1 Struts2何时将Action的对象放入值栈中?
放入时间:在调用Action类的Action方法时,但在之前会进行如下:
-->先创建一个StrutsActionProxy对象
-->在创建StrutsActionProxy之后,对其进行初始化时,把Action对象放入值栈中。
2 *property标签
用来输出值栈内,某个对象的属性值。
<body>
<s:debug></s:debug>
<br>
s:property:打印值栈中对象的属性值<br>
<s:property value="productName"/>
<br>
对于Map栈,打印reques session application的某个属性值,或者某个请求参数值
<br>
<s:property value="#session.date"/>
<br>打印某个请求参数(请求参数是数组对象):<br>
<s:property value="#parameters.name[0]"/>
</body>
3.url标签
url标签用来动态创建一个URL
<br><br>
s:url 创建一个URL地址
<br><!-- 以下标签会创建此url: /struts2-4/getProduct?productId=1001 -->
<s:url value="/getProduct" var="url" >
<s:param name="productId" value="2222"></s:param>
</s:url>
${url }
<br><br><!-- param的value会自动进行OGNL解析,如果不想解析,就用单引号引出 -->
<s:url value="/getProduct" var="url2" >
<s:param name="productId" value="#session.date"></s:param>
</s:url>
${url2 }
<br><br>
<s:url value="/getProduct" var="url3" >
<s:param name="productId" value="abcd"></s:param>
</s:url>
${url3 }
<br><br><!-- 用单引号再次包围后,就不会去值栈中查找 /struts2-4/getProduct?productId=abcd -->
<s:url value="/getProduct" var="url4" >
<s:param name="productId" value="'abcd'"></s:param>
</s:url>
${url4 }
<br><br><!--构建一个请求Action的地址 /struts2-4/hcx/testAction!save.action -->
<s:url action="testAction" namespace="/hcx" var="url5" method="save"></s:url>
${url5 }
<br><br><!--includeParams的get参数:会在新url后带上当前地址请求参数 :testUrl?name=hcx -->
<s:url value="testUrl" var="url6" includeParams="get"></s:url>
${url6 }
<br><br><!-- all会包涵到本页的post参数,附加到url上 -->
<s:url value="testUrl" var="url7" includeParams="all"></s:url>
${url7 }
<br><br>
4.set标签
可以用来在以下Map对象中创建一个键值对。
ValueStack值栈的ContextMap值栈、Map类型的session对象、Map类型的application对象、Map类型的Request对象、Map类型的page对象
<br><br>
<!-- 将key为productNameTest value为值栈中的poroductName的值放入request中,value会OGNL解析
实际打印出来的是productName的值:CPU -->
<s:set name="productNameTest" value="productName" scope="request"></s:set>
productname:${requestScope.productNameTest }
5.push标签
先在request中放入一个对象,然后使用push压入值栈,在push标签内部,直接输出值栈中的内容
<!-- 在标签开始后压入值栈,标签结束时弹出值栈 -->
<%
Test test=new Test();
test.setProductName("hcx");test.setProductDesc("100");
request.setAttribute("ttt", test);
%>
<s:push value="#request.ttt">
push标签测试productDsc:${productName }
</s:push>
6.if,else和elseif标签
test中可以直接使用值栈中的属性,例子中就通过判断值栈中product对象的productPrice,来进行区分。
<br><br>
<s:if test="productPrice>1000">
IIIIII7
</s:if>
<s:elseif test="productPrice>800">
IIIII5
</s:elseif>
<s:else>
I3
</s:else>
7.iterator标签
用于遍历一个数组,Collection或Map,并把这个可遍历对象的每一个元素依次压入和弹出ValueStack栈。
<%
List<Test> tests = new ArrayList();
tests.add(new Test("AA", "10"));
tests.add(new Test("BB", "20"));
tests.add(new Test("CC", "30"));
tests.add(new Test("DD", "40"));
request.setAttribute("tests", tests);
%>
<s:iterator value="#request.tests" status="status">
<!-- status属性可以打印 索引和个数-->
${status.index }--${productName }----${productDesc }
<br>
</s:iterator>
<br>
-----------------
<br>
<s:iterator value="tests">
${productName }----${productDesc }
<br>
</s:iterator>
8.sort标签
现准备好实现Comparator接口的类,然后确定source,再引入域对象,内部进行iterator。
#attr :会从域对象中依次寻找对应的key的数据,搜寻范围从 page>request>session>application
<br>排序<br>
<!-- var代表放到域对象里的key的值 先确定比较的comparator,然后把list放入域对象,再s:iterator遍历-->
<s:sort comparator="#request.ts" source="tests" var="newtests" >
<s:iterator value="#attr.newtests">
${productName }----${productDesc }
<br>
</s:iterator>
</s:sort>
9.date标签
<br><br>
s:date 可以对Date对象进行排版
<br>
<s:date name="#session.date" format="yyyy-mm-dd" var="date2"/>
date:${date2 }
10.a标签
<br><br>
<!-- a标签可以生产url,在href里用%{}进行强制OGNL解析 -->
<s:iterator value="#request.tests" >
<s:a href="testURl.action?name=%{productName}">${productName}--url</s:a>
</s:iterator>