附录2 Struts 常用标签&国际化
Struts提供了五个标签库,即:HTML、Bean、Logic、Template和Nested
标签库 | 说明 |
HTML 标签 | 用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单 |
Bean 标签 | 在访问JavaBeans 及其属性,以及定义一个新的bean 时使用 |
Logic 标签 | 管理条件产生的输出和对象集产生的循环 |
Template 标签 | 随着Tiles框架包的出现,此标记已开始减少使用 |
Nested 标签 | 增强对其他的Struts 标签的嵌套使用的能力 |
标签的公共特征
属性 | 说明 |
id | 命名自定义标签创建时的脚本变量名 |
name | 指出关键字值,在该关键字下可以找到一个存在的bean 。如果给出了scope属性,则仅仅在scope中查找。否则,根据标准的顺序在各种scope中查找:(page, request, session, or application) |
property | 指出bean 中的某个属性,可以在其中检索值。如果没有标明,则使用对象本身的值 |
scope | 定义了Bean在哪个范围(page, request, session, or application)中被查找。如果没有标明按顺序查找。脚本变量(见id)将在相同的范围中创建 |
Struts 标签也支持嵌套引用,比如:
Property="foo.bar.baz"
这相当于进行下面的调用:
getFoo().getBar().getBaz();
或者做为setter:
getFoo().getBar().setBaz(value);
虽然Struts 标签的设计原意是为了避免使用scriptlet,scriptlet的表达式还能够提供给所有的Struts 标签使用。但请确保使用完整的表达式:
错误:
<html:link href="'<%= "/" + name %>/index.jsp>'>
正确:
<html:link href="'<%= "/" + name + "/index.jsp" %>'> // 表达式必须提供整个属性值
Html 标签库
1. <html>标签
它有两个属性:locale和xhtml,两者都不是必需的。
<html:html locale=/"true/">
此行代码解析后:
<html lang=/"en/">
说明:生成的结果取决于Struts应用程序所位于的服务器的locale。如果你将应用程序部署到一个不同locale的服务器,你不需要改变代码,Locale会自动调整。
2. <base>标签:表示所包含页面的绝对位置。这个标签只有内嵌在head标签中才有效。
<html:base/>
此行代码解析后:
<base href=/"http://www.mymain.com/myStrutsApp/testing.jsp/">
3. <img>标签
最重要的属性page:图象文件的路径,前面必须带有一个斜线。
其它属性:heignt、width、alt。
<html:img page=/"/logo.gif/" height=/"50/" width=/"200/" alt=/"Web Logo/"/>
4. <link>标签
<html:link page=/"/index.html/">Click demo</html:link>
此行代码解析后:
<a href=/"/index.html/">Click demo</a>
forward属性:链接到一个global forward上;action属性:链接到一个action mapping上;
href属性:这个链接会转发给控制器,由控制器做决定;page属性:一个相对的链接。
用page属性链接到action上:
<html:link page="/html-link.do">
Linking with the page attribute.
</html:link>
注意,上面的代码中你不必指定web的关联。相反的,如果你使用href属性,你就必须像下面所示指出web的关联(这里的关联就是struts-exercise)
<html:link href="/struts-exercise-taglib/html-link.do">
Using Href
</html:link>
很明显,当你在相同的web应用程序中做链接是,它比page属性更加好。你也能用href在不同的服务器上创建链接:
<html:link href="http://otherserver/strutsTut/html-link.do">
Using Href
</html:link>
另一种链接到html-link.do的方法是用action属性:
<html:link action="/html-link">
Using Action attribute
</html:link>
你也可以以硬编码的方式使用参数:
<html:link page="/htmllink.do?doubleProp=3.3&longProp=32">
Double and long via hard coded changes
</html:link>
或者使用paramId, paramName, and paramProperty属性:
<html:link page="/html-link.do" paramId="booleanProperty" paramName="testbean"
paramProperty="nested.booleanProperty">
Boolean via paramId, paramName, and paramValue
</html:link>
解析后的代码:
<a href="/struts-exercise-taglib/html-link.do?booleanProperty=false">
Boolean via paramId, paramName, and paramValue
</a>
另外,还能使用带name属性的Map来实现传递多个参数:
<%
java.util.HashMap newValues = new java.util.HashMap();
newValues.put("floatProperty", new Float(444.0));
newValues.put("intProperty", new Integer(555));
newValues.put("stringArray", new String[]
{ "Value 1", "Value 2", "Value 3" });
pageContext.setAttribute("newValues", newValues);
%>
...
<html:link action="/html-link" name="newValues">
Float, int, and stringArray via name (Map)
</html:link>
你也能够链接到Map类型的action上,上面的代码解析后的结果:
<html:messages property="property2" message="true" id="msg" header="messages.header" footer="messages.footer">
<tr><td><%= pageContext.getAttribute("msg") %></td></tr>
</html:messages>
5. select和option标签
<html:select property=/"color/" size=/"3/">
<html:option value=/"r/">red</html:option>
<html:option value= /"g/">green</html:option>
<html:option value= /"b/">blue</html:option>
</html:select>
<html:select> 的属性:property-与ActionForm中的某个属性对应;size-显示option的数目;multiple-默认为fales,表示不能多选,当设定为true时,property对应的ActionForm的属性必须为数组。
<html:select property="name" size=6 multiple="true">
<html:option>的属性:key、local、bundle-指定Resource Bundle中的内容。
例如 <html:option value="color1">Orange</html:option>
<html:option value="color1" bundle="htmlselect.Colors" key="htmlselect.red"/>
它和配置文件中的<message-resources>元素的key属性匹配 --> <message-resource parmeter="HtmlSelectColors" key="htmlselect.Colors"/>
<message-resource>中配置的资源文件为HtmlSelectColors.properties,相关内容为 htmlselect.red=RED
<html:options>标签,提供了一组<option>元素,在<html:select>元素中可以包含多个<html:options>元素。非常灵活,可以取得集合或数组中的值。
例1 <html:options collection="coll" property="value" labelProperty="label" /> 这指在coll的集合中存放了options,value指实际能被提交的值,label是显示给用户的值。
例2 <html:options property="value" labelProperty="label" /> collection属性不被指定时,将使用表单相关的form bean,form bean中value属性存放option value,label属性值显示给用户。
例3 <html:options name="valueBean" property="values" labelName="labelsBean" labelProperty="labels" /> 这个意思是value值存放在名为valueBean的bean的vlaues属性中,它是一个collection;label值也是同样的意思。
<html:optionsCollection>标签,和<html:options>的用法很相似。
例 如 <html:select property="custId"><html:optionsCollection property="customers" label="name" value="custId" /></html:select>
这个标签和org.apache.structs.util.LabelValueBean结合的很好,如果把label和value都放到这个对象中,可以很简单的这样应用:
<html:select property="custId"><html:optionsCollection property="customers" /></html:select>
6. <form>标签系列
使用<form>标签时必须遵循一些规则
i) 标签中必须包含一个action属性,它是这个标签中唯一必需的属性。如果不具备该属性则JSP页面会抛出一个异常。之后你必须给这个action属性指 定一个有效值。一个有效值是指应用程序的Struts配置文件中元素里的任何一个子元素的访问路径。而且相应的元素中必须有一个name属性,它的值是 form bean的名称。
<html:form action=/"/login/" >
如果你有上述一个标签 ,那么你的Struts配置文件的元素中必须有一个如下显示为粗体的元素:
<action-mappings>
<action path=/"/login/"
type=/"com.javapro.struts.LoginAction/"
name=/"loginForm/"
scope=/"request/"
input=/"/login.jsp/">
<forward name=/"success/" path=/"/mainMenu.jsp/"/>
</action>
.
.
.
</action-mappings> // 这就是说一个form标签是和form bean相关联的
ii) 任何包含在<form>中用来接收用户输入的标签(<text>、<password>、< hidden>、<textarea>、<radio>、<checkbox>、< select>)必须在相关的form bean中有一个指定的属性值。比如,如果你有一个属性值被指定为“username”的< text>标签,那么相关的form bean中也必须有一个名为“username”的属性。输入<text>标签中的值会被用于生 成form bean的userName属性。
iii) <form>标签还有一些不是必须但很有用的“次要”属性。
比如,你可以用focus属性来生成JavaScript,它会“定焦”(focus)到该form所包含的一个元素上。使用focus属性时你需要给它指定元素的名称。
<body>
<html:form action=/"/login/" focus=/"password/">
User Name: <html:text property=/"userName/"/>
<br>Password: <html:text property=/"password/"/>
<br><html:submit/>
</html:form>
</body>
代码解析后:
<body>
<form name=/"loginForm/" method=/"post/" action=/"/myStrutsApp/login.do/">
User Name: <input type=/"text/" name=/"userName/" value=/"/">
<br>Password: <input type=/"text/" name=/"password/" value=/"/">
<br><input type=/"submit/" value=/"Submit/">
</form>
<script language=/"JavaScript/" type=/"text/javascript/">
<!--
if (document.forms[/"loginForm/"].elements[/"password/"].type != /"hidden/")
document.forms[/"loginForm/"].elements[/"password/"].focus()
// -->
</script>
</body>
有没有看到这个标签库是如何建立JavaScript来定焦到password元素上的? 这也是该库让人着迷的地方之一。你不用担心如何在客户端进行编程,它会帮你自动生成。
还可以看到,<form>标签中method属性的缺省值是POST。
7. <text>标签、<hidden>标签、<textarea>标签、<radio>标签、<checkbox>标签、<submit>标签、<reset>标签:
都有一个property属性,最后会被转换成HTML中的name属性,当然还有name和value属性。
8. <password>标签
<html:password property=/"password/" redisplay=/"false/"/>
该标签中的一个很重要的属性是"redisplay",它用于重新显示以前输入到这个区域中的值。该属性的缺省值为true。然而,为了使password不能被重新显示,你或许希望将该属性的值设为false
9.
Logic 标签
Struts 的Logic标签可以根据特定的逻辑条件来判断网页的内容,或者循环遍历集合元素,它和HTML,Bean标签是Struts应用种最常用的三个标签.它 的功能主要是比较运算,进行字符串的匹配,判断指定的内容是否存在,循环遍历集合,进行请求转发和重定向,下面具体的说明标签的用途:
<logic:equal>变量等于指定的常量
<logic:notEqual>变量不等于指定的常量
<logic:lessThan>变量小于指定的常量
<logic:lessEqual>变量小于或者等于指定的常量
<logic:geraterThan>变量大于指定的常量
<logic:geraterEqual>变量大于或等于指定的常量
以上这些标签都很类似, 有共同的属性,cookie属性指定cookie属性的值,然后用value设置的常量进行比较.header属性设置header请求头的值,也是通过 value属性设置的值进行比较.parameter属性设置一个请求参数,然后也是通过value属性设置的值进行比较.name属性设置一个变量,然 后用value比较.如果同时设置了name和property属性,此时name属性指定已经存在的JavaBean,property属性指定 Bean的属性.这个标签感觉十分简单,用法也十分单一,下面研究一下进行字符串匹配的标签和判断特定内容的标签.
< logic:match>标签是判断变量种是否包含常量字符串的,<logic:netMatch>也判断是否不包含字符串的,用 name属性定义一个字符串变量,然后用value属性的值去判断变量是否包含这个字符串或者是不包含这个字符串,判断成功返回true.
<logic:empty>和<logic:netEmpty>标签可以判断指定的变量是否为空的字符串,可以通过name属性来判断一个字符串是否为null.例如是请求参数的字符串.
< logic:present>和<logic:notPresent>标签可以判断指定的对象是否为空,这个标签的属性很多. cookie属性判断Cookie是否存在.Header属性判断HTPP请求头是否存在.role属性是判断当前的权限的用户是否是指定的安全角色. user属性是判断当前通过权限验证的用户是否拥有指定的用户名.parameter属性是判断请求的参数是否存在.name属性是用来判断指定的 Bean是否存在.同时设置name和property属性就是判断Bean种的具体属性是否存在了.
< logic:messagesPresent>和<logic:messagesNotPresent>标签是用来判断是否在 request范围内的特定的ActionMessages或者是子类ActionErrors对象.name属性是用来检索 ActionMessages对象的key,property指定从ActionMessages集合对象中检索某条消息key也就是具体的 ActionMessage对象.
进行循环遍历Logic标签是Logic标签库中最复杂的标签,也是用途最广泛的标签,它能够在一个循环中遍历数组,Collection,Enumeration,Irerator或者Map中的所有元素
1) 遍历集合的标签< logic:iterate>的name属性指定需要进行遍历的集合对象,它每次从集合中检索出一个元素,然后存放在page范围内,并以id属性 指定这个字符串来命名这个元素,最好是在里面嵌套一个<bean:write>标签,把刚刚遍历的第一个id指定的字符串输出,然后在循环在 输出.length属性需要遍历的元素的数目,如果没有设置length属性,就遍历集合中的所有元素.offset属性指定开始遍历的其实位置,默认值 是0.indexId属性定义一个代表当前被遍历元素的系列号,这个变量存放在page范围内,可以被<bean:write>标签访问输出 输出的是int的数字.例如1.2.3.4等.可以用户输出输出的元素的系列号.
2) 遍历Map 是通过<logic:iterate>标签,name属性指定一个HashMap,存放在request范围,然后赋给id指定的变量, indexId可以指定索引编号,然后通过<bean:write>标签输出出来.在HashMap的每一个元素都是一个集合对象,所以可以 嵌套使用.就是说<logic:inerate>这个标签既可以把Collection的元素弄出来负给一个变量也可以弄Map的.所以说它 的功能强大.还有一个collection属性可以设置一个表达式,这个表达式返回的结果可以作为,<logic:inerate>标签输出 的集合或者Map.这个属性类似name属性.
最后研究一下进行请求转发和重定向的Logic 标签,<logic:forward>标签用于请求转发,它的name属性指定转发的目标,与Struts配置文件中的<global -forwards>元素和的子元素<forward>元素匹配.简单的说就是<logic:forward>标签的 name属性定义的值,要去找到<golbal-forwards>子元素<forward>元素的匹配的name属性,然后通 过path指定的路径进行转发.重定向用<logic:redierct>标签它的forward,href和page属性指定重定向的目 标,这几个属性和<html:link>标签的属性用法十分相似.
Bean标签
1.Struts Bean标签库中的标签可以访问已经存在的JavaBean以及他们的属性,还可以定义心的Bean,把他存放在
page范围内或者用户指定的范围内,供网页内其他元素访问。
2.Bean标签库大致可以分为以下三类:1/用于访问HTTP请求信息或JSP隐含对象的Bean标签。2/用于访问Web应
用资源的Bean标签。3/用于定义或输出JavaBean的Bean标签。
3.“<bean:header>”标签用于检索HTTP请求中的Header信息。如:
<bean:header id="lang" name="Accept-language"/>其中id是java.lang.String类型的标量用于存储请求Header中
的"Accept-Language"信息。整个操作等价于下面的JSP程序段。
<%
String id = "lang";
String name = "Accept-Language";
String value = ((HttpServletRequest)pageContext.getRequest()).getHeader
(name);
pageContext.setAttribute(id,value);
%>
4.<bean:parameter>标签用于检索HTTP请求参数。如:<bean:parameter id = "arg1" name="testg"
value="noarg"/> 的变量不再是java.lang.String类型,而是字符串数组类型,用于存放所有和name属性匹配的请求
参数值。如:<bean:parameter id="arg2" multiple="yes" name="testarg" value="noarg"/> 所得到的testarg中就存
在三个参数arg2[0]=123,arg2[1]=456,arg[2]=789。
5.<bean:resource>标签用于检索Web资源的内容。如:
<bean:resource id="resource" name="/testpage.jsp"/><bean:write name="resource"/>
,它的值为testpage.jsp的源文件内容。这个标签有意思,如果可以任意指定一个URL就可以返回相应的原码文
件,是不是就可以动态的监视某个网页上的数据和行为了呢?只是个猜想,还没试过。有机会看看。
6.<bean:struts>标签用于检索Struts框架内在的对象,如:ActioinFormBean,ActionForward或ActionMapping。
如:<bean:struts id="forward" forward="BeanResource"/>
7.<bean:include>标签和标准的JSP标签<jsp:include>很相似,都可以用来包含其他Web资源的内容,区别在于
<bean:include>标签把其他Web资源的内容存放在一个变量中,而不是直接显示在网页上。
8.<bean:define>标签用于定义一个变量。id属性指定变量的名字,toScope属性指定这个变量的存放范围。设置i
d变量有三种方式:1/<bean:define id="stringBean" value="BeanTaglibs"/>设置 value属性,此时
假设请求的URL为http://localhost:8080/beantaglibs/BeanServlet.jsp?testarg=123&testarg=456&testarg789那么
如果希望检索出所有和参数名批判的请求参数,应该设置<bean:parameter>标签的multiple属性,此时id属性定义
的id属性定义的
变量为字符串类型,value属性代表这个变量的字符串值。2/ 同时设置name和property属性。name属性指定一个
已经存在的Bean,property属性指定已经存在的Bean的某个<bean:define id="contextBean" name="sessionBean"
property="servletContext"/> 属性 同时设置name属性和type属性。name属性指定已经存3/<bean:define
id="contextBean_copy" name="contextBean" type="javax.servlet.ServletContext"/>在的javaBean,type属性指定这
个javaBean的完整的类名。
9.<bean:size>标签用于获得Map,Collection或数组的长度。id属性定义的变量的值为Map,Collection或数组的长
度。name属性指定已经存在的Map,Collection或数组变量。
10.<bean:write>标签用于在网页中输出某个Bean或它的属性的内容。如:<bean:size id="length" name="lines"/>
<bean:write name="length"/>以上<bean:write>标签仅仅设置了name属性,<bean:write>标签处理类会调用name
属性指定的toString()方法获得字符串,然后输出字符串内容。如果希望输出Bean的某个属性,应该同时设置
<bean:write>标签的name属性和property属性。property属性指定Bean的属性,如。<bean:write>标签的format属
性用于设置输出数据格式。如:<bean:write name="contextBean" property="serverInfo"/>
<%
request.setAttribute("floatval",Float.valueOf("3.14159"));
Calendar gc=GregorianCalendar.getInstance();
gc.setTime(new java.util.Date(session.getCreationTime()));
request.setAttribute("now",gc);
%>
<bean:write format="#.####" name="floatval"/><BR>
<bean:write format="MM-dd-yyyy hh:mm:ss" name="now" property="time"/><BR>
以上代码定义的resource变量代表"/testpage.jsp"资源,因为没有设置input属性,所以resource变量为字符串类型
<bean:write>还有一个filter属性,默认值为true。如果filter属性为true,将把输出的内容中的特殊html符号作为普通
字符输出。如果为false则不会把输出内容中的特殊html符号转化为普通字符串。如:
<%
String boldStart="<B>":
String boldEnd="</B>";
request.setAttribute("bs",boldStart);
request.setAttribute("be",boldEnd);
%>
<bean:write name="bs"/ filter="true">bold
<bean:write name="be" filter="true"/><BR>
版权所有,转载请友情注明 相关系列视频 http://cyedu.ke.qq.com