本文共 6295 字,大约阅读时间需要 20 分钟。
web开发中,servlet和jsp的交互会很多,servlet也必须根据前端情况创建很多。参考的图。
所以要考虑创建要BaseServlet,将重复的东西归到一起,然后让其他的servlet继承该类,其他servlet只需要根据实际情况进行方法的改变。
案例
1.0版本
根据前端需求,这里需要实现 【注册servlet】、【用户名是否注册过的servlet】以及【登录servlet】,一般我们需要建立三个servlet以实现该功能。
这里我们建立一个【UserServlet】来实现这三个方法。
前端能够调用某一方法的方式,就是依靠url地址【重点】: 【http://localhost:8080/rj_xiaomi/userservlet?method=register】 问号后面的就是调用的具体方法,servlet可以获取method参数,拿到参数下面的value值,然后根据值执行对应的方法。
@WebServlet(name = "UserServlet", value = "/userservlet")public class UserServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*这需要进行判断,从而调用具体的方法*/ String method = request.getParameter("method"); if (method.equals("register")) { register(); } else if (method.equals("login")) { login(); } else if (method.equals("checkUsername")) { checkUsername(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /*注册方法*/ public void register() { System.out.println("注册servlet"); } /*登录方法*/ public void login() { System.out.println("登录servlet"); } /*用户名是否存在*/ public void checkUsername() { System.out.println("检查用户名是否存在servlet"); }}
2.0版本
虽然实现了目标,但如果servlet很多的话,判断语句也要写很多,非常繁琐,可以使用反射获取方法名,根据方法名执行对应的方法。
@WebServlet(name = "UserServlet", value = "/userservlet")public class UserServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /*这需要进行判断,从而调用具体的方法*/ String methodName = request.getParameter("method"); try { Method method = this.getClass().getMethod(methodName); //相当于是 this.method(),前面获取了methodName,根据名字找到了具体对应方法 method.invoke(this); } catch (Exception e) { e.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } /*注册方法*/ public void register() { System.out.println("注册servlet"); } /*登录方法*/ public void login() { System.out.println("登录servlet"); } /*用户名是否存在*/ public void checkUsername() { System.out.println("检查用户名是否存在servlet"); }}
3.0版本
我只是是用来一个UserServlet类,如果还有其他的类,比如订单类OrderServlet类等等,都要重复使用反射中的方法,所以,我们要将重复的部分抽离出来,形成【BaseServlet】。
BaseServlet继承HttpServlet,让其他的servlet类继承BaseServlet即可,这样,其他servlet既可使用反射方法,又有HttpServlet中方法。
还有一个重要的问题,就是一旦分开,则需要其他servlet类传入request和response参数,才能实现转发和重定向等功能,所以,这次,我们的方法有了参数。
/*BaseServlet类*///该类不需要注解,因为不与前端发生关系,只是类方法的抽取,具体实现依靠子类public class BaseServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String methodName = request.getParameter("method"); try { Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); method.invoke(this, request, response); } catch (Exception e) { e.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); }}/*UserServlet类*/@WebServlet(name = "UserServlet", value = "/userservlet")public class UserServlet extends BaseServlet { /*注册方法*/ public void register(HttpServletRequest request, HttpServletResponse response) { System.out.println("注册servlet"); } /*登录方法*/ public void login(HttpServletRequest request, HttpServletResponse response) { System.out.println("登录servlet"); } /*用户名是否存在*/ public void checkUsername(HttpServletRequest request, HttpServletResponse response) { System.out.println("检查用户名是否存在servlet"); }}
4.0版本
最后要解决的是重定向和转发的路径问题,我们可以这样要求:
- 返回一个字符串
- 如果是重定向,则字符串格式为【redirect : / servlet 】或者【redirect : / index.jsp】等等
- 如果是转发,则直接书写【/servlet】或者【/index.jsp】等等
- 在BaseServlet中去判断,根据判断结果进行重定向或者转发
/*BaseServlet*/public class BaseServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String methodName = request.getParameter("method"); try { Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class); String url = (String) method.invoke(this, request, response); if (url != null && url.trim().length() != 0) { //url不是空,而且不是0,说明是要转发或者重定向,定义规则,如果有"redirect:"说明要重定向 if (url.startsWith("redirect:")) { //重定向 response.sendRedirect(request.getContextPath() + url.split(":")[1]); } else { //转发 request.getRequestDispatcher(url).forward(request, response); } } } catch (Exception e) { e.printStackTrace(); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); }}/*UserServlet*/@WebServlet(name = "UserServlet", value = "/userservlet")public class UserServlet extends BaseServlet { /*注册方法,返回字符串,即重定向或者转发的内容*/ public String register(HttpServletRequest request, HttpServletResponse response) { System.out.println("注册servlet"); return "redirect:/login.jsp"; } /*登录方法*/ public String login(HttpServletRequest request, HttpServletResponse response) { System.out.println("登录servlet"); return "/listservlet"; } /*用户名是否存在*/ public String checkUsername(HttpServletRequest request, HttpServletResponse response) { System.out.println("检查用户名是否存在servlet"); return "redirect:/login.jsp"; }}
技巧
由于返回的是字符串类型,所以完全可以直接使用本类其他方法,直接实现转发功能,比如,在【UserServlet】中有一个【show()】方法,是用来展示用户的,该方法返回值是转发给前端页面,后面还有其他的筛选或者操作方法,这些方法执行完毕后都需要【返回展示界面】,我们就可以直接调用【show()】。return show(request, response);
转载地址:https://blog.csdn.net/qq_45337431/article/details/100713578 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!