jsp,servlet交互驱动层实现

在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);

 

搞定。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值