博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
web开发之BaseServlet的使用
阅读量:3963 次
发布时间:2019-05-24

本文共 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版本

最后要解决的是重定向和转发的路径问题,我们可以这样要求:

  1. 返回一个字符串
  2. 如果是重定向,则字符串格式为【redirect : / servlet 】或者【redirect : / index.jsp】等等
  3. 如果是转发,则直接书写【/servlet】或者【/index.jsp】等等
  4. 在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);

转载地址:http://jpgzi.baihongyu.com/

你可能感兴趣的文章
Java 白皮书
查看>>
在Windows XP中安装Java SE
查看>>
使用记事本(Notepad)开发一个 hello world 程序
查看>>
Java语言规范
查看>>
字符组
查看>>
单词分界符
查看>>
Spring Batch 精萃
查看>>
Spring Batch 环境设置
查看>>
字符组转译序列
查看>>
字符转译序列
查看>>
Java 数据类型
查看>>
UTF-16 编码简介
查看>>
Java 变量名
查看>>
Java 四舍五入运算
查看>>
Spring Batch 例子: 运行系统命令
查看>>
解析输入
查看>>
格式化输出
查看>>
Java 大数值
查看>>
括号及后向引用
查看>>
Spring Batch 核心概念
查看>>