概述

在学习注解的时候,学了个懵懵懂懂。学了JavaWeb之后,在做Demo项目的过程中,借助注解和反射实现了对页面按钮的权限控制,对于注解才算咂摸出了点味儿来。

需求

以"角色列表"页面为例,该页面包含"新建","编辑","启用/禁用","删除"四个权限。根据用户所属角色的权限,来控制这些按钮是否显示。问题是,如何确定哪些页面下包含哪些按钮?

实现

定义注解

  1. package com.ttpfx.bean;
  2. import java.lang.annotation.*;
  3. @Target(ElementType.METHOD) // 注解的作用对象:只能用于方法
  4. @Retention(RetentionPolicy.RUNTIME) // 注解的级别:运行时有效,可以通过反射获取注解信息
  5. @Repeatable(Buttons.class) // 可重复注解: 一个方法可以有多个Button注解,一个方法的多个Button注解将组成一个Buttons返回
  6. public @interface Button {
  7. String servlet(); // ServletName
  8. String action(); // ActionName, 每个action是Servlet中的一个方法,代表一个请求地址:servletName?action=actionName
  9. String name(); // 按钮名称
  10. }
  1. package com.ttpfx.bean;
  2. import java.lang.annotation.*;
  3. @Target(ElementType.METHOD)
  4. @Retention(RetentionPolicy.RUNTIME)
  5. public @interface Buttons {
  6. Button[] value(); // Button注解的数组,通过Btuuons.value()获取页面的多个Button
  7. }

在Servlet中使用注解

  1. public class RoleServlet extends BaseServlet {
  2. private RoleService roleService = new RoleServiceImpl();
  3. // RoleServlet.index() 对应角色列表页面,访问地址为:/role?action=index
  4. // 该页面包含"新建","编辑","启用/禁用","删除"四个权限
  5. @Button(servlet = "role", action = "add", name = "add")
  6. @Button(servlet = "role", action = "edit", name = "edit")
  7. @Button(servlet = "role", action = "changeStatus", name = "changeStatus")
  8. @Button(servlet = "role", action = "delete", name = "delete")
  9. protected void index(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  10. // ....
  11. }
  12. }

在BaseServlet中校验页面按钮的权限,并将结果保存在requestScope中

  1. // method:Servlet中的方法, 如上面RoleServlet.index()
  2. private Map<String, Boolean> getButtonPermissions(Method method) {
  3. // buttonMap是一个以Button.name为key, 以是否有权限的布尔值为value的键值对
  4. // 该结果会被保存在requestScope中,供jsp页面使用
  5. Map<String, Boolean> buttonMap = new HashMap<>();
  6. Button[] buttonAnnotations = null;
  7. // 页面有一个Button注解的时候可以直接获取
  8. // 页面有多个Button注解的时候,只能获取到Buttons注解,再通过Buttons.value()方法得到多个Button注解
  9. Buttons buttonsAnnotation = method.getAnnotation(Buttons.class);
  10. Button buttonAnnotation = method.getAnnotation(Button.class);
  11. if (buttonsAnnotation != null) {
  12. buttonAnnotations = buttonsAnnotation.value();
  13. } else if (buttonAnnotation != null){
  14. buttonAnnotations = new Button[] {buttonAnnotation};
  15. }
  16. if (buttonAnnotations != null) {
  17. for (Button button : buttonAnnotations) {
  18. // 在这里实现对每个按钮的权限验证,将结果put至buttonMap
  19. // 真正的验证过程已省略
  20. buttonMap.put(button.name, true);
  21. }
  22. }
  23. return buttonMap;
  24. }

在页面的jsp文件中,控制按钮是否显示

  1. <c:if test="${requestScope.buttonMap.add}">
  2. <button type="button">新建角色</button>
  3. </c:if>

