1.概念

比如上图中客户端的操作比较多,那我们需要每一个操作建一个Servelet,最终项目结构会很混乱。
所以我们需要将用户的操作全部抽取到一起,一个Servlet搞定所有用户操作!
Servlet中原有的方法只有doGet和doPost,那怎么做到我们各种各样操作需求?
2.自定义方法
我们可以通过自己定义方法来完成各种需要的操作,由于Http协议中有一个头参数operator,可以在请求过程中在请求头中带上operator键值对,这样不同操作需求定义成不同方法的时候,通过不同的请求头中参数来判断到底调用哪个方法最后在doGet()通过条件判断调用即可
jsp代码:user.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style>
table{
font-size: 20px;
color: red;
}
</style>
</head>
<body>
<table>
<!--每个超链接上添加参数,告知服务器,要做什么事情,operator是http协议中的参数-->
<tr>
<td>
<!--${pageContext.request.contextPath}是web应用名称-->
<a href="${pageContext.request.contextPath}/user?operator=register">注册</a>
</td>
</tr>
<tr>
<td>
<a href="${pageContext.request.contextPath}/user?operator=login">登录</a>
</td>
</tr>
<tr>
<td>
<a href="${pageContext.request.contextPath}/user?operator=modifypassw">修改密码</a>
</td>
</tr>
</table>
</body>
</html>

Servlet服务器代码:
@WebServlet(urlPatterns = "/user")
public class UserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取客户端超链接的参数
String operator = request.getParameter("operator");
if ("login".equals(operator)) {
login(request, response);
} else if ("register".equals(operator)) {
register(request,response);
}
//自定义处理注册方法
public void register(HttpServletRequest request, HttpServletResponse response) {
System.out.println("收到注册请求");
//以下具体操作略
}
//自定义处理登录方法
public void login(HttpServletRequest request, HttpServletResponse response) {
System.out.println("收到登录请求");
//以下具体操作略
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
这个时候我们就达到了,一个Servlet,完成多种操作的目的。
3.改进
我们的需求会不断变多,一旦操作变多,那么doPost()中的条件会不断增加,导致代码可读性、后期维护性都很差,如图

所以我们需要对doPost中的判断进行改进。
**既然是选择不同的方法进行调用,那我们可以选择反射技术,反射调用方法!**这时就不需要if-else条件判断了
Servlet服务器代码改进:
@WebServlet(urlPatterns = "/user")
public class UserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取客户端超链接的参数
String operator = request.getParameter("operator");
//反射
try {
//获取UserServlet的类
Class<? extends UserServlet> ServletClass = this.getClass();
//通过传过来的方法名获取方法
Method method = ServletClass.getMethod(operator, HttpServletRequest.class, HttpServletResponse.class);
//调用方法
method.invoke(this, request, response);
} catch (Exception e) {
e.printStackTrace();
}
}
//处理注册方法
public void register(HttpServletRequest request, HttpServletResponse response) {
System.out.println("收到注册请求");
//以下具体操作略
}
//处理登录方法
public void login(HttpServletRequest request, HttpServletResponse response) {
System.out.println("收到登录请求");
//以下具体操作略
}
//处理修改密码方法
public void modifyPassw (HttpServletRequest request, HttpServletResponse response) {
System.out.println("收到改密请求");
//以下具体操作略
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
此时无论增加多少需求,只要增加方法定义即可,而不用修改doPost()主体
单Servlet多操作实践
本文介绍了一种在Java Web开发中使用单个Servlet处理多种客户端请求的方法。通过自定义方法和利用HTTP请求中的参数,实现了根据不同的操作需求调用相应处理逻辑的功能。进一步通过反射技术优化了条件判断逻辑,使得代码更加简洁且易于扩展。
7403

被折叠的 条评论
为什么被折叠?



