Struts入门

来源:互联网 发布:java 函数缺省参数 编辑:程序博客网 时间:2024/06/11 19:13

Struts

使用方式

  1. 编写Action,有三种方法:实现Action接口,继承ActionSupport类,普通类
  2. 配置文件:src下配置struts.xml(package标签,action标签,result标签)
  3. web.xml中配置过滤器
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>    <package name="demo" extends="struts-default" namespace="/">        //声明拦截器        <interceptors>            <interceptor name="loginintercept" class="自定义拦截器包类路径">            </interceptor>        </interceptors>        <action name="访问路径_*" class="action类包类路径" method="{1}">            //使用自定义的拦截器            <interceptor-ref name="loginintercept">                /*配置让action里面哪个方法不进行拦截                 param标签的name属性值 固定的:excludeMethods                在param标签里面,不进行拦截的方法名称                 */                <param name="excludeMethods">不拦截的方法名</param>            </interceptor-ref>//使用自定义的拦截器特点:struts2默认拦截器不会执行了需要把默认的拦截器手动使用一次             <interceptor-ref name="defaultStack"></interceptor-ref>            <result name="list">/jsp/customer/list.jsp</result>        </action>    </package></struts>   

拦截器

  1. 底层原理主要两部分
    (1)aop思想:面向切面(方面)编程
    在开发中,有基本功能,扩展基本功能,使用aop思想,不修改源代码扩展功能
    (2)责任链模式: 类似于过滤链
    过滤链:一个请求,可以有多个过滤器进行过滤,每个过滤器只有做放行,才能到下一个过滤器
  2. 拦截器在action对象创建之后,action里面的方法执行之前执行

使用方式
1)自定义拦截器实现
第一种 创建类,继承AbstractInterceptor
第二种 创建类,继承 MethodFilterInterceptor(常用)
2)struts.xml中声明拦截器
3)在具体使用拦截器的action标签里面使用声明拦截器
4)使用自定义拦截器之后,默认的拦截器不执行了,手动把默认的拦截器使用一次
5)通过配置方式,让action里面哪些方法不进行拦截

    // web.xml中配置struts2过滤器    <filter>        <filter-name>struts2</filter-name>            <filter-class>                org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter            </filter-class>    </filter>    <filter-mapping>        <filter-name>struts2</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>

执行流程

当我们发出一次请求的时后,会先经过过滤器,然后通过request的方法得到访问路径,拆分字符串就能得到一个值,拿着这个字符串去找struts.xml,使用dom4j解析xml之后,用这个值去和action标签的name属性值比较,如果一样的话就能得到class属性值,这个class属性值就是action类的路径,再利用反射技术加载该类执行里面的方法,然后得到一个返回值,在按着这个返回值去和resullt标签比较,一样就跳转到对相应的页面

获取表单数据

  1. ActionContext类获取:
    该类不能直接new,有静态方法getContext,得到该对象再使用getParameters方法,返回一个map集合
  2. ServletActionContext类获取:
    该类有静态方法能获取到HttpServletRequest,HttpServletresponse,ServleteContext,PageContext对象
  3. 实现接口
    servletRequestAware
    servletResponseAware
    SessionAware
    ServletContextAware

封装数据

  1. 传统封装:
    先用HttpServletRequest获取到值,再创建对象赋值
  2. 属性封装:
    在action类中创建成员变量,名称和页面中输入项的name属性值要一样,然后生成get,set方法
  3. 模型驱动:
    让Action实现ModelDriven接口(泛型为要封装的数据类型),重写getModel方法,创建实体类对象,注意表单输入项的name属性值要和实体类的属性名称一样,getModel方法返回实体类对象
    • 复杂数据的封装
      与属性封装步骤一致,但需要注意表单输入项name的写法
      对象 (页面)object.property
      Map<String,Object> (页面)map['key'].property
      List<Object> (页面)list[0].property

OGNL

ognl表达式:获取值栈里面的数据
使用前提:
必须有ognl的jar包,还要引入struts 的标签库,与struts2的标签结合使用
使用 格式:<s:property value="ognl" />

特殊符号
# 获取到context中得值
%{}表单标签中的ognl表达式能按照原意执行

值栈

值栈:类似于域对象,可以存取值

  • 内部结构
    • root:是一个list集合,我们我操作的数据大多在list中
    • context:是一个map集合,Context里面key名称是固定的,request、session、application、parameters、attr
  • 像值栈中存值有三种方式:
    第一种方式: 获取值栈(ValueStack)对象,调用值栈对象里面的set方法
    第二种方式:获取值栈对象,调用值栈对象里面的push方法
    第三种方式:在action成员变量位置定义变量,生成这个变量的get方法
1 1
原创粉丝点击