Struts2学习笔记

来源:互联网 发布:gson解析json嵌套数组 编辑:程序博客网 时间:2024/06/05 05:01

近段时间学习了Struts2,下面是学习实践过程中记录的一些东西。

 

页面视图与Action之间的数据传输
1 对于Action里面的属性,可以直接使用<s:property value="userName" />进行访问。
2 对于Action里面返回的数据库中的数据,可以在Action中实现ServletRequestAware接口,在action里面调用request.setAttribute("user", user); 在页面上使用<s:property value="#request.user.userName" />进行访问user中的数据。

文件上传
1 <constant name="struts.multipart.saveDir" value="/tmp" />
2 Struts2针对表单中名为xxx的文件域,在对应的Action类中使用3个属性来封装该文件域信息:
类型为File的xxx属性:用来封装页面文件域对应的文件内容。
类型为String的xxxFileName属性:用来封装该文件域对应的文件的文件名。
类型为String的xxxContentType属性:用来封装该文件域应用的文件的文件类型。
3 Action里面配置
具体的配置和错误提示配置可以参考Struts2 api文档。
<interceptor-ref name="fileUpload">
   <param name="allowedTypes">
     image/bmp,image/png,image/gif,image/jpeg,image/jpg,image/x-png, image/pjpeg
   </param>
   <param name="maximumSize">102400</param>
</interceptor-ref>
<interceptor-ref name="defaultStack" />

访问Request, Response, Session, Application, Parameters, Cookies
1 可以通过ActionContext.getContext()来访问Application, Session, Parameters等。
2 可以通过实现ServletRequestAware, ServletResponseAware, SessionAware, ApplicationAware, ParameterAware, CookiesAware 等进行访问 Request, Response, Session等的访问.

国际化支持
1 配置文件中加载资源文件<constant name="struts.custom.i18n.resources" value="message" />,
文件命名方式:
l baseName_language_country.properties
l baseName_language.properties
l baseName.properties
2 在页面显示时调用<s:text name="message key" />
在Action中访问资源,可以使用getText("");如果带参数可以使用getText("", new String[]{userName});

FieldError & ActionError
Action类通过拓展ActionSupport类,可以实现validate表单验证方法。
在页面显示错误时:使用<s:fielderror/> <s:actionerror/>

一个Action中支持多个方法的调用配置
1、简单的Action配置
<action name="logon" class="tutorial.Logon">
  <result type="redirect-action">Menu</result>
  <result name="input">/tutorial/Logon.jsp</result>
</action>

