BaseServlet

问题分析

当我们创建一个 JavaWeb 项目时,一般一个 Servlet 类只处理一个请求方法,当 Servlet 类过多时,就会使项目代码显得冗余,每个继承 HttpServlet 的类都会重写 doGet()和 doPost()方法,进而使得代码复用性降低。而且,在代码维护甚重构时,对于每个模块所对应的大量的 Servlet 类将导致项目的可读性降低。

问题解决

创建 HttpServlet 类的继承类,复写 service()方法。
通过反射机制实现对不同方法的调用。

注意

问题:注意在表单的action中附加请求参数时,如果使用的post请求时不会有任何问题的,但是一旦使用的get请求,由于get请求是通过url地址来传递请求参数的,所以get请求中的参数会自动覆盖掉action属性中的请求参数,所以如果使用get请求,那么action属性中的请求参数将会丢失
解决方案:所以我们在通过get方式发送请求时,需要在表单中设置一个表单隐藏域,并将method属性设置进隐藏域中。

主要代码

注:

getDeclaredMethod(String name,Class… parameterTypes):

name 参数是一个字符串,指定所需的方法的简单名称,
parameterTypes 参数是一个数组的Class对象识别方法的形参类型,在声明的顺序
//抽象类!
public abstract class BaseServlet extends HttpServlet {
	//final修饰,不能被重写!
    @Override
    protected final void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException 
        //1.获取 methodName 参数,它是用户想调用的方法名称
        String methodName = req.getParameter("method");
        Method method = null;
        //2.通过方法名称获取 Method 对象
        try {
            //3.获得自身的所有定义过的方法
            method = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException("您调用的  " + methodName + "() 方法不存在", e);
        }
        //通过 Method 对象来调用它
        try {
       		//3.设置调用私有方法的权限
            method.setAccessible(true);
            //4.利用invoke执行该方法并获得返回值result
            String result = (String) method.invoke(this, req, resp);
            //扩充:简化转发和重定向功能
            /*考虑到用 f、r 分别代替 forward、redirect 对他人阅读代码可能会造成阅读障碍
            故,在此并未进行替代*/
            if (result != null && !result.trim().isEmpty()) {
                String[] strings = result.split(":");
                //子类中的转发格式 forward:/index.jsp
                if (strings[0].equals("forward")) {
                    req.getRequestDispatcher(strings[1]).forward(req, resp);
                    //子类中的重定向格式 redirect:/index.jsp
                } else if (strings[0].equals("redirect")) {
                    resp.sendRedirect(req.getContextPath() + strings[1]);
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值