关于taglib的标签使用,我倒是不太喜欢,本人更倾向于使用JSTL的标签,不过struts标签一点好处就是:struts标签 能够和struts-config.xml, ActionForm等特有的对象进行交互既然struts自带这么多标签,我还是要说一下的
struts的标签大致分为,struts html标签,Bean标签,Logic标签,Nested标签,template标签
html标签
HTML标签库主要用来显示HTML元素,如果不用这种方法,你就必须用HTML标签来指定它们。从表面上看,这个标签库很简单。但是通过深入研究,我们就会发现它很强大。例如,它可以为我们在HTML表单的一个特定输入元素中放置重点内容生成JavaScript,或为客户端输入验证生成脚本。而且,你可以用它通过一行代码来处理错误。然而,在将这个标签库用于你的Struts应用程序前,你需要做些简单的准备工作。
Struts标签大致分为以下几类:
1)用于生成基本的HTML元素的标签;
2)用于生成HTML表单的标签;
3)显示错误或正常消息的标签;
一、 用于生成基本的HTML元素的标签:
1.<html:html>标签:
用于在网页的开头生成HTML的<html>元素。该标签有一个lang属性,用于显示用户使用的语言:<html:html lang=”true”>。如果客户浏览器使用中文语言,那么以上代码在运行时将被解析为普通的HTML代码:<html lang=”zh-CN”>。
当lang属性为“true”时,<html:html>标签将先根据存储在当前HttpSession中的Locale对象来输出网页使用的语言,如果不存在HttpSession或HttpSession中没有Locale对象,就根据客户浏览器提交的HTTP请求头中的Accept-Language属性来输出语言,如果HTTP请求头中没有Accept-Language属性,就根据默认的Locale来输出语言。
2. <html:base>标签:
<html:base>标签在网页的<head>部分生成HTML<base>元素。HTML<base>元素用于生成当前网页的绝对URL路径。如果在网页中使用了<html:base>标签,当该网页引用同一个应用的其他网页时,只需给出相对于当前网页的相对URL路径即可。
3.<html:link>标签:
<html:link>标签用于生成HTML<a>元素。它有两个优点:
1)允许在URL中以多种方式包含请求参数;
2)当用户浏览器关闭Cookie时,会自动重写URL,将SessionID作为请求参数包含在URL中,用于跟踪用户的SessoinID状态。
<html:link>标签有以下重要属性:
1) forward:指定全局转发链接(在Struts配置文件中配置<global-forwards>的子元素<forward>);
2) href:指定完整的URL链接(如果Web应用需要链接到其他站点);
3)page:指定相对于当前网页的URL(如果从一个网页链接到同一个应用中的另一个网页),page属性用于指定相对于当前应用的URI;
<html:link>标签的使用:
1)在URL或URI中包含请求参数:如果要在URL或URIk 包含请求参数,只要把请求参数加在URL或URI的末尾即可。例如:<html:link page=”/action.do?param1=value1&param2=value2”>链接文本</html:link>。
2) 在URL或URI中包含单个请求变量:如果要在URL中包含一个请求参数,而这个参数的值存在于当前网页可访问的一个变量中,可按以下方式实现:首先在网页中创建可访问变量,如:
<%
//创建一个字符串类型的变量
String strBean = “value to pass on URL”;
pageContext.setAttribute(“strBean”,strBean);
%>
//创建一个JavaBean
<jsp:useBean id=”user” scope=”page” class=”beans.userBean” />
<jsp:setProperty name=”user” property=”name” value=”name1” />
接着,把这两个变量作为请求参数加入到URL或URI中:
<html:link page=”/action.do” paramId=”param1” paramName=”strBean”>
把字符串变量作为请求参数进行传递</html:link>
<html:link page=”/action.do” paramId=”param2” paramName=”user” paramProperty=”name” >将JavaBean的属性值作为请求参数进行传递</html:link>
其中,paramId属性指定请求参数名,paramName属性指定变量的名字,paramProperty属性指定JavaBean的属性。
在URL或URI中包含多个请求变量:
如果在URL或URI中包含多个请求参数,而这些参数的值来自于多个变量,需要先定义一个Map类型的Java类,用它来存放请求变量。例如:
<%
java.util.Map myMap = new java.util.HashMap();
myMap.put(“myString”,new String(“string value”));
myMap.put(“myArray”,new String[]{“str1”,”str2”,”str3”});
pageContext.setAttribute(“map”,myMap);
%>
将HashMap作为请求参数,加入到URL或URI中:
<html:link page=”/action.do” name=”map” >将多个变量作为请求参数传递</html:link>
以上代码将生成如下HTML代码:
<a href=”/应用程序名/action.do?myString=string+value&myArray=str1&myArray=str2&myArray=str3”>将多个变量作为请求参数传递</html:link>
4.<html:rewrite>标签:
用于输出超链接中的URI部分,但它并不生成HTML<a>元素。URI指的是URL中协议、主机和端口以后的内容。URI用于指定具体的请求资源。它的使用方法和<html:link>保持一致。
5.<html:img>标签:
用于在HTML页中嵌入图片。此外,它还允许包含请求变量,以便动态控制图片的输出。
1)生成基本的HTML<img>元素:<html:img page=”/图片相对于当前页面的URI” />,page属性指定相对于当前页面的URI;
2)生成包含单个请求变量的HTML<img>元素:其用法和<html:link>标签相似。
<html:img src=”/图片完整的URI” paramId=”参数名” paramName=”变量名” />
3) 生成包含多个请求变量的HTML<img>元素:用法和<html:link>标签相似。
<html:img page=”/图片相对于当前页面的URI” name=”Map集合对象在作用域对象中的key值” />
二、 基本的表单标签:
1. <html:form>标签:
该标签用于创建表单,例如:<html:form action=”formBasic.do”>,action属性用来指定当用户提交表单后,处理用户请求的组件。以上代码生成如下的HTML内容:<form action=”/应用程序名/formBasic.do” name=”formBasicForm” method=”post”>。
2. <html:text>标签:
该标签在表单上创建HTML文本框字段。<html:text property=”属性名” />。property属性指定了字段的名字,它和ActionForm Bean中的一个属性匹配。
3. <html:cancel>标签:
该标签在表单中生成取消按钮。当用户按下取消按钮时,将产生一个取消事件,这个事件由Action类来捕获,至于如何处理这个事件,可以在Action类的execute()方法中编程来实现。用户选择取消按钮的情形为:用户已经按下了提交按钮,在等待服务器响应结果的过程中忽然改变主意,想取消操作,就会按下取消按钮。因此,在Action类中处理取消事件时,可以执行一些清除操作,取消已经执行的响应用户请求的部分操作。
<html:cancel>Cancel</html:cancel>,以上代码生成如下HTML内容:<input type=”submit” name=”org.apache.struts.taglib.html.CANCEL” value=”Cancel”>。
Action类的isCancelled(request)方法用来判断取消事件有没有发生,如果这个方法返回true,就表示取消事件发生了,可以在程序中进行相关的操作。
4. <html:reset>标签:
该标签生成表单的复位按钮。<html:reset>Reset</html:reset>,生成如下HTML内容:<input type=”reset” name=”reset” value=”Reset” />。
5. <html:submit>标签:
该标签用于生成表单的提交按钮。<html:submit>Submit</html:submit>,生成如下HTML内容:<input type=”submit” name=”submit” value=”Submit” />。
6. <html:hidden>标签:
该标签在表单上生成隐藏字段。用于在表单上存放不希望用户看到或不允许修改的信息。使用方式有两种:
1)<html:hidden property=”hiddenValue” />:生成相应的HTML内容为<input type=”hidden” name=”hiddenValue” value=”网页中hiddenValue元素的值” />;
2)<html:hidden property=”hiddenValue” write=”true” />:生成相应的HTML内容为<input type=”hidden” name=”hiddenValue” value=”网页中hiddenValue元素的值” />网页中hiddenValue元素的值;这种方式可以把隐藏字段的值显示在网页上,如果需要在表单上显示某个值,但不希望用户改变这个值,就可以使用这种方法。
三、 检查框和单选按钮标签:
1. <html:checkbox>标签:
在表单上生成标准的HTML检查框。假如ActionForm Bean中的某个属性只有两种可选值(如true和false),就可以在表单中使用该标签,它只能和ActionForm Bean中的boolean类型的属性对应。<html:checkbox property=”checkbox1” />,生成相应的HTML内容为:<input type=”checkbox” name=”checkbox1” value=”true” />。
<html:checkbox>有一个value属性,用来设置用户选中检查框时的值,value默认值为true。如果把value属性设置为false,则表示如果用户选择了这个检查框,就把相应的ActionForm Bean中的属性值设置为false。这个规则很容易让人混淆,使用时应小心。
注:为了使检查框能正常工作,必须在ActionForm Bean的reset()方法中对其复位。
2. <html:multibox>标签:
在表单上生成标准的HTML检查框。如果应用中有多个checkbox,并且希望在ActoinForm Bean中用单个数组来表示它们,就可以采用该标签。使用方法如下:
1)在ActionForm Bean中定义一个数组,来存放所有CheckBox的值;
2)在表单中加入<html:multibox>元素,通过设置property属性来把它和ActionForm Bean中的数组关联;
3)对于每个<html:multibox>元素,设置它的初始值,有两种方式:<html:multibox property=”属性数组名” value=”数组元素的值”/>或<html:multibox property=”属性数组名”>数组元素的值</html:multibox>。
当用户提交表单时,所有被选中的复选框的值都会被存放到ActionForm Bean中的相应数组中,如果某个复选框没有被选中,那么数组的就不会包含它的值。
3. <html:radio>标签:
提供表单中的HTML<input type=”radio”>元素,表示单选按钮。多个<html:radio>标签可以成组使用。例如:
<html:radio property=”radioVal” value=”value1” />
<html:radio property=”radioVal” value=”value2” />
将标签的property属性设置为相同,而仅仅是value不同。在同一时刻,只允许用户选择一个按钮,如果两个按钮都没有选中,则ActionForm Bean中的radioVal属性将被设为空字符串。
四、 下拉列表和多选列表标签:
1.<html:select>标签:
用于生成HTML<select>元素。它可以在表单上创建下拉列表或多选列表。可以包含多个<html:option>、<html:options>和<html:optionsCollection>标签。其基本形式为:
<html:select property=”propertyName” multiple=”true|false” size=”count”>
[1 or more <html:option>,<html:options>,<html:optionsCollection> tags]
</html:select>
1) size属性:指定每次在网页上显示的可选项的数目;
2) multiple属性:指定是否支持多项选择,如果设置为true,就表示多选列表,否则表示下拉列表。默认值为false。
3)property属性:与ActionForm Bean中的某个属性对应,这个属性用来存放用户在列表上选中选项的值。在单项选择的情况下,ActionForm Bean中的对应属性应该定义为简单类型(不能为数组);在多项选择的情况下,ActionForm Bean中的对应属性应该定义为数组类型。
2. <html:option>标签:
用于生成HTML<option>元素。这个标签被嵌套在<html:select>标签中,代表列表中的一个可选项。可选项的Label值有两个来源:
1)在<html:option>和</html:option>之间的文本内容;
2)由<html:option>标签的key、locale和bundle属性指定的Resource Bundle中的内容。bundle属性指定Resource Bundle,它和Struts配置文件中<message-resources>元素的key属性匹配;key属性和资源文件中的消息key匹配。
3. <html:options>标签:
提供一组HTML<option>元素。在<html:select>中可以包含多个<html:options>元素。 其主要属性为:
1)collection属性:指定存放可选项的集合(可以是HashMap集合,或者包含JavaBean对象的List集合);
2) property属性:指定集合中可选项的实际值;
3) labelProperty属性:指定集合中可选项的显示值;
4. <html:optionsCollection>标签:
用于提供一组HTML<option>元素。在<html:select>元素中可以包含多个<html:optionsCollection>元素。其主要属性为:
1) property属性:指定可选项的集合(和ActionForm Bean的一个集合属性相关联);
2)value属性:指定集合中可选项的实际值;
3)label属性:指定集合中可选项的显示值;
4)name属性:指定可选项的集合(可以是HashMap集合,或者包含JavaBean对象的List集合);
五、 在表单中上传文件标签:
文件上传指的是用户通过浏览器把用户本地的文件上传到Web服务器端。<html:file>标签生成HTML<input type=”file”>元素,提供从HTML表单中上传文件的功能。
1. <html:file>标签:可以方便地实现文件上传功能,例如:
<html:form action=”action.do” method=”Post” enctype=”multipart/form-data”>
<html:file property=”属性名” />
</html:form>
使用<html:file>标签需要注意以下几点:
1) <html:file>标签必须嵌套在<html:form>标签中;
2)<html:form>标签的method属性必须设置为”post”;
3) <html:form>标签的编码类型enctype属性必须设置为“multipart/form-data”;
4)<html:file>标签必须设置property属性,这个属性和ActionForm Bean中的FormFile类型的属性相对应。
2. 在ActionForm Bean中设置FormFile属性:
与JSP文件中的<html:file property=”propertyName” />,在ActionForm Bean中必须定义一个名为”propertyName”的属性。这个属性必须为“org.apache.struts.upload.FormFile”类型。
3. 在Action类中处理文件上传:
文件上传比传递HTTP表单的其他数据要复杂,Struts框架提供了这方面的功能,如果要处理实际的文件上传和保存操作,可以采用以下代码:
//确定上传文件在服务器上的保存目录
String dir = servlet.getServletContext().getRealPath(“/upload”);
//获得ActionForm Bean的实例
HtmlFileForm hff = (HtmlFileForm)form;
FormFile file = hff.getFile();
if(file == null)
{
return mapping.findForward(“success”);
}
//获得文件名和文件大小
String fileName = file.getFileName();
String size = Integer.toString(file.getFileSize()) + “bytes”;
//获取读取用户上传文件的InputStream对象
InputStream streamIn = file.getInputStream();
//创建将上传数据写到目标文件中的OutputStream对象
OutputStream streamOut = new FileOutputStream(dir + “/” + fileName);
//读取InputStream的内容,再将读取内容通过OutputStream对象写到目标文件中
int bytesRead = 0;
byte[] buffer = new byte[1024];
while((bytesRead=streamIn.read(buffer,0,1024)) != -1)
{
streamOut.write(buffer,0,bytesRead);
}
streamOut.close();
streamIn.close();
六、 <html:errors>标签:
用于输出错误消息。
1.错误消息的来源:
<html:errors>标签在request和session范围内寻找ActionMessages(或其子类ActionErrors)集合对象,再从ActionMessages集合对象中读取ActionMessage对象,把ActionMessage对象包含的消息文本显示到网页上。
在ActionForm Bean和Action类中都可以生成ActionMessages对象:ActionForm Bean的validate()方法执行表单验证,返回ActionErrors对象,Struts控制器组件RequestProcessor把ActionErrors对象存放在request范围内,存放时的属性key为Globals.ERROR_KEY;在Action类的execute()方法可以进行数据逻辑验证,如果验证失败,将生成ActionMessages对象(创建ActionMessages对象;向ActionMessages对象中添加ActionMessage对象;调用saveErrors(HttpServletRequest,ActionMessages)方法把ActionMessages对象保存在request范围内)。
2. 格式化地显示错误消息:
<html:errors>标签能够格式化地显示ActionMessage对象包含的消息文本,而这些消息文本预先存放在Resource Bundle中。<html:errors>标签能够识别错误消息文本中的HTML元素(如:<li>元素、<hr>元素等)。另:errors.header和errors.footer分别可以生成消息主体的页头和页尾。
3.<html:errors>标签的用法:
<html:errors>标签可以放在网页的任何地方,既可以位于HTML表单内,也可以位于HTML表单之外。<html:errors>标签具有以下重要属性:
1)name:指定ActionMessages对象存放在request或session范围内的属性key,默认值为Global.ERROR_KEY。
2)property:指定消息属性。如果此项没有设置,将显示ActionMessages对象中所有的ActionMessage。
3)bundle:指定Resource Bundle。如果此项没有设置,将从应用默认的Resource Bundle中获取消息文本。
注:ActionMessages的add(String property,ActionMessage message)方法的porperty参数用于设置消息属性。同一消息属性可以对应多条消息,例如:
errors.add(ActionMessages.GLOBAL_MESSAGE,new ActionMessage(“error.err1”));
errors.add(ActionMessages.GLOBAL_MESSAGE,new ActionMessage(“error.err2”));
<html:errors>标签的property属性和以上ActionMessages的add()方法的property属性匹配。
<html:errors>的三种使用方法:
1)显示全局消息:全局消息是指不和特定表单字段关系的消息,消息属性为ActionMessages.GLOBAL_MESSAGE。ActionMessages.GLOBAL_MESSAGE是一个常量,它的值为“org.apache.struts.action.GLOBAL_MESSAGE”,它代表全局消息。
2)显示所有消息:如果在<html:errors>标签中没有设置property属性,将显示ActionMessages对象中所有的消息。
3)显示和特定表单字段关联的消息:例如:在ActionForm Bean的validate()方法中有如下代码:errors.add(“txtUserName”,new ActionMessage(“errors.user”));而在相应的JSP页面中显示该错误消息的代码为:<html:errors property=”txtUserName” />。
七、 <html:messages>标签:
<html:messages>标签和<html:errors>标签有些相似,也能够在网页上输出消息,不过两者的使用方法有些差别。例如在JSP页面中显示正常消息的代码如下:
<html:messages id=”message” message=”true”>
<bean:write name=”message” />
</html:messages>
该标签的重要属性为:
1)name属性:指定ActionMessages对象存放在request或session范围内的属性key。
2)message属性:指定消息来源。如果为true,则从request或session范围内检索出属性为key为Globals.MESSAGE_KEY的ActionMessages对象,此时name属性无效;如果为false,则根据name属性来检索ActionMessages对象,如果此时没有设置name属性,将采用默认值Globals.ERROR_KEY。message属性的默认值为false。
3)id属性:用来命名从消息集合中检索出的每个ActionMessage对象,它和<bean:write>标签的name属性匹配。在上例中,<html:messages>标签的处理类每次从消息集合中取出一个ActionMessage对象,就把它命名为“message”,<bean:write>标签接着把这个名为“message”的ActionMessage对象的消息输出到网页上。
注:在Action类的execute()方法中处理逻辑时,如果需要添加消息,然后在转发的JSP页面中输出这些消息,则先创建ActionMessages对象,然后调用它的add(String property, ActionMessage message)方法将一条正常的消息保存在ActionMessages集合对象中,接着再调用saveMessages(HttpServletRequest,ActionMessages)方法,把ActionMessages集合存放到request范围内。
bean标签
Struts Bean标签库的功能大致分为三类:
1)用于访问HTTP请求信息或JSP隐式对象的Bean标签;
2)用于访问Web应用资源的Bean标签;
3)用于定义或输出JavaBean的Bean标签;
一、访问HTTP请求信息或JSP隐式对象:
1. <bean:header>标签:
用于检索HTTP请求中的Header信息,它具有的属性:
1)id属性:定义一个String类型的变量名称,这个变量存放在page范围内;
2)name属性:指定需要检索的Header信息;
例如:<bean:header id=”lang” name=”Accept-Language” />,该标签执行的操作
等价于:<%
String value = request.getHeader(“Accept-Language”);
pageContext.setAttribute(“lang”,value);
%>
可以通过<bean:write name=”lang” />标签输出lang变量的值。
2.<bean:parameter>标签:
用于检索HTTP请求参数,它具有的属性:
1)id属性:定义一个String类型的变量名称,这个变量存放在page范围内;
2)name属性:指定请求参数的名称;
3)value属性:指定请求参数的默认值;
4)multiple属性:可以设置为任意一个字符串(如:yes),则检索出所有和参数名匹配的请求参数,此时id属性定义的变量不再是String类型,而是String[]数组,用于存放所有和name属性匹配的请求参数值。
3. <bean:cookie>标签:
检索保存在浏览器中的Cookie。它具有以下属性:
1)id属性:定义一个javax.servlet.http.Cookie类型的变量,这个变量被存放在page范围内;
2)name属性:指定Cookie的名字;
3)value属性:指定Cookie的默认值。如果由name属性指定的Cookie不存在,就使用value属性指定的默认值。
4. <bean:page>标签:
用于检索JSP隐式对象。它具有以下属性:
1) id属性:定义一个引用隐式对象的变量,这个变量存放在page范围内;
2)property属性:指定隐式对象的名字,可选值包括application、config、request、response和session。
二、访问Web应用资源:
1. <bean:message>标签:
用于输出Resource Bundle中的一条消息。bundle属性指定Resource Bundle,它和Struts配置文件的<message-resources>元素的key属性匹配。如果没有设置bundle属性,就采用默认的Resource Bundle。在<bean:message>标签中指定消息key有三种方式:
1)<bean:message>标签的key属性直接指定消息key;
2)<bean:message>标签的name属性指定一个可以转化为字符串的变量,这个变量的字符串值为消息key;
3)同时指定<bean:message>标签的name属性和property属性,name属性指定一个JavaBean,property属性指定JavaBean的一个属性,这个JavaBean的属性值就是消息key。
注:对于带参数的复合消息,可以使用<bean:message>标签的arg0、arg1、arg2、arg3和arg4属性来设置参数值。
2.<bean:resource>标签:
用于检索Web资源的内容。它具有以下属性:
1)id属性:定义一个代表Web资源的变量;
2)name属性:指定Web资源的路径;
3)input属性:如果没有设置input属性,则id属性定义的变量为字符串类型;如果给input属性设置了值(可以是任意字符串),则id属性定义的变量为java.io.InputStream类型。
3.<bean:struts>标签:
用于检索Struts框架内在的对象,如ActionForm Bean、ActionForward或ActionMapping。<bean:struts>标签的id属性定义一个page范围内的变量,用来引用Struts框架的内在对象。必须设置formbean、forward或mapping属性中的一个属性,来指定被引用的Struts内在对象:
1)formbean属性:指定ActionForm Bean对象,和Struts配置文件的<form-bean>元素匹配;
2)forward属性:指定ActionForward对象,和Struts配置文件的<global-forward>元素的<forward>子元素匹配;
3)mapping属性:指定ActionMapping对象,和Struts配置文件的<action>元素匹配;
4.<bean:include>标签:
与标准的JSP标签<jsp:include>很相似,都可以用来包含其他Web资源的内容,区别在于<bean:include>标签把其他Web资源的内容存放在一个变量中,而不是直接显示到网页上。<bean:include>标签的id属性定义一个代表其他Web资源的变量。
可以通过<bean:include>标签的forward、page或href属性来指定其他Web资源:
3)forward属性:指定全局转发路径,和Struts配置文件的<global-forward>元素中<forward>子元素匹配;
4)page属性:指定相对于当前应用的URI,以“/”开头;
5)href属性:指定完整的URL。
三、定义或输出JavaBean:
1. <bean:define>标签:
用于定义一个变量。id属性指定变量名字,toScope属性指定这个变量的存放范围,如果没有指定toScope属性,则这个变量存放在page范围内。给变量赋值的方式有三种:
1)设置value属性:此时id属性定义的变量为字符串类型,value属性代表这个变量的字符串值。
2) 同时设置name和property属性:name属性指定一个已经存在的Bean。property属性指定已经存在的Bean的某个属性。id属性定义的变量的值由property属性决定。
3)同时设置name属性和type属性:name属性指定已经存在的JavaBean,type属性指定这个JavaBean的完整类名。id属性定义的变量引用这个已经存在的JavaBean。
注:对于由name属性指定的已经存在的JavaBean,在默认情况下,<bean:define>标签会依次在page、request、session和application范围内寻找这个JavaBean。此外,也可以设置<bean:write>标签的scope属性,明确指定这个JavaBean的范围。
2. <bean:size>标签:
用于获得Map、Collection或数组的长度。<bean:size>标签的id属性定义一个Integer类型的变量。name属性指定已经存在的Map、Collection或数组变量。
3. <bean:write>标签:
用于在网页上输出某个Bean或它的属性的内容。它具有以下属性:
1) name属性:指定已经存在的变量。如果<bean:write>只设置了name属性,<bean:write>标签处理类会调用name属性指定的变量的toString()方法获得字符串。
2) property属性:指定Bean的属性。如果希望输出Bean的某个属性值,应该同时设置<bean:write>标签的name属性和property属性。
3)format属性:设置输出数据的格式。
filter属性:默认值为true,表示将把输出内容中的特殊HTML符号作为普通字符串来显示;如果filter属性为false,表示不会把输出内容中的特殊HTML符号转化为普通字符串
Logic标签
一、进行比较运算的Logic标签:
比较运算标签比较结果为true的条件: 比较运算标签 比较结果为true的条件
<logic:equal> 变量等于指定常量
<logic:notEqual> 变量不等于指定常量
<logic:lessThan> 变量小于指定常量
<logic:lessEqual> 变量小于或等于指定常量
<logic:greaterThan> 变量大于指定常量
<logic:greaterEqual> 变量大于或等于指定常量
比较运算标签的value属性指定常量值,可以通过以下方式来设置变量:
1)设置cookie属性,此时变量为cookie属性指定的Cookie的值;
2) 设置header属性,此时变量为header属性指定的HTTP请求中的Header信息;
3)设置parameter属性,此时变量为parameter属性指定的请求参数的值;
4) 设置name属性,此时name属性指定被比较的变量;
5) 同时设置namet属性和property属性,此时name属性指定已经存在的JavaBean,property属性指定JavaBean的属性,被比较的变量为这个属性的值;
注:如果两个字符串都可以成功地转化为数字,就比较数字的大小,否则就进行字符串比较。
二、进行字符串匹配的Logic标签:
所有的字符串匹配标签都判断一个变量中是否包含指定的常量字符串。字符串匹配标签判断结果为true的条件:
字符串匹配标签 判断结果为true的条件
<logic:match> 变量中包含指定的常量字符串
<logic:notMatch> 变量中不包含指定的常量字符串
字符串匹配标签的value属性指定常量值,可以通过cookie、header、parameter、name和property属性来设置变量,它们的用法和比较运算标签的相应属性相同。
字符串匹配标签的location属性指定子字符串的起始位置,可选值包括:
1)start:子字符串位于母字符串的起始位置;
2) end:子字符串位于母字符串的结尾;
如果没有指定location属性,子字符串可以位于母字符串的任何位置。
三、判断指定内容是否存在的Logic标签:
1. <logic:empty>和<logic:notEmpty>标签:
判断指定的变量是否为null或空字符串。可以通过设置name属性,或者同时设置name属性和property属性,来指定变量。
2.<logic:present>和<logic:notPresent>标签:
判断指定的对象是否存在。具有以下属性,分别用于判断某种类型的对象是否存在:
1)cookie属性:判断指定的cookie是否存在;
2)header属性:判断指定的HTTP请求Header是否存在;
3)role属性:判断当前通过权限验证的用户是否具有指定的安全角色,多个安全角色之间以逗号分隔,例:<logic:present role=”role1,role2,role3”>code..</logic:present>;
1)user属性:判断当前通过权限验证的用户是否拥有指定的用户名;
2) parameter属性:判断指定的请求参数是否存在;
3)name属性:判断指定的JavaBean是否存在;
4)同时设置name属性和property属性:name属性指定JavaBean,property属性指定JavaBean的某个属性,判断这个属性是否存在并且是否为null。
1. <logic:messagesPresent>和<logic:messagesNotPresent>标签:
判断是否在request范围内存在指定的ActionMessages(或其子类ActionErrors)对象,以及在ActionMessages对象中是否存在特定的消息。具有以下属性:
属性 说明
name 指定在request范围内检索ActionMessages对象的属性key
message 如果为true,则从request范围内检索属性key为Globals.MESSAGE_KEY的ActionMessages对象,此时name属性指定的值无效;
如果为false,则根据name属性指定的属性key,从request范围内检索ActionMessages对象,如果此时没有设置name属性,则默认的属性key为Globals.ERROR_KEY;
该属性的默认值为false。
property 指定从ActionMessages对象中检索某条消息的消息key
四、进行循环遍历的Logic标签:
<logic:iterate>是Logic标签库中最复杂的标签,也是应用最广泛的标签,它能够在一个循环中遍历数组、Collection、Enumeration、Iterator或Map中的所有元素。
1.遍历集合:
<logic:iterator>标签的name属性指定需要进行遍历的集合对象,它每次从集合中检索出一个元素,然后把它存放在page范围内,并以id属性指定的字符串来命名这个元素。
length属性指定需要遍历的元素的数目。offset属性指定开始遍历的起始位置,默认值为“0”,表示从集合的第一个元素开始遍历。indexId属性定义一个代表当前被遍历元素的序号的变量,这个变量被存放在page范围内。
2. 遍历Map:
例:<%
HashMap months = new HashMap();
months.put(“Jan.”,”January”);
months.put(“Feb.”,”February”);
months.put(“Mar.”,”March”);
request.setAttribute(“months”,months);
%>
<logic:iterate id=”element” indexed=”index” name=”months”>
<bean:write name=”index” />.
<bean:write name=”element” property=”key” />:
<bean:write name=”element” property=”value” /><br />
</logic:iterate>
3. 设置被遍历的变量:
可以通过以下方式来设置需要遍历的变量:
1)设置name属性,name属性指定需要遍历的集合、数组或Map;
2)设置name属性和property属性,name属性指定一个JavaBean,property属性指定JavaBean的一个属性,这个属性为需要遍历的集合或Map;
3)设置collection属性,collection属性指定一个运行时表达式,表达式的运算结果为需要遍历的集合或Map;
五、进行请求转发或重定向的Logic标签;
1.<logic:forward>标签:
用于请求转发,它的name属性指定转发目标,与Struts配置文件中的<global-forwards>元素中的<forward>子元素匹配。
2. <logic:redirect>标签:
用于请求重定向。它的forward、href和page属性指定重定向目标,这几个重要属性的用法和<html:link>标签中的属性用法很相似。
nested标签
Struts Nested 标签库的一部分标签用于表达 JavaBean 之间的嵌套关系,还有一部分标签在特定的级别提供和其他Struts标签库的标签相同的功能。其中最主要的两个标签为:"<nested:root>"和"<nested:nest>"。
1.<nested:nest>: 定义一个新的嵌套级别。<nested:nest> 标签可以表达JavaBean之间的嵌套关系。<html:form action="/showPerson"> < nested:nest property="person"> LastName: < nested:text property="lastName"> < /nested:nest> < /html:form >以上的<nested:nest>标签的上层JavaBean为与<html:form>表单标签对应的PersonForm Bean 。<nested:nest>标签的property属性为"person" ,代表PersonForm Bean 的person属性。这个person属性代表Person Bean , 因此嵌套在<nested:nest> 标签内部的Nested标签都相对于这个Person Bean.
2.<nested:root>: 用来显示的指定顶层级别的JavaBean。 <nest:root> 标签的name属性指定JavaBean的名字。嵌套在<nested:root>标签中的<nested:nest>标签的property属性为这个JavaBean的某个属性。<nested:root name="PersonForm"><nested:nest property="person"><nested:write property="lastName"/></nested:nest></nested:root>以上代码中,<nested:root>标签的name属性"PersonFrom",代表当前的PersonFormBean。 嵌套其中的<nested:nest>标签的property属性为"person",代表PersonForm Bean的person属性。
template标签
由于随着Tiles框架包的出现,此标签已经开始减少使用,就不再讲解
具体示例
index.jsp
<%@ page pageEncoding="UTF-8"%>
<jsp:forward page="taglib.do"/>
TaglibAction.java
package com.javacrazyer.web.action;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.javacrazyer.domain.Account;
/**
* 业务控制器:控制业务处理的流程
*
*/
public class TaglibAction extends Action {
//具体业务流程处理方法,由Struts框架回调
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
request.setAttribute("name", "zs");
request.setAttribute("money", 123.456);
request.setAttribute("date", new Date());
Account acc = new Account();
acc.setLoginname("xkk");
acc.setPwd("123456");
acc.setStatus(100);
Account acc2 = new Account();
acc2.setLoginname("kkx");
acc2.setPwd("654321");
acc2.setStatus(-10);
request.setAttribute("account", acc);
List<String> strList = new ArrayList<String>();
strList.add("xxxxxx");
strList.add("yyyyy");
strList.add("zzzzzzzzz");
request.setAttribute("list", strList);
Map<String, Account> accMap = new HashMap<String, Account>();
accMap.put("xkk", acc);
accMap.put("kkx", acc2);
request.setAttribute("accountMap", accMap);
return mapping.findForward("result");
}
}
result.jsp
<%@ page pageEncoding="UTF-8"%>
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-bean-el" prefix="bean-el" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-logic-el" prefix="logic-el" %>
<%@ taglib uri="http://struts.apache.org/tags-nested" prefix="nested" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Struts自定义标签库的使用示例</title>
</head>
<body>
<h3>Struts常用标签的使用示例</h3><hr/>
<li>bean标签库的使用</li><br/><br/>
name: <bean:write name="name" filter="false" ignore="true"/><br/><br/>
money: <bean:write name="money" format="¥#,###.00" ignore="true"/><br/><br/>
date: <bean:write name="date" format="yyyy-MM-dd HH:mm:ss" ignore="true"/><br/><br/>
Account的loginname属性: <bean:write name="account" property="loginname" scope="session" ignore="true" /><br/><br/>
Account的pwd属性: ${account.pwd}
<li>html标签库的使用</li><br/><br/>
<html:messages id="msg">
<li><bean:write name="msg"/></li>
</html:messages>
<html:form action="login.do" method="post">
用户名:<html:text property="loginname"/> <html:messages id="msg" property="loginname"><bean:write name="msg"/></html:messages><br/>
密码:<html:password property="pwd" redisplay="false" /> <html:messages id="msg" property="pwd"><bean:write name="msg"/></html:messages><br/>
<html:submit value="提交"/>
</html:form>
<li>logic标签库的使用</li><br/><br/>
<logic:notEmpty name="date">
<bean:write name="date" format="yyyy-MM-dd HH:mm:ss"/>
</logic:notEmpty><br/>
<logic:iterate name="list" id="zs">
<bean:write name="zs"/><br/>
</logic:iterate>
<br/><br/>
<logic:notEmpty name="accountMap">
<logic:iterate name="accountMap" id="entry">
key---><bean:write name="entry" property="key"/>,
value---><bean:write name="entry" property="value"/>
<br/>
</logic:iterate>
</logic:notEmpty>
</body>
</html>
WEB-INF/struts-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">
<struts-config>
<!-- ================================================ Form Bean Definitions -->
<form-beans>
<form-bean name="loginForm" type="com.javacrazyer.web.formbean.LoginForm"></form-bean>
</form-beans>
<!-- =========================================== Action Mapping Definitions -->
<action-mappings>
<action path="/taglib" type="com.javacrazyer.web.action.TaglibAction">
<forward name="result" path="/result.jsp"/>
</action>
</action-mappings>
</struts-config>
web.xml的我就不想再说了,与之前的都一样