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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36737934/article/details/82911374

        前言:自从接触了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方法名,效果如图:

猜你喜欢

转载自blog.csdn.net/qq_36737934/article/details/82911374