利用Java反射机制抽取BaseServlet实现类似SpringBoot的注解请求

        前言:自从接触了SpringBoot之后,我就发现自己彻底的回不去了,因为不用写SQL语句,不用自己考虑页面跳转,不用管理数据库连接池,不用写一大堆的配置文件等特性,让我深深的爱上了它,并且离不开了;奈何学校开课要求做Java web课程设计,必须只使用原生的Servlet和Apache的那一堆开源jar包开发,哇,这让习惯了使用SpringBoot开发后台的我,简直是不能忍,于是就想着用个什么方式去实现类似SpringBoot的Controller那样,只需要写一个返回String的方法,加上一个注解,然后返回指定的路径就能请求到jsp页面的那样快捷方便的方式,由于本人有着一些做上线项目开发的经验,加上自己对原生的Java和Servlet比较熟悉,所以就想到了抽取出一个BaseServlet,帮我们来做这个事情,这样的话,就不用每次都写转发了,那样写多了很烦人的,一点都不能代码复用,好了,废话说多了,接下来放代码:

package wiki.zimo.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 *
 * @auther: 子墨
 * @datetime: 2018/10/30 11:01
 * @describe: 所有Servlet的父类,利用反射技术加上一个method参数,实现一个Servlet可以处理多个请求
 */
public class BaseServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    	request.setCharacterEncoding("utf-8");
    	response.setCharacterEncoding("utf-8");
    	response.setContentType("text/html;charset=utf-8");
    	
        // 获取到请求参数method
        String methodName = request.getParameter("method");

        // 如果是空,默认方法名是index->请求主页
        if(methodName == null || methodName.trim().length() == 0) {
            methodName = "index";
        }

        // 当请求参数不为空的时候
        if(methodName != null) {
            // 利用java的反射机制,找到对应的方法,并获取到方法的返回值,如果返回为一个路径,那么进行统一的处理
            try {
                Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
                String path = (String) method.invoke(this, request,response);
                if(path != null) {
                    // 返回值不为空,统一处理请求转发和重定向
                    if (path.contains(":")){
                        // 判断是转发还是重定向
                        String []paths = path.split(":");
                        if (paths[0].equalsIgnoreCase("forward")){
                            request.getRequestDispatcher(paths[1]).forward(request, response);
                        }else if (paths[0].equalsIgnoreCase("redirect")){
                            response.sendRedirect(paths[1]);
                        }
                        return;
                    }
                    // 默认不写是请求转发
                    request.getRequestDispatcher(path).forward(request, response);
                }
            } catch (NoSuchMethodException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SecurityException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

上面的代码注释比较详细,大家应该能看懂。

接下来说说怎么使用这个BaseServlet类实现类似Springboot的Controller的效果,

第一步:新建一个Servlet继承自BaseServlet,我这里命名为TestServlet

package wiki.zimo.servlet;

public class TestServlet extends BaseServlet {
}

第二步,在TestServlet里面创建一个公有的,注意,一定要是public的方法,返回Spring,返回的String就是我们需要请求的页面,一般是放在webapp下的

public String test(HttpServletRequest request, HttpServletResponse response){
        return "test.jsp";
    }

贴出test.jsp的代码

<%--
  Created by IntelliJ IDEA.
  User: 子墨
  Date: 2018/9/30
  Time: 16:59
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


测试

代码就这样愉快的写完了,那么怎么去请求到我们的test.jsp页面呢?答案很简单,只需要在请求jsp的时候加上方法名这个参数即可,请注意,这里的方法名是我们在TestServlet中自己写的那个返回String方法名,效果如图:

利用Java反射机制抽取BaseServlet实现类似SpringBoot的注解请求_第1张图片

这个BaseServlet还可以帮助我们完成在一个servlet中处理多个请求的事情。大家都知道,原生的Servlet一次只能处理一个请求,如果要完成大量的工作的话,就需要写大量的Servlet类,显然不利于管理,但是只要我们有了BaseServlet,我们就可以在一个Servlet中完成很多事情,比如说,用户管理这么一个功能:以前用原生的Servlet开发的话,我们至少需要写四个Servlet分别完成增删查改的操作,可能规范点的命名会是:UserAddServlet、UserDeleteServelt、UserSearchServlet、UserUpdateServlet这样的,每个小功能都是一个servlet去处理,这样就显得冗余麻烦,然后现在我们有了BaseServlet过后,我们只需要写一个UserServlet,然后在里面写四个方法,分别处理用户的增删查改就好了。

如果不想在自己的项目里面写BaseServlet,也可以导入我写好的jar包,下载链接:https://download.csdn.net/download/qq_36737934/11253478

下载下来,复制到 /你的项目/WebContent/WEB-INF/lib 这个目录下即可。

你可能感兴趣的:(Java,Web)