一个自动生成表格的servlet
2007-08-14 19:21
375 查看
package lin.util;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import java.lang.reflect.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TableServlet extends HttpServlet {
public static final Class[] NO_PARAMS = new Class[0];
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String tableOptions = request.getParameter("tableOptions");
if(tableOptions == null)
{
tableOptions = "";
}
String trOptions = request.getParameter("trOptions");
if(trOptions == null)
{
trOptions = "";
}
String tdOptions = request.getParameter("tdOptions");
if(tdOptions == null)
{
tdOptions = "";
}
String thOptions = request.getParameter("thOptions");
if(thOptions == null)
{
thOptions = "";
}
String data = request.getParameter("data");
if(data == null)
{
getServletContext().log("No data available");
throw new ServletException("No data parameter available");
}
Object dataOb = request.getAttribute(data);
if(dataOb == null)
{
getServletContext().log("No data object found");
throw new ServletException("Can' t locate the data object named"+data);
}
String[] columns = request.getParameterValues("column");
String[] columnType = request.getParameterValues("columnType");
String[] columnHeaders = request.getParameterValues("columnHeader");
Hashtable columnAccessors = getAccessors(dataOb,columns);
PrintWriter out = response.getWriter();
out.println("<table "+tableOptions+">");
//out.println("<table border='1'>");
if(columnHeaders != null)
{
out.println("<tr "+trOptions+">");
//out.println("<tr>");
for(int i=0; i<columnHeaders.length;i++)
{
out.print("<th "+thOptions+">");
//out.println("<th>");
out.println(columnHeaders[i]);
out.println("</th>");
}
out.println("</tr>");
}
if(dataOb instanceof Vector)
{
Vector v=(Vector)dataOb;
Enumeration e = v.elements();
while (e.hasMoreElements())
{
out.println("<tr "+trOptions+">");
//out.println("<tr>");
printRow(out,e.nextElement(),columns,columnType,
columnAccessors,tdOptions);
out.println("</tr>");
}
}
else if(dataOb instanceof Object[])
{
Object[] obs = (Object[])dataOb;
for(int i=0;i<obs.length;i++)
{
out.println("<tr "+trOptions+">");
out.println("<tr>");
printRow(out,obs[i],columns,columnType,columnAccessors,tdOptions);
out.println("</tr>");
}
}
out.println("</table>");
}
protected void printRow(PrintWriter out,Object ob,String[] columns,
String[] columnTypes,Hashtable columnAccessors,String tdOptions)
throws ServletException
{
for(int i=0;i<columns.length;i++)
{
Object value = getColumnValue(ob,columns[i],columnAccessors);
out.print("<td "+tdOptions+">");
if(columnTypes[i].equalsIgnoreCase("data"))
{
out.print(value);
}
else if(columnTypes[i].equalsIgnoreCase("image"))
{
out.print("img src/" "+value+"/">");
}
out.print("</td>");
}
}
protected Object getColumnValue(Object ob,String columnName,Hashtable columnAccessors)
throws ServletException
{
Object accessor = columnAccessors.get(columnName);
if(accessor instanceof Field)
{
try {
Field f = (Field)accessor;
return f.get(ob);
} catch (IllegalAccessException e) {
getServletContext().log(
"Error getting column"+columnName,e
);
throw new ServletException(
"Illegal access exception for column"+columnName);
}
}
else if(accessor instanceof Method)
{
try {
Method m=(Method)accessor;
return m.invoke(ob,NO_PARAMS);
} catch (IllegalAccessException e) {
getServletContext().log(
"Error getting column"+columnName,e
);
throw new ServletException(
"Illegal access exception for column"+columnName
);
}
catch(InvocationTargetException ee)
{
getServletContext().log(
"Error getting column"+columnName,ee
);
throw new ServletException(
"Invocation target exception"+"for column"+columnName
);
}
}
return null;
}
protected Hashtable getAccessors(Object ob,String[] columns)
throws ServletException
{
Hashtable result = new Hashtable();
Class obClass = null;
if(ob instanceof Object[])
{
Object[] obs=(Object[])ob;
if(obs.length==0)
return result;
obClass = obs[0].getClass();
}
else if(ob instanceof Vector)
{
Vector v =(Vector)ob;
if(v.size()==0)
return result;
obClass = v.elementAt(0).getClass();
}
for(int i=0;i<columns.length;i++)
{
try {
Field f=obClass.getField(columns[i]);
result.put(columns[i],f);
continue;
} catch (Exception e) {
// TODO: handle exception
}
try {
Method m=obClass.getMethod(columns[i],NO_PARAMS);
result.put(columns[i],m);
} catch (Exception ex) {
getServletContext().log("Exception location field"+
columns[i],ex);
throw new ServletException(
"Can' t location field/method for"+columns[i]
);
}
}
return result;
}
}
test.jsp
<%@ page language="java" contentType="text/html; charset=gbk"%>
<html>
<head>
<title>My JSP 'tableTest.jsp' starting page</title>
</head>
<body>
<%!
public class Person
{
public String name;
public int age;
protected String phoneNumber;
public Person(String aName,int anAge,String aPhone)
{
name=aName;
age=anAge;
phoneNumber = aPhone;
}
public String getPhoneNumber()
{
return phoneNumber;
}
}
%>
<%
Person[] people=new Person[]{
new Person("XXXXX",7,"04137130367"),
new Person("YYYYYYY",7,"13588880514"),
new Person("CCCCCCCCC",29,"13888429840"),
new Person("AAAAAAAA",30,"13868137859")
};
request.setAttribute("people",people);
%>
<jsp:include page="/TableServlet" flush="true">
<jsp:param name="data" value="people"/>
<jsp:param name="tableOptions" value="border=4"/>
<jsp:param name="column" value="name"/>
<jsp:param name="columnType" value="data"/>
<jsp:param name="columnHeader" value="Name"/>
<jsp:param name="column" value="age"/>
<jsp:param name="columnType" value="data"/>
<jsp:param name="columnHeader" value="Age"/>
<jsp:param name="column" value="getPhoneNumber"/>
<jsp:param name="columnType" value="data"/>
<jsp:param name="columnHeader" value="Phone#"/>
</jsp:include>
</body>
</html>
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;
import java.lang.reflect.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TableServlet extends HttpServlet {
public static final Class[] NO_PARAMS = new Class[0];
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String tableOptions = request.getParameter("tableOptions");
if(tableOptions == null)
{
tableOptions = "";
}
String trOptions = request.getParameter("trOptions");
if(trOptions == null)
{
trOptions = "";
}
String tdOptions = request.getParameter("tdOptions");
if(tdOptions == null)
{
tdOptions = "";
}
String thOptions = request.getParameter("thOptions");
if(thOptions == null)
{
thOptions = "";
}
String data = request.getParameter("data");
if(data == null)
{
getServletContext().log("No data available");
throw new ServletException("No data parameter available");
}
Object dataOb = request.getAttribute(data);
if(dataOb == null)
{
getServletContext().log("No data object found");
throw new ServletException("Can' t locate the data object named"+data);
}
String[] columns = request.getParameterValues("column");
String[] columnType = request.getParameterValues("columnType");
String[] columnHeaders = request.getParameterValues("columnHeader");
Hashtable columnAccessors = getAccessors(dataOb,columns);
PrintWriter out = response.getWriter();
out.println("<table "+tableOptions+">");
//out.println("<table border='1'>");
if(columnHeaders != null)
{
out.println("<tr "+trOptions+">");
//out.println("<tr>");
for(int i=0; i<columnHeaders.length;i++)
{
out.print("<th "+thOptions+">");
//out.println("<th>");
out.println(columnHeaders[i]);
out.println("</th>");
}
out.println("</tr>");
}
if(dataOb instanceof Vector)
{
Vector v=(Vector)dataOb;
Enumeration e = v.elements();
while (e.hasMoreElements())
{
out.println("<tr "+trOptions+">");
//out.println("<tr>");
printRow(out,e.nextElement(),columns,columnType,
columnAccessors,tdOptions);
out.println("</tr>");
}
}
else if(dataOb instanceof Object[])
{
Object[] obs = (Object[])dataOb;
for(int i=0;i<obs.length;i++)
{
out.println("<tr "+trOptions+">");
out.println("<tr>");
printRow(out,obs[i],columns,columnType,columnAccessors,tdOptions);
out.println("</tr>");
}
}
out.println("</table>");
}
protected void printRow(PrintWriter out,Object ob,String[] columns,
String[] columnTypes,Hashtable columnAccessors,String tdOptions)
throws ServletException
{
for(int i=0;i<columns.length;i++)
{
Object value = getColumnValue(ob,columns[i],columnAccessors);
out.print("<td "+tdOptions+">");
if(columnTypes[i].equalsIgnoreCase("data"))
{
out.print(value);
}
else if(columnTypes[i].equalsIgnoreCase("image"))
{
out.print("img src/" "+value+"/">");
}
out.print("</td>");
}
}
protected Object getColumnValue(Object ob,String columnName,Hashtable columnAccessors)
throws ServletException
{
Object accessor = columnAccessors.get(columnName);
if(accessor instanceof Field)
{
try {
Field f = (Field)accessor;
return f.get(ob);
} catch (IllegalAccessException e) {
getServletContext().log(
"Error getting column"+columnName,e
);
throw new ServletException(
"Illegal access exception for column"+columnName);
}
}
else if(accessor instanceof Method)
{
try {
Method m=(Method)accessor;
return m.invoke(ob,NO_PARAMS);
} catch (IllegalAccessException e) {
getServletContext().log(
"Error getting column"+columnName,e
);
throw new ServletException(
"Illegal access exception for column"+columnName
);
}
catch(InvocationTargetException ee)
{
getServletContext().log(
"Error getting column"+columnName,ee
);
throw new ServletException(
"Invocation target exception"+"for column"+columnName
);
}
}
return null;
}
protected Hashtable getAccessors(Object ob,String[] columns)
throws ServletException
{
Hashtable result = new Hashtable();
Class obClass = null;
if(ob instanceof Object[])
{
Object[] obs=(Object[])ob;
if(obs.length==0)
return result;
obClass = obs[0].getClass();
}
else if(ob instanceof Vector)
{
Vector v =(Vector)ob;
if(v.size()==0)
return result;
obClass = v.elementAt(0).getClass();
}
for(int i=0;i<columns.length;i++)
{
try {
Field f=obClass.getField(columns[i]);
result.put(columns[i],f);
continue;
} catch (Exception e) {
// TODO: handle exception
}
try {
Method m=obClass.getMethod(columns[i],NO_PARAMS);
result.put(columns[i],m);
} catch (Exception ex) {
getServletContext().log("Exception location field"+
columns[i],ex);
throw new ServletException(
"Can' t location field/method for"+columns[i]
);
}
}
return result;
}
}
test.jsp
<%@ page language="java" contentType="text/html; charset=gbk"%>
<html>
<head>
<title>My JSP 'tableTest.jsp' starting page</title>
</head>
<body>
<%!
public class Person
{
public String name;
public int age;
protected String phoneNumber;
public Person(String aName,int anAge,String aPhone)
{
name=aName;
age=anAge;
phoneNumber = aPhone;
}
public String getPhoneNumber()
{
return phoneNumber;
}
}
%>
<%
Person[] people=new Person[]{
new Person("XXXXX",7,"04137130367"),
new Person("YYYYYYY",7,"13588880514"),
new Person("CCCCCCCCC",29,"13888429840"),
new Person("AAAAAAAA",30,"13868137859")
};
request.setAttribute("people",people);
%>
<jsp:include page="/TableServlet" flush="true">
<jsp:param name="data" value="people"/>
<jsp:param name="tableOptions" value="border=4"/>
<jsp:param name="column" value="name"/>
<jsp:param name="columnType" value="data"/>
<jsp:param name="columnHeader" value="Name"/>
<jsp:param name="column" value="age"/>
<jsp:param name="columnType" value="data"/>
<jsp:param name="columnHeader" value="Age"/>
<jsp:param name="column" value="getPhoneNumber"/>
<jsp:param name="columnType" value="data"/>
<jsp:param name="columnHeader" value="Phone#"/>
</jsp:include>
</body>
</html>
相关文章推荐
- OLE方式控制WORD生成一个文档,包括自动生成表格
- 利用textbox自动生成一个表格 附详细解释
- 用js实现的一个根据内容自动生成表格的函数
- 自动生成mysql表格的一个网页,没有ERStudio功能全
- 用js实现的一个根据内容自动生成表格的函数
- 不再为DataGrid生成的表格的单无格中的内容过长、自动折行、表格撑开等问题而烦恼----一个很久以前的做品
- ASP.NET基础教程-Web 自定义控件的使用-根据属性值从数据库中提取数据并在页面上自动生成一个表格
- 利用table动态生成表格并填充内容/和panel做一个可控制显示/隐藏的小玩意
- 用servlet写一个双色球(生成随机数)
- 不再为DataGrid生成的表格的单无格中的内容过长、自动折行、表格撑开等问题而烦恼
- 解决:Eclipse新建Servlet时不会自动生成mapping到web.xml(水印为楼主微博ID)
- .net自动生成表格解决方案
- 为什么在eclipes为创建一个android布局文件在R中没有自动生成
- Java根据数据库表格自动生成java实体类
- 根据一个大图片自动生成相应小图片的代码
- Java Web项目--使用Servlet生成一个页面
- 一个VS.net自动生成代码引发的问题
- 一个简单的基于Servlet的验证码生成程序
- 一个能够自动给pdf生成目录的东西
- 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序