zoukankan      html  css  js  c++  java
  • 三大框架 之 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,配置页面跳转

    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的拦截器

    值栈

    什么是值栈

    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(域对象的数据),就是因为内部有值栈的引用

  • 相关阅读:
    OpenStack--Rabbitmq组件消息队列
    Redis-主从
    haproxy mycat mysql 读写分离MHA高可用
    mysql小白系列_14 线上故障分析与排错
    mysql小白系列_13 Online DDL
    mysql小白系列_12 sysbench
    mysql小白系列_11 MHA补充
    mysql小白系列_11 MHA
    mysql小白系列_10 mysql主从复制原理
    mysql小白系列_09 mysql性能优化关键点
  • 原文地址:https://www.cnblogs.com/mumuyinxin/p/10738727.html
Copyright © 2011-2022 走看看