简单的利用Java的反射进行对Servlet方法的抽取
first:首先我们要明白,什么是一个servlet?
Servlet是运行在Web服务器上的代码片段(组件),用于处理用户的http请求,是Sun公司定义的JavaEE的组件规范,然而Web服务器并不只有我们见过的tomcat,先列举一下常见的web容器-服务器
1.Tomcat Apache基金组织(开源,免费)支持JavaEE的部份规范
2. webLogic:oracle公司(收费)支持所有的JAVAEE规范
3. webSphere:IBM公司(收费)支持所有的JAVAEE规范
4. JBOSS:JBOSS公司的(文档服务等收费)支持所有的JAVAEE规范
JAVAEE规范就是我们常用的JDBC,XML,JSP,Servlet,EJB等十三个规范
我有讲过servlet的结构体系并说过他们各自的作用
Servlet(接口)->GenericServlet(抽象类)->HttpServlet
second:我们要明白每次访问Servlet他会总要执行服务(service())方法
然后GenericServlet这个抽象类就是将其他生命周期方法进行(可以理解为做空),只讲service()方法改写成抽象方法,所以我们可以在这里做文章
/**
*控制台,操纵并跳转对应的方法
*/
public class DispatcherServlet extends GenericServlet{
private static final long serialVersionUID = 2931709688095184937L;
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
String methodUri = req.getRequestURI();
String methodName = methodUri.substring(methodUri.lastIndexOf("/")+1);//将你访问的uri截取
Method method;
try {
method = this.getClass().getDeclaredMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);//简单用了一下Java的反射
//这的this是谁,代表谁
method.setAccessible(true);//可写可不写,因为看你的方法类的方法是否是公共私有的-他是一个开关
method.invoke(this, req,resp);//调用methodName方法
} catch (Exception e) {
e.printStackTrace();
}
}
}
third:并创建一个类来继承这个DispatcherServlet(servlet)并写对应的方法
/**
*
* 拦截路径为 虚拟路径/login/*
* 虚拟路径一般之项目名
*
*/
@WebServlet("/login/*")
public class LoginServlet extends DispatcherServlet{
private static final long serialVersionUID = 8413304431967299782L;
public void userLogin(HttpServletRequest req,HttpServletResponse resp)throws Exception{
//方法体
}
}
他拦截/login/*的请求,就会调用父类的service方法(这就无需解释了,基础问题)如果市虚拟路径/login/userLogin他就会访问这个userLogin方法
**last:**代码还有好多拓展性,优化,比如访问一个/login/userRegister
LoginServlet 这个servlet里面没有这个对应的方法会报错,所以会有很多优化的问题,并且在前端请求访问的路径必须加上/a/b的形式,a代表一个类别,比如login是跟登录一系列的有关系的,而 b代表a里面对应的登录的一系列的方法。
对于像为什么要强转request,response之类的,可以自己根据自己的风格来做,我是在Dispatcher做的强转,对于Java的反射也只是会一些皮毛,如果要是想问LoginServlet里面的方法为什么抛异常,这个问题,你可以先去编一编,就会知道了,动一动手的啊!