一个web项目通常有很多servlet,不便于管理,所以可以通过抽取代码,再分层,方便管理
第一种方法:将servlet文件抽取到了一个类中,一个servlet变成一个方法,通过参数调用相应的方法,与商品有关的servlet放到一起
public class PrdocutServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获得请求的哪个方法的method
String methodName = request.getParameter("method");
if("productList".equals(methodName)){
productList(request,response);
}else if("categoryList".equals(methodName)){
categoryList(request,response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
public void productList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
public void categoryList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
public void productList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
第二种方法:思考:如何通过方法名就调用相应方法,就不用上面的else if语句呢?反射就可以做到,这种方法就是第一种的改进,红色代码是第一种方法改动的代码,并且删除了doget和dopost方法
public class PrdocutServlet extendsBaseServelt {
public void productList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
public void categoryList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
public void productList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
此时请求来到productServlet,没找到service方法,就去找父类,创建一个父类,在父类中调用的this代表的是当前对象,就是自己
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
try {
//1、获得请求的method的名称
String methodName = req.getParameter("method");
//2、获得当前被访问的对象的字节码对象
Class clazz = this.getClass();//ProductServlet.class ---- UserServlet.class
//3、获得当前字节码对象的中的指定方法
Method method = clazz.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
//4、执行相应功能方法
method.invoke(this, req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}