优化并抽取Servlet
如果每实现一个功能就写一个Servlet,代码难免会显得有些冗余,如果可以稍加封装,代码的优雅性会大大提高。
用模块化的思想,用户模块写一个Servlet,商品模块写一个Servlet,管理员模块写一个Servlet,这样一个项目中Servlet的个数会大大减少,同时也利于项目的维护。
首先写一个BaseServlet
,它继承HttpServlet
,重写它的service(HttpServletRequest req, HttpServletResponse resp)方法,获取每次请求的uri,拿到uri所对应的模块功能名,例如/user/login
拿到的就是login,UserServlet
继承BaseServlet
,在UserServlet
中直接写逻辑代码,方法名与访问uri的地址后模块功能名保持一致即可。
这样一来每次发出一个请求,映射到地址/user/*
下,被UserServlet
所捕获,UserServlet
中没有重写service方法,那么自动调用它父类的service方法,也就是我们在BaseServlet
中重写的service方法,让它去执行请求,它得出请求的uri是/user/login
,拿到方法名login,拿到调用service方法的对象this,利用反射去调用方法,即可实现登录的逻辑。
代码如下:
package com.briup.test;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/*
优化并抽取servlet。(考点:service)
*/
@WebServlet("/随便写")
public class BaseServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String uri = req.getRequestURI();
// /user/login /user/register /admin/login /admin/add
String methodName = uri.substring(uri.lastIndexOf("/") + 1);
System.out.println(this + "调用了父类BaseServlet中重写的service方法,执行:" + methodName);
Class<? extends BaseServlet> clazz = this.getClass();
try {
Method method = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.briup.test;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/user/*")
public class UserServlet extends BaseServlet {
private static final long serialVersionUID = 1L;
//这里方法的权限修饰符一定要是public的
public void login(HttpServletRequest req,HttpServletResponse resp) {
System.out.println("用户登录");// /user/login
}
public void register(HttpServletRequest req,HttpServletResponse resp) {
System.out.println("用户注册");// /user/register
}
}