Struts2

来源:互联网 发布:剑灵灵女捏脸数据下载 编辑:程序博客网 时间:2024/06/06 02:28

概述

  • struts2(and springMVC)框架应用javaee三层结构中的web层框架
  • struts2框架是struts1和webwork基础之上发展起来的全新框架
  • struts2解决的问题和Baseservlet作用类似。

对struts的理解

  • struts是一个按MVC模式设计的Web层框架,其实它就是一个Servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。我们可以在web.xml文件中将符合某种特征的所有请求交给这个Servlet处理,这个Servlet再参照一个配置文件将各个请求分别分配给不同的action去处理。
    (struts的配置文件可以有多个,可以按模块配置各自的配置文件,这样可以防止配置文件的过度膨胀)
  • ActionServlet把请求交给action去处理之前,会将请求参数封装成一个formbean对象(就是一个java类,这个类中的每个属性对应一个请求参数),
  • ActionServlet把formbean对象传递给action的execute方法之前,可能会调用formbean的validate方法进行校验,只有校验通过后才将这个formbean对象传递给action的execute方法,否则,它将返回一个错误页面,这个错误页面由input属性指定。
  • action执行完后要返回显示的结果视图,这个结果视图是用一个ActionForward对象来表示的,actionForward对象通过struts-config.xml配置文件中的配置关联到某个jsp页面,因为程序中使用的是在struts-config.xml配置文件为jsp页面设置的逻辑名,这样可以实现action程序代码与返回的jsp页面名称的解耦。

学习步骤

导jar包

  • commons-fileupload-1.2.2.jar 【文件上传相关包】
    commons-io-2.0.1.jar
    struts2-core-2.3.4.1.jar 【struts2核心功能包】
    xwork-core-2.3.4.1.jar 【Xwork核心包】
    ognl-3.0.5.jar 【Ognl表达式功能支持表】
    commons-lang3-3.1.jar 【struts对java.lang包的扩展】
    freemarker-2.3.19.jar 【struts的标签模板库jar文件】
    javassist-3.11.0.GA.jar 【struts对字节码的处理相关jar】

创建类

  • 类名为Action(类似与Servlet)默认调用方法为execute(类似与service方法)

配置访问路径(两个)

  • 这个配置文件的位置和名称都是固定的(src下 :struts.xml)
(核心配置文件1)struts.xml的配置:<?xml version="1.0" encoding="UTF-8"?>       <!--引入DTD约束--> <!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"    "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>      <!--设置编码--> <constant name="struts.i18n.encoding" value="utf-8">           </constant>      <!--类似与代码包,name值用于区分Action,不重复即可。extends让其拥有action的功能-->   <package name="hellodemo" extends="struts-default" namespace="/"><!--如果多个Action,方法里面的返回值相同,到达的页面也是相同的,这个时候可以使用全局结果配置-->       <global-results>            <result name="ok" >index.jsp</result>       </global-results>      <!--namespace+name访问路径 method默认为execute-->       <action name="Hello" class="action.HelloAction" method="">      <!--根据name返回值,转到不同的路径中去,type来决定怎样到页面去(默认为转发)-->  <result name="ok"  type="">/index.jsp</result>      </action></package></struts>
(配置文件2)web.xml中的配置:<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> 
  • result type属性

运行过程

>

action的编写方式(3种)

  • 创建普通类,不实现任何的接口,也不继承任何类
  • 创建类,实现Action接口
  • 创建类,继承ActionSupport类

线程安全

  • 在一个进程中有多个线程并发执行,每个线程执行过程过程中,变量值是相同的,执行结果也是相同的
    *Servlet中有不安全的因素,Struts2是线程安全的,因为他每次被访问都会产生一个新的对象

访问action的方法(3种)

  • 使用action标签里的method属性,在这个属性里面写执行的action方法
  • 使用通配符实现
<package name="hellodemo" extends="struts-default" namespace="/"><action name="book_*" class="action.HelloAction" method="{1}">  <result name="ok" >index.jsp</result></action></package>
  • 动态访问实现(了解)

常量配置

获取表单数据

  • 表单提交数据的后缀(.action)应与web.xml配置文件中过滤器的过滤条件一样(即必须要经过过滤器)
  • 在action类中定义属性的话,要和表单页面属性的name值相同,并生成set get方法,框架会自动获取到表单中的值,并且在jsp中可以直接获取到(${name} )

Struts2的主要api简介

ActionContext类



