MVC框架之Struts2总结笔记

一、struts1
       Bean需要继承ActionForm,Struts1会给你封装form,而且需要配置到struts1的配置文件中。<form-beans></form-beans>,还需要在action中引用,<action name=”usr”>

继承DispatchAction可以自己编写自己的方法,在配置文件中加个paramter,可指定方法名的字段

步骤:
1.       导包
2.       配置web.xml,配置ActionServlet,设置初始化参数config value=struts-config.xml
3.       编写实现了Action的类
4.       编写继承Action的类。重写其方法或自己写方法。编写domain,需继承ActionForm
5.       配置struts-config.xml
a)         配置bean
b)        配置action
多方法请求,继承DispatcherAction,此类在strut1的扩展包中.

二、struts2
Struts2的request
Struts2会将属性信息放到值栈 中去。而且页面中获取的request对象已经经过struts2包装。类似与在Tomcat中,访问的jsp页面取出的request是被tomcat包装过。Struts2的实现是经过struts2的核心过滤器后,重新包装了它的request


Struts2不是把Action的属性放在request中,而是直接把自己的Action放进去,然后在自己get
1、通过属性驱动来封装对象
2.2.3可以把未初始化的对象自动初始化。
2、通过模型驱动
在Action中实现ModelDriver接口,重写getMode方法,先初始化接收的对象

3、可获得原生的ServletAPI
1.通过ServletActionContext.getRequest()/ getSession()
       2.可通过注入方式获取,需实现ServletRequestAware/ServletSessionAware
4、非IOC方式,实现RequestAware,实现的方法返回map
可通过ActionContext.getContext().getParameters()

Result结果类型


plantText注意IE必须设置头
redirect 参数可以由${name}取出 默认从request中取<param name=”xxx” > ${xx}</parma>
,而#{session.xx}是获取非根对象
Redirect与redirectAction的区别:
       redirectAction继承redirect参数不一样

       redirectAction:参数
                     actionName
                     namespace
supressEmptyParamters控制空参数
       dispatch:必须是一个JSP或html资源
       chain:必须转发到一个action资源,共享属性值
              参数:actionName :
                            namespace :  /xxx


异常的处理。
<exception-mapping  />


Struts2的类型转换
自动转换

COS上传下载(见徐文海文件上传下载)

Struts2自带上传
1.       声明一个File类型的成员变量,需要与字段名相同img
2.       必须实现保存功能.在execute中利用FileUtils.copyFile
3.       必须要再实现另一个变量来转梦保存文件名 imgFileName
4.       必须再实现一个变量来获得文件类型 imgContentType

Struts2的get方式乱码解决方式:
写过滤器,重写request的getPramaterMap();


多文件上传: 都是数组类型也可以使List
1.       声明文件 File[] file;
       fileFileName
       fileContextType
文件下载
Result类型stream
参数
inputName   作为action的属性
       contentType         image/jpeg
       contentDisposition  attachment/filename=”xx.pdf”
       contentSize   缓冲大小

拦截器
一、步骤
1.       书写实现Interceptor接口的类
2.       实现interceptor方法,返回值
3.       配置文件中配置
4.       配置哪个action拦截
         <Interceptors> Minterceptor name=”fist” class=””>
b)        在Action配置中使用拦截器     
5.       获取session
         ActionContext.getContext().getSession()
        Invocation.getInvocationContext().getSession();

二、配置了拦截器的影响:默认拦截器失效将会失效(例如:参数获取不到)
影响的解决:引用系统的拦截器。如果需要上传,则引用系统的上传拦截器,等等。

三、 配置默认拦截器:即使不引用也可以执行的拦截器。配置default-interceptor-ref 会对本包的action起作用。
四、 配置拦截器栈:可包含多个拦截器。
       <interceptors>
        <interceptor  name=”first” class=”” />
        <interceptor-stack name=”complex”>
              <interceptor-ref name=”first” />
              <interceptor-ref name=”defaultStack” />”
</interceptor>
       </interceptors>

Interceptor  的实现方法
Public String interceptor(ActionInvocation invo) {
     
}

