SSH(struts+spring+hibernate)迅速开发--附录2 Struts 常用标签&国际化(1)

来源:互联网 发布:立二拆四 知乎 编辑:程序博客网 时间:2024/05/18 13:29

附录2 Struts 常用标签&国际化

 

Struts提供了五个标签库,即:HTMLBeanLogicTemplateNested

标签库

说明

 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 标签的设计原意是为了避免使用scriptletscriptlet的表达式还能够提供给所有的Struts 标签使用。但请确保使用完整的表达式:

错误:

<html:link href="'<%= "/" + name %>/index.jsp>'>
 
正确:
 <html:link href="'<%= "/" + name + "/index.jsp" %>'>    //
表达式必须提供整个属性值

 

Html 标签库

1.       <html>标签

它有两个属性:localexhtml,两者都不是必需的。

<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:图象文件的路径,前面必须带有一个斜线。
其它属性:heigntwidthalt

  <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&amp;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.       selectoption标签

<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>
的属性:keylocalbundle-指定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的集合中存放了optionsvalue指实际能被提交的值,label是显示给用户的值。
2 <html:options property="value" labelProperty="label" /> collection属性不被指定时,将使用表单相关的form beanform beanvalue属性存放option valuelabel属性值显示给用户。
3 <html:options name="valueBean" property="values" labelName="labelsBean" labelProperty="labels" /> 这个意思是value值存放在名为valueBeanbeanvlaues属性中,它是一个collectionlabel值也是同样的意思。
<html:optionsCollection>
标签,和<html:options>的用法很相似。
<html:select property="custId"><html:optionsCollection property="customers" label="name" value="custId" /></html:select>
这个标签和org.apache.structs.util.LabelValueBean结合的很好,如果把labelvalue都放到这个对象中,可以很简单的这样应用:
<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 beanuserName属性。

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属性,当然还有namevalue属性。

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比较.如果同时设置了nameproperty属性,此时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是否存在.同时设置nameproperty属性就是判断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,hrefpage属性指定重定向的目 标,这几个属性和<html:link>标签的属性用法十分相似.

 

 


Bean标签

1.Struts Bean标签库中的标签可以访问已经存在的JavaBean以及他们的属性,还可以定义心的Bean,把他存放在

page范围内或者用户指定的范围内,供网页内其他元素访问。

2.Bean标签库大致可以分为以下三类:1/用于访问HTTP请求信息或JSP隐含对象的Bean标签。2/用于访问Web

用资源的Bean标签。3/用于定义或输出JavaBeanBean标签。 

3.“<bean:header>”标签用于检索HTTP请求中的Header信息。如:

<bean:header id="lang" name="Accept-language"/>其中idjava.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]=123arg2[1]=456arg[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,ActionForwardActionMapping

如:<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属性,此时

假设请求的URLhttp://localhost:8080/beantaglibs/BeanServlet.jsp?testarg=123&testarg=456&testarg789那么

如果希望检索出所有和参数名批判的请求参数,应该设置<bean:parameter>标签的multiple属性,此时id属性定义

id属性定义的

变量为字符串类型,value属性代表这个变量的字符串值。2/ 同时设置nameproperty属性。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>

 
原创粉丝点击