三大框架 之 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三层结构,每一层都用到了不同的框架 ...
随机推荐
- 安装License需要重启
"only commands for license handling are allowed in current state" Can you confirm if licen ...
- python多线程爆破压缩包密码
import zipfile from threading import Thread #多线程库 import optparse #选定字典或者文件 def extractFile(zfile,pa ...
- iOS 静态、全局变量、常量
关键字static 两个概念:生命周期.作用域生命周期:这个变量能存活多久,它所占用的内存什么时候分配,什么时候收回.作用域:这个变量在什么区域是可见的,可以拿来用的. static分两种情况:修饰局 ...
- 如何在Hybris commerce里创建一个media对象
进入backoffice的Media中心, 首先新建一个文件夹,用于存放即将创建的media对象: 取名为jerryimage: 然后创建一个新的media对象,取名jerryproductimage ...
- Linux网卡上添加多个IP
1.查看现有网卡ip addr show看到ens_xxx 2.进入网卡配置项cd /etc/sysconfig/network-scripts/vim ifcfg-ens192末尾添加2行:IPAD ...
- MySQL Connection--使用tcpkill杀掉MySQL活跃连接
当MySQL连接被打满,连管理员也无法本地登录时,可以考虑使用tcpkill杀掉一些应用服务器创建的连接. CentOS 6安装tcpkill rpm安装包: libnids-1.24-1.el6.x ...
- Linux磁盘管理——日志文件系统与数据一致性
参考:Linux磁盘管理——Ext2文件系统 数据不一致 上图是Ext2结构图,其他FS结构类似. 一般来说,我们将 inode table 与 data block 称为数据区:至于其他例如 sup ...
- sqlite3入门之sqlite3_get_table,sqlite3_free_table
sqlite3_get_table sqlite3_get_table函数原型: int sqlite3_get_table( sqlite3 *db, /* An open database */ ...
- Spring -10 -<bean>的 scope 属性 -singleton 默认值/prototype 多例 /request /session /application /global session
1.<bean>的属性; 2.作用:控制对象有效范围(单例,多例等)3.<bean/>标签对应的对象默认是单例的. 3.1无论获取多少次,都是同一个对象 Teacher t1 ...
- 神经网络(12)--具体实现:如何对back propagation的正确性进行验证
我们在进行back propagation时难免会出现各种各样的问题,当出现问题的时候,我们的cost function仍然是随着迭代的次数下降的,但是这中间会有一些问题存在,那么我们如何来检查我们的 ...