自定义Tag标签的使用、Struts2国际化全局资源配置(老鸟请绕道)

      今天同事问我,如何对jsp上用户的某个功能进行限制,具有相应的权限,则能执行相应的功能,否则不可见或者不能执行!  我当时告诉他可以建个类,这个类继承BodyTagSupport类。然后重写它的 doStartTag()方法!前提是还要在WEB-INF目录下建立tag文件夹,再tag文件夹下建立 .tld文件,然后再加以配置就可以实现限制权限的功能!晚上回到家闲着没事就把写了个源代码实例!欢迎大家拍砖!


      首先,我们先建立 TagPrivilege 类

package cn.zg.tools;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class TagPrivilege extends BodyTagSupport {

	private String privilegeContent;//权限的内容
	private String trueMsg;// 有权限应输出的内容
	private String falseMsg;//无权限应输出的内容
	public String getPrivilegeContent() {
		return privilegeContent;
	}
	public void setPrivilegeContent(String privilegeContent) {
		this.privilegeContent = privilegeContent;
	}
	public String getTrueMsg() {
		return trueMsg;
	}
	public void setTrueMsg(String trueMsg) {
		this.trueMsg = trueMsg;
	}
	public String getFalseMsg() {
		return falseMsg;
	}
	public void setFalseMsg(String falseMsg) {
		this.falseMsg = falseMsg;
	}
	@Override
	public int doStartTag() throws JspException{
		String text = (String) pageContext.getSession().getAttribute("privilege");
		try {
			if(privilegeContent.equals(text)){
				this.pageContext.getOut().write(trueMsg);
				
			}else{
				this.pageContext.getOut().write(falseMsg);
			}
			return EVAL_BODY_INCLUDE;
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		return EVAL_BODY_INCLUDE;
	}
	
	
	
	
}


然后我们还要配置.tld文件: 注意把TagPrivilege类中用到的属性写在tld文件中!如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
                        "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
	<tlibversion>1.0</tlibversion>
	<jspversion>1.1</jspversion>
	<shortname>privilege</shortname>
	<uri>http://cn.zg.tools/privilege</uri>
	<tag>
		<name>privilege</name>
		<tagclass>cn.zg.tools.TagPrivilege</tagclass>
		<attribute>
			<name>privilegeContent</name>
			<required>true</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>trueMsg</name>
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		<attribute>
			<name>falseMsg</name>
			<required>false</required>
			<rtexprvalue>true</rtexprvalue>
		</attribute>
		
	</tag>
</taglib>

 如果是新手的话,可能对这个tld文件的xml代码中的标签有些陌生,别急,我来告诉大家。 name 标签对应的是标签类TagPrivilege的属性名, required 则表示是否为必填, rtexprvalue 表示在是否可以在里面写入EL表达式。


做完这一步,就算是大功告成了! ,那么如何进行使用呢? 请看下面的jsp代码!

 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib  prefix="p" uri="http://cn.zg.tools/privilege"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">


<html>
  <head>
    
    <title>权限测试</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
  </head>
  <%
  		request.getSession().setAttribute("privilege","show");
   %>
  <body>
     	<p:privilege privilegeContent="close" trueMsg="欢迎访问,您已经获得权限!" falseMsg="您无权限
访问!"/>
  </body>
</html>

 不知大家可否注意:jsp页面上tablib引用的uri为: http://cn.zg.tools/privilege 。它和.tld文件中定义的uri标签是一致的!


现在大家猜想一下 页面的输出结果是什么,

首先假设用户已经登陆,我在session设置他对某个按钮的功能为可见,暂定为

request.getSession().setAttribute("privilege","show");

然后当我们在页面中使用

<p:privilege privilegeContent="close" trueMsg="欢迎访问,您已经获得权限!" falseMsg="您无权限
访问!"/>

这个标签的时候,就会自动的执行TagPrivilege类中的doStartTag()方法,方法中通过pageContext.getSession().getAttribute("privilege"); 得到用户的权限,

然后根据用户在标签上提供的

privilegeContent="close"

来进行比较,如果相等,则用户具有此权限,否则没有,由此可以进行扩展的是,用户登陆后我们获取用户的权限的集合,然后保存在session中,那么对应的某一个按钮,是否可以执行一个权限,那么就看这个session中的权限集合是否包含该按钮的权限,假如包含则:反馈trueMsg内容,否则反馈falseMsg内容!


我们可以把trueMsg 和 falseMsg 的内容写成true 或者false,当为fasle就把按钮设置为隐藏或者不可点击,为true则显示按钮或可点击! 这样就实现了用户对某个按钮上的权限的使用!


因为"close" != "show"  ,所以页面会输出falseMsg的内容,即“您无权限访问!”,假如把

privilegeContent的值改为 "show",那么和session的键为“privilege”的值是一致的,那么输出“欢迎访问,您已经获得权限!”

 

为了新手学习,我提供了源码(里面还有我写的struts2的“国际化全局资源配置”源码,因为我写tag自定义标签是在前面这个项目上临时加的功能! 直接访问项目的index.jsp页面就可以看到国际化和tag自定义标签这两种技术的效果)放在附件里,欢迎下载!      老鸟请绕道!  呵呵!

 

你可能感兴趣的:(jsp,Web,cache,servlet,sun)