Struts2自定义标签——通过自定义标签实现权限控制

来源:互联网 发布:it名片 编辑:程序博客网 时间:2024/05/17 03:21
  • 近期在开发中遇到一种需求:根据用户的权限决定是否显示某操作按钮。

例如:若用户拥有删除数据的权限,则在界面中显示“删除”按钮;若用户无该权限,则界面中不显示相应按钮。

这样,就需要用到自定义标签了。


要定义Struts2的自定义标签,只需三步:

  1. 定义一个Component类,并继承自org.apache.struts2.components.Component;
  2. 定义一个Tag类,并继承自import org.apache.struts2.views.jsp.ComponentTagSupport;
  3. 在WEB-INF目录下创建相应的LTD文件

下面就来逐一实现:

step1:定义Component类

Component,顾名思义是“组件”。这其中封装了标签需要的处理逻辑。

我们定义的Component类需要继承org.apache.struts2.components.Component;。在父类中,有两个方法比较重要,分别是:start()方法和end()方法,这两个方法分别对应了开始标签结束标签,我们可以通过这两个方法来对标签进行操作。
此外,若标签需要属性,则应该在本类中定义相应属性,并提供相应的get()set()方法,用于封装这些属性。
然后,我们就可以对标签及属性进行处理了。

这里给出我的代码,实现的功能是:将当前每一个要显示的按钮的URL地址用户所拥有的权限对应的URL比较,若用户有权限访问该URL,则显示按钮,否则将不显示任何内容。

package qdgxy.tag;import com.opensymphony.xwork2.util.ValueStack;import org.apache.struts2.components.Component;import qdgxy.domain.User;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import java.io.IOException;import java.io.Writer;public class AComponent extends Component {    private String actionURL;    private String value;    private String onclick = "";    private HttpServletRequest request;    @Override    public boolean start(Writer writer) {        HttpSession session = request.getSession();        User user = (User) session.getAttribute("user");        if (user.hasPrivilegeByURL(actionURL)) {            try {                writer.write("<a href='" + formatURL(actionURL) + "' onClick='" + onclick + "'>" + value + "</a>");            } catch (IOException e) {                e.printStackTrace();            }            return true;        } else {            return super.start(writer);        }    }    private String formatURL(String url) {        int index = url.indexOf('?');        if (index != -1) {            String params = url.substring(index);            url = url.substring(0, index) + ".action" + params;        } else {            url = url + ".action";        }        return url;    }    public AComponent(ValueStack stack, HttpServletRequest request) {        super(stack);        this.request = request;    }    public String getActionURL() {        return actionURL;    }    public void setActionURL(String actionURL) {        this.actionURL = actionURL;    }    public String getValue() {        return value;    }    public void setValue(String value) {        this.value = value;    }    public String getOnclick() {        return onclick;    }    public void setOnclick(String onclick) {        this.onclick = onclick;    }}

step2:定义Tag类

Tag类,说白了就是我们所使用的标签。

创建Tag类,首先需要继承org.apache.struts2.views.jsp.ComponentTagSupport类。

然后,重写getBean()方法和populateParams()方法。

  • getBean()方法用于返回标签组件的实例,即我们step1中创建的组件。
  • populateParams()方法用于填充属性,即:将我们标签中的属性封装到标签类中。因此,我们在Tag类中也需要定义相应属性并提供get()set()方法。

这样,我们就可以指定组件对标签进行处理。

可能有人会有疑问:为什么我们不将标签处理逻辑直接写在Tag类中,而是要单独定义一个Component类呢?
这是因为:Struts2支持多种表现层技术,使用Component可以对不同的表现层技术使用不同的处理方式,提高程序的可扩展性。

给出我的代码:
这段代码实现的功能是:使用step1中定义的组件对标签进行处理。

