欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用BaseServlet提高Servlet的代码复用性

程序员文章站 2022-05-08 13:16:19
...
  • 第一次接触这种设计思路,首先,设置一个BaseServlet,它继承HttpServlet.
  • 在BaseServlet里面doGet方法中,获取request中的method字段,通过反射执行这个方法,具体代码实现,可以看
  • 其他的Servlet都继承BaseServlet,因为继承BaseServlet,不需要重写doGet方法,所以将自动创建的所有东西删除即可,然后在里面创建实现各种功能的方法.
  • 前端页面在传入数据的时候,在相关Servlet的url后面跟上”?method=XXX”,XXX即为需要调用的方法,这样相关继承了BaseServlet的Servlet就可以通过BaseServlet中的doGet方法,反射执行相关方法了.
  • 所有方法的返回值是String,即为请求转发的绝对路径,因为BaseServlet中抽取了请求转发,如果不需要请求转发,比如不需要传数据回网页,或使用AJAX传数据的时候,返回值为null即可
  • 关于权限的说明等另一篇文章写到这里的时候一起补充吧
package com.cuixiaoming.web.servlet;

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;

import cn.itcast.anno.Power;
import cn.itcast.domain.User;

/**
 * Servlet implementation class BaseServlet
 */
public class BaseServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 1、获取超链接提交的method参数,如果 add 就是添加 如果是 del 就是删除 .....
        String methodName = request.getParameter("method");// register
        // 如果客户端没有提交 method 参数,为他设置一个 默认值
        if (methodName == null) {
            methodName = "doDefault";
        }

        // 2、判断并分别执行
        // 使用反射根据 methodName 获取到对应的 方法的 Method 对象
        Class clazz = this.getClass();// 获取该 Servlet 自己的反射对象
        try {
            //参数1:方法名;  其他参数:方法的参数
            Method m = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);

            //权限相关,判断有有没有注解 Power 如果有,查看session 中是否有 user,有,正常执行,没有直接跳转到 login.jsp
            boolean flag = m.isAnnotationPresent(Power.class);
            if(flag){//有权限验证的注解
                User user = (User)request.getSession().getAttribute("user");
                if(user == null){//没有登陆
                    response.sendRedirect(request.getContextPath() + "/login.jsp");
                    return;
                }
            }
            // 执行方法: 方法.invoke(对象,参数列表); == 对象.方法(参数列表)
            String path = (String) m.invoke(this, request, response);
            // 方法没有返回值,反射执行获取的是 null
            if (path != null) {
                request.getRequestDispatcher(path).forward(request, response);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 执行默认操作的方法
     * 
     * @param request
     * @param response
     * @return
     */
    public String doDefault(HttpServletRequest request, HttpServletResponse response) {
        // 根据自己需求编写实现
        System.out.println("默认实现.....");
        return null;
    }


    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}
相关标签: BaseServlet Servlet