在jsp和servlet中,参数的传递和解析往往占用了大多说的代码空间,以至于出现了像spring,struts这样优秀的参数包装模型,但是如果项目中没有使用框架,只是依靠自己来维护,那有没有什么好的解决办法呢?
在页面中,像下图这样的查询模型非常常见
如果没有一个好的维护策略,在后台servlet的解析中,对每一个输入框都要进行参数的接受,数据类型的转换,参数异常的捕捉,按照上图这样一个查询模型,代码量是非常巨大的,常常不利于维护,说说我的一些看法,不足之处还请朋友们补充。
1.把这些查询对象看成一个对象。
2.将参数的转换委托给一个servlet以外的工具类进行整合。
3.得到一个完整的VO对象,在servlet中只要判断是否为空即可。
1.对象模型:
public class ValueServiceVO {
/**
* 需求标志位
*/
private int isrequireOfQuery = SystemConstant.INVALID_QUERY;
/**
* 公司名称
*/
private String corporationOfQuery;
/**
* 服务投放港口名称
*/
private String pharborOfQuery;
/**
* 服务投放港口编号
*/
private int pharborid = SystemConstant.INVALID_QUERY;
/**
* 服务投放行业编号
*/
private int industryOfQuery = SystemConstant.INVALID_QUERY;
/**
* 起始港名称
*/
private String sharborOfQuery;
/**
* 起始港编号
*/
private int sharborid = SystemConstant.INVALID_QUERY;
/**
* 服务类型
*/
private int stidOfQuery = SystemConstant.INVALID_QUERY;
/**
* 承运公司
*/
// private String scnameOfQuery;
private int scidOfQuery = SystemConstant.INVALID_QUERY;
/**
* 航线编号
*/
private int lineOfQuery = SystemConstant.INVALID_QUERY;
/**
* 目的港
*/
private String eharborOfQuery;
/**
* 目的港编号
*/
private int eharborid = SystemConstant.INVALID_QUERY;
/**
* 联系方式
*/
private String phoneOfQuery;
/**
* 注册时间前后
*/
private int cdatenote = SystemConstant.INVALID_QUERY;
/**
* 注册时间
*/
private String cdateOfQuery;
/**
* 过期时间前后
*/
private int edatenote = SystemConstant.INVALID_QUERY;
/**
* 过期时间
*/
private String edateOfQuery;
}
此处省略setters and getters。
2.工具类模型,其原理就是通过反射,将valueserviceVO当中的setter方法中set以后的字符串当做属性全部对应于jsp input标签中的name
例如:
对应于jsp中的input name
工具类代码如下:
public class FormBeanVO{
public static <T> T getFormBean(HttpServletRequest request, Class<T> k) {
try {
T o = k.newInstance();
for(Method m : k.getDeclaredMethods()) {
String mName = m.getName();
String requestName = null;
if(mName.startsWith("set")) {
requestName = request.getParameter(setLower(mName.substring(3)));
}
if(requestName == null || "".equals(requestName)) continue;
else {
if (m.getParameterTypes()[0].equals(int.class)
|| m.getParameterTypes()[0].equals(Integer.class)) {
m.invoke(o, Integer.valueOf(requestName));
} else if (m.getParameterTypes()[0].equals(boolean.class)
|| m.getParameterTypes()[0].equals(Boolean.class)) {
m.invoke(o, Boolean.valueOf(requestName));
} else if (m.getParameterTypes()[0].equals(String.class)) {
m.invoke(o, requestName);
} else if (m.getParameterTypes()[0].equals(float.class)
|| m.getParameterTypes()[0].equals(Float.class)) {
m.invoke(o, Float.valueOf(requestName));
} else if (m.getParameterTypes()[0].equals(long.class)
|| m.getParameterTypes()[0].equals(Long.class)) {
m.invoke(o, Long.valueOf(requestName));
} else if (m.getParameterTypes()[0].equals(Timestamp.class)) {
m.invoke(o, Timestamp.valueOf(requestName));
} else if (m.getParameterTypes()[0].equals(String[].class)){
String s[] = request.getParameterValues(setLower(mName.substring(3)));
m.invoke(o, s);
}
}
}
return o;
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return null;
}
private static String setLower(String s) {
StringBuilder builder = new StringBuilder(s);
String first = s.substring(0, 1).toLowerCase();
builder.setCharAt(0, first.charAt(0));
return builder.toString();
}
/*
public static void main(String[] args) {
FormBeanVO fb = new FormBeanVO();
System.out.println(int.class);
// fb.getFormBean(Balance.class);
// System.out.println(fb.setLower("SDAFASDF"));
// System.out.println(String.class);
}
*/
}
3.这样就为servlet减轻了负担,在servlet中的调用简单方便
private void findValueServiceList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 查询条件
ValueServiceVO vsVO = FormBeanVO.getFormBean(request, ValueServiceVO.class);
//页码
String pageOfString = request.getParameter("page");
int page;
if(pageOfString == null || "".equals(pageOfString)) {
page = 1;
} else {
try {
page = Integer.valueOf(pageOfString);
} catch (NumberFormatException e) {
request.setAttribute("message", "页码不符合规范");
MethodError(request, response);
return;
}
}
int maxResult = MAX_RESULT;
PageView<ValueService> pageView = new PageView<ValueService>(maxResult, page);
HttpSession session = request.getSession();
User u = (User) session.getAttribute("user");
StringBuilder whereSql = new StringBuilder("1=1");
List<Object> vslist = new ArrayList<Object>();
// 需求标志位
if(vsVO.getIsrequireOfQuery() != SystemConstant.INVALID_QUERY) {
// ................
}
}
没错,只需要这样一句话:
ValueServiceVO vsVO = FormBeanVO.getFormBean(request, ValueServiceVO.class);
搞定。