BaseServlet ——servlet的优化
servlet作用
通俗来讲servlet专门用来接收客户端的请求,专门接收客户端的请求数据,然后调用底层service处理数据并生成结果
传统的书写servlet的方法
从图片中看到,我们只是有两个类,一个用户类,一个任务类,而功能很是简单,登录注册、添加修改查询任务,而servlet的就已经是五个了,所以以后我们一个功能一个servlet,那就会非常冗余,并且用户和任务的servlet写在了一起,不好辨别什么是什么,加大了后期维护的难度。
优化思路
MVC三层架构
那我们能不能设计一个容易管理的方法,便于统一管理呢?
参照我们MVC三层架构中的service和dao层
我们来试着和他们一样,一个具体的类用一个对应的dao或service类来管理。我们便设计了BaseServlet。是不是感觉清晰了很多了呢。
然后每一个模块中的功能都抽象为一个方法。(图为UserServlet中的方法)
然后我们前端的请求路径这样写
servlet运行过程
客户端发送请求——init初始化servlet——调用service方法,自动识别post或是get请求方法。我们上面设计了每一个功能都作为一个方法,那我们要怎么去自动识别是哪一个方法呢?我们想到了反射。那我们来结合service方法和反射,去改造,让他自动识别是哪一个方法。
优化过程
- 原先我们是直接类继承HttpServlet,现在我们多了一层BaseServlet,那我们原来的类就要继承BaseServlet,然后BaseServlet去继承HttpServlet,然后重写里面的service方法。
/*BaseSevlet继承HttpServlet*/
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) {
//1.先获取请求路径
String requestUrl = req.getRequestURI();
//2.获取请求路径的最后的方法名称(详见上文url图片)
int index = requestUrl.lastIndexOf('/');
String methodName = requestUrl.substring(index + 1);
//3.获取调用对象的字节码文件
Class<? extends BaseServlet> clazz = this.getClass();
try {
//4. 通过方法名,获取类中的方法。
Method method = clazz.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
//5. 执行方法
method.invoke(this, req,resp);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
- 原来的类继承BaseServlet
/**
* @program: BaseServlet
* @description:
* @author: stop.yc
* @create: 2022-04-13 15:42
**/
//user下的,*代表任意
@WebServlet("/user/*")
public class UserServlet extends BaseServlet{
/**
* @Description: 登录servlet
* @Param: [req, resp]
* @return: void
* @Author: stop.yc
* @Date: 2022/4/13
*/
public void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//1.获取前端数据(post)请求体
BufferedReader reader = req.getReader();
String userStr = reader.readLine();
//2......
}
}
- 前端请求写法
//仅是url的举例,具体其他代码依照你的代码。
axios({
method: "post",
url: "http://localhost:8080/qg-engineering-management-system/user/login",
data: _this.user,
}).then(function (resp) {
//。。。
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。