??xml version="1.0" encoding="utf-8" standalone="yes"?> 3.数据库脚?br> 下面介绍几个Display最常用的功能,更多功能请参?a >http://displaytag.homeip.net/displaytag-examples-1.1/?br>1. 分页 2. 对列排序 4. Display Tag的属性设|?br> 前面所说的display:setProperty 是一U改变Display Tag属性的ҎQ但是在每个jsp中都要写太麻烦了?br> Display Tag中设|了很多默认的属性,它有一个专门的属性文Ӟ是在它的jar包中的displaytag/properties/TableTag.properties 5. 其它功能 引自Q?a target="_blank" >http://www.javaresearch.org/article/showarticle.jsp?column=106&thread=51309
1.试代码
<HTML>
<HEAD>
<title>WebForm1</title>
<LINK HREF="Calendar.css" TYPE="text/css" REL="stylesheet">
<script language="javascript" src="Calendar.js"></script>
</HEAD>
<body>
<form id="Form1" method="post" runat="server">
<table cellSpacing="1" cellPadding="1" width="936" border="0" height="29" style="LEFT: 10px; POSITION: absolute; TOP: 15px">
<tr>
<td>
<!--日期实例?-begin-->
<asp:TextBox id="txtDATE" runat="server" onchange='javascript:gChangeDate(this,0);' onblur='javascript:gChangeDate(this,0);'></asp:TextBox>
<INPUT TYPE="button" value='
' NAME='bntDATE' OnClick='showCalendar(txtDATE,0)' class="button">
<!--end-->
<select size="1" name="REC_SOURCE_SCUR">
<OPTION VALUE="" selected></OPTION>
<OPTION VALUE="1">1</OPTION>
<OPTION VALUE="2">2</OPTION>
</select>
<asp:Button id="Button1" runat="server" Text="Button"></asp:Button>
</td>
</tr>
</table>
</form>
</body>
</HTML>
]]>
-------------------------------------
源代码下?a >/Files/singlepine/topmenu.rarpublic class TopMenu : System.Web.UI.Page
{
protected DataRow[] father;
protected DataRow[] first;
protected DataRow[] second;
private void Page_Load(object sender, System.EventArgs e)
{
}
public static string ConnectionString=System.Configuration .ConfigurationSettings .AppSettings["ConnectionString"];
GetDataSet#region GetDataSet
public static DataSet GetDataSet(string sql)
{
SqlDataAdapter sda =new SqlDataAdapter(sql,ConnectionString);
DataSet ds=new DataSet();
sda.Fill(ds);
return ds;
}
#endregion
Web Form Designer generated code#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/**//**//**//// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
LoadTopMenu#region LoadTopMenu
protected string LoadTopMenu()
{
//IsBoot讄菜单U别,0一U?1二,2三,依此cL.
string sqlFather="select * from topmenu order by IsBoot";
DataSet dsFather=GetDataSet(sqlFather);
father=dsFather.Tables[0].Select("IsBoot=0","IsBoot");
string menu="";
int one=0;
int two=1;
int three=1;
foreach(DataRow drfather in father)
{
menu+="mpmenu"+one+"=new mMenu("+"'"+drfather["text"]+"'"+",'/','self','','','','');";
first=dsFather.Tables[0].Select("ParentID='"+Convert.ToInt32(drfather["ID"])+"' and IsBoot=1","IsBoot");
foreach(DataRow drfirst in first)
{
second=dsFather.Tables[0].Select("ParentID='"+Convert.ToInt32(drfirst["ID"])+"' and IsBoot=2","IsBoot");
if(second.Length==0)
{
menu+="mpmenu"+one+".addItem(new mMenuItem("+"'"+drfirst["text"]+"'";//description
menu+=","+"'"+drfirst["url"]+"'"+",";//url
menu+="'"+drfirst["target"]+"'"+",";//target
menu+=""+drfirst["visible"]+",";//是否可见,false可见,true不可?br>
menu+="'"+drfirst["status"]+"'"+",";//状态条
menu+="null,'','','',''));";
}
foreach(DataRow drsecond in second)
{
menu+="msub"+two+"=new mMenuItem("+"'"+drfirst["text"]+"','',"+"'"+drfirst["target"]+"'";
menu+=","+drfirst["visible"]+",";//是否可见,false可见,true不可?br>
menu+="'','1','','','','');";
menu+="msub"+three+".addsubItem(new mMenuItem("+"'"+drsecond["text"]+"'";//description
menu+=","+"'"+drsecond["url"]+"'"+",";//url
menu+="'"+drsecond["target"]+"'"+",";//target
menu+=""+drsecond["visible"]+",";//是否可见,false可见,true不可?br>
menu+="'"+drsecond["status"]+"'"+",";//状态条
menu+="null,'','','',''));";
menu+="mpmenu"+one+".addItem(msub"+two+");";//addItem
three++;
}
two++;
}
one++;
}
return menu;
}
#endregion
}
--
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[topmenu]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[topmenu]
GO
CREATE TABLE [dbo].[topmenu] (
[ID] [int] NOT NULL ,
[parentId] [int] NOT NULL ,
[text] [nvarchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
[url] [nvarchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
[target] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[IsBoot] [int] NULL ,
[visible] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[status] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
--插入试数据
insert into topmenu([ID],[parentId],[text],[url],[target],[IsBoot],[visible] ,[status])
values(1,0,'深圳','http://singlepine.cnblogs.com/articles/259955.html','self',0,'false','深圳')
insert into topmenu([ID],[parentId],[text],[url],[target],[IsBoot],[visible] ,[status])
values(2,1,'南山','http://singlepine.cnblogs.com/articles/259955.html','self',1,'false','南山')
insert into topmenu([ID],[parentId],[text],[url],[target],[IsBoot],[visible] ,[status])
values(3,1,'田','http://singlepine.cnblogs.com/articles/259955.html','self',1,'false','田')
insert into topmenu([ID],[parentId],[text],[url],[target],[IsBoot],[visible] ,[status])
values(4,2,'U技?,'http://singlepine.cnblogs.com/articles/259955.html','self',2,'false','U技?)
insert into topmenu([ID],[parentId],[text],[url],[target],[IsBoot],[visible] ,[status])
values(5,3,'塞格','http://singlepine.cnblogs.com/articles/259955.html','self',2,'false','塞格')
insert into topmenu([ID],[parentId],[text],[url],[target],[IsBoot],[visible] ,[status])
values(6,0,'q州','http://singlepine.cnblogs.com/articles/259955.html','self',0,'false','q州')
insert into topmenu([ID],[parentId],[text],[url],[target],[IsBoot],[visible] ,[status])
values(7,6,'q州火R?,'http://singlepine.cnblogs.com/articles/259955.html','self',1,'false','q州火R?)
]]>
首先当然是要下蝲它的jar包了Q?a >q里可以下蝲到最新的版本。将jar包放到WEB-INF的lib文g夹下。另外还需要两个辅助包Qapache的commons-lang和standard包,更多的辅助包可以在这?a >下蝲?br>
在web.xml下添加一个filter
<filter>
<filter-name>exportFilter</filter-name>
<filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class>
</filter>
在jsp面做一个引用:
<%@ taglib uri="http://displaytag.sf.net/el" prefix="display" %>
首先我们定义一个list
<%
List test = new ArrayList( 6 );
test.add( "Test String 1" );
test.add( "Test String 2" );
test.add( "Test String 3" );
test.add( "Test String 4" );
test.add( "Test String 5" );
test.add( "Test String 6" );
request.setAttribute( "test", test );
%>
当我们想在jsp面上显C个listӞ我们只需要写一句话
<display:table name="test" />
display tag会自动生成一个table
如果list是从控制层抛出来的,name可用EL表达式表C?br> <display:table name="${test}" />
q是最单的display tag的用,我们可以l它加上样式{,也可以定义显C的列,下面的table昄复杂一?br><display:table name="test" styleClass="list" cellspacing="0" cellpadding="0">
<display:column property="id" title="ID" class="idcol"/>
<display:column property="name" />
<display:column property="email" />
<display:column property="description" title="Comments"/>
</display:table>
如果惌l它加个链接也很?下面的代码给name加了q接Qƈ附带id参数Qemail也自动连接到mailto:XXX
<display:table name="test" styleClass="list" cellspacing="0" cellpadding="0">
<display:column property="id" title="ID" class="idcol"/>
<display:column property="name" url="detail.jsp" paramId="id" paramProperty="id"/>
<display:column property="email" autolink="true"/>
<display:column property="description" title="Comments"/>
</display:table>
如果惛_代码分页Q只需在display:table标签中添加一pagesize="每页昄行数"Q如
<display:table name="test" pagesize="10"/>
display tag可对列进行排序,是点击列名Q对该列的数据进行排序。你只需Ҏ要排序的列添?sort="true"
OKQ如下面的代码可对前三列q行排序。在display:table中添加defaultsort="列数"Q可默认Ҏ定的列排序?br><display:table name="test" styleClass="list" cellspacing="0" cellpadding="0" defaultsort="1">
<display:column property="id" title="ID" class="idcol" sort="true"/>
<display:column property="name" url="detail.jsp" paramId="id" paramProperty="id" sort="true"/>
<display:column property="email" autolink="true" sort="true"/>
<display:column property="description" title="Comments"/>
</display:table>
如果table有分,Display Tag默认只对当前进行排序,如果惛_整个list排序Q可以在display:table之间d一D代码:
<display:setProperty name="sort.amount" value="list"/>
3. 导出数据
在display:table中添加export="true"Q看看会出现什么!Display Tag默认会提供三U数据导出方式:CSV、Excel、XML ?br> 另外Display Tagq可以导ZؓPDF格式Q在http://prdownloads.sourceforge.net/itext/下蝲一个辅助包iText.jarQcopy到lib目录下,然后在display:table之间d一D代码:
<display:setProperty name="export.pdf" value="true"/>Q大功告成?/p>
惌改变它的默认属性,我们可以在WEB-INF\classes下新Z个文件displaytag.propertiesQ仿照TableTag.properties中属性的格式讄需要修改的属性?br>
TableTag.properties中的#
messages中设|的是显C在面上的提示信息。默认是英文的,我们可以把它改ؓ中文的。不q这里只能用unicodeQ就是说中文字符必须转换?
unicode码,q个可以使用jdk自带的native2ascii.exeq行转换?/p>
DisplayTagq有一些很实用的小功能Q这里提两个。一个是Ҏ据的FormatQ这?.1版本d的新功能Q可以用标{方式格式化时间、数
字、字W串。比如日期,在需要格式化的column标签中添加format="{0,date,yyyy-MM-dd}"Q第一个参Cؓ格式化的数据?
PW二个参数是数据cdQ数字ؓnumberQ第三个参数为数据格式?br>
另外一个功能是对table数据的合计功能。在table标签中添?
decorator="org.displaytag.decorator.TotalTableDecorator"Q然后在惌q行合计的数据列?
column标签中添?total="true"Q该列就可以被计L了。但q个功能有个~点Q不能用在有分页的时候,它只能合计第一늚数据?br>
DisplayTag的不?br>
初次使用DisplayTag的h可能会觉得惊喜,但是用久了会发现很多问题Q最大的问题是对中文的支持不好,比如如果查询条g中有中文Q就无法页Q无
法对中文排序Q将中文导出为指定文件时出现q{等。这些问题有时候会让h很郁P有时候逼得你要M改它的源代码。下面是对以上几个问题的解决ҎQ?br>
1.
对于中文无法页、排序,最单的办法是修改Tomcat下的server.xml文g。找到HTTP的Connector标签Q在里面d一?
URIEncoding="..."Q引号里面的内容取决于你的页面编码,比如可以是GBKQUTF8{。这样上面两个问题就可以解决了?br>
2.
导出为文Ӟ其实q个功能除了中文支持外还有很多其它问题,比如它会Html标签一起导出、只导出昄的内容,但如果对tableq行?
decoratorQdecorator后的内容无法导出。如果想要将中文正确导出Q需要修改DisplayTag源代码?br>
下蝲相同版本的源代码Q在org.displaytag.export.ExcelView.java文g中找到getMimeType()ҎQ将此方
法修改ؓ return
"application/vnd.ms-excel;charset=GB2312";Q修改后导出数据的速度会慢很多Q不q将吧?br> 3. 新版的DisplayTag1.1d了对一ơ取部分数据的支持,相关的标{括partialList和sizeQ需要设|partialList="true"和size的大。具体怎么用偶q没研究?/p>
标签被定义和分布在一个称为标{ֺ的结构中Q一个标{ֺ是由元信息和cȝ成的集合Q?br>1.标签处理器:实现定制标签功能的JavacR?br>2.标签附加信息QTEIQ:向JSP容器提供边辑以确认标{ֱ性和创徏变量的类?br>3.标签库描q器QTLDQ:描述单个标签和整个标{ֺ属性的XML文?br>
?
{֤理器和标{N加信息需要定位在JSP容器c蝲入器可以扑ֈ的地斏V标{ֺ描述器可在URL指定的符意位|。JSP1.1规范要求JSP容器接受一个打
包成因定l构的JAR文g的标{ֺ。TLD必须?META-INF目录中名为taglib.tld的文ӞJAR文g则复制到/WEB-INF/lib
目录下?br>
一、标{֮?br>
1.开发步?br>a.定义标签的名字、属性、声明的变量和标{体的内宏V?br>b.~写标签库描q器TLD?br>c.~写标签处理器?br>d.在JSP面中用标{?br>
2.JSP面在JSP容器中的转换步骤Q?br>JSP面存在三种形式Qjsp文g、java文g和class文g?br>a.指o元素<%@page%>?lt;%@include%>?lt;%@taglib%>向JSP容器提供转换时信息?br>b.HTML行在_jspService()Ҏ中依序转换到out.print()语名中?br>c.脚本元素的声明被原封不动地复制到_jspService()Ҏ外的源码中?br>d.脚本元素的表辑ּ在_jspService()Ҏ中依序转换到out.print()语名中?br>e.脚本元素的Scriptlet被原不动地复制到_jspService()Ҏ中?br>f.行ؓ元素被{换ؓ执行其功能的q行旉辑代码?br>g.定制标签被扩展到调用其相应标{֤理器中方法的Java语句中?br>
3.标签在JSP容器中的转换步骤Q?br>a.JSP容器使用taglib指o元素定位标签库描q器Q将面中用到的定制标签和TLD相匹配?br>b.d标签库描q器的标{ֈ表和每一标签相关的类名字?br>c.在页面中遇到一个标{时Q查找与h指定名字的标{։~相关的一个标{ֺ?br>d.容器使用在TLD中找到的标签l构信息生成一pd完成标签功能的Java语句?br>
二、标{ֺ描述器(TLDQ?br>
标签库描q器是一个描q整个标{ֺ标记信息和库中每个标{֤理器及其属性的XML文档?br>
标签库描q器的DTD׃个简单的<taglib>元素l成Q此元素包含下列一些子元素?br>整个标签库标C?br>tlibversion 标签库版本号。是一个点式十q制敎ͼ最多ؓ4l小数点分隔的数字组成?br>jspversion 标签库所需的JSP规范最低版本。例如JSP1.1
shortname 标签库的~写名。JSP可以使用该名字作为库中标{~省前缀?br>uri 标签库唯一URI的元素。典型URL位置来自可下载taglib的位|?br>info 标签库描qC息?br>每个标签处理器及其属?br>tag 在TLD中加入标{,描述l成库的每个标签?br>name 与标{ֺ的名字前~一起用的标签的名字, 是JSP容器唯一的标{标识?br>tagclass 实现标签的标{֤理器cȝ全名?br>teiclass 标签附加信息QTEIQ类的全名。TEIcȝ出关于标{֤理器创徏变量及对标签司性执行的L有效性验证的信息?br>bodycontent 描述标签处理器如何用标{体的内宏V有三种取|
emptyQ表C标{体必须为空Q?br> JSP:表示脚本元素和模板及其它标签一栯评估?br> tagdependentQ体内容被原不动写入BodyContentQ其它脚本元素以源码形式出现Q而不被JSP容器解释?br>info 标签的h工可Lq性信息?br>attribute 使用标签时被~码的属性信息。用于定义标{属性?br> <name>属性名</name>Q属性的名字?br> <request>true|false</request>Q属性在标签用到的位|是否要被编码?br> <rtxexpvalue>true|false</rtxexpvalue>Q属性D否用表达式指定?br>
三、标{֤理器
标签处理器是通过实现JSP容器调用的一pd预定义方法执行定制标{行为的一个JavacR?br>标签处理器实C标签的行为,标签处理器是JavacR?br>
1.标签处理器的工作方式
a.导入javax.servlet.jsp和javax.servlet.jsp.tagext包?br>b.实现javax.servlet.jsp.tagext包中的Tag接口或BodyTag接口。BodyTag是Tag的子接口?br>c.l承TagSupportcLBodyTagSuppoertcR它们是上述接口的缺省实现?br>d.重蝲public int doStartTag()throws JspExceptionҎ?br>
2.标签处理器的接口与实?br>javax.servlet.jsp.tagext.Tag是实现标{最基本的接口?br>javax.servlet.jsp.tagext.TagSupport是实现Tag接口的具体类?br>通常情况下承tagSupportc而不直接实现Tag接口通常是有益的。除了对所有必需Ҏ提供了缺省实现外、还保存了pageContext对象及对嵌套标签的支持?br>Tag接口包含4个常量,表示doStartTag()和doEndTag()Ҏ可能的返回码?br>EVAL_BODY_INCLUDE 当doStartTag()q回Ӟ指明servlet应对标签体进行评估?br>SKIP_BODY 当doStartTag()q回Ӟ指明servlet应忽视标{体?br>EVAL_PAGE 当doEndTag()q回Ӟ指明面其余部分应被评估?br>SKIP_PAGE 当doEndTag()q回Ӟ指明面其余部分p跌?br>Tag接口的方?br>public void setPageContext
(PageContext ctx) 生成的servlet在请求处理器执行其它d前首先调用此ҎQ实现类应保存上下文对象以便它可以在标签?
命期中用。从面上下文中标签处理器可以访问所有JSP隐含对象?br>public void setParent(Tag p) 使用一个标{可以找到操作栈中它上面的标{。在setPageContext后立卌用?br>public Tag getParent() q回父标{?br>public int doStartTag() throws Jsp 在设|了面上下文、父标签和开始标C~码的属性后调用。返回码表明JSP实现servlet是否p估标{体?br>public int doEndTag()throws JspException 当遇到结否标记时调用。返回码表明JSP是否qU页面的其余部䆾?br>public void release() 保在页面退出前被调用。释放资源ƈ重置标签处理器状态?br>TagSupportcȝҎ
public static Tag finAncestorWithClass(Tag thisTag, Class cls) 为所需的父标签处理器查找运行时标签栈。一个标{֤理器可以提供其范围内子标{调用的Ҏ?br>public void setId(String id) 保存和检索在id属性中指定的名字?br>public void setValue(String name, Object o) 在本地哈希表中设|指定名字的倹{?br>public Object getValue (String name) 从本地哈希表中获取指定名U的倹{?br>public void removeValue (String name) 从本地哈希表中删除指定名U的倹{?br>public Enumeration getValues() q回哈希表中关键字的一个枚举?br>
3.标签处理器的生命?br>a.生成servlet需要创建标{֤理器cȝ一个实例。实现方式通常是调用JSP容器的工厂类的一个方法,工厂cd含一个标{֤理器实例池以使其可重用不再处于激zȝ态的对象?br>b.初始化标{֤理器QservletL其存在性。servlet通过调用标签处理器的两个Ҏ实现此过E:setPageContext(PageContext ctx)和setParent(Tag parent)?br>c.如果标签h属性,属性的取值通过处理器提供setterҎ传入到对象。属性setterҎ是一个标{支持属性所需的唯一Ҏ?br>d.
面的上下文和父标签已被调置Qƈ已具备属性。此时调用标{֤理器的doStartTag()ҎQ该Ҏ可以dq些变量q执行实现标{功能所需的计?
和操作。doStartTag()Ҏ必须q回一个整型数。返回EVAL_BODY_INCLUDE则正常处理标{体Q返回SKIP_BODY则从初始
JSP面中直到此标签l束标记处的内容均被忽略?br>e.标签体被评估或忽视后调用标签处理器的doEndTag()ҎQ返回EVAL_PAGE则页面的其余部分被评伎ͼq回SKIP_PAGE则servlet代码立即从_jspService()中返回?br>
4.体标{֤理器的接口与实现
javax.servlet.jsp.tagext.BodyTag是Tag的子接口?br>javax.servlet.jsp.tagext.BodyTagSupport是实现BodyTagcR?br>BodyContent是javax.servlet.jsp.JspWriter的子c,但与其父cL所区别?br>BodyContent
对象的内容不自动写了入servlet的输出流Q而是U篏在一字符串缓存中。当标签体完成后其对象仍可在doEndTag()Ҏ中可以应用,?
getString()或getReader()Ҏ操作。ƈ在必要时修改及写入恢复的JspWriter输出?br>BodyContentcȝҎ
public void flush()throws IOException 复写JspWrite.flush()Ҏ以便它L产生溢出。刷新写入已失效Q因为它没有q接到将被写入的实际输出中?br>public void clearBody() 重置BodyContent~存为空?br>public Reader getReader() q回Readerd体内宏V?br>public String getString() q回包含体内容的一个字W串?br>public void writeOut(Write w) 体内容写入指定输出?br>public JspWrite getEnclosing Write() q回栈中下一个更高的写入者对象(可能是另一个BodyContent对象Q?br>BodyTag接口定义了一个新的整型常?br>EVAL_BODY_TAG 当doStartTag()q回Ӟ使得新的BodyContent对象被创建ƈ与此标签处理器相兌。当doAfterBody()q回Ӟ使得JSP servlet在修改完此标{控制的L变量后再ơ评C?br>BodyTag接口的方?br>public void setBodyContern (BodyContent out) 在当前JspWriter已被写入Q一个新的BodyContent在被创徏后由Jsp servlet调用Q它发生在doStartTag()之后?br>public void doInitBody() throws JspException setBodyContent()之后Q体被评估前调用的生命期Ҏ。如果多ơ评CQ此Ҏ只调用一ơ?br>public init doAfterBody
() throws JspException 体被评估后,BodyContent写入者仍处于Ȁzȝ态时调用的生命期Ҏ。此Ҏ必须q回
EVAL_BODY_TAG或SKIP_BODYQ若q回EVAL_BODY_TAG时体再次被评估?br>BodyTagSupportcȝҎ
public int doStartTag() throws JspException 复写TagSupport中的doStartTag()Ҏ?br>public int doEndTag() throws JspException 调用TagSupport中的doEndTag()ҎQ返回结果?br>public void setBodyContent (BodyContent out) 在一保护成员变量bodyContent中保存新的体内容对象Q子cd直接讉K此对象?br>public void doInitBody() throws JspException ~省什么都不做。被需要执行初始化的子cL复写?br>public int doAfterBody() throws JspException 每次体被评估后由JSP servlet调用Q体同容对象仍处于激zȝ态。返回SKEP_BODY或EVAL_BODY_TAG则体再次被评?br>public void release() 讄bodyContent对象为nullQ然后调用super.release()?br>public BodyContent getBodyContent() q回bodyContent变量。子cdl可以访问保护变量,但此Ҏ允许无关的标{֤理类Ҏ体内容发送输出?br>public JspWriter getPreviousOut() 在bodyContent变量上调用getEnclosingWriter()q返回结果的便方法?br>
5.体标{֤理器的生命期
a.生成servlet需要创建标{֤理器cȝ一个实例。实现方式通常是调用JSP容器的工厂类的一个方法,工厂cd含一个标{֤理器实例池以使其可重用不再处于激zȝ态的对象?br>b.初始化标{֤理器QservletL其存在性。servlet通过调用标签处理器的两个Ҏ实现此过E:setPageContext(PageContext ctx)和setParent(Tag parent)?br>c.如果标签h属性,属性的取值通过处理器提供setterҎ传入到对象。属性setterҎ是一个标{支持属性所需的唯一Ҏ?br>d.面的上下文和父标签已被调置Qƈ已具备属性。调用标{֤理器的doStartTag()ҎQ该Ҏ可以dq些变量q执行实现标{功能所需的计和操作?br>doStartTag()Ҏ必须q回一个整型数?br>q回EVAL_BODY_TAG则正常处理标{体Q蟩到eQ;
q回SKIP_BODY则从初始JSP面中直到此标签l束标记处的内容均被忽略。(跛_fQ?br>e.如果q回EVAL_BODY_TAGӞ则正常处理标{体?br> e1.在栈中保存当前的JspWriter对象Q创建新的BodyContent对象Qƈ其|ؓJSP面的out对象保存在上下文范围内名为name的属性中。ƈ调用它的setBodyContent()Ҏ?br> e2.调用doInitBody()Ҏq行初始化?br> e3.处理标签体。将输出写入BodyContent对象中,此过E依赖于TLD的标{օ?lt;bodycontent>Q有三种可能取倹{?br> e4.调用doAfterBody()ҎQ将体内体内容写入JspWriterQ可如下实现Q?br>JspWriter out=bodyContent.getEnclosingWriter();
out.println(bodyContent.getString());//bodyContent.writeOut(out);
bodyContent.clear();
e5.doAfterBody()Ҏq回两种可能Q?br>q回EVAL_BODY_TAGӞ再对标签体进行评伎ͼq是数组和枚举被循环处理的典型情c?br> q回SKIP_PAGEӞl箋面的其余部份?br>e6.体内容完成,因此创徏它的q程被反向:
调用pageContent.popBody()Ҏ索前面的JspWriter对象?br> 写入者设|回out隐含对象?br>f.标签体被评估或忽视后调用doEndTag()ҎQ允许标{֤理器像输出流发回内容?br>q回EVAL_PAGE则页面的其余部分被评伎ͼ
q回SKIP_PAGE则servlet代码立即从_jspService()中返回?br>g. 此时体的内容在受保护的bodyContent对象中仍然可用?br>可以它写入servlet输出中Q?br>JspWriter out=pageContext.getOut();
out.println(bodyContent.getString());
或?br>bodyContent.WriteOut(pageContext.getOut());
6.标签附加信息c?br>
四、标{指?br>
taglib指o元素的目的是指定TLD的位|,讄在页面上与标{分开来的一个短别名?br>语法Q?lt;%@ taglib prefix=”tag prefix” uri=”taglibURI” %>
属性:prefixQ用于标识标{ֺ的唯一标识。uriQ标{ֺ本n的URI?br>uri不必指向一个实际文Ӟ它是JSP容器可以在web.xml中查扑֮际文件位|的唯一标识W?/p>
]]>
解压密码Q?strong> 解压密码Qxxx_programer
]]>
如果使用scriptlets,那么Q我们经怋用Iterator或者Enumeration来进行P代,如:
Iterator it = collection.iterator();
while(it.hasNext()){
SomeBean someBean = (SomeBean)it.next();
out.println(someBean.getXXX());
…………..
}
在前面的一ơ中Q我们开发过一个P代标{,JSTL中也提供了对q代q行支持的标{,q且Q他的功能比上一章的强大的多。JSTL中的q代标签有两个:
l <c:forEach>;
l <c:forTokens>;
1?lt;c:forTokens>专门处理TokenString的P代,可以指定一个或者是多个分隔W。由于他们用的很少Q在q里׃介绍了?/font>
2?lt;c:forEach>是最常用的,他几乎能够完成所有的q代dQ就象jsp中的for(int i=j;i<k;i++)下面我来详细介绍?注意Q?#8220;[]”里面的是可选条?
语法Qa、在Collection中P代:
<c:forEach [var=”varName”] items=”collection” [varStatus=”varStatusName”]
[begin=”begin”] [end=”end”] [step=”step”]>
Body 内容
</c:forEach>
b、P代固定的ơ数Q?/font>
<c:forEach [var=”varName”] [varStatus=”varStatusName”]
begin=”begin” end=”end” [step=”step”]>
Body 内容
</c:forEach>
举例Qc_forEach1.jsp(在Collection中P?
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<%@ page import="java.util.*,com.j2ee14.ch12.User"%>
<%
Collection users_c=new ArrayList();
for(int i=0;i<3;i++)
{
User user=new User();
user.setUserName("foo"+i);
user.setPassword("foo"+i);
users_c.add(user);
}
session.setAttribute("users",users_c);
%>
<html>
<head>
<title>JSTL:c:forEach的用之一</title>
</head>
<body bgcolor="#FFFFFF"><center>
<h4>q代某个collection中的元素?lt;/h4>
<table border=1>
<tr><td>用户?lt;/td><td>密码</td></tr>
<c:forEach var="users" items="${users}">
<tr>
<td><c:out value="${users.userName}"/></td>
<td><c:out value="${users.password}"/></td>
</tr>
</c:forEach>
</table>
</center></body>
</html>
举例Qc_forEach2.jspQP代固定的ơ数Q?/font>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<tcounttle>JSTL:c:forEach的用之?lt;/tcounttle>
</head>
<body bgcolor="#FFFFFF"><center>
<h4>W二UP代:50Q?0</h4>
<c:forEach var="count" begin="50" end="60">
<c:out value="${count}"/> **
</c:forEach>
<h4>W二UP代:10 to 100,step=10</h4>
<c:forEach var="count" begin="10" end="100" step="10">
<c:out value="${count}"/>**
</c:forEach>
</center>
</body>
</html>
<sql:update>
作用Q主要是执行插入、更新和删除操作的标{。另外,q有一些没有返回结果集?font face="Times New Roman">sql操作也可以用这个标{。比?/font>
create table tableName(id int….);
drop table tableName
grant tableName {等。?/font>
语法Q?font face="Times New Roman">a、没?font face="Times New Roman">body的情?/font>
<sql:update sql=”sqlUpdate”
[dataSource=”dataSource”]
[var=”varName”]
[scope=”{page|session|request|application}”]/>
b、有body Qƈ且在body中指定参?/font>
<sql:update sql=”sqlUpdate”
[dataSource=”dataSource”]
[var=”varName”]
[scope=”{page|session|request|application}”] >
<sql:param> actions
</sql:update>
c、有bodyQ在body中指?font face="Times New Roman">sql语句和可选的参数
<sql:update sql=”sqlUpdate”
[dataSource=”dataSource”]
[var=”varName”]
[scope=”{page|session|request|application}”] >
Update statement
<sql:param> actions
</sql:update>
举例Q?font face="Times New Roman">sql_update.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>JSTL:的?font face="Times New Roman"></title>
</head>
<sql:setDataSource
var="ds2"
dataSource="jdbc/ch12"
/>
更新记录?font face="Times New Roman">1<hr>
<sql:update var="update1" dataSource="${ds2}">
update sql_test set power='low' where id=01
</sql:update>
W?font face="Times New Roman">2U更斎ͼ创徏?font face="Times New Roman"><hr>
<sql:update var="update4" sql="create table sql_temp_901(test varchar(20))" dataSource="${ds2}"/>
W?font face="Times New Roman">3U更斎ͼ增加记录
<sql:update var="update5" sql="insert into sql_temp_901 values('hellking')" dataSource="${ds2}"/>
W?font face="Times New Roman">4U更斎ͼ删除记录<hr>
<sql:update var="update6" sql="delete from sql_temp_901 where test='hellking'" dataSource="${ds2}"/>
W?font face="Times New Roman">5U更?font face="Times New Roman">:删除?font face="Times New Roman"><hr>
<sql:update var="update7" sql="drop table sql_temp_901" dataSource="${ds2}"/>
</body>
</html>
<sql:transaction>
作用Q用语事务处理,它ؓ<sql:query>?font face="Times New Roman"><sql:update>建立事务处理上下文,q且提供相同的数据源?/font>
语法Q?font face="Times New Roman"><sql:transation [dataSource=”dataSourceName”]>
[isolation=”isolationLevel”]>
<sql:query> and <sql:update> statement
</sql:transation>
isolationLevel ::=”read_committed”
|”read_uncommitted”
|”repeatable_read”
|”serializable”
注意Q?font face="Times New Roman">DataSource属性和其他标签?font face="Times New Roman">DataSource属性一Pisolactionlevel属性指定事务隔ȝU别Q如果没有指定它的|那么׃用自己配|的DataSource事务隔离U别。而且Q嵌套在里面?font face="Times New Roman"><sql:query> ?font face="Times New Roman"> <sql:update>标签不能再指定其他的数据源?font face="Times New Roman"><sql:transaction>
是数据库装的轻量事务处理Q如果你需要复杂的事务处理或者分布试处理Q它׃适合?/font>
举例Q?font face="Times New Roman">sql_transaction.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>JSTL:sql:transaction的?font face="Times New Roman"></title>
</head>
<sql:setDataSource
var="ds2"
dataSource="jdbc/ch12"
/>
<h2>使用事务处理方式创徏一个表Q?font face="Times New Roman"></h2>
<sql:transaction dataSource="${ds2}">
<sql:update var="test_temp902">
create table test_temp902 (
id int primary key,
name varchar(80)
)
</sql:update>
<sql:update sql="insert into test_temp902 values(01,'wyy')"/>
<sql:update sql="update sql_test set power='wyy' where id=01"/>
</sql:transaction>
</body>
</html>
<sql:param>
作用Q设|?font face="Times New Roman">sql语句?#8220;Q?#8221;表示的占位符L倹{?/font>
语法Q?font face="Times New Roman">a、没?font face="Times New Roman">bodyQ?font face="Times New Roman">value指定?/font>
<sql:param value=”value”/>
b、在body中指?/font>
<sql:param>
参数?/font>
</sql:param>
举例Q?font face="Times New Roman">sql_param.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>JSTL:sql:param的?font face="Times New Roman"></title>
</head>
<sql:setDataSource
var="example"
dataSource="jdbc/ch12"
/>
执行更新操作Q?font face="Times New Roman"><hr>
<sql:update var="update2" sql="update sql_test set power=? where id=?" dataSource="${example}">
<sql:param value="high"/>
<sql:param value="01"/>
</sql:update>
</body>
</html>
l <c:import>
l <c:redirect>
l <c:url>
l <c:param>
<c:import>
作用Q导入一个url的资源,相当于jsp 中的<jsp:include page=”path”>标签Q同样也可以把参C递到被导入的面?/font>
语法Qa、资源的内容使用string对象向外暴露
<c:import url=”url” [context=”context”]
[var=”varName”] [scope=”{page|request|session|application}”]
[charEncoding=”charEncoding”]>
Optional body content for <c:param> subtags
</c:import>
b、资源的内容使用redirect对象向外暴露
<c:import url=”url” [context=”context”]
varReader=”varReaderName”
[charEncoding=”charEncoding”]>
Body content where varReader is consumed by another action
</c:import>
举例Qc_import.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>JSTL:c:import的?lt;/title>
</head>
<body bgcolor="#FFFFFF">
<h3>l对路径 URL</h3>
<blockquote>
<ex:escapeHtml>
<c:import url="http://127.0.0.1:8080/ch12/footer.jsp"/>
</ex:escapeHtml>
</blockquote>
<h3>相对路径q且传递参数到指定的URL</h3>
<blockquote>
<c:import url="footer.jsp" charEncoding="gb2312">
<c:param name="userName" value="hellking"/>
</c:import>
</blockquote>
</body>
</html>
<c:redirect>
作用Q把客户的请求发送到另一个资源,相当于jsp中的<% request.sendRedirect(“other.jsp”)%>或者servlet中的RequestDispatch.forward(“other.jsp”)的功能?/font>
语法Qa、没有body的情?/font>
<c:redirect url=”value” [context=”context”]/>
b、有bodyQ在body 中查询指定的参数
<c:redirect url=”value” [context=”context”]>
<c:param> subtags
</c:redirect>
举例Qc:redirect.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>JSTL:c:redirect的?lt;/title>
</head>
<body bgcolor="#cc99cc">
<c:url value="footer.jsp" var="nextpage"><c:param name="userName" value="hellking"/></c:url>
<c:redirect url="${nextpage}"/>
</body>
</html>
<c:url>
作用Q用于构造URLQ主要的用途是URL的重写?/font>
语法Qa、没有body的情?/font>
<c:url value=”value” [context=”context”]
[var=”varName”] [scope=”{page|request|session|application}”]/>
b、有body Qƈ在body 中有重写的参?/font>
<c:url value=”value” [context=”context”]
[var=”varName”] [scope=”{page|request|session|application}”]>
<c:param> subtags
</c:url>
举例Qc_url.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>JSTL c:url 的?lt;/title>
</head>
<body bgcolor="#FFFFFF">
<c:url var="footer" value="footer.jsp" scope="page">
<c:param name="id" value="hellking"/>
</c:url>
<c:out value="${footer}"/>
<br>另一U没有参数的URL<br>
<c:url value="footer.jsp"/>
</body>
</html>
<c:param>
作用Q它是在<c:import>Q?lt;c:redirectt>Q?lt;c:url>中添加请求的参数。和一般的参数没什么区别?/font>
语法Qa、参数的g用value属性指?/font>
<c:param name=”name” value=”value”/>
b、参数的值在body 中指?/font>
<c:param name=”name”>
参数?/font>
</c:param>
举例Qc_param.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>JSTL c:param的?lt;/title>
</head>
<body bgcolor="#FFFFFF">
<c:redirect url="footer.jsp">
<c:param name="userName">
hellking
</c:param>
</c:redirect>
</body>
</html>
<sql:setDataSource>
<sql:query>
<sql:update>
<sql:transaction>
<sql:param>
<sql:setDataSource>
语法Q?lt;sql:setDataSource>用来讄数据源,可以通过scope讄使用范围Q如page、application、session{。有两种方式可以讄数据源,一U是直接使用在web中配|的数据源,只要指定jndi名就可以了(q个׃要我多讲了吧Q呵呵)Q第二种是指定所有的q接属性?/font>
<sql:setDataSource
{dataSource=”dataSourceName” | url=”jdbcurl”
[driver=”driverClassName”]
[user=”userName”]
[password=”password”]
[var=”varName”]
[scope=”{page|session|request|application}”]/>
举例Qsql_datasource.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jstl/sql" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>JSTL:<sql:setDataSource>的?lt;/title>
</head>
<body bgcolor="#FFFFFF">
创徏普通的数据源:<br>
<sql:setDataSource
var="ds1"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/jstlTest"
user="jstl"
password="jstl"
/>
从jndi名称I间中获得一个数据源?lt;br>
<sql:setDataSource
var="ds2"
dataSource="jdbc/ds2"
/>
</body>
</html>
<sql:query>
作用Q不用说都知道了Q数据库操作中最频繁的查询?/font>
语法Qa、没有body
<sql:query sql=”sqlQuery”
Var=”varName” [scope=”{page|session|request|application}”]
[dataSource=”dataSourceName”]
[maxRows=”maxRows”]
[startRow=”startRow”] />
b、有一个body Qƈ在body 中指定了查询需要的参数
<sql:query sql=”sqlQuery”
Var=”varName” [scope=”{page|session|request|application}”]
[dataSource=”dataSourceName”]
[maxRows=”maxRows”]
[startRow=”startRow”] >
<sql:param> actions
</sql:query>
c、有bodyQƈ且可以指定可选的参数Q?lt; sql:param >在后面讲qͼ
<sql:query sql=”sqlQuery”
Var=”varName” [scope=”{page|session|request|application}”]
[dataSource=”dataSourceName”]
[maxRows=”maxRows”]
[startRow=”startRow”] >
query
optional<sql:param> actions
</sql:query>
举例Qsql_query.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>JSTL:<sql:query>的?lt;/title>
</head>
<body bgcolor="#FFFFFF">
<sql:setDataSource
var="ds2"
dataSource="jdbc/ch12"
/>
W一U查询:<hr>
<sql:query var="query" dataSource="${ds2}">
SELECT * FROM sql_test
</sql:query>
<table border="1">
<c:forEach var="row" items="${query.rows}">
<tr>
<td>Name: <c:out value="${row.id}"/></td>
<td>mobile: <c:out value="${row.power}"/></td>
</tr>
</c:forEach>
</table>
<hr>
W?U查询:<hr>
<sql:query var="query2" sql="SELECT * FROM sql_test where id=?" dataSource="${ds2}">
<sql:param value="01"/>
</sql:query>
<table border="1">
<c:forEach var="row" items="${query2.rows}">
<tr>
<td>Name: <c:out value="${row.id}"/></td>
<td>mobile: <c:out value="${row.power}"/></td>
</tr>
</c:forEach>
</table>
</body>
</html>
条g标签包括以下几种Q?/font>
l <c:if>;
l <c:choose>;
l <c:when>;
l <c:otherwise>;
下面Q我来分别介l:
l <c:if>; 它用来做条g判断Q功能类似jsp中的<%if(boolean){}%>
语法Q?/font>
1、无body的情?/font>
<c:if test=”testCondition” var=”varName” [scope=“{page|request|session|application}”]/>
2、有body的情?/font>
<c:if test=”testCondition” var=”varName” [scope=“{page|request|session|application}”]>
Body内容
</c:if>
举例Q?/font>c_if.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>JSTL:c:if的?lt;/title>
</head>
<body bgcolor="#FFFFFF">
<c:set var="count" value="100"/>
<c:if test="${count>78}">
count>78
</c:if>
</body>
</html>
l <c:choose>; 它是用于条g选择Q和<c:when>,<c:otherwise>一起用,它的条g选择是排斥性的Q相当于jsp中的<%switch(i){case 0: … case 1:… default :}%>Q也可以完成<%if{}…else if{}….else if{} else{} %>的功?/font>
语法Q?lt;c:choose>
Body内容(<c:when>,<c:otherwise>)
</c:choose>
注意Q它的body内容只能是由以下的元素组成:
1. I格Q?/font>
2. 0个或多个<c:when>子标{,<c:when>必须?lt;c:otherwise>子标{之前出玎ͼ
3. 0个或多个<c: otherwise >子标{?/font>
l <c:when> 它是<c:choose>的一个分?/font>
语法Q?/font>
<c:when test=”testCondition”>
Body内容
</c:when>
注意Q它有两个限Ӟ
1. 必须?lt;c:choose>作ؓ它的父标{?/font>
2. 必须?lt;c:otherwise>标签之前出现
l <c:otherwise>他代表了<c:choose>的最后选择相当于jsp?lt;%switch(i){case 0: … case 1:… default :}%> 中的default语句?/font>
语法Q?/font>
<c:otherwise>
Conditional block
</c:otherwise>
它的使用有两个限Ӟ
1. 必须?lt;c:choose>作ؓ它的父标{;
2. 必须?lt;c:choose>的最后分支方式出玎ͼ
<c:choose>,<c:otherwise>,<c:when>举例Qc_choose.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<c:set var="count" value="100"/>
<html>
<head>
<title>JSTL:c:choose的?lt;/title>
</head>
<body bgcolor="#FFFFFF">
<c:choose>
<c:when test="${count <=0}">
<font color="blue">
</c:when>
<c:when test="${count<=60&&count>0}">
<font color="red">
</c:when>
<c:otherwise>
<font color="green">
</c:otherwise>
</c:choose>
count的值是Q?lt;c:out value="${count}"/>
</font>
</body>
</html>
好了Qjstl条g标签׃l到q里Q下再见。。。。:Q?/font>
在JSTL中,一般用途的标签只要是指h输出Q设|变量,和错误处理等功能的标{,他们在jsp中用很频繁Q它们有Q?/font>
l <c:out>
l <c:set>
l <c:remove>
l <c:catch>
下面Q我来讲qC下他们的作用Q?/font>
<c:out>
它是一个输出的标签Q负责把计算出的l果输出到jspwriterQ就跟调用out.println()基本一栗没有BODY的时候,使用下面的语法:
<c:out value=”value” [escapeXml]=”{true|false}” [default=”defaultValue”]/>
有BODY的时候,使用下面的语法:
<c:out value=”value” [escapeXml]=”{true|false}” >
q里是BODYQ可以是M合法的jsp或者是html代码?/font>
</c:out>
注意QescapeXml的作用是是否代码交lxml解析器解释,trueZlxml解析器解释,falseZl浏览器解释Q见U色部分代码
举例Qc_out.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>JSTL: c:out的?lt;/title>
</head>
<body bgcolor="#FFFFFF">
<hr>
<c:set var="sessionAttr" value="sessionValue" scope="session"/>
<c:set var="pageAttr" value="pageValue" scope="page"/>
<c:set var="requestAttr" value="requestValue" scope="request"/>
<c:out value="以下输出的是前面讄的属?lt;br>" escapeXml="false"/>
<c:out value="${sessionAttr}"/>
<c:out value="${pageAttr}"/>
<c:out value="${requestAttr}"/>
<c:out value="${test_nodef}" default="没有test_nodefq个变量"/>
</html>
<c:set>
q个标签用于在某个范?page,request,session,application)里面讄特定的?默认为page)Q或者设|某个已l存在的javabean的属性。类g<%request.setAttribute(“name”,value)%>
语法Q?/font>
1、用value属性设|一个特定范围里面的属性:
<c:set value=”value” var=”varName” [scope= “{page|request|session|application}”]/ >
2、用value属性设|一个特定范围里面的属性,带有BODYQ?/font>
<c:set value=”value” var=”varName” [scope= “{page|request|session|application}”] >
Body content
</c:set>
3、设|某个特定对象的一个属性:
<c:set value=”value” target=”target” property=”propertyName”/ >
4、设|某个特定对象的一个属? 带有BODYQ?/font>
<c:set value=”value” target=”target” property=”propertyName” >
Body content
</c:set>
举例Qc_set.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<jsp:useBean id="user" class="com.j2ee14.ch12.User"/>
<html>
<head>
<title>JSTL:的用c:set</title>
</head>
<body bgcolor="#FFFFFF">
<hr>
讄一个属性,然后输出?lt;br>
<c:set var="maxCount" value="100"/>
<c:out value="${maxCount}"/>
<hr>讄属性时Q把它的值放在标{body中?/font>
<c:set var="password">
ksdjfxsdf234234
</c:set>
<c:out value="${password}"/>
<hr>讄javaBean的属性,然后输出q些属性|
<c:set value="hellking" target="${user}" property="userName"/>
userName=<c:out value="${user.userName}"/>
<hr>讄属性,q且指定它们的范_属性的默认范围是page?/font>
<c:set value="20" var="maxIdelTime" scope="session"/>
<c:set value="next.jsp" var="nextPage" scope="page"/>
</body>
</html>
<c:remove>
它的作用是删除某个变量或者属性。类g<%session.removeAttribute(“name”)%>,它的语法是:<c:remove var=”varName” [scope= “{page|request|session|application}”]/ >
举例Qc_remove.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>JSTL:c:remove的?lt;/title>
</head>
<body bgcolor="#FFFFFF">
<c:set value="10000" var="maxUser" scope="application"/>
<c:set value="10" var="count" scope="session"/>
maxUser=<c:out value="${maxUser}"/><br>
count=<c:out value="${count}"/>
<hr>调用c:remove...
<c:remove var="maxUser" scope="application"/>
<c:remove var="count"/>
调用了c:remove后,参数gؓQ?/font>
maxUser=<c:out value="${maxUser}"/>Q?/font>
count=<c:out value="${count}"/>Q?/font>
</body>
</html>
<c:catch>
它的作用是捕捉由嵌套在它里面的标{所抛出来的异常。类g<%try{}catch{}%>Q它的语法是Q?lt;c:catch [var=”varName”]>nested actions</c:catch>
举例Qc_catch.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html; charset=gb2312" language="java" %>
<html>
<head>
<title>JSTL:catch的?lt;/title>
</head>
<body bgcolor="#FFFFFF">
<c:catch var="error">
<%
Integer.parseInt("sdkfj");
%>
</c:catch>
<hr>异常Q?/font>
<c:out value="${error}"/>
<hr>异常 exception.getMessage=
<c:out value="${error.message}"/>
<hr> 异常exception.getCause=
<c:out value="${error.cause}"/>
</body>
</html>
<c:if test="${age<18}">
对不P你的q龄q小Q不能访问这个网◎Q?br> </c:if>
<br>
</body>
</html>
web.xml
(使用java的标{ֺ文g*.jar)
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns=" xmlns:xsi=" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd"
version="2.4">
<display-name>jstl test</display-name>
<description>
jstl test
</description>
</web-app>
(使用标签库文?.tld)
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns=" xmlns:xsi=" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee version="2.4">
<taglib>
<taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/fmt-rt</taglib-uri>
<taglib-location>/WEB-INF/fmt-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/core-rt</taglib-uri>
<taglib-location>/WEB-INF/c-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/sql</taglib-uri>
<taglib-location>/WEB-INF/sql.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/sql-rt</taglib-uri>
<taglib-location>/WEB-INF/sql-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/x</taglib-uri>
<taglib-location>/WEB-INF/x.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/x-rt</taglib-uri>
<taglib-location>/WEB-INF/x-rt.tld</taglib-location>
</taglib>
</web-app>
好了Q一个最单的包含有jstl的页面设计完成了。下面测试?br>http://localhost:8080/jstl/frist_jstl.jsp
面输出l果Q?br>
Ƣ迎您,hellking
1
2
3
4
5
对不P你的q龄q小Q不能访问这个网◎Q?
呵呵。。。简单吧Q下l。。。。。:Q?/p>