Struts2通過自定義標簽實現(xiàn)權(quán)限控制的方法
近期在開發(fā)中遇到一種需求:根據(jù)用戶的權(quán)限決定是否顯示某操作按鈕。
例如:若用戶擁有刪除數(shù)據(jù)的權(quán)限,則在界面中顯示“刪除”按鈕;若用戶無該權(quán)限,則界面中不顯示相應按鈕。
這樣,就需要用到自定義標簽了。
要定義Struts2的自定義標簽,只需三步:
1.定義一個Component類,并繼承自org.apache.struts2.components.Component;
2.定義一個Tag類,并繼承自import org.apache.struts2.views.jsp.ComponentTagSupport;
3.在WEB-INF目錄下創(chuàng)建相應的LTD文件
下面就來逐一實現(xiàn):
step1:定義Component類
Component,顧名思義是“組件”。這其中封裝了標簽需要的處理邏輯。
我們定義的Component類需要繼承org.apache.struts2.components.Component;。在父類中,有兩個方法比較重要,分別是:start()方法和end()方法,這兩個方法分別對應了開始標簽和結(jié)束標簽,我們可以通過這兩個方法來對標簽進行操作。
此外,若標簽需要屬性,則應該在本類中定義相應屬性,并提供相應的get()和set()方法,用于封裝這些屬性。
然后,我們就可以對標簽及屬性進行處理了。
這里給出我的代碼,實現(xiàn)的功能是:將當前每一個要顯示的按鈕的URL地址與用戶所擁有的權(quán)限對應的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類,說白了就是我們所使用的標簽。
創(chuàng)建Tag類,首先需要繼承org.apache.struts2.views.jsp.ComponentTagSupport類。
然后,重寫getBean()方法和populateParams()方法。
getBean()方法用于返回標簽組件的實例,即我們step1中創(chuàng)建的組件。
populateParams()方法用于填充屬性,即:將我們標簽中的屬性封裝到標簽類中。因此,我們在Tag類中也需要定義相應屬性并提供get()和set()方法。
這樣,我們就可以指定組件對標簽進行處理。
可能有人會有疑問:為什么我們不將標簽處理邏輯直接寫在Tag類中,而是要單獨定義一個Component類呢?
這是因為:Struts2支持多種表現(xiàn)層技術(shù),使用Component可以對不同的表現(xiàn)層技術(shù)使用不同的處理方式,提高程序的可擴展性。
給出我的代碼:
這段代碼實現(xiàn)的功能是:使用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目錄下創(chuàng)建TLD文件
TLD文件描述了標簽的語法,如:標簽有哪些屬性,標簽的屬性是否支持表達式等內(nèi)容。
我們在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:標簽體中能寫的內(nèi)容
attribute:屬性
name:屬性名
required:是否必須
rtexprvalue:是否支持表達式
TLD文件中的內(nèi)容還有很多,更多內(nèi)容可以Google一下就能獲得,在此就不再贅述。
至此,我們就可以在JSP中使用自定義標簽了。
使用的方式:
1. 引入標簽庫:<%@ taglib prefix="oa" uri="/WEB-INF/OATag.tld" %>
2. 使用標簽:<oa:a actionURL="user_editUI?id=${id}" value="修改"/>
這樣,在用戶查看當前頁面時,就能夠根據(jù)用戶的權(quán)限來選擇是否顯示操作按鈕。
總結(jié)
以上就是本文有關(guān)Struts2通過自定義標簽實現(xiàn)權(quán)限控制的方法的介紹,希望對大家有所幫助。感興趣的朋友可以參閱:Struts和servlet不能共存問題解決方法 Struts2修改上傳文件大小限制方法解析 struts2開發(fā)流程及詳細配置等。有什么問題可以留言,小編會及時回復大家的。
相關(guān)文章
idea項目debug模式啟動,斷點失效,斷點紅點內(nèi)無對勾問題及解決
這篇文章主要介紹了idea項目debug模式啟動,斷點失效,斷點紅點內(nèi)無對勾問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
IntelliJ IDEA 2021.1 EAP 1 發(fā)布支持 Java 16 和 WSL 2
這篇文章主要介紹了IntelliJ IDEA 2021.1 EAP 1 發(fā)布支持 Java 16 和 WSL 2,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
Java線程之間數(shù)據(jù)傳遞的實現(xiàn)示例(4種)
我們經(jīng)常會遇到父子線程數(shù)據(jù)傳遞(非調(diào)用參數(shù))的場景,本文主要介紹了Java線程之間數(shù)據(jù)傳遞的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-08-08
高可用架構(gòu)etcd選主故障主備秒級切換實現(xiàn)
這篇文章主要為大家介紹了高可用架構(gòu)etcd選主故障主備秒級切換的實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-02-02
java序列化和serialVersionUID的使用方法實例
這篇文章主要介紹了java序列化和serialVersionUID的使用方法實例的相關(guān)資料,這里說明很詳細的使用方法讓你徹底學會,需要的朋友可以參考下2017-08-08

