Struts2

概述

  • struts2框架应用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页面名称的解耦。

学习步骤

创建类

  • 类名为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>
  • 动态访问实现(了解)
  1. 常量配置

获取表单数据

  • 表单提交数据的后缀(.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标签实例:

这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值