package qdgxy.tag;import com.opensymphony.xwork2.util.ValueStack;import org.apache.struts2.components.Component;import org.apache.struts2.views.jsp.ComponentTagSupport;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class ATag extends ComponentTagSupport {    private String actionURL;    private String value;    private String onclick = "";    @Override    public Component getBean(ValueStack valueStack, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {        return new AComponent(valueStack, httpServletRequest);    }    @Override    protected void populateParams() {        AComponent component = (AComponent) getComponent();        component.setActionURL(actionURL);        component.setValue(value);        component.setOnclick(onclick);    }    public String getOnclick() {        return onclick;    }    public void setOnclick(String onclick) {        this.onclick = onclick;    }    public String getActionURL() {        return actionURL;    }    public void setActionURL(String actionURL) {        this.actionURL = actionURL;    }    public String getValue() {        return value;    }    public void setValue(String value) {        this.value = value;    }}

step3:在WEB-INF目录下创建TLD文件

TLD文件描述了标签的语法,如:标签有哪些属性,标签的属性是否支持表达式等内容。

我们在JSP中使用标签前,都需要引入相应的标签库,所以我们需要定义TLD文件,使JSP中能使用我们的自定义标签。

给出我定义的TLD文件,其中有几个简单的属性。

<?xml version="1.0" encoding="UTF-8"?><taglib>    <tlib-version>1.0</tlib-version>    <jsp-version>2.0</jsp-version>    <short-name>oa</short-name>    <uri>/WEB-INF/OATag.tld</uri>    <tag>        <name>a</name>        <tag-class>qdgxy.tag.ATag</tag-class>        <body-content>scriptless</body-content>        <attribute>            <name>actionURL</name>            <required>true</required>            <rtexprvalue>true</rtexprvalue>        </attribute>        <attribute>            <name>value</name>            <required>true</required>            <rtexprvalue>true</rtexprvalue>        </attribute>        <attribute>            <name>onclick</name>            <required>false</required>            <rtexprvalue>true</rtexprvalue>        </attribute>    </tag></taglib>

其中:

  • short-name:相当于前缀
  • uri:就是<%@taglib>中的uri
  • tag:一个标签
  • tag-class:标签类,就是我们的Tag类
  • body-content:标签体中能写的内容
  • attribute:属性
  • name:属性名
  • required:是否必须
  • rtexprvalue:是否支持表达式

TLD文件中的内容还有很多,更多内容可以Google一下就能获得,在此就不再赘述。


至此,我们就可以在JSP中使用自定义标签了。

使用的方式:
1. 引入标签库:<%@ taglib prefix="oa" uri="/WEB-INF/OATag.tld" %>
2. 使用标签:<oa:a actionURL="user_editUI?id=${id}" value="修改"/>

这样,在用户查看当前页面时,就能够根据用户的权限来选择是否显示操作按钮。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 剩米饭放硬了怎么办 肉罐头拉环断了怎么办 5大战区拥兵自重怎么办 买的期房停工了怎么办 怀孕后长了副乳怎么办 耳朵冻的红肿了怎么办 吃螃蟹吃柿子了怎么办 吃了螃蟹和柿子怎么办 螃蟹与柿子同吃怎么办 手被鞭炮炸伤了怎么办 索尼l36h变砖了怎么办 oppor9s手机忘记解锁图案怎么办 索尼z5刷死机了怎么办 魅蓝note3被锁定怎么办 oppo图案锁忘了怎么办 手机图案锁忘w怎么办输 手机图案解锁密码忘了怎么办 忘记htc手机锁屏怎么办 我手机密码忘了怎么办 小米5x忘记密码怎么办 oppo忘记手机解锁图案怎么办 手机解锁图案忘了怎么办 苹果id给锁了怎么办 苹果手机忘了ld怎么办 4s忘记开机密码怎么办 取卵22个肚子胀怎么办 夜神模拟器很卡怎么办 夜神模拟器卡顿怎么办 入职体检有痔疮怎么办 泰迪鼻子干怎么办恢复 泰迪幼犬鼻子干怎么办 狗狗呕吐没精神怎么办 狗狗鼻子干拉稀怎么办 狗狗鼻子干呕吐怎么办 肛门直肠环断了怎么办 原房主欠取暖费怎么办 澳门赢了几千万怎么办 被海鲜骗局骗了怎么办 将军令没电了怎么办 将军令没有电了怎么办 在香港超过7天怎么办