Struts2通過自定義標(biāo)簽實(shí)現(xiàn)權(quán)限控制的方法
近期在開發(fā)中遇到一種需求:根據(jù)用戶的權(quán)限決定是否顯示某操作按鈕。
例如:若用戶擁有刪除數(shù)據(jù)的權(quán)限,則在界面中顯示“刪除”按鈕;若用戶無該權(quán)限,則界面中不顯示相應(yīng)按鈕。
這樣,就需要用到自定義標(biāo)簽了。
要定義Struts2的自定義標(biāo)簽,只需三步:
1.定義一個(gè)Component類,并繼承自org.apache.struts2.components.Component;
2.定義一個(gè)Tag類,并繼承自import org.apache.struts2.views.jsp.ComponentTagSupport;
3.在WEB-INF目錄下創(chuàng)建相應(yīng)的LTD文件
下面就來逐一實(shí)現(xiàn):
step1:定義Component類
Component,顧名思義是“組件”。這其中封裝了標(biāo)簽需要的處理邏輯。
我們定義的Component類需要繼承org.apache.struts2.components.Component;。在父類中,有兩個(gè)方法比較重要,分別是:start()方法和end()方法,這兩個(gè)方法分別對(duì)應(yīng)了開始標(biāo)簽和結(jié)束標(biāo)簽,我們可以通過這兩個(gè)方法來對(duì)標(biāo)簽進(jìn)行操作。
此外,若標(biāo)簽需要屬性,則應(yīng)該在本類中定義相應(yīng)屬性,并提供相應(yīng)的get()和set()方法,用于封裝這些屬性。
然后,我們就可以對(duì)標(biāo)簽及屬性進(jìn)行處理了。
這里給出我的代碼,實(shí)現(xiàn)的功能是:將當(dāng)前每一個(gè)要顯示的按鈕的URL地址與用戶所擁有的權(quán)限對(duì)應(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)簽組件的實(shí)例,即我們step1中創(chuàng)建的組件。
populateParams()方法用于填充屬性,即:將我們標(biāo)簽中的屬性封裝到標(biāo)簽類中。因此,我們?cè)赥ag類中也需要定義相應(yīng)屬性并提供get()和set()方法。
這樣,我們就可以指定組件對(duì)標(biāo)簽進(jìn)行處理。
可能有人會(huì)有疑問:為什么我們不將標(biāo)簽處理邏輯直接寫在Tag類中,而是要單獨(dú)定義一個(gè)Component類呢?
這是因?yàn)椋篠truts2支持多種表現(xiàn)層技術(shù),使用Component可以對(duì)不同的表現(xiàn)層技術(shù)使用不同的處理方式,提高程序的可擴(kuò)展性。
給出我的代碼:
這段代碼實(shí)現(xiàn)的功能是:使用step1中定義的組件對(duì)標(biāo)簽進(jìn)行處理。
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)簽的屬性是否支持表達(dá)式等內(nèi)容。
我們?cè)贘SP中使用標(biāo)簽前,都需要引入相應(yīng)的標(biāo)簽庫(kù),所以我們需要定義TLD文件,使JSP中能使用我們的自定義標(biāo)簽。
給出我定義的TLD文件,其中有幾個(gè)簡(jiǎn)單的屬性。
<?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:一個(gè)標(biāo)簽
tag-class:標(biāo)簽類,就是我們的Tag類
body-content:標(biāo)簽體中能寫的內(nèi)容
attribute:屬性
name:屬性名
required:是否必須
rtexprvalue:是否支持表達(dá)式
TLD文件中的內(nèi)容還有很多,更多內(nèi)容可以Google一下就能獲得,在此就不再贅述。
至此,我們就可以在JSP中使用自定義標(biāo)簽了。
使用的方式:
1. 引入標(biāo)簽庫(kù):<%@ taglib prefix="oa" uri="/WEB-INF/OATag.tld" %>
2. 使用標(biāo)簽:<oa:a actionURL="user_editUI?id=${id}" value="修改"/>
這樣,在用戶查看當(dāng)前頁面時(shí),就能夠根據(jù)用戶的權(quán)限來選擇是否顯示操作按鈕。
總結(jié)
以上就是本文有關(guān)Struts2通過自定義標(biāo)簽實(shí)現(xiàn)權(quán)限控制的方法的介紹,希望對(duì)大家有所幫助。感興趣的朋友可以參閱:Struts和servlet不能共存問題解決方法 Struts2修改上傳文件大小限制方法解析 struts2開發(fā)流程及詳細(xì)配置等。有什么問題可以留言,小編會(huì)及時(shí)回復(fù)大家的。
相關(guān)文章
SpringBoot結(jié)果封裝和異常攔截的實(shí)現(xiàn)示例
SpringBoot 項(xiàng)目中,我們通常需要將結(jié)果數(shù)據(jù)封裝成特定的格式,以方便客戶端進(jìn)行處理,本文主要介紹了SpringBoot?優(yōu)雅的結(jié)果封裝和異常攔截,感興趣的可以了解一下2023-08-08Spring Cloud入門系列服務(wù)提供者總結(jié)
這篇文章主要介紹了Spring Cloud入門系列之服務(wù)提供者總結(jié),服務(wù)提供者使用Eureka Client組件創(chuàng)建 ,創(chuàng)建完成以后修改某文件,具體操作方法及實(shí)例代碼跟隨小編一起看看吧2021-06-06淺談Java中BIO、NIO和AIO的區(qū)別和應(yīng)用場(chǎng)景
這篇文章主要介紹了Java中BIO、NIO和AIO的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04SpringBoot集成pf4j實(shí)現(xiàn)插件開發(fā)功能的代碼示例
pf4j是一個(gè)插件框架,用于實(shí)現(xiàn)插件的動(dòng)態(tài)加載,支持的插件格式(zip、jar),本文給大家介紹了SpringBoot集成pf4j實(shí)現(xiàn)插件開發(fā)功能的示例,文中通過代碼示例給大家講解的非常詳細(xì),需要的朋友可以參考下2024-07-07劍指Offer之Java算法習(xí)題精講字符串與二叉搜索樹
跟著思路走,之后從簡(jiǎn)單題入手,反復(fù)去看,做過之后可能會(huì)忘記,之后再做一次,記不住就反復(fù)做,反復(fù)尋求思路和規(guī)律,慢慢積累就會(huì)發(fā)現(xiàn)質(zhì)的變化2022-03-03SpringBoot使用AOP,內(nèi)部方法失效的解決方案
這篇文章主要介紹了SpringBoot使用AOP,內(nèi)部方法失效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08