Struts2.5 笔记

1.struts2 框架应用 javaee三层结构中的web框架
2.struts2 是基于struct1 + webwork 基础之上发展的全新的框架。
引入:找到原zip解压拿War示例里面的jar
struts.xml 放到src文件夹下

【structs.xml的名称和位置是固定的】
strcuts.xml 里面的约束在示例zip里面有
定义Action   例如 : HelloAction{}
默认执行里面的execute方法
<package name=“hello” extends=”struts-default” namespace=”/”>
    <action name=”Hello” class=”xxx.xxx.HelloAction”>
        <!– 配置方法到访问页面  –>
        <result name=”x” >/x.jsp</result>
    </action>
<package>
action是满足所有浏览器所需要的需求。标准浏览器不需要action

!注意:要配置过滤器

structs2 基本执行内容

 

关于配置文件

Package:
      包,区分不同的Action
      属性:
    1. name 区分不同的Package,起名字,与功能本身没有关系
    2. extends:继承的关系,属性值是固定的=“structs-default”,配置了该值之后,里面的类才具有Action的功能。
    3. namespace:属性值和Action的name值构成一个访问路径,默认namespace 就是 / -> 通过/xxx访问
Action:
    配置Action的访问路径
    1. name:name+namespace 构成访问路径,路径唯一,不能有重复name
    2. class:Action的类
    3. method 
      1. Action里面默认执行execute方法
      2. 让action中的多个方法执行,可以用method实现
Result:根据Action返回值,跳转到不同的路径。
    1. name:返回值,到不同的页面
    2. type:如何到路径去 default=”dispatcher” (转发|重定向)

修改Structs2的默认常量

  1.    常用方式:使用structs.xml进行配置。
    1. <constant name=”xxxxx” value=”yyyy” /> 
    2. 可以修改其默认常量
  2. 在src目录下创建structs.properties文件,进行修改
  3. 在web.xml下进行配置
  最常用的是structs.i18n.encoding=UTF-8,在structs中进行post上传,它默认处理。

分模块开发

—场景:多人协同开发。
  • 单独写配置文件,将配置文件引入核心文件中。
  • 用法:<include file=”com/hafrans/ok” ></include>

Action编写方式

  1. action的编写有三种方式
    1. 创建普通类,不继承任何类,不实现任何接口
    2. 创建类,实现Action接口
    3. 创建类,实现ActionSupport(推荐)

Action不同方法的访问

  1. 在action标签中的method属性。
    1. 例如
      1. <action name=”Hello1″ class=”xxx.xxx.HelloAction” method=”1″></action>
      2. <action name=”Hello2″ class=”xxx.xxx.HelloAction” method=”2″></action>
  2. 使用通配符的方式实现
    1. 例如
      1. <action name=”Hello_1″ class=”xxx.xxx.HelloAction” method=”{1}”></action>
      2.  

  3. 动态访问实现(不用)
    1.  

关于Result:

         result的返回值可以没有,但是如果有他的值必须是java.lang.String
     如何让action里面的方法没有返回值?
      • 设置void
      • 返回“none” (Action.NONE)
      •  

—————————————————————————————————————————-
在Action中对数据的操作
  1. 结果页面的配置
    1. 全局结果页面
    2. 局部结果页面
    3. result标签name属性type属性
  2. 在Action获取表单数据
    1. 使用ActionContext获取
    2. 使用ServletActionContext获取
    3. 使用接口注入方式获取(用的不多)
  3. structs2 提供获取表单数据方式
    1. 属性封装
    2. 模型驱动封装
  4. structs2获取数据封装到集合中
    1. 封装到list集合
    2. 封装到map集合
  5. 扩展–表达式封装和模型驱动比较 

结果页面的配置

result 标签配置action方法的返回值到不同的路径里面。
   如果有多个Action到相同的页面,可以使用全局结果页面进行配置。
方法:
<global-results>
        <result name=”success” >/hello.jsp</success>
</global-result>
是package的子节点
局部result页面的优先级比全局的页面配置高。

Result 中的Type属性。

功能:配置如何到路径去(转发或者重定向)
普通属性值:默认值dispatcher , 可选 redirect
上面的两个值dispatcher和redirect,这两个值一般针对到页面中配置,配置到其他action中需要其他属性
新属性值:chain , redirect,注意:chain有缓存的问题,一般用redirectAction
属性值:
    1. dispatcher
    2. redirect
    3. chain
    4. redirectAction

 

Action获取表单提交数据

方式
  1. 使用ActionContext类
    1. 调用:ActionContext.getContext()获取实例
  2. 使用ServletActionContext
    1. 跟在servlet里面差不多
       
  3. 使用接口注入方式
    1. 实现ServletRequestAware 接口 用的不多

