Struts2.0
处理流程
值栈
一次request只有一个值栈。
Action
1、当前正在访问的action永远在值栈栈顶。
2、服务器端跳转到另外一个action时值栈里会有两个action,且,先访问的action在栈底。
默认action写法:
<default-action-ref name="login"/>
命名空间
路径
标签
1、property标签:
获取值栈中的action属性值:
<s:property value="userName"/>
取值为字符串:<s:property value="'userName'"/>
设定默认值:<s:property value="admin" default="管理员"/>
设定html标签:<s:property value="'<hr color=red>'" escape="false"/>
2、set标签:
<s:set var="aaa" value="'userName'"/>
1、其中,value可以是一个ognl表达式,也可以是一个字符串。
2、指定set范围:可以为application、session、request、page,默认为action。
3、默认情况下,范围为action:在request中可以取值,也可以在ActionContext中取值。
从request取值:<s:property value="#request.aaa"/> 从ActionContext取值:<s:property value="#aaa"/>
set设定page范围:
<s:set var="abcd" value="'adbc'" scope="page"/> 从page范围取值:
<%=pageContext.getAttribute("abcd") %>
set设定session范围:
<s:set var="ss" value="'sss'" scope="session"/> 从session范围取值:<%=session.getAttribute("ss") %> 或者:<s:property value="#session.ss"/>
set设定application范围:
<s:set var="app" value="'appli'"
scope="application"/>
从application范围取值:
<%=application.getAttribute("app") %>
或者:<s:property value="#application.app"/>
3、bean标签:
<s:bean name="com.yjl.domain.Book" var="myBook"> <s:param name="bookName" value="'mybook'"/> </s:bean>
4、include标签(不能包含动态网页):
包含静态英文文件:
<s:include value="includeEnglish.html"/>
包含静态中文文件:
<s:include value="includeChinese.html"/>
%的用法:<s:set var="web"
value="'includeEnglish.html'"/>
<s:include value="%{#web}"></s:include>
%{}的意思是说:强制将花括号中间的内容强制转换成ognl表达式
5、date标签
<s:date name=”birthDate” format=”yyyy-MM-dd” /> 格式也可写成:”yyyy/MM/dd HH:mm:ss”
6、fielderror标签
<s:fielderror fieldname=”MyError” theme=”simple”/>
7、if elseif else标签
<s:if test="password.length()<6">密码太短</s:if> <s:elseif test="password.length()>6">密码太长</s:elseif>
<s:else>yeah!</s:else>
8、iterator标签
<s:iterator value="{1,2,3}">
<s:property/>|
</s:iterator>
<s:iterator value="{'aaa','bbb','ccc'}" var="x"
status=”status”>
<s:property value="#status.first"/>|
<s:property value="#x.toUpperCase()"/>| </s:iterator>
遍历map
<s:iterator value="#{1:'aaa',2:'bbb',3:'ccc'}" var="x">
<s:property value="key"/>|<s:property value="value"/><br>
</s:iterator>
异常
在action中写:
<exception-mapping result="error"
exception="java.lang.Exception"></exception-mapping>
也可以在包内写全局结果和全局异常映射,注意:全局结果一定要写在全局异常前面。
类型转换
1.List类型转换(注意通过url传值的写法)
http://localhost:8080/Struts2_TypeConversion/userLogin?books=java&books=xml&books=uml
2.Map类型转换(注意通过url传值的写法)
http://localhost:8080/Struts2_TypeConversion/userLogin?books=java&mapType[‘a’]=music&mapType[‘b’]=sleep
拦截器栈
Aspect-Oriented Programming
<package name="interceptor" extends="struts-default" > <interceptors>
<interceptor-stack name="mystack"> <interceptor-ref name="timer" /> <interceptor-ref name="logger" /> <interceptor-ref name="params" />
<interceptor-ref name="staticParams" /> </interceptor-stack>
</interceptors>
<action name="first" class="action.FirstAction">
<param name="who">比尔</param>
<interceptor-ref name="mystack"/> </action>
</package>
几种结果集类型
<result type="dispatcher">/dispatcher.jsp</result> <result type="redirect">/redirect.jsp</result> <!-- forward到另外一个action -->
<result type="chain">a2</result>
<!-- 重定向到另外一个action -->
<result type="redirectAction">a1</result> 全局结果集
在package中且action外写如下代码:
<global-results>
<result name="global">/global.jsp</result> </global-results>
要想使用其它包中的全局结果集,需继承那个包。
动态结果集
在action类中属性r的值为“/*.Jsp”。
在配置文件中中写${r},意思是获取Value Stack 中的值。如: <result>${r}</result>
带参数的结果集
一次request只有一个值栈,所以,当结果的类型为redirect并且想给跳转到的页面传递参数时,Value Stack是空的,应从Stack Context中获取值。 注意:当result类型为forward时,为同一个request,所以也是同一个
值栈。
配置文件中:
<result
type="redirect">/success.jsp?t=${type}</result> 从Stack Context 获取值:<s:property
value="#parameters.t"/>
OGNL(Object Graph Navigation Language)表达式 特殊
[i]:i大于等于零,表示在值栈中,从第i个开始,从上往下,所有元素的集合。可以用[i].xxx来取值。
访问值栈中的对象的普通属性
userName:yjl
使用域模型的值访问
book.bookName:JAVA
访问值栈中对象的普通方法1 userName.length():3
访问值栈中对象的普通方法2(book是Book类的一个实例) book.say():我是一本 JAVA 书!
访问值栈中action的普通方法
say():我是 yjl
访问值栈中对象的静态属性
@com.yjl.action.OGNLAction@VARNAME
访问值栈中对象的静态方法
@com.yjl.action.OGNLAction@methodName()
访问Math类的静态方法
@@max(2,3)
访问Stack Contex中的值
#parameters.book.bookName:JAVA #parameters.book.price:30.0
集合
注释:
listName:List集合对象名
mapName:Map集合对象名
setName:Set集合对象名
访问List,Map,Set listName|mapName|setName
访问List中某个元素 listName[1]
访问List中某个属性的集合
listName.{bookName},这个表达式的意思是说listNamebookName的集合。
注意:ognl表达式中‘{}’可以代表一个集合。
中所有
访问List中某个属性的集合中的特定值 listName.{bookName}[0] 或 listName[0].age
访问Set中某个元素
setName[1]:这是错误的!因为Set是无序的。
访问Map中某个元素
mapName.keyName 或 map['keyName']
访问Map中所有key
mapName.keys:[四川, 河南, 山西]
访问Map中所有value
mapName.values:[重庆, 新乡, 太原]
访问容器大小(List、Map、Set一样) mapName.size() 或 listName.size
投影(过滤)
就是说将符合条件的值筛选出来。‘?#’、‘ ^#’、‘ $#’都是过滤条件。 ‘^’表示第一个,‘$’表示最后一个。
listName.{?#this.price==25}[0]:我是一本数学类型的微积分书!
投影
listName.{^#this.price>25}.{bookName}:[大学语文]
投影
listName.{$#this.bookName=='微积分'}.{bookName}:[微积分]
国际化(很少用)
属性配置文件的三种级别:action、package、applacation。
<constant name="struts.custom.i18n.resources" value="LoginAction"/>,LoginAction是资源文件的开头。
在获取值的时候写ognl表达式getText(’welcome’)。
动态语言切换:
只需传递参数request_locale=en_US即可换成英文。
资源文件中可以有占位符,示例:
welcome=你好{0},在获取值的时候可以这样写:
<s:text name="welcome">
<s:param value="userName"></s:param> </s:text>
Token拦截器原理:
在提交页面中写<token></token>标签,请求页面时,服务器会在页面上产生一个随机字符串并将页面发送到客户端同时会将这个字符串放在session中,提交页面的时候会将页面中的那个字符串和session中的比较,如果两个字符串不一样,则会返回一个错误,根据配置文件中的<result name="invalid.token">/error.jsp</result>,返回相应页面。这样就实现了防止重复提交。