欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Struts2通过自定义标签实现权限控制的方法

程序员文章站 2024-03-31 17:36:28
近期在开发中遇到一种需求:根据用户的权限决定是否显示某操作按钮。 例如:若用户拥有删除数据的权限,则在界面中显示“删除”按钮;若用户无该权限,则界面中不显示相应按钮。...

近期在开发中遇到一种需求:根据用户的权限决定是否显示某操作按钮。

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

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

要定义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="修改"/>

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

总结

以上就是本文有关struts2通过自定义标签实现权限控制的方法的介绍,希望对大家有所帮助。感兴趣的朋友可以参阅:struts和servlet不能共存问题解决方法  struts2修改上传文件大小限制方法解析  等。有什么问题可以留言,小编会及时回复大家的。