struts标签
要点集合:
- 通用标签:
- property
- set (默认为action scope 会将值放入request 和 ActionContext中 ; page,request,session,application)
- bean
- include(对中文文件有支持问题,不建议使用,如需包含,改用jsp包含)
- param
- debug
- 控制标签
- if、elseif、 else
- iterator(collections map enumeration iterator array,循环遍历)
- subset(截取集合一部分)
- UI标签
- theme(simple xhtml:默认 、 css xhtml、 ajax )
- AJAX标签
- 再补充
- $ # %的区别
- $用于 i18n 和 struts配置文件
- #取得ActionContext的值
- %将原本的文本属性解析为ognl,对于本来就是ongl的属性不起作用(参考<s:property>和<s:include>)
首先我们需要配置几个jsp页面
index.jsp:
<%--
Created by IntelliJ IDEA.
User: Alex
Date: 2017/5/16
Time: 23:15
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
访问属性:<br/>
<a href="tags.action?username=alex&password=123">tags</a>
</body>
</html>
在此处我们传了两个参数(username和password)至struts.xml
tags.jsp:
<%--
Created by IntelliJ IDEA.
User: Alex
Date: 2017/5/17
Time: 5:21
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<ol>
在此处写例子
</ol>
</body>
</html>
在配置完成后,再看看struts.xml是如何配置的:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="tags" extends="struts-default">
<action name="tags" class="tags.tagsAction">
<result>/tags.jsp</result>
</action>
</package>
</struts>
然后是action:
tagsAction:
package tags;
import com.opensymphony.xwork2.ActionSupport;
/**
* Created by Alex on 2017/5/17.
*/
public class tagsAction extends ActionSupport {
private String username;
private String password;
public tagsAction(){
}
@Override
public String execute(){
this.addFieldError("fieldError.test","wrong!");
return SUCCESS;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
注意学习方法:
尽量多查阅官方DOC文档,帮助很大。
struts标签的property标签
官方文档:
页面代码:
<li>property: <s:property value="username" /> </li>
<li>property 取值为字符串: <s:property value="'username'" /> </li>
<li>property 设定默认值: <s:property value="admin" default="管理员" /> </li>
<li>property 设定HTML: <s:property value="'<hr/>'" escape="false" /> </li>
P.S:value的属性为object类型,都会把里面的对象解析为OGNL表达式。设定默认值意思是,当property在值栈中找不到对象,则会使用这个默认值。
struts标签的set标签
官方文档:
页面内容:
<li>set 设定adminName值(默认为request和ActionContext):<s:set var="adminName" value="username" /> var adminName = username</li>
<li>set 从request里取值 :<s:property value="#request.adminName" /></li>
<li>set 从ActionContext里取值 :<s:property value="#adminName" /></li>
<%--<li>set 设定范围:<s:set name="adminPassword" value="password" scope="page" /> name adminPassword = password (page) </li>--%>
<%--<li>set 从相应的范围取值:<%=pageContext.getAttribute("adminPassword")%></li>--%>
<li>set 设定var 范围为ActionContext: <s:set name="adminPassword" value="password" var="a"/> var a = password(废弃) </li>
<li>set 使用#取值: <s:property value="#a" /> </li>
<li>set 设定var 范围为Session: <s:set var="adminPassword" value="password" scope="session"/> var adminPassword = password(主流) </li>
<li>set 从相应的范围取值: <s:property value="#session.adminPassword" /> </li>
P.S:这里的value的属性也为object类型,官方doc文档有bug。
id与name属性已经废弃,可以不使用。 var使用时,默认为Action,但是用 scope可以指定特定的储存空间。
struts标签的bean标签
官方文档:
页面内容:
<li>
bean 定义bean,并使用param来设定新的属性值:
<s:bean name="tags.Dog" var="myDog">
<s:param name="name" value="'linda'"></s:param>
</s:bean>
</li>
<li>bean 取值:<s:property value="#myDog.name" /> </li>
<li>bean 查看debug:<s:debug></s:debug></li>
P.S:param子标签内部的value值我们若需要插入字符串格式,那么需要在里面加上单引号,若是需要插入OGNL表达式,则不需要单引号。
struts标签的include标签
官方文档:
页面内容:
<li>
include _include1.html 包含静态英文文件:
<s:include value="_include1.html" ></s:include>
</li>
<li>
include _include1.html 包含静态中文文件:
<s:include value="_include2.html" ></s:include>
</li>
<li>
include _include1.html 包含静态中文文件,说明%的用法:
<s:set var="incPage" value="'/_include2.html'" />
<s:include value="%{#incPage}" ></s:include>
</li>
P.S:
老版本的中文include bug已经修复,在此提到%{}的作用,即强制将字符串定义为OGNL表达式进行传递
struts标签的fieldError标签
官方文档
页面内容:
<li>
fieldError simple:<s:fielderror fieldName="fieldError.test" theme="simple"></s:fielderror>
</li>
P.S:此标签有默认样式(ul li标签)若需要去除标签样式,请转至本博客另一篇《去除struts2中s:fieldError标签中的默认样式》中查阅
控制标签
if、else if与else标签
官方文档:
if:
elseif:
页面内容:
<li>
if elseif 和 else:
age = <s:property value="#parameters.age" /><br/>
<s:if test="#parameters.age[0] < 0">wrong age!</s:if>
<s:elseif test="#parameters.age[0] <= 20" >too young!</s:elseif>
<s:else>这才对嘛</s:else>
<s:if test="#parameters.aaa == null">null</s:if>
</li>
简单easy,通俗易懂
P.S:不难发现这里多次用到#parameters.age[0] 我们可以使用set标签来优化语句
iterator标签
官方文档:
页面内容:
<li>
遍历集合:<br/>
<s:iterator value="{1,2,3}">
<s:property /> |
</s:iterator>
</li>
<li>
自定义变量:<br/>
<s:iterator value="{'aaa','bbb','ccc'}" var="x" >
<s:property value="#x.toUpperCase()" /> |
</s:iterator>
</li>
<li>
使用struts:<br/>
<hr/>
<s:iterator value="{'aaa','bbb','ccc'}" status="status">
元素值:<s:property/> <br/>
遍历过的元素总数:<s:property value="#status.count" /> <br/>
遍历过的元素索引:<s:property value="#status.index" /> <br/>
当前是偶数? <s:property value="#status.even"/><br/>
当前是奇数? <s:property value="#status.odd"/><br/>
是第一个元素吗? <s:property value="#status.first" /><br/>
是最后一个元素吗? <s:property value="#status.last" /> <br/>
<hr/>
</s:iterator>
</li>
<li>
遍历Map:<br/>
<s:iterator value="#{1:'a',2:'b',3:'c'}">
<s:property value="key" /> | <s:property value="value"/> <br/>
</s:iterator>
</li>
P.S:在遍历Map时,需要在value里加入#符。
subset标签
官方文档:
页面内容:
<s:subset source="myList" count="13" start="3">
<s:iterator>
<s:property />
</s:iterator>
</s:subset>
P.S:截取部分集合内容,了解即可,过多不再阐述
UI标签
开发中不常用,因为有不方便之处,与JavaScript结合不完美
总的 来说:
- 把所有的主体定义为simple
- fieldError特殊化处理
- 自己控制其他标签的展现