Java Web抽取Servlet(优化)

本文探讨如何通过创建BaseServlet和实体Servlet,减少Servlet数量,提高代码可读性和耦合度。介绍了如何通过反射调用具体功能方法,并举例说明了UserServlet和相关页面逻辑。

问题分析:平常我们写Servlet时,一个功能就会对应一个Servlet,比如登录、注册对应LoginServlet、RegisterServlet,当一个管理系统有许多的功能时,那么就会有10-30个Servlet,让人看代码时就会非常的凌乱

 

抽取Servlet的目的:减少Servlet的文件数目,按照实体来对Servlet进行分类,增加代码的可读性,降低代码的耦合度

步骤:

1、创建一个BaseServlet,通过反射来调取对应WebServlet(具体Servlet)相应的功能方法

2、创建相需要的实体Servlet,每一个实体Servlet继承BasicServlet,并定义该实体的所有功能方法

BasicServlet如下:

/*
    基本Servlet
 */
public class BasicServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String methodName =  req.getParameter("method");
        //如果Servlet选择重定向或者是转发,方法会返回一个不为null的字符串
        if(methodName != null){
            try {
                //反射
                Method method = this.getClass().getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
                //调用对应方法名称的方法
                Object actionObj =  method.invoke(this,req,resp);
                if(actionObj != null){
                    String action = actionObj.toString();
                    if(action.startsWith("redirect:")){
                        System.out.println(action.split("redirect:")[1]);
                        //重定向
                        resp.sendRedirect(action.split("redirect:")[1]);

                    }else{
                        //转发
                        req.getRequestDispatcher(action);
                    }
                }else{
                    System.out.println("空");
                }
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

这里写一个UserServlet作为一个例子,模板如下:

@WebServlet("/user")
public class UserServlet extends BasicServlet {

    public String login(HttpServletRequest request,HttpServletResponse response){
        /*        
            此处省略,根据需求写业务代码....
         */
        
        //重定向index.jsp
        return "redirect:index.jsp";
    }

    public String register(HttpServletRequest request,HttpServletResponse response){
         /*        
            此处省略,根据需求写业务代码....
         */

        //转发login.jsp
        return "login.jsp";
    }
}

login.jsp例子如下,重点看action发送的请求路径


<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>Title</title>
</head>
<body>
<center>这是登录页</center>
<form action="user?method=login" method="post">
    <span>用户名:</span><input name="username">
    <div><input type="submit" value="提交"></div>
</form>
</body>
</html>

这里可能有一些读者有以下疑问❔:

1) 为何BasicServlet不注册为一个WebServlet?

        BasicServlet用于判断每一个WebServlet具体请求的功能(登录、注册等等)和跳转方向(转发或重定向),然后使用反射调用WebServlet对应的功能方法,并且利用if分支进行重定向或者转发。而WebServlet只需要专注于功能实现的具体业务代码,从而在整体上达到减低代码耦合度的效果!

2)为何在WebServlet没有去编写DoGet和DoPost方法,而在BasciServlet中编写这两个方法?

        首先理清上面的继承体系,是UserServlet -> BasicServlet -> HttpServlet,虽然UserServlet被注册为WebServlet,但是它没有DoGet或是DoPost方法,那么它就会调用父类的DoGet或是DoPost方法的方法,父类也就是BasicServlet,然后再通过父类去调用WebServlet对应的功能方法。

这样就不用在每个WebServlet中去编写DoGet或者是DoGet方法了,从而降低代码的耦合度。

注意:在上面的回答中,我提到的WebServlet指的是在Tomcat中注册为Servlet的具体类,它是用户请求的入口

 海内存知己,天涯若比邻,如果你觉得该篇文章对你有一定的启发和帮助,或者你是大神路过,都可以点赞💖+关注😋2022年,和未谋面的你一起进步💪



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值