三大框架 之 Struts2

Struts2

Struts2简介

Struts2框架的作用

  • Struts2是一个基于MVC设计模式的Web应用框架
  • 它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,
  • 是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。
  • Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以可以将Struts 2理解为WebWork的更新产品。

常见web层的框架

  • Struts2
  • Struts1
  • Webwork
  • SpringMVC

web框架特点

基本前端控制器模型来设计

  • 浏览器发送的所有的请求,都需要经过前端控制器
  • 前端控制器再根据具体的请求所要实现 的功能,分发到不同的action来处理
  • 所有的分发操作都是框架自动帮你完成的
  • 我们只需要关心数据怎么样处理,封装、接收这些都不用管
  • 其余的操作都是前端控制器来帮你完成

前端控制器

  • 所有的请求都要处理
  • 是通过过滤器来实现的
  • 过滤器当中会有接收数据,封装数据,把所有的东西都帮你处理好,最后到action当中就可以直接使用了

Struts2基本使用

1.下载strusts框架
https://struts.apache.org/
2.目录结构

apps
    Struts2提供的应用,war文件:web项目打成war包。直接放入到tomcat可以运行
    里面就是一个最简单的一个项目,有strust2所需要的jar包
docs
    Struts2的开发文档和API
lib
    Strtus2框架的开发的jar包
src
    Struts2的源码

3.创建一个web工程
4.引入jar包
5.在工程当中创建一个jsp
在jsp当中写上一个连接,发送一个请求

6.编写Action类
在src当中创建一个普通的类
在类当中提供一个方法,方法名称是固定的
public String execute(){ }
底层会使用反射执行此方法

public String execute(){
    System.out.println("我已经接收到了请求");
    return null;
}

7.创建Struts配置文件
在src当中创建一个配置文件strust.xml
此文件可以在blank项目的classes目录下找到
8.配置Struts.xml

9.配置前端控制器

  • 没有前端控制器,就没有办法执行action
  • 因为Stusts这些功能都是有前端控制器来给我们提供的
  • 它是有一个过滤器来实现的
  • 所以要去配置一个过滤器

  • 到web.xml当中配置核心过滤器

配置完运行,即可执行到创建的MyAction类中的excute方法
10.在Action当中excute中返回一个Success

11.改写strust.xml,配置页面跳转

扫描二维码关注公众号,回复: 5948882 查看本文章

Struts2执行流程

  1. 浏览器发送请求至过滤器
  2. 前端核心控制器里有很多拦截器
  3. 加载核心配置文件,寻找对应action里的class
  4. 执行execute方法
  5. 根据返回值跳转页面

Struts2配置

struts2的加载顺序

在struts2当中可以有很多地方可以配置常量
配置的常量,哪一个地方生效,就跟加载顺序有关

配置文件加载顺序

init_DefaultProperties()
加载default.properties

init_TraditionalXmlConfigurations();
加载struts-default.xml、struts-plugin.xml、struts.xml

init_LegacyStrutsProperties();
加载struts.properties

init_CustomConfigurationProviders();
加载配置提供类

init_FilterInitParameters() ;
加载web.xml中过滤器初始化参数

init_AliasStandardObjects() ;
加载Bean对象

配置文件加载顺序

  • default.properties
  • struts-default.xml
  • struts-plugin.xml
  • struts.xml
  • struts.properties
  • web.xml
  • 后配置的常量的值会覆盖先配置的常量的值

Package

包,这个包与Java中的包的概念不一致。
包为了更好管理action的配置
属性
    name
        包的名称,只有在一个项目中不重名即可。
    extends
        继承哪个包,通常值为struts-default。
        默认我们继承的是Struts-default
        在这个包当中,定义了很多结果类型和很多的拦截器,继承了这些东西之后,action才有了这些功能
    namespace
        namespace+name共同决定了访问路径
        名称空间有三种写法
            带名称的名称空间
                namespace=”/aaa”
            根名称空间
                namespance=”/”
            默认名称空间
                namespace=””
    abstract
        抽象的,用于其他包的继承
        现在这个包想被别人继承,设置abstract值为true
        设置成abstract后就不能用自己运行了

action

配置Action类。
属性
    name
        与namespace共同决定访问路径
    class   
        Action类的全路径
    method
        执行Action中的哪个方法的方法名,默认值execute
    converter
        用来自定义类型转换器,一般不设置,内部提供的转换器已经够用

常量配置

在Struts2的框架中,提供了非常多的常量
    在default.properties
struts.i18n.encoding=UTF-8
    Struts2中所有的post请求的中文乱码不用处理。
struts.action.extension=action,,
    Struts2请求的默认的扩展名。默认扩展名是.action或者什么都不写。

在Struts2中修改一些常量的值

在default.properties当中的值是不允许直接修改的
修改常量的值,可以有三个位置进行修正
    struts.xml中进行修改,通过<constant>标签

struts.properties中进行修改,自己新建的, 只能修改常量,基本不使用

web.xml中进行修改,通过过滤器的初始化参数来修改常量 

后面的会覆盖前面的内容

include

  • 在一个配置文件当中引入其它的配置文件

  • 以后做团队开发时,很多人都需要去修改配置文件

  • 防止被改乱,可以单独的创建一个配置文件

  • 在主配置文件当中引入创建的配置文件

Action执行访问

Action类写法

1.Action类是POJO的类
自己手动实现execute方法
2.Action类实现一个Action的接口
实现接口时,会让你覆盖execute方法
在此接口当中定义了5个常量(逻辑视图)

String SUCCESS = "success";
    成功
String NONE = "none";
    没有跳转
String ERROR = "error";
    失败
String INPUT = "input";
    表单校验时出错
String LOGIN = "login";
    登录出错页面跳转

