[原创]java WEB学习笔记22:MVC案例完整实践(part 3)---多个请求对应一个Servlet解析

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用

内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系。

本人互联网技术爱好者,互联网技术发烧友

微博:伊直都在0221

QQ:951226918

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

多个请求对应一个Servlet解析

如果我们每一个请求对应一个Servelt,这样的话,代码就显得比较臃肿,最主要的是,也不方便系代码的管理和优化

 

方式一:

  

 

  1. 思路:对于每一个页面请求我们设置成一个对应的方法,并且为请求的url设置相应的method参数,servlet-mapping 为  @WebServlet("/customerServlet")  ,而在Servlet 中通过获取 method 参数不同的取值,通过一个switch 语句选择不同的方法,同时调用不同的方法。

  

  2. 代码:test1.jsp ,  CustomerServlet1.java

  test.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>测试</title>
 8 </head>
 9 <body>
10         
11             <a href="customerServlet?method=add">Add1</a>
12             <br><br>
13         
14             <a href="customerServlet?method=query">Query1</a>
15             <br><br>
16         
17             <a href="customerServlet?method=delete">Delete1</a>
18             <br><br>
19             <br><br>
20             <br><br>
21             
22             
23         
24 </body>
25 </html>

  CustomerServlet1.java

 1 package com.jason.mvcapp.servlet;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.annotation.WebServlet;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 /**
11  * Servlet implementation class CustomerServlet
12  */
13 @WebServlet("/customerServlet")
14 public class CustomerServlet1 extends HttpServlet {
15     private static final long serialVersionUID = 1L;
16 
17     /**
18      * 
19      */
20     protected void doGet(HttpServletRequest request,
21             HttpServletResponse response) throws ServletException, IOException {
22         doPost(request, response);
23     }
24 
25     protected void doPost(HttpServletRequest request,
26             HttpServletResponse response) throws ServletException, IOException {
27 
28         String method = request.getParameter("method");
29 
30         switch (method) {
31         case "add":
32             add(request, response);
33             break;
34         case "query":
35             query(request, response);
36             break;
37         case "delete":
38             delete(request, response);
39             break;
40         }
41 
42     }
43 
44     private void delete(HttpServletRequest request, HttpServletResponse response)
45             throws ServletException, IOException {
46         System.out.println("delete");
47 
48     }
49 
50     private void query(HttpServletRequest request, HttpServletResponse response)
51             throws ServletException, IOException {
52         System.out.println("query");
53 
54     }
55 
56     private void add(HttpServletRequest request, HttpServletResponse response)
57             throws ServletException, IOException {
58         System.out.println("add");
59     }
60 
61 }

方法二:

  1. 思路:将所有的请求都设置成 方法名.do, 而将 servlet-mapping 为 @WebServlet("*.do")即响应所有以 .do 结尾的请求.在Servlet中通过反射,获取运行时类,之后invoke() 调用方法

  2.代码:test2.jsp ,  CustomerServlet2.java

  test2.jsp

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>测试2</title>
 8 </head>
 9 <body>
10 
11             <a href="addCustomer.do">Add2</a>
12             <br><br>
13         
14             <a href="query.do">Query2</a>
15             <br><br>
16         
17             <a href="deleteCustomer.do">Delete2</a>
18             <br><br>
19             
20             <a href="update.do">Update2</a>
21             <br><br>
22             
23             <a href="editeCustomer.do">Edite2</a>
24             <br><br>
25             
26 
27 </body>
28 </html>

  CustomerServlet2.java

 1 package com.jason.mvcapp.servlet;
 2 
 3 import java.io.IOException;
 4 import java.lang.reflect.InvocationTargetException;
 5 import java.lang.reflect.Method;
 6 
 7 import javax.servlet.ServletException;
 8 import javax.servlet.annotation.WebServlet;
 9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 
13 /**
14  * Servlet implementation class CustomerServlet2
15  */
16 @WebServlet("*.do")
17 public class CustomerServlet2 extends HttpServlet {
18     private static final long serialVersionUID = 1L;
19 
20     protected void doGet(HttpServletRequest request,
21             HttpServletResponse response) throws ServletException, IOException {
22         doPost(request, response);
23     }
24 
25     protected void doPost(HttpServletRequest request,
26             HttpServletResponse response) throws ServletException, IOException {
27         //1.获取servletPath:/add.do 或者 query.do
28         String serveltPath = request.getServletPath();
29         
30          System.out.println(serveltPath);
31         //2.去除/ 和 .do 得到对应的方法,如 add  query
32         String methodName = serveltPath.substring(1);
33         methodName = methodName.substring(0, methodName.length() - 3);
34         // System.out.println(methodName);
35 
36         try {
37             //3.利用反射获取methodName对应的方法
38             Method method = getClass().getDeclaredMethod(methodName,
39                     HttpServletRequest.class, HttpServletResponse.class);
40             
41             //4.利用反射调用方法
42             method.invoke(this, request, response);
43         } catch (Exception e) {
44 
45             e.printStackTrace();
46         }
47     }
48 
49     
50     
51     private void update(HttpServletRequest request, HttpServletResponse response)
52             throws ServletException, IOException {
53         System.out.println("update");
54 
55     }
56 
57     private void editeCustomer(HttpServletRequest request,
58             HttpServletResponse response) throws ServletException, IOException {
59         System.out.println("edit");
60 
61     }
62 
63     private void deleteCustomer(HttpServletRequest request,
64             HttpServletResponse response) throws ServletException, IOException {
65         System.out.println("delete");
66 
67     }
68 
69     private void query(HttpServletRequest request, HttpServletResponse response)
70             throws ServletException, IOException {
71         System.out.println("query");
72 
73     }
74 
75     private void addCustomer(HttpServletRequest request,
76             HttpServletResponse response) throws ServletException, IOException {
77         System.out.println("add");
78     }
79 
80 }

总结:

  1)理解由方式一过度到方法二;

  2)理解反射获取当前类,获取提交的方法,及解析,调用相应的方法;

原文地址:https://www.cnblogs.com/jasonHome/p/5528628.html