创建Servlet基类,用于解决由于业务太多,来编写太多是Servlet类。--模板设计模式
2018-01-24 20:42
447 查看
在编写后台代码的过程中,如果应用Servlet进行编写,对于业务逻辑较多的项目,需要编写许多的Servlet
类,来进行接收前端传到后台的request和response,并调用业务层,对数据进行处理。
针对大量的Servlet。我们可以写一个基类,就可以将业务写在一个Servlet类中,并且此Servlet用来继承写好的基类。所以写这个基类需要判断要调用哪一个方法。
我来写一下演化的过程:
首先:
如果我想用一个Servlet来解决需要的业务请求其实不用基类的的方法也不是不可以完成的,我们可以在前端传到后台方法的名字
<form action="${ pageContext.request.contextPath }/userServlet?method=register" method="post">
,应用request.getParameter("method")方法获得方法,然后通过if判断让哪一个方法进行执行,逻辑代码为:
但是这样如果我有很多方法的时候,也就是有 很多业务需要处理的时候就会大量的if语句,用来进行判断,我们可不可将这些判断封装到一个模板类里面,然后再去写一个Servlet类集成这个模板类呢,这就出现了这个基类,运用的是模板设计模式:以下为具体的模板实现:
而具体的子类实现为:
然后再去调用Service层和Dao层;这样就可以实现将业务模块化,比如和用户有关的就只写UserServlet一个Servlet类,中间可以写需要方法,来处理业务。
类,来进行接收前端传到后台的request和response,并调用业务层,对数据进行处理。
针对大量的Servlet。我们可以写一个基类,就可以将业务写在一个Servlet类中,并且此Servlet用来继承写好的基类。所以写这个基类需要判断要调用哪一个方法。
我来写一下演化的过程:
首先:
如果我想用一个Servlet来解决需要的业务请求其实不用基类的的方法也不是不可以完成的,我们可以在前端传到后台方法的名字
<form action="${ pageContext.request.contextPath }/userServlet?method=register" method="post">
,应用request.getParameter("method")方法获得方法,然后通过if判断让哪一个方法进行执行,逻辑代码为:
public class UserServlet extends HttpServlet{ public void service(HttpServletRequest req,HttpServletResponse resp){ // 接收参数: String methodName = request.getParameter(“method”); if(“regist”.equals(methodName)){ regist(req,resp); }else if(“login”.equals(methodName)){ login(req,resp); } } public void regist(HttpServletRequest req,HttpServletResponse resp){ } public void login(HttpServletRequest req,HttpServletResponse resp){ } }
但是这样如果我有很多方法的时候,也就是有 很多业务需要处理的时候就会大量的if语句,用来进行判断,我们可不可将这些判断封装到一个模板类里面,然后再去写一个Servlet类集成这个模板类呢,这就出现了这个基类,运用的是模板设计模式:以下为具体的模板实现:
<font>会员注册</font>USER REGISTER <form class="form-horizontal" style="margin-top: 5px;" action="${ pageContext.request.contextPath }/userServlet?method=register" method="post"> <input type="hidden" name="uid" value="<%=UUIDUtils.getID()%>"> <div class="form-group"> <label for="username" class="col-sm-2 control-label">用户名</label> <div class="col-sm-6"> <input type="text" class="form-control" id="username" name="username" placeholder="请输入用户名"> </div> <span id="usernameInfo"></span> </div>
package com.lhy.utils; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //创建一个普通的类来继承HttpServlet public class BaseServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 处理request编码问题 if ("post".equalsIgnoreCase(req.getMethod())) { req.setCharacterEncoding("UTF-8"); } else { } // 处理response编码问题 resp.setContentType("text/html;charset=utf-8"); // 获得要去运行的Servlet方法的名称 String methodName = req.getParameter("method"); if (methodName == null || "".equals(methodName)) { resp.getWriter().println("method参数为null!!!"); return; } // 获取子类的class对象 Class clazz = this.getClass(); // 获得子类中要去执行的方法 try { Method method = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); // 设置一个返回值,接收将继承BaseServlet的子类的返回值,用来进行接下来的转发,刷新或重定向操作 String path = (String) method.invoke(this, req, resp); if (path != null) { if (path.startsWith(req.getContextPath())) { resp.sendRedirect(path); } else { req.getRequestDispatcher(path).forward(req, resp); } } } catch (Exception e) { e.printStackTrace(); } } }
而具体的子类实现为:
package com.lhy.web.servlet; import java.lang.reflect.InvocationTargetException; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConvertUtils; import org.apache.commons.beanutils.Converter; import com.itheima.domain.User; import com.itheima.service.RegisterService; import com.itheima.utils.BaseServlet; import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException; public class UserServlet extends BaseServlet { public String register(HttpServletRequest request, HttpServletResponse response){ Map<String, String[]> parameterMap = request.getParameterMap(); User user = new User(); try { // 自己指定一个类型转换器(将String转成Date) ConvertUtils.register(new Converter() { @Override public Object convert(Class clazz, Object value) { // 将string转成date SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date parse = null; try { try { parse = format.parse(value.toString()); } catch (java.text.ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ParseException e) { e.printStackTrace(); } return parse; } }, Date.class); // 映射封装 BeanUtils.populate(user, parameterMap); String province = request.getParameter("province"); String city = request.getParameter("city"); user.setAddress(province+"-"+city); } catch (IllegalAccessException | Invoca 978c tionTargetException e) { e.printStackTrace(); } RegisterService rss = new RegisterService(); boolean flag = false; try { flag = rss.regiser(user); } catch (SQLException e) { flag = false; System.out.println("SQL异常"); e.printStackTrace(); } return "/login.jsp"; } }
然后再去调用Service层和Dao层;这样就可以实现将业务模块化,比如和用户有关的就只写UserServlet一个Servlet类,中间可以写需要方法,来处理业务。
相关文章推荐
- 设计模式-窗体基类模板方法定义
- C#设计模式-窗体基类模板方法定义
- 设计模式之原型模式解决魔兽怪物创建(Darren)
- Blend3中创建的Silverlight程序在设计模式下无法显示图片的解决办法
- 使用模板设计模式解决问题
- 设计模式学习笔记(三):模板方法模式【Template Method】(二) 问题解决
- myeclipse创建servlet时候模板文件注释多解决办法!
- 设计模式(对象创建)——原型模式
- WebProject应用创建(以及虚拟映射)及编写servlet应用程序
- Java 设计模式之简单工厂模式的详解(创建模式)
- 设计模式学习笔记(十八:模板方法模式)
- 设计模式怎样解决设计问题[笔记]
- [Java] 设计模式之工厂系列 02-面向抽象编程 抽象工厂 - 缺点 : 产生新的产品品种的时候,改动太多
- JAVA设计模式:模板模式。钩子方法
- 深入理解JavaScript系列(41):设计模式之模板方法
- 设计模式 9 —— 模板方法模式
- 设计模式——模板方法模式
- 聊聊设计模式 — 模板方法模式
- Java设计模式透析之 —— 模板方法
- Android和设计模式:模板模式