一个Servlet中可以有多个处理请求的方法

本文介绍了一种在Servlet中实现多个请求处理方法的设计方案——BaseServlet。通过客户端发送请求时指定的方法参数,利用反射机制调用相应的处理方法,简化了传统每个请求对应一个Servlet的复杂度。

BaseServlet


 

一个请求写一个Servlet太过复杂和麻烦,我们希望在一个Servlet中可以有多个处理请求的方法。

客户端发送请求时,必须给出一个参数,用来说明要调用的方法

方法的结构和service()方法的结构一样

初始版


 

当我们访问Servlet时,发生了那些操作?

  首先是通过<url-pattern>找到<servlet-name>,通过<serlvet-name>最终找到<servlet-class>,也就是类名,在通过反射得到Serlvet对象。

  再由tomcat调用init()、service()、destroy()方法,这一过程是Servlet的生命周期。在HttpServlet里有个service()的重载方法。ServletRequest、ServletResponse经过service(ServletRequest req,ServletResponse resp)方法转换成Http格式的。再在service(HttpServletRequest req,HttpServletResponse resp)中调用doGet()或者doPost()方法。

  路径:http://localhost:8080/baseservlet/base?method=addUser

 

 1 public class BaseServlet extends HttpServlet{
 2 
 3     @Override
 4     protected void service(HttpServletRequest req, HttpServletResponse resp)
 5             throws ServletException, IOException {
 6         String method = req.getParameter("method");//获取要调用的方法,其中的value="method"是自己约定的
 7         if("addUser".equals(method)){
 8             addUser(req,resp);
 9         }
10         if("deleteUser".equals(method)){
11             deleteUser();
12         }
13     }
14  
15     private void deleteUser() {
16         System.out.println("deleteUser()");
17     }
18  
19     private void addUser(HttpServletRequest req, HttpServletResponse resp) {
20         System.out.println("add()");
21          
22     }     
23 }

改进版


 

很显然,上面的代码不是我们想要的。

 1 public class BaseServlet extends HttpServlet{
 2  
 3     @Override
 4     protected void service(HttpServletRequest req, HttpServletResponse resp)
 5             throws ServletException, IOException {
 6         String name = req.getParameter("method");//获取方法名
 7         if(name == null || name.isEmpty()){
 8             throw new RuntimeException("没有传递method参数,请给出你想调用的方法");
 9         }
10         Class c = this.getClass();//获得当前类的Class对象
11         Method method = null;
12         try {
13             //获得Method对象
14             method =  c.getMethod(name, HttpServletRequest.class,HttpServletResponse.class);
15         } catch (Exception e) {
16             throw new RuntimeException("没有找到"+name+"方法,请检查该方法是否存在");
17         }
18          
19         try {
20             method.invoke(this, req,resp);//反射调用方法
21         } catch (Exception e) {
22             System.out.println("你调用的方法"+name+",内部发生了异常");
23             throw new RuntimeException(e);
24         }
25          
26     }
27 }

在项目中,用一个Servlet继承该BaseServlet就可以实现多个请求处理。

 

文章转载自:https://www.cnblogs.com/ckui/p/6002029.html

转载于:https://www.cnblogs.com/bobhe1818/p/8471450.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值