需求:
1. 如图:一个请求对应一个 Servlet,会造成 Servlet 太多,不利于管理
2. 在项目开发中,同一个业务(模块),一般对应一个 Servlet 即可,比如 LoginServlet 和
RegisterServlet 都是在处理和会员相关的业务,应当合并.
解决方案:
方案1 if-else
方案 2 反射+模板设计模式+动态绑定(推荐)
设计示意图
思路:将post方法提取到父类BasicServlet,当用请求打到子类(如MemberServlet)时,就会调用父类的dopost()方法,该方法根据action的值(action就是要调用的方法名),使用反射得到该方法,并调用。
BasicServlet代码如下:
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.List;
public class BasicServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文编码问题
request.setCharacterEncoding("utf-8");
//获取到action的值
String action = request.getParameter("action");
//拿到类加载器
//使用反射,获取当前对象的方法
//解读
//1.this 就是请求的Servlet
//2.declaredMethod 方法对象就是当前请求的servlet对应的"action名字" 的方法, 该方法对象(declaredMethod)
// 是变化的,根据用户请求
//3.体会:使用模板模式+反射+动态机制===> 简化多个 if--else if---..
try {
Method declaredMethod = this.getClass().getMethod(action, HttpServletRequest.class, HttpServletResponse.class);
declaredMethod.invoke(this, request, response);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}