工作需要,用到权限控制标签,结合公司项目和网上查阅,弄了个权限标签。其中有一篇文章感觉不错,于是转到自己的博客中。
原文地址:http://buaasss.iteye.com/blog/748247
struts2的自定义标签,需要如下配置,两个类,一个组件类继承org.apache.struts2.components.Component;,一个Tag类继承org.apache.struts2.views.jsp.ComponentTagSupport;,一个tld文件,关联到tag类以及tag类中的各个参数属性,web.xml文件中配置tld位置。
首先组件类,代码都是从原文博客中引用的。
package com.bjsxt.oa.web.tag; import java.io.Writer; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.components.Component; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; import com.bjsxt.oa.manager.AclManager; import com.opensymphony.xwork2.util.ValueStack; public class PermissionComponent extends Component { private AclManager aclManager; private int userId; private String resourceSn; private int pn; public PermissionComponent(ValueStack stack, HttpServletRequest request) { super(stack); this.setAclManager(request); } @Override public boolean start(Writer writer) { boolean result = aclManager.hasPermissionByResourceSn(userId, resourceSn, pn); System.out.println("result=" + result); // try { // if (result) { // writer.write("true"); // return result; // } // writer.write("false"); // } catch (IOException e) { // e.printStackTrace(); // } //当返回值为true时,body的内容被输出;false时,则被忽略,即不输出 return result; } @Override public boolean end(Writer writer, String body) { return super.end(writer, body); } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getResourceSn() { return resourceSn; } public void setResourceSn(String resourceSn) { this.resourceSn = resourceSn; } public int getPn() { return pn; } public void setPn(int pn) { this.pn = pn; } public void setAclManager(AclManager aclManager) { this.aclManager = aclManager; } public void setAclManager(HttpServletRequest request) { WebApplicationContext wac = WebApplicationContextUtils .getRequiredWebApplicationContext(request.getSession() .getServletContext()); this.aclManager = (AclManager) wac.getBean("aclManager"); } }
然后是tag类
package com.bjsxt.oa.web.tag; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.components.Component; import org.apache.struts2.views.jsp.ComponentTagSupport; import com.opensymphony.xwork2.util.ValueStack; public class PermissionTag extends ComponentTagSupport { private static final long serialVersionUID = 1631842497771460718L; private int userId; private String resourceSn; private int pn; @Override public Component getBean(ValueStack stack, HttpServletRequest request, HttpServletResponse arg2) { return new PermissionComponent(stack, request); } @Override protected void populateParams() { super.populateParams(); PermissionComponent pct = (PermissionComponent) component; pct.setUserId(userId); pct.setPn(pn); pct.setResourceSn(resourceSn); } public int getUserId() { return userId; } public void setUserId(int userId) { this.userId = userId; } public String getResourceSn() { return resourceSn; } public void setResourceSn(String resourceSn) { this.resourceSn = resourceSn; } public int getPn() { return pn; } public void setPn(int pn) { this.pn = pn; } }
然后是tld文件,tld文件要放到WEB-INF下面,参数说明:这里的required是说此参数在jsp页面中是否为必填的,rtexprvalue是说此参数是否支持动态的设定,也就是为它设定一个从后台中接收的值。name自然就是属性名了。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>2.2.3</tlib-version> <jsp-version>1.2</jsp-version> <short-name>my</short-name> <uri>/jtime</uri> <tag> <name>permission</name> <tag-class>com.bjsxt.oa.web.tag.PermissionTag</tag-class> <body-content>JSP</body-content> <attribute> <name>userId</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>resourceSn</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>pn</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
然后就是在web.xml中配置tld文件,这个在原文中没有提及,在这里补充上去。uri是指页面中需要引用的uri地址,location就是我们创建的tld文件的位置。
<jsp-config> <taglib> <taglib-uri>http://com.zilong.haha/ch/</taglib-uri> <taglib-location>/WEB-INF/tld/xxx.tld</taglib-location> </taglib> </jsp-config>
然后就是jsp文件调用了。自己写吧
<%taglib prefix="zilong" uri="http://com.zilong.haha/ch/"/>//这里就是web.xml种配置的uri路径。 <zilong:namexx id="" canshux=""/> namexx就是组件的名称了
OK!到此为止!