Struts2小结

一 Struts2内容简介:

2.struts2的应用

3.拦截器Interceptor的工作原理

4.校验

5.Struts2的执行过程

二 Struts2的应用

1.安装JDK,Tomcat与Eclipse

2.建立web项目:Dynameic Web Project

导入Struts2需要的jar包:struts2-core-2.x.x.jar,xwork-core-2.x.x.jar,ognl-2.6.x.jar,freemarker-2.3.x.jar,commons-fileupload-1.2.1.jar

配置Tomcat服务器:点击window->Preferences->Server->Runtime Environments->add

web项目添加Tomcat:右键项目->Build Path->Configure Build Path->Add Libaray->Server Runtime,选择Tomcat添加

3.web.xml中配置Struts2的核心Filter

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" 
xsi:schemaLocation
="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>webTest01</display-name> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> <!-- 添加struts2过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class> <!-- 添加核心Filter --> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>

4.在src里建立struts.xml(必须是这个名字),配置Action类(约定优于配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">
   
<struts>
<constant name="webTest01" value="true" />
<!-- 所有Action都定义在package下 -->
   <package name="gusixue" namespace="/" extends="struts-default">
<!--    *为通配符,{1}为取*得值,jsp定位使用.action -->
      <action name="*_status" 
            class="com.nsu.web.action.UserAction" 
            method="{1}">
<!-- 定义两个逻辑视图和物理资源之间的映射 -->  
            <result name="success">/welcome.jsp</result>
            <result name="fail">/login.jsp</result>
       </action>
   </package>
</struts>

三 拦截器Interceptor的工作原理

1.内置拦截器配置:

在struts.xml文件下添加

<interceptors>
    <interceptor name="拦截器名1" class="拦截器类1"></interceptor>
    <interceptor name="拦截器名2" class="拦截器类2"></interceptor>
    ...
    <interceptor name="拦截器名n" class="拦截器类n"></interceptor>
</interceptors>

<action name="Action名" class="Action类">
    <interceptor-ref name="defaultStack"></interceptor-ref>
    <interceptor-ref name="拦截器1"></interceptor-ref>
    <interceptor-ref name="拦截器2"></interceptor-ref>
</action>

  一旦继承了struts-default包(package),所有Action都会默认调用拦截器栈 ---defaultStack。但是当在Action配置中加入“<interceptor-ref name=”..“ />”则会覆盖defaultStack,所以在action中写拦截器引用时,需要显示引用defaultStack(而且最好在第一句)。

2.自定义拦截器:

  1)实现方法

  • 实现Interceptor接口
  • 继承AbstractInterceptor类
  • 继承MethodFilterInterceptor类

  2)拦截器必须是无状态的,换句话说,在拦截器类中不应该有实例变量。这是因为struts2对每一个Action的请求使用的是同一个拦截器实例来拦截调用,如果拦截器有状态,在多个线程(客户端的每个请求将由服务器端的一个线程来服务)同时访问一个拦截器实例的情况下,拦截器的状态将不可预测。

3.其他:在struts2的工作原理下

四 校验

1.校验:

  1)输入校验分为客户端校验和服务器端校验

  2)服务器端校验分为:手工校验和配置校验,但是都必须要继承ActionSupport类

  3)手工校验:

    方式一:重写validate()方法: validate()方法会校验action中所有与execute方法签名相同的方法。

    方式二:重写validateXxx()方法:validateXxx()只会校验action中方法名为Xxx的方法。

    

    当某个数据校验失败时,我们应该调用addFieldError()方法往系统的fieldErrors添加校验失败信息(为了使用addFieldError()方法,action可以继承ActionSupport )

    如果系统的fieldErrors包含失败信息,struts2会将请求转发到名为input的result。在input视图中可以通过<s:fielderror/>显示失败信息。

   4)校验框架:

    校验文件和action类放在同一个包下,文件的取名格式为:ActionClassName(struts.xml中的action的name)-validation.xml,其中ActionClassName为action的简单类名,-validation为固定写法

    当为某个action提供了ActionClassName-validation.xml和ActionClassName-ActionName-validation.xml两种规则的校验文件时,系统按下面顺序寻找校验文件:
    先检查全Action的AconClassName-validation.xml再检查某个方法的ActionClassName-ActionName-validation.xml;如果两个校验文件中指定的校验规则冲突,则只使用后面文件中的校验规则;当 action继承了另一个action,父类action的校验文件会先被搜索到。

     

2.自定义类型转换:

  1)建立一个新类

  • 实现ognl.TypeConverter接口
  • 继承DefaultTypeConverter类(一般使用这个)
  • 继承StrutsTypeConverter类

    类中添加转换判断与转换过程

  2)特定类型转换器:只有特定的Action才可以使用

     注册方法:在Action所在的包中建立properties文件,文件名格式:Action类名-conversion.properties,内容如下:要转换的Action类的属性名=类型转换器全限定名

  3)全局类型转换器:所有Action都可以使用

    注册方法:在classpath下建立名为xwork-conversion.properties的文件,内容如下:目标类型(全限定名)=类型转换器全限定名

五 Struts的执行过程

  1. 首先jsp传递参数并发出请求
  2. 根据请求名在Struts.xml中找到Action
  3. 在Actin中根据传递出来的名字找到对用的set方法,检查是否有有自定义类型转换
  4. 从配置文件中找到要转换的属性极其转换类
  5. 进入转换类判断转换方向,将字符串转换为给定类类型
  6. 如果在执行类型转换的过程中出现异常,系统会将异常信息保存到ActionContext,conversionError拦截器将异常信息添加到fieldErrors里。不管类型转换是否出现异常,都会进入下一步
  7. 系统通过反射技术先调用action中的validateXxx()方法,Xxx为方法名。再调用action中的validate()方法。(此为输入校验)
  8. 如果系统中的fieldErrors存在错误信息(即存放错误信息的集合的size大于0),系统自动将请求转发至名称为input的视图。如果系统中的fieldErrors没有任何错误信息,系统将执行action中的处理方法。
原文地址:https://www.cnblogs.com/zhuanzhuruyi/p/6642917.html