三大框架 之 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执行流程
- 浏览器发送请求至过滤器
- 前端核心控制器里有很多拦截器
- 加载核心配置文件,寻找对应action里的class
- 执行execute方法
- 根据返回值跳转页面
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(域对象的数据),就是因为内部有值栈的引用
三大框架 之 Struts2的更多相关文章
- Java_Web三大框架之Struts2
今天正式接触Java_Web三大框架之Struts2框架.对于初学者来说,先来了解什么是框架技术: 一.“框架技术”帮我们更快更好地构建程序: 1.是一个应用程序的半成品 2.提供可重用的公共结构 3 ...
- 三大框架SSH(struts2+spring+hibernate)整合时相关配置文件的模板
最近在学SSH三大框架的整合,在此对他们整合时相关配置文件做一简单的模板总结,方便以后复用! 首先是web.xml配置文件,这里面就配置一些简单的监听器.过滤器,包括spring核心配置文件appli ...
- java三大框架SSH(Struts2 Spring Hibernate)
http://www.cnblogs.com/qiuzhongyang/p/3874149.html
- 框架: Struts2 讲解 1
一.框架概述 1.框架的意义与作用: 所谓框架,就是把一些繁琐的重复性代码封装起来,使程序员在编码中把更多的经历放到业务需求的分析和理解上面. 特点:封装了很多细节,程序员在使用的时候会非常简单. 2 ...
- java 的 struts2 Spring Hibernate 三大框架的整合
原理就不说了,直接上配置文件及代码,用来备用 首先,将三大框架所需要的jar包导入项目中 导入 struts2-spring-plugin-2.3.3.jar包 此包的作用是作为struts2 与 ...
- Struts2+Spring+Hibernate 三大框架的合并集成
这次来看看Struts2+Spring+Hibernate三大框架的整合应用,主要是Spring和Hibernate框架的整合,因为前边已经将Strtus2+Spring整合过了基本一样. 首先看一 ...
- struts2.1.8+hibernate2.5.6+spring3.0(ssh2三大框架)常见异常原因和解决方案
---------------------------------------------------------------------------------------------------- ...
- 最新版本的Struts2+Spring4+Hibernate4三大框架整合(截止2014-10-15,提供源码下载)
一. 项目名称:S2316S411H436 项目原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6 + Quartz2.2.1 源代码下载地址: 基本版:ht ...
- (转)hibernate-5.0.7+struts-2.3.24+spring-4.2.4三大框架整合
http://blog.csdn.net/yerenyuan_pku/article/details/70040220 SSH框架整合思想 三大框架应用在JavaEE三层结构,每一层都用到了不同的框架 ...
随机推荐
- Unity3D如何接入第三方的SDK - iOS篇
来源:http://blog.csdn.net/smlisi2/article/details/8786485 授人以鱼,不如授人以渔”,以UNITY3D调用iOS版的91SDK为例,利用C# / C ...
- CRM, C4C和SAP Hybris的数据库层设计
SAP的product都是DB provider无关的. CRM大家都很熟悉了,application developer最多用Open SQL直接操作表. Netweaver里支持的DB provi ...
- HDFS-SecondaryNameNode(SNN)角色介绍
它出现在Hadoop1.x版本中,又称辅助NameNode,在Hadoop2.x以后的版本中此角色消失.如果充当datanode节点的一台机器宕机或者损害,其数据不会丢失,因为备份数据还存在于其他的d ...
- ViewBag---MVC3中 ViewBag、ViewData和TempData的使用和差别-------与ViewBag+Hashtable应用例子
ViewBag 在MVC3開始.视图数据能够通过ViewBag属性訪问.在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),Vi ...
- Oracle Drop Table
DROP TABLE 使用DROP TABLE语句将表或对象表移动到回收站或从数据库中完全删除表及其所有数据. 注:除非指定purge子句,否则drop table语句不会将表占用的空间释放回表空间供 ...
- XML DOM 知识点
第一部分[DOM基础] DOM介绍: 1.什么是 HTML DOM? HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法(接口). 2.什么是 XML DOM? XML DO ...
- Redis一主二从Sentinel监控配置
本文基于Redis单实例安装安装.https://gper.club/articles/7e7e7f7ff7g5egc4g6b 开启哨兵模式,至少需要3个Sentinel实例(奇数个,否则无法选举Le ...
- 智能驾驶数据后处理分析利器—INTEWORK-VDA
随着智能驾驶技术在新车上逐步普及,车辆研发阶段需要做大量的实车测试工作,当前的测试方式主要是路采实车数据后,按标准和法规进行测试场景提取和测试数据分析.调查显示绝大部分智能驾驶研发厂商 ...
- 《BUG创造队》作业9:【Beta】冲刺 Scrum meeting 3
项目 内容 这个作业属于哪个课程 2016级软件工程 这个作业的要求在哪里 实验十三 团队作业9:Beta冲刺与团队项目验收 团队名称 BUG创造队 作业学习目标 (1)掌握软件黑盒测试技术:(2)学 ...
- (一)WCF基础
我们近期在做项目的时候用到了WCF,之前已经看了部分视频,对于WCF有了一定的了解,但仅限于能够根据搭建好的框架使用WCF,还不了解.所以就进行了研究,这样既有实践也能增加理论,二者结合,使用起来更胜 ...