我是靠谱客的博主 漂亮星星,最近开发中收集的这篇文章主要介绍JAVA注解实现@WebServlet(一)JAVA注解实现@WebServlet前言一、创建注解RequestMapping二、创建一个继承HttpServlet的类三、创建过滤器总结,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
JAVA注解实现@WebServlet
提示:需要些反射和文件操作
文章目录
- JAVA注解实现@WebServlet
- 前言
- 一、创建注解RequestMapping
- 二、创建一个继承HttpServlet的类
- 三、创建过滤器
- 总结
前言
在学SpringMVC
时,发现@RequestMapping很好用就很想在我们普通的java项目中也能用到,就模写一个。先展示项目目录结构如下:
一、创建注解RequestMapping
代码如下(示例):
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestMapping {
public String value();
}
- @Target:用来限制注解的使用范围;ElementType.TYPE是可以在类上使用;ElementType.METHOD是可以在方法上使用
- @Retention:是声明该注解是否被虚拟机读取,默认是不被读取的;RetentionPolicy.RUNTIME就可以让虚拟机读取
- @Documented:注解表明这个注解应该被 javadoc工具记录。默认情况下,javadoc是不包括注解的。
二、创建一个继承HttpServlet的类
代码如下(示例):
@RequestMapping("/ok")
public class TestController extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.write("Hello World");
writer.close();
}
@RequestMapping("/test")
public void test(HttpServletRequest request, HttpServletResponse response) {
PrintWriter writer;
try {
writer = response.getWriter();
writer.write("test");
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
一个@RequestMapping在类上,另一个在方法上
三、创建过滤器
代码如下(示例):
@WebFilter("/*")
public class InitFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// tomcat的部署目录
String realPath = request.getServletContext().getRealPath("\WEB-INF\classes");
// servlet的目录
File file = new File(realPath + "\com\controller");
// 获取servlet目录下的所有类
String[] list = file.list();
// 强制转换
HttpServletRequest hRequest = (HttpServletRequest) request;
// 获取请求地址
String uri = hRequest.getRequestURI();
// 获取项目的uri
String path = hRequest.getContextPath();
// 打印查看
System.out.println(uri);
for (String string : list) {
// 截取类名称
String name = string.substring(0, string.lastIndexOf("."));
try {
// 通过反射获取Class对象
Class c = Class.forName("com.controller." + name);
// 判断该类上是否有RequestMapping注解
String value = "";
if (c.isAnnotationPresent(RequestMapping.class)) {
// 获取注解,进行强制转换成RequestMapping对象
RequestMapping annotation = (RequestMapping)c.getAnnotation(RequestMapping.class);
// 获取RequestMapping对象的值
value += annotation.value();
System.out.println(path + value);
}
// 获取所有的方法
// 没有就调用父类的service方法
Method[] methods = c.getDeclaredMethods();
// 创建servlet对象
Servlet servlet = request.getServletContext().createServlet(c);
// 循环遍历判断是否RequestMapping这个注解
for (Method method : methods) {
if(method.isAnnotationPresent(RequestMapping.class)) {
RequestMapping meRequestMapping = (RequestMapping)method.getAnnotation(RequestMapping.class);
String meValue = meRequestMapping.value();
// 如果有就调用相印的方法
if (uri.equals(path + value + meValue)) {
method.invoke(servlet, request, response);
}
}
}
servlet.service(request, response);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
到这基本上就好了,最后我们进行测试
总结
在研究这个时,看了源码一脸懵,就去百度,就是搜不到类似的,所以自己写一个,提供大家研究,以便指出我的不足。
最后
以上就是漂亮星星为你收集整理的JAVA注解实现@WebServlet(一)JAVA注解实现@WebServlet前言一、创建注解RequestMapping二、创建一个继承HttpServlet的类三、创建过滤器总结的全部内容,希望文章能够帮你解决JAVA注解实现@WebServlet(一)JAVA注解实现@WebServlet前言一、创建注解RequestMapping二、创建一个继承HttpServlet的类三、创建过滤器总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复