Struts2基础
#的用法:
1、从map栈中取值,
2、从对象栈中值则不用加#号(如果通过set放进对象栈的对象,则通过对象名.属性来取)
%用法:
1、 文本框<s:textfield name="test" value="%{#request.text}"></s:textfield>
2、 配置result中使用<result name="text">ognl/%{#test-url}</result>
3、 输出字符串:<s:property value="%{'<hr>hr'}" escape="false"/>
$用法:
$(对象栈的属性):这样就可以在非struts2标签中使用对象栈的值
Property标签:
1、escape属性,默认为true,设置为false时,不转义
<s:property value="%{'<hr>hr'}" escape="false"/>
2、default 属性,当value的值不存在是,输出默认值
s:property value="#xixifasf" default="dafhodsh"/>
3、<s:property/>:什么属性都不写,表示输出栈顶元素值
Debug标签:
<s:debug></s:debug>//利用这个标签可以输出ognlcontext中所有的值
注意:注释(通用)
<!-- 大家好 -->
该注释方法仍然会被编译,如果是纯文本则在源代码中可以显示;如果含有代码,则会编译成对应值输出
<%-- <s:set value="%{'你好'}" var="aa" scope="request"></s:set>--%>
该注释方法,不回被编译,即使在源代码中也看不到
“valueStack”=OgnlValueStack
.context=OgnlContext
._root=CompoundRoot //对象堆栈
._values = HashMap<K.V> //Map堆栈
.table=HashMap$Entry<K.V>
[2]是application对应的地址
[14]是session对应的地址
[23]是request对应的地址
[24]是action对应的地址
[27]是parameters对应的地址
.root= CompoundRoot //对象堆栈
elementData=Object[2]
.[0]=ValueStackAction
.[1]=DefaultTextProvider
1、<s:debug></s:debug>//利用这个标签可以输出ognlcontext中所有的值
Push标签:
将value放到对象栈顶,但只能在内部才能取到对应的值,标签结束,值便消失
<s:push value="%{'大家好'}">
<s:property/>
<s:debug></s:debug>
</s:push>
2、测试set标签:<br>
<s:set value="#request.request_username" var="aaaaa" scope="request"></s:set>
<s:property value="#request.aaaaa"/>
说明:这样的情况,aaaaa的key值会出现在request域中。
<s:set value="#request.request_username" var="aaaaa"></s:set>
<s:property value="#request.aaaaa"/>
说明:这种写法aaaaa会作为一个key值存在ognl的map中。所以利用
<s:property value="#aaaaa"/>也能输出值。
3、显示map栈中域的值
输出request域中的值<s:property value="#request.request_name"/><br/>
//attr表示依次在各域中查找
输出session域中的值<s:property value="#attr.session_name"/><br/>
输出application域中的值<s:property value="#application.application_name"/>
显示map栈中map的值:<s:property value="#xixi"/>
4、Radio标签
<s:radio list={'"#male':'男','female':'女'}" name="sex" label="性别" ></s:radio><br/>
<!-- 两者写法效果相同 -->
<s:radio list="#request.map" name="sex" label="性别"/>
4、取值方法
ValueStack的push方法,push(student); 将对象直接放到栈顶中去
ValueStack的set方法,set("person", person);将对象放到对象栈的HashMap中去
ValueStack的setValue(“comment”,update)方法,设置栈顶参数值
ValueStack的getValue()方法,获取栈顶参数值 getValue in interface Map.Entry
Result中name的作用,当一个action中有多个result时,就需要用name来区别
<result name="scope">ognl/showscope.jsp</result>
5、配置常量
Constantd的配置可以覆盖掉default.properties文件中的,还可以覆盖struts-default.xml,struts-plugin.xml这些xml文件中关于常量的内容
<constant name=”struts.ui.theme” value=”simple”></constant>
注意:value值如果有多个,可以用”,“隔开
6、result中的type值
redirect和redirectAction chain的区别
定义:当使用type=“redirectAction” 或type=“redirect”提交到一个action并且需要传递一个参数时。
这里是有区别的:
1、使用type=“redirectAction”时,结果就只能写Action的配置名,不能带有后缀:“.action”
2、使用type=“redirect”时,结果应是action配置名+后缀名
Struts2常用标签
不会的时候查看内存快照是个好方法
struts的标签不懂的,拿到页面一看源代码就行了
form默认method为post
用了ognl表达式action="/userAction_doEdit.action"不用${pageContext.request.contextPath}了
讲了表单
radio标签
<s:radio list="{'JavaEE+Android课程','Net+WindowPhone课程','JavaEE+物联云计算课程'}"
onselect="courseName" name="courseName" label="意向课程"></s:radio>
select标签
s:select
list属性代表数据的来源
listKey相当于option元素中的value属性的值
listValue相当于option元素中要显示的值
headerKey是最上面的option元素的value的值
headerValue是最上面的option元素的要显示的值
name属性,可以实现回显功能
s:checkboxlist
list数据的来源
listKey value的值
listValue 显示的值
name 必须要有
<!-- 没有解决默认选中的问题 -->
<s:checkboxlist list="#list" listKey="sid" listValue="sname" name="用户名"></s:checkboxlist>
s:iterator 属性都存在map栈中
value 数据来源,没有则默认找栈顶元素对象
[var] 可选,表示当前迭代对象,当多层循环时要用
status 当前元素一些属性值
count 遍历了的第几个数据
index 正在遍历的索引值
even 是否为偶数
odd 是否为奇数
说明:迭代的时候,struts2会把元素对象临时放到栈顶,循环结束后删除
格式:
list的迭代
<s:iterator value="#personList" var="pList" status="st">
<tr class="<s:propery value="#st.even?'even':'odd'">
<s:porperty value="#pList.pid"/>
<s:porperty value="#pList.pname"/>
<s:porperty value="#st.count"/>
<s:porperty value="#st.index"/>
<s:porperty value="#st.even"/>
<s:porperty value="#st.odd"/>
<s:iterator/>
特别的:将personList push到栈顶
则修改为<s:iterator>
Map的迭代,value得到的是entry,对应key、value
<s:iterator value="#map">
</s:porperty value="key">
</s:porperty value="value.pid">
</s:porperty value="value.pname">
<s:iterator/>
多层的迭代(list<map>)
<s:iterator value="#lists">
<s:iterator [value="top"]>
<s:porperty value="key"/>
</s:porperty value="value.pid">
</s:porperty value="value.pname"/
</s:iterator>
</s:iterator>
if else语句
<s:if test="">
</s:if>
<s:elseif test="">
</s:elseif>
<s:else>
</s:else>
超级链接语句
<s:a action=""></s:a>
1、针对struts2.1的版本
如果超级要加一个参数
正确的写法是tagAction_show_href_ifelse?pid=%{pid}
错误的写法是tagAction_show_href_ifelse.action?pid=%{pid}
2、EL表达式$与ognl表达式问题
ognl标签外部可以使用el表达式,ognl标签内不可以使用
html标签中,只能使用el表达式
<s:a action="tagAction_show_href_ifelse?pid=${pid}"></s:a>