请问 如何 在jsp 中实现 用户权限 的管理,可能会比较复杂?谁能说说呢?或者给个链接教程
解决方案 »
- js-自定义标签
- JDBC 更新oracle多张表时出现锁?怎么解决?
- struts+spring+JPA 下的一个常见异常。BeanUtils.populate 急!
- 求助想在jsp中使用SELECT标签搜索查询!!
- 怎么实现select的三级联动
- 课题:用JAVA开发一个客户端FTP上传悬浮窗?挺有挑战性的。说说思路亦可,谢谢。
- hibernate+oracle10g 做分页,返回数据只要页码为第1页,设置每页显示只要大于10,返回的数据都只有十条。
- 一个奇怪的标记<c:if></c:if>
- tomcat中在哪里设置session的失效时间?马上结
- 一个关于日期处理的问题
- setHeader问题
- 数据库查询和 Html交替显示的问题
所谓标记库(tag library),
是指由在JSP页面中使用的标记所组成的库。
JSP容器推出时带有一个小型的、默认的标记库。
当JSP 标准标记库(Standard Tag Library,JSTL)还未满足到项目需要时,就要自已封装自己的taglib
而自定义标记库是人们为了某种特定的用途或者目的,
将一些标记放到一起而形成的一种库。
在一个团队中协同工作的开发者们可能会为各自的项目创建一些非常特定化的自定义标记库,
同时也会创建一个通用自定义标记库,以供当前使用。
JSP 标记替代了scriptlet,
并缓解了由scriptlet所招致的所有令人头痛的事情。
例如,您可以看到这样的标记:
<ito:sayHello name="david"/>或者这样的标记:
<ito:sayHelloToEveryBody/>
原理
一个tag就是一个普通的java类,
它唯一特别之处是它必须继承TagSupport或者BodyTagSupport类。
这两个类提供了一些方法,负责jsp页面和你编写的类之间的交互,例如输入,输出。
而这两个类是由jsp容器提供的,无须开发人员自己实现。
换句话说,你只需把实现了业务逻辑的类继承
TagSupport或者BodyTagSupport,
再做一些特别的工作,你的类就是一个Tag。
并且它自己负责和jsp页面的交互,不用你多操心。
现在以demo为例子:制作一个say hello的taglib,以实现这样一个功能
<ito:sayHello name="david"/>
显示为hello david!实现行为,编写java类
package demo;import javax.servlet.jsp.tagext.BodyTagSupport;
import javax.servlet.jsp.JspWriter;public class SayHello extends BodyTagSupport
{
private String name ; public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} public int doStartTag()
{
try
{
JspWriter out = pageContext.getOut();
out.print("hello "+name +"!");
}
catch (Exception e)
{ }
return SKIP_BODY;
} public int doEndTag(){
return EVAL_PAGE;
}
}说明 Tag Extension API 中提供了两种类型的标记管理器:
Simple Tag Handler 和 Tag Handler that want access to the body content
(简单标记管理器和可以访问其主体内容的标记管理器).
这里仅用到第一类,
即简单标记管理器。
这类标记管理器不能操纵它的主体内容(body content,即在标记之间的内容)。
本例中我们并不需要操纵标记间的内容。这里使用的两个标记管理器都继承自TagSupport类。
TagSupport类实现了Tag 和 IterationTag两个接口。
有必要介绍一下它的几个主要的、由容器管理的方法:doStartTag():
在标记开始处由容器调用,返回值将决定是否对body content计值。返回值为Tag.EVAL_BODY_INCLUDE时计值,为Tag.SKIP_BODY时忽略body content。(所谓对body content计值,就是将body content写入输出流中输出;body content,即标记之间的内容);
doAfterBody():
当doStartTag()方法调用完毕并且返回Tag.EVAL_BODY_INCLUDE时,将对该标记的body content进行计值处理。
计值完以后,将由容器调用该方法。因为只有对body content计值,才可能触发"after body"这一事件;
doEndTag():
当doStartTag()方法调用完毕并且返回Tag.SKIP_BODY时或者doAfterBody()方法调用完毕并且返回IterationTag.SKIP_BODY时调用,一般在该方法中输出结果,即将结果写入JspWriter输出流中输出;该方法可以返回Tag.SKIP_PAGE或者Tag.EVAL_PAGE。前者不再对该标记以后的页面计值,后者继续对该标记以后的页面计值; getParent():
获得最近的、包围了自己的一个标记管理器实例。即自己在该标记管理器实例的body content 中。本例中GoodsDetailTag实例将调用getParent()来获得GoodsHeaderTag的一个实例。 setters方法:
设置Tag属性的方法,当Tag Handler实例化时由容器调用,从而获取JSP页面中的参数。创建TLD sayHello.tld <?xml version="1.0" encoding="ISO-8859-1" ?>
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>ito</short-name>
<uri>ito</uri>
<description>
Itorgan Tag Library Descriptor
</description><tag>
<name>sayHello</name>
<tag-class>demo.SayHello</tag-class>
<body-content>JSP</body-content>
<description>sayHello tag</description> <attribute>
<name>name</name>
<required>true</required>
</attribute>
</tag></taglib>说明:
WEB-INF/xxxx.tld
注意:需要在tld文件里定义:tlibversion Tag library的版本jspversion 这个Tag library要求的JSP版本shortname 缺省的名字。
uri 这个Tag library的URLinfo Tag library的使用信息tag 自定义的tagname 自定义的tag的名字tagclass 处理这个tag的java类的名字.不同的tag可能对应不同的java类来处理。Teiclass bodycontent 标出属性值的类型,如果没有标识,隐含为JSPJSP interpreted by pageEMPTY no body allowedTAGDEPENDENT interpreted by tag需要BodyTag BodyTag can post-process JSPinfo 这个tag的使用信息attribute 属性。 每个tag可以有n个属性
<attribute>里的name:
属性名字。
例如<c:out value=""/>里的value。
名字可任意取,只要类里提供相应的set方法即可。 required:是否必填属性。 rtexprvalue:是否支持运行时表达式取值。
这是tag的强大功能。暂时设为false
web.xml配置加上 <taglib>
<taglib-uri>ito</taglib-uri>
<taglib-location>/WEB-INF/sayHello.tld</taglib-location>
</taglib>页面中调用
<%@page contentType="text/html;charset=GBK"%>
<%@ taglib prefix="ito" uri="ito"%>
<html><body>
<ito:sayHello name="david"/>
</body>
</html>