打开struts-2.3.7\docs\WW\tag-reference.html可以看到Struts2提供的所有标签。其中分为“通用标签”和“UI标签”两大部分。
Struts2通用标签之数据标签
1.<s:property>(重要)
- <s:property>标签用来执行OGNL表达式,最为常用的方式是使用它在页面中输出ValueStack或ActionContext中的数据。
- <s:property value=”#request.hello”/>,等于ActionContext.getContext().getRequest().get(“hello”)。
名称 | 必需 | 默认值 | 类型 | 说明 |
default | 否 | 无 | String | 表示默认值。当结果为null时,输出默认值。 |
escape | 否 | true | boolean | 表示是否进行转义。该值为true时,当结果中包含<、>、”、’、&时,对其进行转义。 |
value | 否 | 栈顶对象 | Object | Ognl表达式 |
2.<s:set>
- <s:set>标签用来创建一个变量,保存到指定的范围内。
- <s:set var=”myVar” value=”#parameters.score[0]” scope=”page”/>,创建一个变量,保存到page范围,key为myVar,值为“#parameters.score[0]”的运算结果。
名称 | 必需 | 默认值 | 类型 | 说明 |
var | 是 | 无 | String | 变量的域名字,默认不是Ognl表达式 |
value | 否 | 栈顶对象 | Object | Ognl表达式。 |
scope | 否 | Action | String | 变量的范围。可选值为:application、session、request、page、action |
scope的可选值中的action是我们陌生的范围,它是scope的默认值。它表示保存到request和OgnlContext两个范围中。即比request范围多出了一个OgnlContext范围。
<s:set var=”myVar” value=”#parameters.score[0]” />
<s:property value=”#myVar”/>等同于ActionContext.getContext().get(“myVar”);
<s:property value=”#request.myVar”/>等同ActionContext.getContext.getReuqest().get(“myVar”);
3.<s:push>
- <s:push>标签是把指定值暂时压入到值栈中,当执行完<s:push>标签后,压入到值栈中的值会被弹出。
- <s:push value=”’hello’”/>等于把hello字符串压入到值栈中后,马上又弹出了,相当于什么都没做。
- <s:push value=”#session.user”>把user压入到值栈中
- <s:property value=”username”/>打印值栈元素的username属性
- <s:property value=”password”/>打印值栈元素的password属性
- </s:push>把user从值栈中弹出 4.<s:url>
- <s:url>标签通常用来生成action路径,它与<c:url>标签很相似。
- <s:url action=”TestAction”/>在页面中打印/contextpath/TestAction.action。也就是说它与<c:url>一样会生成全路径。而且无论给出后缀“.action”!action属性的值只需要与struts.xml文件中<action>元素的name属性值相同即可。
- <s:url action=”TestAction” namspace=”/” />还可以指定名称空间
- <s:url action=”TestAction”>
- <s:param name=”name” value=”’张三’”/>
- </s:url>页面中打印为:/ognl/TestAction.action?name=%E5%BC%A0%E4%B8%89还可以为URL指定参数,其中参数包含中文时自动使用URL编码。
其中<s:param>是用来作为子标签的,它的作用是指定参数。它的value属性值为Ognl表达式,所以我们需要把“张三”用单引号引起来,表示Ognl表达式的字符串常量。
名称 | 必需 | 默认值 | 类型 | 说明 |
action | 否 | 无 | String | 指定用于生成URL的action。 |
value | 否 | 无 | String | 指定用于生成URL的地址值。通常只使用action或value其中一个属性。 |
var | 否 | 无 | String | 如果指定了该属性,那么生成的URL不会输出到页面中,而是被保存到OgnlContext中。 |
method | 否 | 无 | String | 指定调用action中的方法。如果使用的是value属性,那么该属性无效。 |
namespace | 否 | 无 | String | 指定action所属的名称空间。 |
forceAddSchemeHostAndPort | 否 | false | Boolean | 当该属性为true时,生成的URL为绝对路径,而且会包含主机名及端口号。 |
5.<s:a>:它用来生成超链接,与<s:url>相似!
- <s:a action=”TestAction” namespace=”/”>添加用户
- <s:param name=”name” value=”’张三’”/>
- </s:a>
6.<s:debug>:Debug标签用于调试,它在页面中生成一个“[Debug]”超链接,单击这个超链接,可以查看ValueStack和ActionContext中保存的所有对象。
Struts2通用标签之控制标签
控制标签很好理解,就是流程控制了。例如if、elseif等,以及iterator等。
1.<s:if>、<s:elseif>、<s:else>
<!—
在浏览器中输入:http://localhost:8080/tagtest/index.jsp?score=85
-->
<s:setname="score"value="#parameters.score[0]"/>
<s:propertyvalue="#score"/>:
<s:iftest="#score > 100 || #score < 0">
<s:propertyvalue="'输入错误'"/>
</s:if>
<s:elseiftest="#score >= 90">
<s:propertyvalue="'A'"/>
</s:elseif>
<s:elseiftest="#score >= 80">
<s:propertyvalue="'B'"/>
</s:elseif>
<s:elseiftest="#score >= 70">
<s:propertyvalue="'C'"/>
</s:elseif>
<s:elseiftest="#score >= 60">
<s:propertyvalue="'D'"/>
</s:elseif>
<s:else>
<s:propertyvalue="'E'"/>
</s:else>
2.<s:iterator>:<s:iterator>标签可以用来迭代一个集合,可以迭代的集合有:Collection、Map、Enumeration、Iterator或者是数组。iterator标签在迭代过程中,会把当前对象暂时压入值栈,这样在子标签中就可以直接访问当前对象的属性(因为当前对象在栈顶),在标签体执行完毕后,位于栈顶的对象就会被删除,在循环的第二圈时,把新的当前对象再压入值栈中。
<s:iteratorvalue="{'zhangSan','liSi','wangWu' }">
name: <s:property/><br/>
</s:iterator>
如果为<s:iterator>标签指定了var属性,那么当前对象不只是压入到了值栈中,而且还会被添加到OgnlContext中。
<s:iteratorvalue="{'zhangSan','liSi','wangWu' }"var="name">
name: <s:propertyvalue="#name"/><br/>
</s:iterator>
名称 | 必需 | 默认值 | 类型 | 说明 |
var | 否 | 无 | String | 如果指定了该属性,那么迭代的集合中的元素将被保存到OgnlContext中,可以通过该属性的值来引用集合中的元素。该属性几乎不被使用。 |
value | 否 | 无 | Coolection、Map、Enumeration、Iterator 或数组 | 指定迭代的集合。如果没有指定该属性,那么iterator标签将把位于值栈栈顶的对象放入一个新创建的List中进行迭代。 |
status | 否 | 无 | String | 如果指定了该属性,一个IteratorStatus实例将被放入到OgnlContext中,通过该实例可以获取迭代过程中的一些状态信息。 |
IteratorStatus类在org.apahce.struts2.views.jsp包下。下面是对该类常用方法的介绍:
- public int getCount():得到当前已经迭代的元素的总数。
- public int getIndex():得到当前迭代的元素的索引。
- public boolean isEven():判断当前迭代的元素的个数是否是偶数。
- public boolean isOdd():判断当前迭代的元素的个数是否是奇数。
- public boolean isFirst():判断当前迭代的元素是否是第一个元素。
- public boolean isLast():判断当前迭代的元素是否是最后一个元素。
在OGNL表达式中使用IteratorStatus类的方法时,可以直接使用:count、index、even、odd、first、last属性。
<s:iteratorvalue='{"one", "two", "three"}'status="status">
<s:propertyvalue="#status.count"/>,
<s:propertyvalue="#status.index"/>,
<s:propertyvalue="#status.even"/>,
<s:propertyvalue="#status.odd"/>,
<s:propertyvalue="#status.first"/>,
<s:propertyvalue="#status.last"/><br/>
</s:iterator>
<hr/>
<s:iteratorvalue="#{'1':'one','2':'two','3':'three','4':'four'}" status="st">
<s:propertyvalue="key"/>:<s:propertyvalue="value"/><br/>
</s:iterator>
Struts2的表单标签还是比较好用的,但它也存在一些败笔,例如主题这一部分就不是很灵活。所以导致开发中没有公司会使用它提供的主题。
Struts2标签UI标签之表单标签
Struts2标签的优势:
- 简化代码;
- 自动数据回显;
- 指定主题样式(说是优点,但很多人也会认为这是缺点);
1.表单标签入门
我们首先使用一个登录表单来对比一下html表单和Struts2表单的区别。
通过上面生成的代码可以看来:
- <s:form>
通过action和namespace两部分来指定请求路径,action直接给<action>元素的name值即可,无需给出后缀“.action”;
method默认为post;
会自动添加id属性,值与action属性值相同;
整个表单会生成在<table>中。 - <s:textfield>
对应<input type=”text”>标签;
通过lable来生成<lable>标签; - <s:password>
对应<input type=”password”>标签;
通过label来生成<lable>标签 - <s:submit>
对应<input type=”submit”>标签;
2.表单主题:
我们发现,整个表单都会在<table>中生成,这也就说明无需为每个表单项添加<br/>。因为在表格中就无需再换行了。生成在表格中是因为<s:form>标签的theme属性的默认值为xhtml,它表示一个主题样式。这个主题样式由Freemarker模板来完成。如果你不希望使用这个xhtml主题,那么有下列3种方法来修改主题:
- 在<s:textfield>的theme属性指定为simple,那么这个表单项就使用简单主题;
- 在<s:form>的theme属性指定为simple,那么整个表单都使用简单主题;
- 设置struts.ui.theme常量为simple,那么所有表单标签的默认主题都是simple。 当表单设置为theme=”simple”之后:
<s:formaction="LoginAction"namespace="/user"theme="simple">
<s:textfieldname="username"label="用户名"/>
<s:passwordname="password"label="密 码"/>
<s:submitvalue="登录"/>
</s:form>
<formid="LoginAction"name="LoginAction"action="/ognl/user/LoginAction.action"method="post">
<inputtype="text"name="username"value=""id="LoginAction_username"/>
<inputtype="password"name="password"id="LoginAction_password"/>
<inputtype="submit"id="LoginAction_0"value="登录"/>
</form>
这时没有表格来格式化表单,而且也不能生成<lable>,这说明样式都要自来来设定。好处是你重新获得了自由,坏处是一切都要靠自己了。
3.自动回显
我们知道,当表单提交后,再返回到表单页面后,html标签不可能帮我们回显数据。而Struts2的表单标签可以做到这一点。原因是当前Action就在值栈顶,而表单标签会从值栈中获取数据来回显。
表单标签之选择性标签
- <s:redio>标签
表单标签中简化比较大的标签可以不在需要写循环,还有就是自动回显。我们都知道在下拉列表、单选、复选中,手动回显是比较麻烦的事。但使用Struts2的表单标签就方便多了
<s:radiolist="#{'male':'男','female':'女'}" name="gender"/>
list指定的是一个Map,默认key为实际值,而value为显示值。
也可以为list属性指定为list:
<s:radiolist="{'男','女'}"name="gender"/>
这时实际值和显示值是相同的。
- <s:checkboxlist>标签
这个东西也很好用,一下子可以显示很多复选按钮。而且自动回显!
<s:checkboxlistlist="#{'read':'看书','netplay':'上网','music':'音乐' }" name="hobby"/>
- <s:select>标签
下拉列表与上面两个标签也一样,都是选择性的!使用它也是无需循环,无需处理循环。
<s:selectname="city"list="#{'bj':'北京','sh':'上海','gz':'广州'}"/>