利用Java反射机制抽取BaseServlet实现类似SpringBoot的注解请求
前言:自从接触了SpringBoot之后,我就发现自己彻底的回不去了,因为不用写SQL语句,不用自己考虑页面跳转,不用管理数据库连接池,不用写一大堆的配置文件等特性,让我深深的爱上了它,并且离不开了;奈何学校开课要求做Java web课程设计,必须只使用原生的Servlet和Apache的那一堆开源jar包开发,哇,这让习惯了使用SpringBoot开发后台的我,简直是不能忍,于是就想着用个什么方式去实现类似SpringBoot的Controller那样,只需要写一个返回String的方法,加上一个注解,然后返回指定的路径就能请求到jsp页面的那样快捷方便的方式,由于本人有着一些做上线项目开发的经验,加上自己对原生的Java和Servlet比较熟悉,所以就想到了抽取出一个BaseServlet,帮我们来做这个事情,这样的话,就不用每次都写转发了,那样写多了很烦人的,一点都不能代码复用,好了,废话说多了,接下来放代码:
package com.bolopi.pub.servlet;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
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方法,实现代码复用
* @author 子墨
* @date 2018年5月28日 上午10:43:17
*/
@WebServlet("/BaseServlet")
public class BaseServlet extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取到请求参数method
String methodName = request.getParameter("method");
// 如果是空,默认方法名是index->请求主页
if(methodName == null || methodName.trim().length() == 0) {
methodName = "index";
}
// System.out.println(methodName);
// 当请求参数不为空的时候
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) {
// 返回值不为空,统一处理请求转发
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();
}
}
}
/**
* 跳转到主页
* @param req
* @param res
* @return
*/
public String index(HttpServletRequest req, HttpServletResponse res) {
return "index.jsp";
}
}
上面的代码注释比较详细,大家应该能看懂。
接下来说说怎么使用这个BaseServlet类实现类似Springboot的Controller的效果,
第一步:新建一个Servlet继承自BaseServlet,我这里命名为TestServlet
package com.bolopi.pub.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" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>测试</h1>
</body>
</html>
代码就这样愉快的写完了,那么怎么去请求到我们的test.jsp页面呢?答案很简单,只需要在请求jsp的时候加上方法名这个参数即可,请注意,这里的方法名是我们在TestServlet中自己写的那个返回String方法名,效果如图: