三、WebWork(Struts2 的前身)

此文是对以下文章的学习笔记:http://www.blogjava.net/moxie/archive/2006/10/20/76375.html

一、WebWork

  Struts2 是 WebWork 的升级,跟 Struts1 无关。

  WebWork 是 Java 的一个开源框架,功能和 Struts 类似。之后被 Apache 吸收,并在此基础上推出了 Struts2 框架。

  1. 过滤器fiter 和拦截器 interceptor 的区别

    a:filter 是 servlet,jsp里面的东西,应该说是属于规范了。而拦截器是struts的东西,不通用。

    b:请求到后台:get/post -> filter -> Interceptor -> Interceptor/filter 里面的跳转 -> 指定的 jsp/action/servlet

    c:Interceptor 只能拦截 action 请求,而 filter 是万能的,是请求就能拦截。

    d:filter 是链式处理的,也就是一个 filter 完后,如果还有过滤,那就得继续。顺序根据web.xml里面的顺序来。

    e: filter 是 servlet包里面的一个接口,写一个filter,只要实现它,然后实现它的几个方法就算一个filter了。

  2:filter 配置(题外话):

<filter>
  <filter-name>loginFilter</filter-name>
  <filter-class>cn.com.webinfo.web.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>loginFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>
public class UserLoginFilter implements Filter {
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
       HttpServletResponse res = (HttpServletResponse) response;
    // 此时所有的配置文件都还没有进来,只启动了项目。所以获得对象或者jsp,都需要通过路径、cookies获得
    String seerviceUri=requestUri.substring(contextPath.length());//路径
    Cookie cookies[]=req.getCookies();//cookies
    // 通过 spring 获得 class 对象
    ClientManager clientManager=(ClientManager)WebApplicationContextUtils.getWebApplicationContext(req.getSession().getServletContext()).getBean("clientManager");
    
    chain.doFilter(req, res);
  }
  public void destroy() {
	// TODO Auto-generated method stub
  }
  public void init(FilterConfig arg0) throws ServletException {
	// TODO Auto-generated method stub	
  }
}

二、WebWork 结构

  1. WebWork 结构:Xwork1 + WebWork2

  2.执行流程:

  3. WebWork 组成(webwork.xml):Action + Reusults + Interceptors:

    a.Action:

    b.Results:配置文件中,自定义的字符串,用来指示Action执行之后,如何显示执行结果。

          Result Type 表示如何及用哪种视图技术展现结果,由此WebWork支持多种视图技术。

          而且这些技术可以互相切换,不需要修改Action。

    c.Interceptors:Action 之前、之后 执行。将功能用插拔的方式注入到 Action 中。

三、WebWork实例:

  1. 安装jar包

    

  2. 配置前端控制器:FilterDispatcher(web.xml-filter)

    

  注:①:这里的前端控制器会接受任意的请求(默认是将.action结尾的URL)映射为WebWork的Action请求。

    ②:我们可以在webwork.properties文件中,设置我们自己的后缀名,多个后缀名可以用逗号隔开。

      例如:webwork.action.extension=action,do

  3. 配置 xwork.xml

   

  4. index.jsp  

  

  5. cc.action.LoginAction 

     

    ①:它实现了Action接口,获得login.jsp页面传入的数据即输入的用户名

    ②:没有调用任何一个 JavaServlet 的 API

    ③:值堆栈和表达式语言来实现参数的传递(action的参数传递给jsp)

  5. success.jsp

  

    ①:将通过表达式语言,取得Action执行之后暴露出来的数据对象

    ②:在Jsp页面中,默认“altSyntax”是开启的。它是用来解决标签库中的字符串和表达式语言混淆的问题。

      所以,作为变量的表达式语言应该放在%{}中,否则WebWork会把它当作字符串处理

  6. 结果

   

