struts2框架
详细教程 参考https://www.w3cschool.cn/struts_2/struts_configuration.html
struts2 基于mvc设计模式的web应用程序框架,它不仅仅是struts1 的升级版本,更是一个全新的struts架构。最初,是以webwork框架和struts框架为基础,通过提供增强和改进的struts框架,进而实现简化web技术人员开发工作的目标。不久之后,webwork框架和struts社区联合创造了现在流行的struts2框架。
struts2与struts1.x已经不能再放到一起比较,虽然都是对mvc架构模式的实现,本质却完全不同。struts2的前身是webwork,其实现方式和功能都要优于struts1.x,但是,struts先入为主,很多应用程序都基于struts,其生命力和普及度使得webwork落于下风。随着新思想和新架构的不断涌入,特别是web2.0被大量提及,struts1.x显然无法跟上日新月异的变化,在很多应用上显得力不从心,最终催生了struts2.0。可以说struts2.0是为变而变。
-----------------------------------------------------------------------------------------------------------------
struts2的新特征
如果读者熟悉struts1.x,会发现struts2比struts1.x有了巨大的变化:
action 类:
• struts1要求action类继承一个抽象基类。struts1的一个普遍问题是使用抽象类编程而不是接口。
• struts 2 action类可以实现一个action接口,也可实现其他接口,使可选和定制的服务成为可能。struts2提供一个actionsupport基类去实现常用的接口。action接口不是必须的,任何有execute标识的pojo对象都可以用作struts2的action对象。
线程模式:
• struts1 action是单例模式并且必须是线程安全的,因为仅有action的一个实例来处理所有的请求。单例策略限制了struts1 action能作的事,并且要在开发时特别小心。action资源必须是线程安全的或同步的。
• struts2 action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
servlet 依赖:
• struts1 action 依赖于servlet api ,因为当一个action被调用时httpservletrequest 和 httpservletresponse 被传递给execute方法。
• struts 2 action不依赖于容器,允许action脱离容器单独被测试。如果需要,struts2 action仍然可以访问初始的request和response。但是,其他的元素减少或者消除了直接访问httpservetrequest 和 httpservletresponse的必要性。
可测性:
• 测试struts1 action的一个主要问题是execute方法暴露了servlet api(这使得测试要依赖于容器)。一个第三方扩展--struts testcase--提供了一套struts1的模拟对象(来进行测试)。
• struts 2 action可以通过初始化、设置属性、调用方法来测试,“依赖注入”支持也使测试更容易。
捕获输入:
• struts1 使用actionform对象捕获输入。所有的actionform必须继承一个基类。因为其他javabean不能用作actionform,开发者经常创建多余的类捕获输入。动态bean(dynabeans)可以作为创建传统actionform的选择,但是,开发者可能是在重新描述(创建)已经存在的javabean(仍然会导致有冗余的javabean)。
• struts 2直接使用action属性作为输入属性,消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。action属性能够通过web页面上的taglibs访问。struts2也支持actionform模式。rich对象类型,包括业务对象,能够用作输入/输出对象。这种modeldriven 特性简化了taglib对pojo输入对象的引用。
表达式语言:
• struts1 整合了jstl,因此使用jstl el。这种el有基本对象图遍历,但是对集合和索引属性的支持很弱。
• struts2可以使用jstl,但是也支持一个更强大和灵活的表达式语言--"object graph notation language" (ognl).
绑定值到页面(view):
• struts 1使用标准jsp机制把对象绑定到页面中来访问。
• struts 2 使用 "valuestack"技术,使taglib能够访问值而不需要把你的页面(view)和对象绑定起来。valuestack策略允许通过一系列名称相同但类型不同的属性重用页面(view)。
类型转换:
• struts 1 actionform 属性通常都是string类型。struts1使用commons-beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。
• struts2 使用ognl进行类型转换。提供基本和常用对象的转换器。
校验:
• struts 1支持在actionform的validate方法中手动校验,或者通过commons validator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。
• struts2支持通过validate方法和xwork校验框架来进行校验。xwork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性
action执行的控制:
• struts1支持每一个模块有单独的request processors(生命周期),但是模块中的所有action必须共享相同的生命周期。
• struts2支持通过拦截器堆栈(interceptor stacks)为每一个action创建不同的生命周期。堆栈能够根据需要和不同的action一起使用。
注:以上资料从网上搜集,来源:struts开发组,翻译:tianxinet(胖猴)。
-----------------------------------------------------------------------------------------------------------------------------------------------------
搭建struts2开发环境
servlet api 2.4
jsp api 2.0
java 5
需要提醒的是,在struts中会用到annotation,所以请将jdk版本升级到1.5以上.
1. struts2下载,struts-2.1.0-all.zip 包含struts2项目所用的jar包
2.新建web工程,导入包(13个),创建action.java、配置文件struts.xml、web.xml。
3.核心配置文件struts.xml :
- package标签,为action或截拦器分组,在package里面才能配置action。
- name属性
- name属性值根功能本身没有关系的,
- 在一个配置文件中可以写多个package标签,name属性值不能相同的 - extends属性 extends="struts-default"
- 属性值固定的,struts-default
- 写了这个属性之后,在package里面配置的类具有action功能 - namespaces属性
-namespace属性值和action标签里面的name属性值构成访问路径
- action标签
- name属性
- namespace属性值和action标签里面的name属性值构成访问路径
- 在package标签里面写多个action标签,但是action的name属性值不能相同的 - class属性
- action全路径 - method属性
- 比如在action里面默认执行的方法execute方法,但是在action里面写其他的方法
- 让action里面多个方法执行,使用method进行配置
- result标签,根据action的方法返回值,配置到不同的路径里面
- name属性
和方法返回值一样 - type属性
配置如何到路径中(转发或者重定向)
type属性默认值 做转发操作
1 <?xml version="1.0" encoding="utf-8"?> 2 <!doctype struts public 3 "-//apache software foundation//dtd struts configuration 2.5//en" 4 "http://struts.apache.org/dtds/struts-2.5.dtd"> 5 6 <struts> 7 <package name="struts2" extends="struts-default" namespace="/"> 8 <action name="login" class="action.loginaction"> 9 <result name="success">/loginsuccess.jsp</result> 10 <result name="fail">/loginfail.jsp</result> 11 </action> 12 </package> 13 </struts>
4.web.xml, 作用整个项目的全局,设置filter过滤器,捕获器,以及映射标签
将struts2所带的过滤器org.apache.struts2.dispatcher.filterdispatcher配置到工程的web.xml文件中,默认情况下,该过滤器拦截请求字符串中以.action结尾的请求,并将该请求委托给指定的action进行处理。最直观的表现就是调用action的execute()方法。注:在sturts1.x中,该行为由servlet完成。
1 <?xml version="1.0" encoding="utf-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" 5 xsi:schemalocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 <display-name></display-name> 8 9 <filter> 10 <filter-name>struts2</filter-name> 11 <filter-class>org.apache.struts2.dispatcher.filter.strutsprepareandexecutefilter</filter-class> 12 </filter> 13 <filter-mapping> 14 <filter-name>struts2</filter-name> 15 <url-pattern>/*</url-pattern> 16 </filter-mapping> 17 18 <welcome-file-list> 19 <welcome-file>login.jsp</welcome-file> 20 </welcome-file-list> 21 </web-app>
5.action.java类
execute():该方法一般会被重写,当客户端向action发送请求时,会调用此方法。
1 package action; 2 3 4 public class loginaction{ 5 private string account; 6 private string password; 7 public string getaccount() { 8 return account; 9 } 10 public void setaccount(string account) { 11 this.account = account; 12 } 13 public string getpassword() { 14 return password; 15 } 16 public void setpassword(string password) { 17 this.password = password; 18 } 19 20 public string execute()throws exception{ 21 if(account.equals(password)){ 22 return "success"; 23 } 24 return "fail"; 25 } 26 }
strut2的体系结构如图所示:
从图可以看出,一个请求在struts2框架中的处理大概分为以下几个步骤:
1、客户端初始化一个指向servlet容器(例如tomcat)的请求;
2、这个请求经过一系列的过滤器(filter)(这些过滤器中有一个叫做actioncontextcleanup的可选过滤器,这个过滤器对于struts2和其他框架的集成很有帮助,例如:sitemesh plugin);
3、接着filterdispatcher被调用,filterdispatcher询问actionmapper来决定这个请求是否需要调用某个action;
4、如果actionmapper决定需要调用某个action,filterdispatcher把请求的处理交给actionproxy;
5、actionproxy通过configuration manager询问框架的配置文件,找到需要调用的action类;
6、actionproxy创建一个actioninvocation的实例。
7、actioninvocation实例使用命名模式来调用,在调用action的过程前后,涉及到相关拦截器(intercepter)的调用。
8、一旦action执行完毕,actioninvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个action链)一个需要被表示的jsp或者freemarker的模版。在表示的过程中可以使用struts2 框架中继承的标签。在这个过程中需要涉及到actionmapper。
注:以上步骤参考至网上。在此表示感谢!
https://www.cnblogs.com/duanxz/p/3158488.html
上一篇: 每天一个Linux命令(9):cp命令
推荐阅读
-
从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之十一Swagger使用一
-
基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作
-
基于微信开发框架进行业务开发的处理过程
-
react移动端ui框架哪个好(react优秀项目案例)
-
Afianl框架里面的FinalBitmap加载网络图片
-
对angularjs框架下controller间的传值方法详解
-
h5开发app用什么框架(h5开发app框架讲解)
-
单点登录框架有哪些(单点登录失败解决措施)
-
struts2中一个表单中提交多个请求的例子(多个提交按钮)
-
Codeigniter框架实现获取分页数据和总条数的方法