BaseServlet的进一步封装

1、BaseServlet的进一步封装的意义

  该BaseServletPlus是BaseServlet的进一步封装主要用于处理Servlet返回跳转方式和跳转地址进行页面跳转,原版BaseServlet在另一篇文章中BaseServlet详解(每行代码均有详细注释)

  • 为了防止我个人混淆,我将其命名为BaseServletPlus,实际开发中依然命名为BaseServlet
  • 比原版BaseServlet多了对方法调用后返回的值进行了处理,进行页面的跳转
  • 具体内容:
  •   继承了该BaseServletPlus的Servlet,可返回一个字符串
  •   即:return Constants.FORWARD + “/welcome.jsp”;
  •   Constants.FORWARD = “forward:”
  •   Constants是自定义用于存放静态常量的类,
  •   FORWARD、REDIRECT用于对转发方式的标记

2、具体实现

  我就不多说废话了,下面是我的BaseServletPlus的具体实现,内附有超详细注释。

public class BaseServletPlus extends HttpServlet {
    /**
     * 用于重定向到首页
     * @param req
     * @param resp
     * @return
     */
    public String redirectIndex(HttpServletRequest req, HttpServletResponse resp) {
        return Constants.REDIRECT + "/index.jsp";
    }

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //获取要调用的方法的方法名,用于利用反射获取方法
        String methodName = request.getParameter("method");

        if (null == methodName) {
            methodName = "redirectIndex";
        }
        Method method = null;
        Class<? extends BaseServletPlus> aClass = this.getClass();
        try {
            method = aClass.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
            /*
             * 使用result接受method.invoke(this, request, response)的执行结果(字符串)
             * 返回的要请求的页面的地址以及请求的方式,继承了BaseServletPlus的Servlet
             * 应返回格式为:forward:/index.jsp或redirect:/index.jsp
             * 这种字符串开头以跳转方式开头+跳转的页面
             *      跳转方式:/跳转页面
             */
            Object result = method.invoke(this, request, response);
            if(result != null){
                String str = (String)result;

                //截取:后面的字符串
                // 强求转发 forward:/index.jsp----> /index.jsp
                //重定向  redirect:/index.jsp  -----> /index.jsp
                // FLAG = ":"
                String path = str.substring(str.indexOf(Constants.FLAG) + 1);

                //Servlet返回的地址是以forward:开头的判定为请求转发方式
                if(str.startsWith(Constants.FORWARD)){
                    // 转发 index.jsp
                    request.getRequestDispatcher(path).forward(request,response);
                }else if(str.startsWith(Constants.REDIRECT)){  //Servlet返回的地址是以redirect:开头的判定为请求转发方式
                    //重定向到  /index.jsp
                    response.sendRedirect(path);
                }else {
                    //其余方式,返回响应数据
                    response.getWriter().println(str);
                }
            }
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            e.printStackTrace();
        }
    }
}

  下面是我的Constants类,用于存放静态常量,程序的所有公用的静态常量都放置在该类中,不使用该类也可,只需将相应的调用换成具体的字符串即可。

public class Constants {

    //默认时为首页
    public static final String INDEX = "index";

	//请求转发标识
    public static final String  FORWARD = "forward:";


    //重定向标识
    public static final String  REDIRECT = "redirect:";
	
	//分割符
    public static final String FLAG = ":";
}

  以上所有内容均为个人见解,如有错误欢迎批评与指正,更欢迎广大同胞们表达自己的看法共同进步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值