这个注解完成了一个 Servlet 代理多个请求。
ServletMapping 注解
1@Target({ElementType.METHOD})
2@Retention(RetentionPolicy.RUNTIME)
3@Documented
4@Inherited
5public @interface ServletMapping {
6 String value() default "";
7}
注解使用
1import cn.liuqichun.annotation.ServletMapping;
2import cn.liuqichun.dao.UserDao;
3import cn.liuqichun.entity.User;
4import cn.liuqichun.utils.Result;
5import com.fasterxml.jackson.databind.ObjectMapper;
6
7import javax.servlet.ServletException;
8import javax.servlet.annotation.WebServlet;
9import javax.servlet.http.HttpServlet;
10import javax.servlet.http.HttpServletRequest;
11import javax.servlet.http.HttpServletResponse;
12import java.io.IOException;
13import java.lang.reflect.Method;
14import java.sql.SQLException;
15import java.util.List;
16import java.util.concurrent.ConcurrentHashMap;
17
18/**
19 * Description: 处理用户相关请求,通过反射+注解代理所有用户相关方法
20 *
21 * @author: liuqichun
22 */
23@WebServlet(urlPatterns = {"/user", "/user/*"})
24public class UserServlet extends HttpServlet {
25
26 private final ObjectMapper json = new ObjectMapper();
27
28 private final UserDao userDao = new UserDao();
29
30 private final static ConcurrentHashMap<String, Method> uriMap;
31
32 @ServletMapping("/user/register")
33 private void registerUser(HttpServletRequest request, HttpServletResponse response) throws IOException {
34 // 业务逻辑
35 }
36
37 @ServletMapping("/user/login")
38 private void login(HttpServletRequest request, HttpServletResponse response) throws IOException{
39 // 业务逻辑
40 }
41
42 @ServletMapping("/user/del")
43 private void del(HttpServletRequest request, HttpServletResponse response) throws IOException{
44 // 业务逻辑
45 }
46
47 @ServletMapping("/user/modify")
48 private void modify(HttpServletRequest request, HttpServletResponse response) throws IOException{
49 // 业务逻辑
50 }
51
52 @ServletMapping("/user/list")
53 private void userList(HttpServletRequest request, HttpServletResponse response) throws IOException{
54 // 业务逻辑
55 }
56
57
58 // config operate -----------------------------------------------------------------
59 static{
60 uriMap = new ConcurrentHashMap<String, Method>();
61 Method[] methods = UserServlet.class.getDeclaredMethods();
62
63 for (Method m : methods) {
64 ServletMapping annotation = m.getAnnotation(ServletMapping.class);
65 if (annotation != null) {
66 String uri = annotation.value();
67 System.out.println("annotation.value() = " + annotation.value());
68 if (uri.length() > 0) {
69 uriMap.put(uri, m);
70 } else {
71 System.err.println("[ERROR] 存在非法的注解");
72 }
73 }
74 }
75 }
76
77 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
78 String uri = request.getRequestURI();
79 Method method = uriMap.get(uri);
80 if (method != null) {
81 try {
82 method.invoke(this, request, response);
83 } catch (Exception e) {
84 e.printStackTrace();
85 }
86 }else{
87 response.setStatus(400);
88 json.writeValue(response.getOutputStream(), Result.error("请求异常"));
89 System.err.println("[ERROR] 处理方法异常");
90 }
91 }
92
93 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
94 doPost(request, response);
95 }
96}
总结
在 Java 项目中(多是基于 Spring)大量用到了注解,注解提供了方法额外的信息,例如可以放置方法的备注,这些备注可以在程序运行时获取,这对于日志系统很有帮助,还有放置方法的访问权限,目前绝大多数鉴权框架都是用注解进行标记,注解为类或方法提供了额外信息的解耦,而且用起来很方便。
讲注解的一些文章:
[1] https://blog.csdn.net/javazejian/article/details/71860633 [2] https://ifeve.com/java-annotations/ [3] https://www.runoob.com/w3cnote/java-annotation.html [4] https://www.liaoxuefeng.com/wiki/1252599548343744/1265102413966176