四、ValueStack( 值堆栈 ) 和 EL( 表达式语言 )

  1. ValueStack:用来放置Java对象(例如:Action对象、Model对象等)的堆栈。

  2. EL(Express Language):①:用来存储获取(set()get())ValueStack中存放的对象的数值。

                  ②:直接访问类的静态数据,调用静态方法。

  3. 两者都遵循OGNL规范。

  4.  WebWork为每一次请求构建一个ValueStack。

     并将所有相关的数据对象(例如:Action对象、Model对象等)放到ValueStack中。

     再将ValueStack暴露给视图页面,这样页面就可以直接访问后台处理生成的数据。

  5. 查找数值的方式:我们给的操作指令是”name”,ValueStack会从上而下,遍历栈里面的对象。

  6. context map:

    ①:它是一个放置值堆栈上下文数据的对象

    ②:通过符号“#“再加上对象的名称,可以访问这些数据(只可以访问)

    ③:一些JavaServlet相关的数据都放在这个容器中

    因此:可以直接通过表达式语言去访问request、attribute、session、application里的数据。

    例如:用property标签库打印出所有请求参数的数据,代码如下:<ww:property value="%{#request}"/>

  7. “top”是ValueStack里面的关键字,通过它可以找到ValueStack中最上面的那个对象。

    语法:valueStack.findValue("top"))

  8. 表达式语言调用形式:

    ①:调用基于JavaBean规范的get和set方法之外

    ②:可以调用一般的Java方法(这是需要使用方法的全名,并传入需要的参数)

    ③:可以直接访问Java类的静态字段和静态方法

五、IoC(Inversion Of Control)容器

  IoC = 倒置翻转 = 依赖注入 = 依赖倒置原理

  1. 用来为对象组装其依赖的对象的容器;也就是说对象本身不用关心它依赖的对象(可以是组件或者服务,反正就是提供业务方法的对象)的创建,初始化,生命周期等,而是由容器来控制。

  2. 官方推荐Spring来作为WebWork的IoC容器

    Spring 的方式:

    ①:拷贝Spring依赖的所有jar文件

    ②:配置web.xml文件

      <listener>

          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

        </listener>

    ③:在webwork.properties中设置WebWork对Spring的支持:webwork.objectFactory = spring

    ④:可以在webwork.properties中设置Bean组件的默认组装方式。

      默认是按照Bean的名称,可以选择按照类型、构造函数、自动选择等方式。

 六、总结:

  1. 多视图支持:只需要修改xwork.xml中的result,无需修改action

  2. Action的数据验证(3种方式):

    ①:为action绑定验证文件,在验证文件中定义验证规则

    ②:在Action中实现com.opensymphony.xwork.Validateable接口的validate

    ③:在Action的执行方法中,编写代码来验证

     注: a. webwork 又一些常规的验证可用(如:字段必填,邮箱地址等)

       b. 也可以在 视图层验证(如:js),但是这个就无关webwork的验证了。

       c. 前两种验证方法,参考:http://www.cnblogs.com/MissRabbit/p/6595741.html

  3. 数据类型转换:

    ①:基本数据类型,webwork会自动处理

    ②:如果数据是一个集合,或者需要特定转化,就要在文件(ClassName-conversion.properties)中定义转换规则

      参考:http://www.cnblogs.com/xiaolongSunny/p/4655546.html

  4. Action除了执行execute()方法外,还可以执行其他的方法

    条件:这些方法必须是无参数

    访问格式:actionName!methodName.action,例如user!doAdd.action,调用user Action类的doAdd方法

  5. Action链(Action Chaining

    http://www.blogjava.net/jnbzwm/archive/2010/11/19/338495.html

  6. 多模块

    ①:xwork.xml 可以继承(包含) 其他的xwork.xml(例如: <include file="webwork-default.xml"/>

    ②:package的继承:

      http://www.cnblogs.com/ningvsban/p/3734562.html

      http://www.jianshu.com/p/c3092b28ab11

  7. Action的Model Driven:

    http://blog.csdn.net/li_tengfei/article/details/6098145

 

原文地址:https://www.cnblogs.com/MissRabbit/p/6559543.html