在使用struts的时候,感觉struts的前后台参数传输挺有用的,但又不希望把struts都放到项目内,而且也不可能(某些项目已经完成了,再修改不方便)。所以尝试做了一下struts中的实现。
主要实现功能:在前台的html或者jsp提交的form中,有许多参数,把这些参数都放到某个bean内,只要后台提交后,调用相应的处理模块,就能直接处理那个参数bean,而不需要再做一些前台的参数获取,比如req.getParameter等这些语句,做到数据隔离的方式。
以下为实现的处理模块的类:
package com.XXXX.common;
import java.lang.reflect.Field;
import javax.servlet.http.HttpServletRequest;
public class ParaPro {
public Object fillBean(HttpServletRequest req) {
Object retObj = null;
String BeanName = (String) req.getParameter("ParaClass");
System.out.println("bn is " + BeanName);
try {
retObj = Class.forName(BeanName).newInstance();
} catch (InstantiationException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
Field fields[] = retObj.getClass().getDeclaredFields();
String fieldName;
String fieldType;
String strGetParameter;
for (int i = fields.length - 1; i > -1; i--) {
fields[i].setAccessible(true);
fieldName = fields[i].getName();
fieldType = fields[i].getType().toString();
try {
if (req.getParameter(fieldName) != null) {
System.out.println(fieldType.toString());
if (fieldType.equals("class java.lang.Integer")) {
fields[i].set(
retObj,
new Integer(req.getParameter(fieldName)));
System.out.println(
"fieldName is "
+ fieldName
+ " type is "
+ fieldType);
}
if (fieldType.equals("class java.lang.String")) {
fields[i].set(retObj, req.getParameter(fieldName));
System.out.println(
"fieldName is "
+ fieldName
+ " type is "
+ fieldType);
}
}
} catch (IllegalArgumentException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}
}
return retObj;
}
}
以下为提交后的servlet的处理:
package com.XXXX.common;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @version 1.0
* @author
*/
public class argProcess extends HttpServlet implements Servlet {
/**
* @see javax.servlet.http.HttpServlet#void (javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Object obj_tmp=null;
ParaPro paraPro=new ParaPro();
System.out.println("begin"+(String)req.getParameter("ParaClass"));
obj_tmp=paraPro.fillBean(req);
ParaBean pb=(ParaBean)obj_tmp;
System.out.println("get is "+pb.BeginDate+" rate is "+pb.Rate);
}
}
以下为所用的参数bean:
public class ParaBean {
String BeginDate;
String EndDate;
String SalesCode;
Integer Rate;
}
以下为调用提交的html:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0012)http://amis/ -->
<HTML><HEAD><TITLE></TITLE>
<META content="text/html; charset=gb2312">
<META content="MSHTML 5.00.3315.2870" name=GENERATOR></HEAD>
<BODY bgColor=#ffffff leftMargin=0 >
<FORM action="/argProcess" method=post name=login >
<INPUT type="text" name="BeginDate" size="20" value="20041201">
<INPUT type="text" name="EndDate" size="20" value="20041231">
<INPUT type="text" name="Rate" size="20" value="3">
<INPUT type="submit" name="submit" value="确认">
<INPUT type="text" name="ParaClass" size="50" value="com.XXXX.ParaBean">
</FORM>
</BODY>
<HEAD>
<META http-equiv=Expired content="Fri,21 Dec 2002 00:00:00 GMT">
<META http-equiv=PRAGMA content="no-cache">
<META http-equiv=CACHE-CONTROL content="MAX-AGE=1">
</HEAD>
</HTML>
以上程序做的东西,其实就是在HTML文件中,把要处理的bean的名字以及bean内的参数都作为参数传输到servlet里面,然后调用后台处理类,根据bean的名字来获取相应的bean的结构并且把前台参数分别对应的内容填写到这个新生产的bean里面,然后再由后台做处理。
至于相关的技术,我是看struts的文档,内部连接到sun的文档的:
http://java.sun.com/docs/books/tutorial/reflect/
以上例子在websphere的wsad5.1中运行通过
其实我的处理还没有完成,只处理了String 和Integer,不过其他类型可以继续加上去。
而且中文的传输也是要考虑的,错误处理也没有完成,等等
希望有高手能看完以上的代码,做点意见啦,谢谢!
用了这个处理类后,假设1个查询有3个参数,如果系统有10个查询,就能省略30行代码。
而且最重要的是这些参数的传输都主动化了。