3.Action类继承ActionSupport类(推荐使用此方式)

Actionsupport当中提供了很多功能,数据校验,国际化等一系列操作方法

Action方法

Method访问

使用方法

public String add(){
    System.out.println("添加");
    return null;
}
public String delete(){
    System.out.println("删除");
    return null;
}
public String update(){
    System.out.println("修改");
    return null;
}
public String find(){
    System.out.println("查找");
    return null;
}
弊端
要写多个action标签

通配符

要求
访问路径当中要包含执行的方法
使用通配符调用方法时,内部会验证是否允许访问该方法,所以要在Action中加上
<allowed-methods>delete,update,insert,select</allowed-methods>
goods_*        method="{1}"    其中1为第一个*的内容
*_*    class="com.myxq.struts.{1}"  method={2}
使用方法

动态方法访问

要求
  • 默认是关闭状态,要想使用的话,必须得要通过修改常量来打开

  • 使用通配符调用方法时,内部会验证是否允许访问该方法,所以要在Action中加上

<allowed-methods>delete,update,insert,select</allowed-methods>
使用方法

ServletAPI

Struts中API介绍

  • 在使用Struts2的框架的过程中,发现Struts2和Servlet的API是解耦合的。
  • 在实际开发中,经常使用到Servlet的API。
  • 比如进行登录,将用户的信息保存到Session中,有的时候需要向页面输出一些内容,用到response对象。
  • 涉及到Servlet的API的访问。

如何获得到servlet中的API

完全解耦合的方式

使用ActionContext来进行获取
注意
​ 此方法只能从域中取数据和保存数据
​ 不能获取其它的方法
使用步骤

示例表单

<form >
    用户名:<input type="text" placeholder="请输入用户名..." name="username"><br/>
    昵称:<input type="text" placeholder="请输入用户名..." name="nick"><br/>
    爱  好: <input type="checkbox" value="足球" name="hobby">足球
            <input type="checkbox" value="篮球" name="hobby">篮球
            <input type="checkbox" value="乒乓球" name="hobby">乒乓球<br/>
    <input type="submit" value="提交">
</form>
使用Servlet的API的原生方式

servletActionContext
这种方式可以操作域对象的数据,同时也可以获得对象的方法。
使用步骤

接口注入的方式

让Action实现一些接口,让接口提供的一些方法,设置一些具体的值
使用步骤

结果页配置

全局配置

全局结果页面

​ 全局结果页面指的是,在包中配置一次,其他的在这个包中的所有的action只要返回了这个值,都可以跳转到这个页面。

使用场景
​ 有些功能需要用户登录才能使用,只要没有登录,就让它返回到登录页面,很多地方都要返回到登录,所以可以把登录页做为一个全局的

使用方法

局部配置

局部结果页面

​ 局部结果页面指的是,只能在当前的action中的配置有效

使用方法

注意点
​ 全局和局部名称相同时,会优先找局部

接收参数

当发送一个请求时,除了使用requestApi来接收参数之外,Struts2内部提供了3种 接收参数的方式

接收参数的方式

1.提供属性set方法的方式
在Action当中提供对应属性的set方法,会自动接收参数,并且会自动做类型转换
使用方式

缺点
​ 接收少量数据可以,如果大量数据,还得要自己手动封装成对象
2.页面中提供表达式方式

  • 创建一个接收参数的domain模型
  • 在Action当中提供一个对象属性,并要提供该对象属性的get/set方法
  • 在jsp页面当中发送参数时要带上Action当中的对象属性名称

使用方式

3.采用模型驱动方式

  • 创建一个接收参数的domain模型
  • 在Action当中实现ModelDriven 接口
  • 实现接口方法getModel()
  • 创建一个模型对象,在接口方法中返回

使用方式

接收参数错误

  • 只要任何一个拦截器在执行的过程当中,都可以向错误信息中添加错误消息。
  • 最后workflow会检查错误信息当中是否有错误的消息
  • 如果没有,就直接到目标action
  • 如果有,就会跳转到input逻辑视图

在开发时,可以配置一个input逻辑视图,错误时,可以在跳转到自己指定的页面, 在页面中可以显示错误信息

接收复杂类型封装到List集合

  • 创建jsp页面

  • 创建页面对象模型

  • 创建对应Action

  • 在jsp当中添加表达式

接收复杂类型封装到Map集合

key值为自己取的一个值

Struts2的拦截器

Struts2的拦截器

值栈

什么是值栈

ValueStack实际上就是一个**容器**。
是一个接口,实现类为OgnlValueStack
当用户每次访问action对象的业务方法时, 会先创建ActionContext对象
、OgnlValueStack对象、Action对象
它由Struts框架创建,当前端页面如jsp发送一个请求时,
Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。
Struts框架中的数据就都保存到了ValueStack中,不存到域当中了
    存到域当中只能在页面中把它取出来
    存到值栈当中可以在任何地方取出数据
        页面中取出
        action中取出
        在配置文件当中取出
ValueStack贯穿整个action的生命周期
action一旦创建,就会创建一个valuestack对象

值栈的内部结构

值栈与ActionContext的关系

可以通过ActionContext获得到值栈

ActionContext上下文对象

  • 当请求过来的时候,执行StrutsPrepareAndExecuteFilter过滤器当中的doFilter方法
  • 在这个方法当中创建ActionContext
  • 在创建ActionContext过程中,创建ValueStack对象
  • 将valueStack对象传递给ActionContext对象。
  • 通过ActionContext获取值栈对象
  • ActionContext对象之所以以够访问servlet的API(域对象的数据),就是因为内部有值栈的引用

猜你喜欢

转载自www.cnblogs.com/mumuyinxin/p/10738727.html