五、 拦截器栈会创建一次拦截器的默认构造,另外每配置的action都会创建一次,如果把拦截器放在栈中,则只会创建一次。


六、拦截方法的拦截器: MethodFilterInterceptor
·使用param标签设置excludeMethods过滤排除某方法不拦截
  includeMethods谁配置谁起作用,includeMethods优先
     

Struts2的标签,OGNL表达式
       1.OGNL以某个对象作为根
2.%不是脚本的变为脚本 ,类似js的eval
       <s:url value=”%{#request.url}” />
3.$表示 用在xml
4. @调用静态的方法,默认为java.lang.Math配合 struts.ognl.allowStaticMethodAccess 为true
       5.#号
1.用于其他范围内的取,
2.声明Map或List。{{‘a’,’b’,c}},#{‘a’:’AAA’,’b’:’BBB’}
3.投影过滤{#{’name’:’wj’,’age’:40},#{’name’:’other’,’age’:99}} #a1.{?this.age>90}
       ^#第一个  $#最后一个
标签
       Uri=”/struts-tags”
       <s:property value=”xxxx” /> àJSTL 里的<c:out/>
       <s:a action=”xxx” />
       <s:iterator value=”xxx” var==”x” /> à <c:forEach />
       <s:action name=”xx.action”/>包含action资源



struts2处理json
       1、布置JSON插件
       2、继承json-default包
       3、修改result 的Type=json
       4、使用注解@JSON(NAME=”XXX”)改名,@JSON(serialized=fasle)不输出
       注意循环调用
使用JsonConfig jc = new JsonConfig();
Js.setExcludes(new String[]{“addr”,”addr.user”});
JsonObect o = JsonObject.from(u,jc);

自定义类型转换器
       两种方式:局部和全局,局部为某个Action
       1. 继承父类的opensym.    DefaultTypeConvertor
              可双向转换
2. 配置
a). 局部的
需在Action所在的包中放置XXXAction-convertion.properties,然后配置文件 这个Action的属性birthday=DateTypeConverter.,这样就转换好了
      b). 全局类型转换器
               将上述的properties放在classpath根下,更名为xwork-conversion.propertis.
               将上面的字段换成需转换的类型如java.util.Date

输入校验
方式:
1.  手工编写方式
  XML配置方式
校验内容:
  Action所有方法
  Action中某个方法
步骤:
1.  继承ActionSuppor类
2.  重写validate方法
3.  在方法在判断如果不符合,使用addFieldError方法输出信息(对所有方法进行验证),此操作会往fieldErrors集合中添加错误信息,如果集合中包含错误信息,会请求转发input的result
4.  第3步的输出可在input的转发页面上使用struts2的标签输出<s:fielderror/>
5.  如果想对某个方法进行校验,可以修改第三步的validate为validateXxx方法,其他的步骤一样。
XML验证:
1.  继承ActionSupport类
2.  新建XXXAction-validation.xml,放在action所在的包
3.  配置xml, <validators><field name=”username>
<field-validator type=”requiredstring”>//必须 的,是校验器
<param name=”trim”>true</parrm>
<message>用户名不能为空</message>
</field-validator>
</field>
/validators>

4.  校验器是在struts的包中,校验器:
         Regex  expiress  <![CDATA[^1[358]\d{9}$]]>
        requiredstring  trim必填
        required不能为null
        stringlength     maxLength/minLength 符合长度
         int 整型     min max
         double 双精度浮点  min max
        fieldexpression  OGNL表达示
        email 
          url网址
          date min max
        conversion 类型转换校验器
          visitor   校验复合属性
      expression OGNL
5.  对Action的方法校验:ActionClassName-ActionName-validation.xml

验证的流程:
1.  获得参数,进行类型转换,封装到Action的属性中去。
2.  在类型转换期间如果发生异常,则把异常信息保存到ActionContext中,conversionError拦截器会把它添加到fieldErrors里,不管类型转换是否成功,都会进入下一步。
3.  系统通过反射调用action中的validateXxx方法。
4.  再调用action中的validate方法
5.  如果fieldErrors中有值,则进入input视图,否则执行action中的视图

你可能感兴趣的:(struts2)