struts2 封装表单的方式

  1. 用原始方式
    1. 不再赘述,如下图。
       
  2. 属性封装
    1. 在Action中写几个成员变量(要和表单属性值一样)
    2. 在Action里面协商Get,Set(只要set就行了)
    3. 缺点,无法直接封装到实体类
  3. 模型驱动封装
    1. 可以直接将表单数据封装到实体类里面
    2. 方法
      1. 实现ModelDriven<T>接口
      2. 创建一个对象
      3. 实现getMoldel(
         要求:输入项的name值和实体类的值一样。
      1. 在一个action中,不能同时使用属性封装和模型驱动封装(两者都用的时候只会使用模型驱动封装,属性封装会变null)

  4. 表达式封装
    1. 在Action里面声明一个实体类
    2. 生成实体类里面的get/set
    3. 在表单输入项内的name属性值里面写上表达式
    4. java内:
       
    5. 表单内

表达式封装和模型驱动封装的比较

  1. 两者都可以把数据封装到实体类里面
  2. 使用模型驱动在一个Action内只能封装到一个实体类内
  3. 表达式方式封装可以把数据封装到不同实体类内

表单封装到集合里面

封装到List/Map里面

  1. 在Action声明一个List<?>/Map<?>
  2. 生成get/set方法
  3. 在表单项目生成表达式
    1. list:   name=”list[0].a” name=”list[1].a”
    2. map: name=”map[‘first’].a” 

OGNL 概述

  1. EL可以获取域对象里面的值
  2. OGNL 是一种表达式,更加强大
    1. 在struts里面操作值栈数据
    2. 一般把ognl放在struts2操作,和struts2 标签一起使用操作值栈。
  3. OGNL 是一个单独的项目,但是经常和struts2一起用
    1. 一般struts2提供ognl

OGNL简单入门

ngnl+struts2标签可以访问实例内的方法例如:
     <s:property value=” ‘haha’.length() “>

什么是值栈

  1. 之前在web阶段,在servlet里面进行操作,把数据放到域对象里面,在页面使用el表达式获取到,域对象在一定范围内,存值和取值。
  2. struts2里面本身提供的一种存储机制,类似于域对象,也可以存值或取值
    1. 在action里面把数据放在值栈里面,在页面中获取到值栈数据。
  3. 值栈存储的位置
    1. 每次访问action的时候,都会创建一个action对象
    2. 在每个action对象里面都有一个值栈对象。

如何获取值栈对象

  1. 使用ActionContext类里面的方法获取值栈对象。
  2.  ?

值栈的内部结构

值栈分为两部分
  1. root,是个List,一般操作这个
  2. Context是个Map,一般不操作
    1. Context存储着request.session.application对象的引用并且存在parameters传递相关的参数,attr存着最小空间域的键值对。
  3. 使用s:debug 看值栈的信息
    1. 在action里面有值栈对象
    2. 值栈对象里面有action引用,默认栈顶元素是Action的引用

向值栈中放数据

  1. 获取值栈对象,调用方法:set
  2. 获取值栈对象,调用方法:push
    1. push(obj)
  3. 在action定义变量,生成get方法 

向值栈放对象

  1. 定义对象变量
  2. 生成get/set 

从值栈中获取数据

使用strut2标签和ognl表达式
  1. 在action里面加上成员变量&get
  2. <s:property value=”xx”></s:property>
遍历
<s:iterator></s:iterator>
每次遍历时,值的引用会放在context中

<s:iterator></s:iterator>

其他操作

OGNL中#号可用于获取request.session.application等引用

更常用的是配合iterator

OGNL中%的使用

  1. 在struts2标签中表单标签
    1. 在strut2标签中使用ognl表达式,如果直接在strut2表单标签里面使用ognl不会被识别,之后用%之后才会被识别。

 

Servlet和action区别

1.   Sevlet:默认在第一次访问的时候创建,创建一次
2.   Action:访问的时候创建,每次访问action的时候,都会创建对象

struts2拦截器(interceptor)

  1.  struts2是框架,封装了很多的功能,很多的功能都封装在拦截器里面,包括ModelDriven等功能
  2. struts2里面封装了很多功能,又很多拦截器,但不是每次这些拦截器都执行,每次只执行一部分拦截器
  3. struts2里面默认拦截器位置
  4. 拦截器什么时候执行?
    1. 在Action创建之后和Action里面的Method执行之前执行。
        

拦截器底层原理

  1. aop思想
    1. 面向切面编程。
      1. 有一个最基本的功能,要扩展功能,不通过修改代码来实现功能
  2. 责任链模式
    1. 责任链模式是其中的一种设计模式    
    2. 类似于过滤链
      1. 什么叫过滤连?一个请求可以有多个过滤器进行过滤,每个过滤器放行后才可以进行下一步过滤(或内容)
  3. aop和责任链模式是如何在struts里面应用的?
    1. 拦截器在action对象创建之后,方法执行之前。
    2. 执行的过程使用了aop的思想,在action中并没有拦截器的方法,使用了配置文件的方式进行操作
    3. 在执行拦截器的时候,要执行了很多个拦截器,这个过程中使用的责任链模式。

过滤器与拦截器的区别(Filters と Interceptors)

  1. 过滤器:理论上可以过滤任何内容
  2. 拦截器:只能拦截Action

自定义拦截器[A]

  1. 集成类或者接口
    1. abstract class AbstractInterceptor
    2. interface Interceptor
  2. 实现接口中的方法
    1.  void init()
    2.  void destroy()
    3.   String intercept(ActionInvocation invocation)

Customized Interceptor[B]

建议使用以下方式:
    写一个类,使其继承MethodFilterInterceptor类实现
    ** 可以让action里面的某个方法不进行拦截

The Relationship between Action & Interceptors

Instead of Invoking interceptor‘s method in action,  they could be related by modifying corresponded configuration files.
 

7,170 total views, 22 views today

发表评论

电子邮件地址不会被公开。 必填项已用*标注