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

  • 第一次接触这种设计思路,首先,设置一个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);
    }

}

你可能感兴趣的:(设计模式与编程思想,web,Servlet)