最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Struts2通過自定義標(biāo)簽實現(xiàn)權(quán)限控制的方法

 更新時間:2017年09月28日 14:23:19   作者:陳夏明  
這篇文章主要介紹了Struts2通過自定義標(biāo)簽實現(xiàn)權(quán)限控制的方法,介紹了定義Struts2的自定義標(biāo)簽的三個步驟以及詳細解釋,需要的朋友可以參考下。

近期在開發(fā)中遇到一種需求:根據(jù)用戶的權(quán)限決定是否顯示某操作按鈕。

例如:若用戶擁有刪除數(shù)據(jù)的權(quán)限,則在界面中顯示“刪除”按鈕;若用戶無該權(quán)限,則界面中不顯示相應(yīng)按鈕。

這樣,就需要用到自定義標(biāo)簽了。

要定義Struts2的自定義標(biāo)簽,只需三步:

1.定義一個Component類,并繼承自org.apache.struts2.components.Component;

2.定義一個Tag類,并繼承自import org.apache.struts2.views.jsp.ComponentTagSupport;

3.在WEB-INF目錄下創(chuàng)建相應(yīng)的LTD文件

下面就來逐一實現(xiàn):

step1:定義Component類

Component,顧名思義是“組件”。這其中封裝了標(biāo)簽需要的處理邏輯。

我們定義的Component類需要繼承org.apache.struts2.components.Component;。在父類中,有兩個方法比較重要,分別是:start()方法和end()方法,這兩個方法分別對應(yīng)了開始標(biāo)簽和結(jié)束標(biāo)簽,我們可以通過這兩個方法來對標(biāo)簽進行操作。

此外,若標(biāo)簽需要屬性,則應(yīng)該在本類中定義相應(yīng)屬性,并提供相應(yīng)的get()和set()方法,用于封裝這些屬性。

然后,我們就可以對標(biāo)簽及屬性進行處理了。

這里給出我的代碼,實現(xiàn)的功能是:將當(dāng)前每一個要顯示的按鈕的URL地址與用戶所擁有的權(quán)限對應(yīng)的URL比較,若用戶有權(quán)限訪問該URL,則顯示按鈕,否則將不顯示任何內(nèi)容。

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類,說白了就是我們所使用的標(biāo)簽。

創(chuàng)建Tag類,首先需要繼承org.apache.struts2.views.jsp.ComponentTagSupport類。

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

getBean()方法用于返回標(biāo)簽組件的實例,即我們step1中創(chuàng)建的組件。

populateParams()方法用于填充屬性,即:將我們標(biāo)簽中的屬性封裝到標(biāo)簽類中。因此,我們在Tag類中也需要定義相應(yīng)屬性并提供get()和set()方法。

這樣,我們就可以指定組件對標(biāo)簽進行處理。

可能有人會有疑問:為什么我們不將標(biāo)簽處理邏輯直接寫在Tag類中,而是要單獨定義一個Component類呢?

這是因為:Struts2支持多種表現(xiàn)層技術(shù),使用Component可以對不同的表現(xiàn)層技術(shù)使用不同的處理方式,提高程序的可擴展性。

給出我的代碼:

這段代碼實現(xiàn)的功能是:使用step1中定義的組件對標(biāo)簽進行處理。

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目錄下創(chuàng)建TLD文件

TLD文件描述了標(biāo)簽的語法,如:標(biāo)簽有哪些屬性,標(biāo)簽的屬性是否支持表達式等內(nèi)容。

我們在JSP中使用標(biāo)簽前,都需要引入相應(yīng)的標(biāo)簽庫,所以我們需要定義TLD文件,使JSP中能使用我們的自定義標(biāo)簽。

給出我定義的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:相當(dāng)于前綴

uri:就是<%@taglib>中的uri

tag:一個標(biāo)簽

tag-class:標(biāo)簽類,就是我們的Tag類

body-content:標(biāo)簽體中能寫的內(nèi)容

attribute:屬性

name:屬性名

required:是否必須

rtexprvalue:是否支持表達式

TLD文件中的內(nèi)容還有很多,更多內(nèi)容可以Google一下就能獲得,在此就不再贅述。

至此,我們就可以在JSP中使用自定義標(biāo)簽了。

使用的方式:

1. 引入標(biāo)簽庫:<%@ taglib prefix="oa" uri="/WEB-INF/OATag.tld" %>

2. 使用標(biāo)簽:<oa:a actionURL="user_editUI?id=${id}" value="修改"/>

這樣,在用戶查看當(dāng)前頁面時,就能夠根據(jù)用戶的權(quán)限來選擇是否顯示操作按鈕。

總結(jié)

以上就是本文有關(guān)Struts2通過自定義標(biāo)簽實現(xiàn)權(quán)限控制的方法的介紹,希望對大家有所幫助。感興趣的朋友可以參閱:Struts和servlet不能共存問題解決方法  Struts2修改上傳文件大小限制方法解析  struts2開發(fā)流程及詳細配置等。有什么問題可以留言,小編會及時回復(fù)大家的。

相關(guān)文章

最新評論

永寿县| 安远县| 普定县| 石渠县| 冕宁县| 宝山区| 都匀市| 达日县| 连平县| 德令哈市| 济源市| 什邡市| 洛扎县| 阳曲县| 淄博市| 九寨沟县| 云和县| 临泉县| 龙游县| 武穴市| 庐江县| 汪清县| 和静县| 周口市| 吉隆县| 台山市| 武定县| 隆德县| 蓬溪县| 平邑县| 紫金县| 安丘市| 呼伦贝尔市| 揭西县| 隆子县| 舒城县| 察雅县| 侯马市| 平江县| 尼勒克县| 永州市|