说在前面
昨天 | 完成了文件上出的学习和实践 |
今天 | 学习servlet的两次抽取,以加快编写工程的速度 |
一、servlet 抽取的原因:
刚刚学习使用servlet写后台,往往只使用一个servlet来处理一个功能,但是随着项目规模加大,页面增多,众多的servlet让人很是心烦,这时候就需要向上抽取serlvet了,即将servlet按照模块来划分,比如注册和登录的servlet就放到user的servlet中。
二、servlet 的第一次抽取
使用选择结构,页面提交请求是加上一个method的参数,表示同一模块的不同功能,到selvlet中获取 method 再判断调用哪个方法即:
1)界面的请求
......
2)servlet的处理
三、servlet的第二次抽取
使用反射,通过一个字符串,来找到一个方法
1、注意事项:
1)method所带参数,必须与方法名相同
2)方法必须是共有的(public)
2、界面请求相同
3、selvlet 处理
1)、创建基础selvlet 类,实现通过一个字符串,来找到一个方法
package com.me.web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Method; @WebServlet("/BaseServlet") @SuppressWarnings("all") public class BaseServlet extends HttpServlet { private static final long serialVersionUID = 1L; public BaseServlet() { super(); } protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); try { //1、获得请求的method的名称 String methodName = request.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, request,response); } catch (Exception e) { e.printStackTrace(); } } }
2)、其他的selvlet继承 BaseServlet 直接写相应的方法即可,不必再用选择结构判断!