[原创]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)理解反射获取当前类,获取提交的方法,及解析,调用相应的方法;