在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);
搞定。
相关推荐
资料包中的源代码部分可能包含了多个JSP页面、Servlet类、JavaBeans组件以及用于处理数据库交互的JDBC驱动代码。这些源码文件共同构成了一个动态网站,它能够响应用户的请求,执行相应的业务逻辑,并与后端的Access...
09年6月14日,IBM全球同步发布了一款具有划时代意义的数据库产品——DB2 9.5,而这款新品最大特点即是率先实现了可扩展标记语言(XML)和关系数据间的无缝交互,而无需考虑数据的格式、平台或位置。 ACCP6.0课程...
功能 学生管理:包括学生的基本信息、课程成绩等信息的管理; 教师管理:包括教师的基本信息、授课信息...设计前端页面,使用Java Web技术(例如Servlet、JSP等)实现与后端的交互; 使用Tomcat或其他Web容器进行部署。
8.6.1 实现与ServletAPI的交互 86.2 域模型DomainModel 86.3 驱动模型ModelDriven 8.7 实战检验 8.7.1 Struts2处理表单数据 8.7.2 使用M印类型的request、session、application 8.8 疑难解惑 8.8.1 Struts Prepare ...
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页...
它使用服务层框架可以将JavaBeans从Jsp/Servlet中分离出来,而使用表现层框架则可以将Jsp中剩余的JavaBeans完全分离,这部分JavaBeans主要负责显示相关信息,一般是通过标签库(Taglib)实现,不同框架有不同自己的...
动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件的...
而对于信息管理系统来说,java能够实现前台和后台的信息交互,并能够对前台所提出的请求处理数据,因此在开发本系统时我把它作为本系统的开发语言。 2. 本系统开发工具的选择 本系统前台使用的开发工具是MyEclipse。...
动态INCLUDE用jsp:include动作实现 <jsp:include page="included.jsp" flush="true" />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。 静态INCLUDE用include伪码实现,定不会检查所含文件...
详细设计 9 3.1 根据数据表设计javabean 9 3.2 JDBUtils连接数据库 10 3.3 与数据库进行交互的Dao层 11 3.4 与用户交互的Jsp页面 12 3.5 Servlet控制请求与响应 13 3.6 Junit单元测试 15 第四章 设计结果及分析 16 ...
C--Teach-assistant ...2.后台:java EE(jsp+servlet)(Eclipse开发),请自行安装jdk和配置环境变量 3.服务器:Tomcat9.0,下载和配置环境变量 4.数据库:Mysql+数据库驱动程序,注意:数据库驱动程序要么放在Tomc
将FileActionForm直接作为业务层的接口入参,相当于将Web层传播到业务层中去,即将业务层绑定在特定的Web层实现技术中,按照分层模型学院派的观点,这是一种反模块化的设计,但在"一般"的业务系统并无需提供多种UI...
16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要...
16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要...
使用我在 2012 年开发的各种技术的交互式网站 Java、JSP、JSTL MySQL、SQL、触发器、索引、审计、设计和开发的网站商店数据库架构、ER 图表、数据库安全(MD5 加密、SQL 注入) JavaScript、AJAX、 HTML、XML ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...
实例60 使用单独JDBC连接驱动程序 184 实例61 数据库基本操作 185 实例62 使用游标 189 实例63 使用事务 191 实例64 实现SQL语句的检索功能 192 实例65 SQL嵌套检索 194 实例66 获取数据库基本信息 195 第6章 Java C...
//给客户发一个感谢消息,消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener 在对象创建的过程中将被容器调用,onMessage函数方法接收消息参数,将其强制转型为合适的消息类型,同时打印出消息...