在学习javaweb的过程中,由于访问Servlet时定义多个Servlet显得十分繁琐,当业务逻辑操作有很多时,为避免Servlet的冗余,提高代码的可读性,我使用了动态代理机制实现一个Servlet可以实现多个业务逻辑操作。
通过创建一个Servlet的抽象类,其他Servlet通过继承这个抽象类,来实现业务逻辑的操作。抽象类中使用动态代理机制获取页面中传递的指定方法名,来执行不同的业务方法。
以下是我对动态代理机制的一些见解
由于是实现类中会包含抽象类中的方法,所以在访问Servlet时,这个this
所指定的就是所访问的Servlet这个类,并不是指抽象类。
明白这一点十分重要
-
this.getClass()
: getClass()方法是获得调用该方法的对象的类 。这里使用this调用该方法就是指获取所访问的Servlet类。 -
getDeclaredMethod(String name, Class<?>... parameterTypes)
:这个方法是指获得方法名为第一个参数name所指定的方法,后面的这个参数是name方法中的参数代表的类。当无参构造时,是获取本类中所有的方法。如果需要深入了解,请查看api文档 -
this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class)
:解读这个方法,就是通过反射获得这个Servlet类中方法名为name,参数类型为指定类的方法。 -
invoke()
:根据传入的对象实例,通过配置的实参参数来调用方法。 -
method.invoke(this,request,response)
:在这里是指通过方法的对象实例,也就是这个Servlet实现类执行上面定义的method对象所指定的方法。
public abstract class BaseServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
String action = request.getParameter("action");//页面中传递过来的参数,用来指定Servlet处理哪种业务与进行响应
try{
Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
method.invoke(this,request,response);
}catch (Exception e){
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
举个栗子,说明Servlet可以处理多个业务
我这边在一个Servlet中定义了两个方法,可以分别实现登录和注册功能
当然,你也可以添加其他Servlet,继承抽象类Servlet,通过页面中传递过来的参数,实现多种不同业务的处理与响应
@WebServlet("/userServlet")
public class UserServlet extends BaseServlet {
private UserService userService = new UserServiceImpl();
protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
User user = WebUtil.copyParamToBean(request.getParameterMap(),new User());
User loginUser = userService.login(new User(user.getUsername(), user.getPassword(), null));
if (loginUser == null){
request.setAttribute("msg","用户名或密码错误!");
request.setAttribute("username",user.getUsername());
request.getRequestDispatcher("pages/user/login.jsp").forward(request,response);
}else {
request.getSession().setAttribute("user",loginUser);
request.getRequestDispatcher("pages/user/regist_success.jsp").forward(request,response);
}
}
protected void regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Session中的验证码
String token = (String) request.getSession().getAttribute(KAPTCHA_SESSION_KEY);
request.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
//获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
String code = request.getParameter("code");
//判断验证码是否正确,正确后再进行登入操作
if (token != null && token.equalsIgnoreCase(code)){
//检查用户名是否可用
if (userService.existUserName(username)){
//不可用
request.setAttribute("msg","用户名已存在!");
request.setAttribute("username",username);
request.setAttribute("email",email);
request.getRequestDispatcher("pages/user/regist.jsp").forward(request,response);
}else {
//可用
User loginUser = new User(username,password,email);
userService.registerUser(loginUser);
request.getSession().setAttribute("user",loginUser);
request.getRequestDispatcher("pages/user/regist_success.jsp").forward(request,response);
}
}else {
request.setAttribute("msg","验证码错误!");
request.setAttribute("username",username);
request.setAttribute("email",email);
request.getRequestDispatcher("pages/user/regist.jsp").forward(request,response);
}
}
}
有任何问题请留言或私信,整理不易,有帮助的话,点个赞再走趴!