多个请求共用一个Servlet

之前在练习的时候因为请求少一直没注意过这个问题,就直接一个请求新建一个Servlet,但是如果请求多了以后就会发现,需要不停的创建新的servelet以及不停的在web.xml中配置servelt,会导致项目看起来十分的杂乱,严重降低效率。于是就需要去思考,如何将一系列的请求用一个servelt封装起来。

实现多个请求公用一个servelt有两种方法

方法一     在每一个请求后面跟上?method= '方法名',再在servelt更具method的值进行处理,method的值可以通过request.getParameter('method')获取

优点--便于理解,实现简单

缺点--麻烦,不利于维护,每加一个方法就要加一层选择结构

首先是web.xml中对这个servlet类进行配置

<servlet>
    <servlet-name>mrequest</servlet-name>
    <servlet-class>Controller.MRServlet</servlet-class>
</servlet>
    
<servlet-mapping>
    <servlet-name>mrequest</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

然后是jsp中的代码

<body>
    <h3>
        <a href="hello?method=add"> 增加</a>
    </h3>

    <h3>
        <a href="hello?method=delete"> 删除</a>
    </h3>

    <h3>
        <a href="hello?method=modify"> 更改</a>
    </h3>
</body>

最后是servlet中的代码

public class MRServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        //request.getRequestDispatcher("success.jsp").forward(request,response);
        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");//设置页面编码
        String method = request.getParameter("method");//获取method中的值
        if("add".equals(method)){//通过选择结构根据method的去判断调用类中的哪个方法
            add(request,response);
        }else if("delete".equals(method)){
            delete(request, response);
        }else if("modify".equals(method)){
            modify(request,response);
        }
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException {
        doPost(request, response);
    }

    private void add(HttpServletRequest request,HttpServletResponse response) 
        throws ServletException, IOException{

        PrintWriter out = response.getWriter();
        out.println("<h1>增加</h1>");
    }
    
    private void delete(HttpServletRequest request,HttpServletResponse response) 
        throws ServletException, IOException{
        PrintWriter out = response.getWriter();
        out.println("<h1>删除</h1>");
    }
    
    private void modify(HttpServletRequest request,HttpServletResponse response) 
        throws ServletException, IOException{
        PrintWriter out = response.getWriter();
        out.println("<h1>修改</h1>");
    }
}

方法二     利用java的反射机制,当然上一种方法种截取出方法名后也可以直接利用反射,本质上讲,这两种方法,只要截取出方法名后,你是利用选择结构还是反射,是可以随便选的。

优点--便于维护

缺点--较难理解

现在web.xml中对servlet进行配置

<servlet>
    <servlet-name>invokeServlet</servlet-name>
    <servlet-class>Controller.InvokeServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>invokeServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

然后是jsp中的代码

<body>
    <h3>
        <a href="add.do"> 增加</a>
    </h3>
    
    <h3>
        <a href="delete.do"> 删除</a>
    </h3>
    
    <h3>
        <a href="modify.do"> 更改</a>
    </h3>
</body>

最后是servelt中的代码

public class InvokeServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");//设置页面编码

        String URL = String.valueOf(request.getRequestURL());
        String method = URL.substring(URL.lastIndexOf("/")+1,URL.lastIndexOf("."));
        //获取URL的值并通过截取函数截出method的值,通过反射,会更具method的值匹配方法
        try{
            Class c = this.getClass();//获取本类对象
            //获取method对象            
            Method m = c.getDeclaredMethod(method,HttpServletRequest.class,HttpServletResponse.class);
            m.invoke(this,request,response);//激活方法
        }catch (Exception e){
            e.printStackTrace();
        }

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
        doPost(request, response);
    }

    private void add(HttpServletRequest request,HttpServletResponse response) 
        throws ServletException, IOException{

        PrintWriter out = response.getWriter();
        out.println("<h1>增加</h1>");
    }

    private void delete(HttpServletRequest request,HttpServletResponse response) 
        throws ServletException, IOException{
        PrintWriter out = response.getWriter();
        out.println("<h1>删除</h1>");
    }

    private void modify(HttpServletRequest request,HttpServletResponse response) 
        throws ServletException, IOException{
        PrintWriter out = response.getWriter();
        out.println("<h1>修改</h1>");
    }
}

界面样式

方法一结果

方法二结果

最后如果我们学了一些框架,比如SpringMVC,可以有更简单的方式解决这个问题。比如springMVC就可以通过多级注解的方式,整合多个请求到一个类中。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值