ActionContext context=ActionContext.getContext();Map<String ,Object> map=context.getParameters();Set<String > keys=map.KeySet();for(Stirng set: keys){Object[] obj=(Object [])map.getKey(set);System.out.println(Arrays.toString(obj);}


#ServletActionContext类(常用)

这里写图片描述

使用接口注入(不常用)

struts2封装表单数据的方式

属性封装

  • 直接把表单提交属性封装到Action的属性里面。
  • 实现步骤:
    • 在action成员变量位置定义变量 (变量名称和表单输入项的name属性值一样)
    • 生成变量的set方法
    • 生成实体类对象,把action中的属性赋值到实体类中

模型驱动封装(最简便最常用)

  • 实现步骤
    • 让action实现ModelDriven接口
    • 实现接口里的方法getModel()
    • 在action中创建实体类的对象

表达式封装

  • 步骤
    • 在action中声明实体类
    • 生成实体类变量的set get方法
    • 在表单输入项的name属性值里面写表达式形式。

表达式封装与模型驱动封装地区别

  • 他们两个都可以把数据封装到实体类中去
  • 模型驱动只能把数据放到一个实体类中去
  • 表达式封装可以把数据封装到不同的实体类中去

struts2可以把数据封装到list,map集合中

  • 在action中声明list/map对象
  • 生成list/map变量的set get方法
  • 在表单输入项里写表达式

OGNL

使用OGNL

在Struts2中使用ognl

>* EL表达式是在jsp中获取域对象里面的值>* ognl经常在struts2中与struts2标签一起使用操作值栈数据,但它是单独的一部分,可以独自使用(使用它需要导入jar包)>* 在jsp中使用时,需要引入标签库:使用://引入标签库<%@  taglib uri="/struts-tags"  prefix="s"%>//value中写ognl表达式<s:property value="'haha'.length()">

  • 使用ognl表达式访问action时可以直接使用。访问actioncontext中的数据时需要加#。

值栈

概述

  • struts2自身提供的一种存储机制,类似与servlet中的域对象。

servlet与action的区别

  • servlet默认是在第一次被访问时创建,且只创建一次。
  • action也是在访问时创建,但是每次访问都会创建一个新的action,创建多次

值栈的存储位置

  • 每次访问action时都会创建一个action对象
  • 每一个action对象里面都有一个值栈对象

获取值栈对象

  • 使用actionContext类里面的方法getValueStack()获取值栈对象。

值栈的内部结构

  • 值栈分为两部分。
    • 第一部分root,结构是list集合(一般操作都是root里面的数据)
    • 第二部分是context,结构map集合。
    • 画图分析值栈

向值栈中存放数据(多种)

  • 第一种 获取值栈对象,调用值栈里面的set方法
  • 第二种 获取值栈对象,调用值栈里面的push方法
  • 在action定义变量,生成变量的get方法(常用)

向值栈中放对象/list集合

  • 第一步:定义对象变量
  • 第二步:生成变量的get方法。
  • 第三步:在执行的方法里面向对象中设置值。

从值栈中获取数据

  • 使用struts2标签+ognl表达式获取值栈数据。
从值栈中获取对象:<s:property value="user.username"><s:property value="user.password"><s:property value="user.address">

从值栈中获取list集合:
这里写图片描述
这里写图片描述
这里写图片描述

  • 从值栈中获取set或push方法放入的值
set放在值栈中的值//value中直接写存数据时的名字即可<s:property value="username"/>取push放在值栈中的值<s:property value="[0].top"/>

细节

  • ognl 中# ,%使用
    • 使用#号获取context里面数据。
      这里写图片描述
    • %的使用
      在struts标签中表单标签
      1)在Struts2标签里面使用ognl表达式,如果直接在Struts2表单标签里面使用ognl表达式不识别,只有%之后才会识别
<s:textfield name="username" value="%{#request.reg}"></s:textfield>

拦截器

概述:

  • Struts2里面封装的功能都是在拦截器里面。
  • Struts2 里面封装了很多的功能,有很多拦截器,不是每次这些拦截器都执行,每次执行默认的拦截器。
  • 默认拦截器的位置在核心包下的配置文件中。
  • 拦截器在action对象创建之后,action的方法执行之前执行

拦截器的底层原理

  • 拦截器底层使用两种原理。
    • aop思想
      aop是面向切面(方面)编程:不通过修改源码方式来扩张功能
    • 责任链模式
      责任链和过滤链模式很相似(一个条件可以有很多过滤器进行过滤,但过滤器只有放行才能到达下一个过滤链)
  • aop思想和责任链模式如何应用到拦截器里面。
    • 在action方法执行之前执行默认拦截器,执行过程使用aop思想,在action中没有直接调用拦截器的方法,使用配置文件方式进行操作。
    • 在执行拦截器时候,执行很多的拦截器,这个过程使用责任链模式。
      画图分析
  • 过滤器与拦截器的区别
    • 过滤器:理论上可以过滤任意内容(jsp servlet html 图片路径)
    • 拦截器: 只能拦截action
    • 拦截器之间采用责任链模式来实现。

自定义拦截器

  • 拦截器的结构
    这里写图片描述
  • 开发中,我们常用的是继承MethodFilterInterceptor类实现
    优点:让action中的某个方法不进行拦截
    这样我们建立的类与action没有关联,必须通过配置文件是他们之间建立联系。
    这里写图片描述
  • 配置的拦截器对action中所有的方法进行拦截,但是我们需要有一个方法不进行拦截,因此我们可以进行再次的配置:

文件上传

  • action中重点代码:
    private File file;
    private String fileFileName
    private String fileContentType
  • 生成set get方法,然后写上传方法upload
  • 配置上传到的路径(Struts.xml中Struts标签里面),文件的最大上传大小必须大于等于maximumSize
  • 当上传的文件大小大于默认上传最大值时(2M)必须,引用文件上传拦截器,设置属性最大文件上传大小

文件下载



* 在Struts中下载
* action

Struts2标签库

常用标签

  • s:property : 和ognl表达式在jsp页面中获取值栈数据
  • s:iterator : 获取值栈list集合数据,表示list集合。
  • s:debug : 查看值栈结构和数据

Struts2表单标签

这里写图片描述

Struts2标签实例:

这里写图片描述

这里写图片描述

原创粉丝点击