2、在开发中通常将多个方法写在一个action中,对于这样action可以采用集中配置方式
   一个方法一个action配制  <action name="delete" class="example.CrudAction" method="delete">

   通配符方式
   <action name="*Crud" class="example.Crud" method="{1}">
   <action name="crud_*" class="example.Crud" method="{1}">
   <action name="crud!*" class="example.Crud" method="{1}">

   url pattern: /{model}/{method}.action
   /User/add.action” 调用User的add方法
   <action name=”*/*” method=”{2}” class=”com.infoq.actions.{1}Action”>
      <result type=”redirect”>/{1}/view.action</result>
      <result name=”view”>/{1}/view.jsp</result>
      <result name=”input”>/{1}/edit.jsp</result>
      <result name=”home”>/{1}/home.jsp</result>
   </action>

表单验证 ---开发者应该以最坏的打算来面对浏览者的输入
表单验证分为客户端验证和服务器验证,客户端验证主要是过滤正常用户的操作,主要通过JavaScript代码完成;服务器验证是整个应用阻止非法数据的最后防线,主要通过在应用中编程实现。
Struts表单验证:一种是实现ActionSupport的validate方法,也可为Action中是方法指定验证方法,如为Action中的register()方法指定validateRegister()方法,那么请求register时会使用validateRegister进行验证;还有一种是编写验证规则文件,可以为每个Action都指定一个验证规则文件,文件命名为"Action类名-[方法名-]validation.xml",保存在与Action Class相同的路径下,在视图页面指定form的validate=true。Struts2提供了多种类型内置的验证器,如required, requiredstring, int, double, date, expression, fieldexpression, email, url, visitor, conversion, stringlength, regex.
以下为一例
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
    <field name="name">
        <field-validator type="requiredstring">
            <message>You must enter a name</message>
        </field-validator>
    </field>
    <field name="age">
        <field-validator type="int">
            <param name="min">13</param>
            <param name="max">19</param>
            <message>Only people ages 13 to 19 may take this quiz</message>
        </field-validator>
    </field>
</validators>

拦截器
拦截器的配置:
相关的元素有
<interceptors../>用于定义拦截器,该元素下包含<interceptor../> <interceptor-stack../>
<interceptor../>用于定义拦截器,包含name和class两属性。
<interceptor-stack../>用于定义拦截器引用,该元素下包含多个<interceptor-ref../>。
<interceptor-ref../>引用一个拦截器或拦截器栈,有一个name属性,该元素可以作为<interceptor-stack../>和<action../>元素的子元素。
<param../>为拦截器指定参数,作为<interceptor-ref../>和<interceptor../>的子元素使用。

实现自定义拦截器:(拦截Action类的所有方法)
如需开发自己的拦截器类,需实现com.opensymphony.xwork2.interceptor.Interceptor接口或实现AbstractInterceptor类。

方法过滤:(继承MethodFilterInterceptor类,实现doIntercept(ActionInvocation invocation) )
该拦截器有两个可选配置参数:excludeMethods和includeMethods来设置Action的哪些方法需要拦截,哪些方法不需要拦截,方法间用","号分隔。

标签库
iterator标签迭代List中的List
<s:iterator value="categorys" id="cate">
    <s:property value='name'/> -- <s:property value='id'/>"
    <s:iterator value="#cate.products">
       ( <s:property value="name"/> -- <s:property value="id"/> )
    </s:iterator>
</s:iterator>
1. value属性:可选的属性,value属性是指一个被迭代的集合,使用ognl表达式指定,如果为空的话默认就是ValueStack栈顶的集合.
2.id属性:可选属性, 是指集合元素的id
3.status属性:可选属性,该属性在迭代时会产生一个IteratorStatus对象,该对象可以判断当前元素的位置,包含了以下属性方法:
int  getCount();  迭代元素个数
int  getIndex();  迭代元素当前索引
boolean getFirst(); 是否为第一个
boolean getEven(); 是否为偶
boolean getLast(); 是否最后一个
bolean getOdd();   是否为奇
由于iteratorstatus对象并不是ognl的根对象因此访问需要加上 #访问如下例子:
<s:iterator value=”{’dd’,'bb’,'cc’}” status=”st”>
   <s:if test=”#st.odd”>
      <s:property value=”#st.index”/>
   </s:if>
</s:iterator>


ONGL表达式:
支持对象方法调用,如xxx.doSomeSpecial();
支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 |  值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;

“#”主要有三种用途:
访问OGNL上下文和Action上下文,#相当于ActionContext.getContext()
用于过滤和投影(projecting)集合,如books.{?#this.price<100};
构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。

“%”符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值。

“$”有两个主要的用途
1. 用于在国际化资源文件中,引用OGNL表达式,如:validation.require=${getText(fileName)} is required
2. 在Struts 2配置文件中,引用OGNL表达式,如:<result type="redirect">ListPhotos.action?albumId=${albumId}</result>

集合操作:
除了in和not in之外,OGNL还允许使用某个规则获得集合对象的子集,常用的有以下3个相关操作符。
?:获得所有符合逻辑的元素。
^:获得符合逻辑的第一个元素。
$:获得符合逻辑的最后一个元素。
如:person.relatives.{? #this.gender == 'male'}  该代码可以获得person的所有性别为male的relatievs集合。

原创粉丝点击