记录Java注解在JavaWeb中的一个应用实例的更多相关文章

  1. 12C RAC中的一个数据库实例自动crash并报ORA-27157、ORA-27300等错误

    rhel7.2上安装12C RAC数据库后,其中一个数据库实例经常会自动crash.查看alert日志发现以下错误信息: Errors in file /d12/app/oracle/diag/rdb ...

  2. Confluence 6 从生产环境中恢复一个测试实例

    请参考 Restoring a Test Instance from Production 页面中的内容获得更多完整的说明. 很多 Confluence 的管理员将会使用生产实例运行完整数据和服务的 ...

  3. Java注解(3):一个真实Elasticsearch案例

    学会了技术就要使用,否则很容易忘记,因为自然界压根就不存在什么代码.变量之类的玩意,这都是一些和生活常识格格不入的东西.只能多用多练,形成肌肉记忆才行. 在一次实际的产品开发中,由于业务需求的缘故,需 ...

  4. 关于FastDFS Java客户端源码中的一个不太明白的地方

    下面代码是package org.csource.fastdfs下TrackerGroup.java文件中靠近结束的一段代码,我下载的这个源码的版本是1.24. /** * return connec ...

  5. Java对象与类中的一个小练习

    一直在Eclipse里做练习.是做一个练习,执行一个的那种.刚刚学习了Java的对象与类,练习中把类和执行放在同一包下的两个.java文件里面了.是可以执行的.(Get) 相关代码: public c ...

  6. Java 从原字符串中截取一个新的字符串 subString()

    Java 手册 substring public String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串.该子字符串从指定索引处的字符开始,直 ...

  7. 【错误记录】windows python 路径中的一个转义错误:'rawunicodeescape' codec can't decode bytes in position 112-113: truncated \uXXXX

    ur"D:\work\结构化\CSV\useful\内容.csv" 报错 编码错误原因,当路径中有\u这种字串时,即使是包含在r"" 中也会进行转义,然后转义出 ...

  8. Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序

    实例化子类时,父类与子类中的静态代码块.实例代码块.静态变量.实例变量.构造函数的执行顺序是怎样的? 代码执行的优先级为: firest:静态部分 second:实例化过程 详细顺序为: 1.父类静态 ...

  9. java如何在静态方法中访问类的实例成员

    类的静态方法是不能直接访问实例的成员的,它只能访问同类的静态成员.访问实例的成员的话,可以参考一下这个方法,那就是把静态方法的参数设置为类的实例,这样通过参数传递的方式就可以访问实例的成员了,例子如下 ...

随机推荐

  1. μC/OS-III---I笔记3---时间管理

    时间管理相关函数,其实深入根本的理解就是一些对时间任务相关变量,数据结果进行修改的函数这样方便对应任务查找延时等时间相关的任务有没有到期.前面的时间相关的函数是这些操作的基 1.延时函数 OsTIme ...

  2. JVM系列之一 JVM的基础概念与内存区域

    前言 作为一名 Java 语言的使用者,学习 JVM 有助于解决程序运行过程中出现的问题.写出性能更高的代码. 可以说:学好 JVM 是成为中高级 Java 工程师的必经之路. 有感于从未整理归纳 J ...

  3. Androidstudio 新GradlePlugin和Gradle Version对应关系

    Project Gradle AS建议升级到4.2. Plugin对应AS的版本,Plugin工具也要和Gradle对应上,否则某些语法不支持,如果是非必要的建议不要轻易升级. Gradle DSL ...

  4. vue & this.$router.resolve

    vue & this.$router.resolve gotoAutoUpdate (query = {}) { const { href } = this.$router.resolve({ ...

  5. 快速下载 Visual Studio Code

    快速下载 Visual Studio Code https://visualstudio.microsoft.com/zh-hant/downloads/ 切换 cdn https://az76429 ...

  6. free Google translator for the personal website

    free Google translator for the personal website https://html5.xgqfrms.xyz/

  7. GMV (Gross Merchandise Volume)

    GMV (Gross Merchandise Volume) 商品总销量 https://www.zhihu.com/question/20146641 GMV=1销售额+2取消订单金额+3拒收订单金 ...

  8. js 触发长按事件

    为网站添加触摸功能 <button id="btn1">长按触发</button> <button id="btn2">长按 ...

  9. NGK” 呼叫河马 “智能合约火爆全网

    最近有一款基于NGK.IO公链上的智能合约"呼叫河马"在区块链市场很火.通过访问和查阅资料可知,"呼叫河马"是一款全新的智能合约Dapp小游戏,智能合约代码是1 ...

  10. 「NGK每日快讯」12.31日NGK第58期官方快讯!