在编写后台代码的过程中,如果应用Servlet进行编写,对于业务逻辑较多的项目,需要编写许多的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 | InvocationTargetException 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类,中间可以写需要方法,来处理业务。