Struts 2.0的Action讲解
有Struts 1.x经验的朋友都知道Action是Struts的核心内容,当然Struts 2.0也不例外。不过,Struts 1.x与Struts 2.0的Action模型很大的区别。
Struts 1.x Stuts 2.0
接口必须继承org.apache.struts.action.Action或
者其子类
无须继承任何类型或实现任何接口
表单数据表单数据封装在FormBean中
表单数据包含在Action中,通过
Getter和Setter获取
虽然,理论上Struts 2.0的Action无须实现任何接口或继承任何类型,但是,我们为了方便实现Action,大多数情况下都会继承
com.opensymphony.xwork2.ActionSupport类,并重载(Override)此类里的String execute()方法。具体的实现,如例1所示:
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s"uri="/struts-tags"%>
例1 HelloWorld.jsp
package tutorial;
import java.text.DateFormat;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorld extends ActionSupport {
private String message;
public String getMessage() {
return message;
}
@Override
public String execute() {
message ="Hello World, Now is "+DateFormat.getInstance().f ormat(new Date());
return SUCCESS;
}
}
例1 classes/tutorial/HelloWorld.java
例1 classes/struts.xml中HelloWorld Action的配置
在浏览器地址栏中键入
http://localhost:8080/Struts2_Action/HelloWorld.action,可以看到如图1所示页面。
图1 HelloWorld输出页面
参考JavaDoc,可知ActionSupport类实现了接口:
?com.opensymphony.xwork2.Action
?com.opensymphony.xwork2.LoaleProvider
?com.opensymphony.xwork2.TextProvider
?com.opensymphony.xwork2.Validateable
?com.opensymphony.xwork2.ValidationAware
?com.uwyn.rife.continuations.ContinuableObject
?java.io.Searializable
?https://www.doczj.com/doc/e310168548.html,ng.Cloneable
默认情况下,当请求HelloWorld.action发生时,Struts运行时(Runtime)根据struts.xml里的Action映射集(Mapping),实例化tutoiral.HelloWorld类,并调用其execute方法。当然,我们可以通过以下两种方法改变这种默认调用。这个功能(Feature)有点类似Struts 1.x中的LookupDispathAction。
1.在classes/sturts.xml中新建Action,并指明其调用的方法;
2.访问Action时,在Action名后加上“!xxx”(xxx为方法名)。
实现方法请参考例2:
在classes/tutorial/HelloWorld.java中加入以下方法:
public String aliasAction() {
message ="自定义Action调用方法";
return SUCCESS;
}
例2 classes/tutorial/HelloWorld.java代码片段
实现方法一,在classes/sturts.xml中加入下面代码:
例2 classes/struts.xml中AlaisHelloWorld Action的配置
实现方法二,使用
http://localhost:8080/Struts2_Action/HelloWorld!aliasAction.action地址来访问HelloWorld Action。
在浏览器地址栏中键入
http://localhost:8080/Struts2_Action/AliasHelloWorld.action
或http://localhost:8080/Struts2_Action/HelloWorld!aliasAction.action,可以看到如图2所示页面。
图2 自定义Action调用方法页面
通过上面的两个例子,细心的朋友应该可能会发现classes/tutorial/HelloWorld.java 中Action方法(execute和aliasAction)返回都是SUCCESS。这个属性变量我并没有定义,所以大家应该会猜到它在ActionSupport或其父类中定义。没错,SUCCESS 在接口com.opensymphony.xwork2.Action中定义,另外同时定义的还有ERROR, INPUT, LOGIN, NONE。
此外,我在配置Action时都没有为result定义名字(name),所以它们默认都为success。值得一提的是Struts 2.0中的result不仅仅是Struts 1.x中forward的别名,它可以实现除forward外的很激动人心的功能,如将Action输出到FreeMaker 模板、Velocity模板、JasperReports和使用XSL转换等。这些都过result里的type (类型)属性(Attribute)定义的。另外,您还可以自定义result类型。
下面让我们来做一个Velocity模板输出的例子,首先在classes/struts.xml中新建一个Action映射(Mapping),将其result类型设为velocity,如以下代码所示:
例3 classes/struts.xml中VMHelloWorld Action的配置
新建HelloWorld.vm,内容如下所示:
例3 HelloWorld.vm
在浏览器地址栏中键入
http://localhost:8080/Struts2_Action/VMHelloWorld.action ,页面输出如下图3所示。
图3 HelloWorld.vm 的输出页面
要运行例3需要在WEB-INF/lib 中添加以下几个包: ? commons-collections-3.2.jar ? velocity-1.4.jar
? velocity-tools-view-1.2.jar ?
avalon-logkit-2.1.jar
前面,我花了不少的时间讨论Action 的输出。我老板有句名言——程序无非就是输入、操作和输出。因此,现在我们要讨论一下输入——表单输入。
使用Struts 2.0,表单数据的输入将变得非常方便,和普通的POJO 一样在Action 编写Getter 和Setter ,然后在JSP 的
UI 标志的name 与其对应,在提交表单到Action
时,我们就可以取得其值。
让我们看一个例子,新建
Login Action ,它通过Login.jsp 的表单获得用户名和密码,验查用户名是否为
“max”,密码是否则为“secret”。如果,两者都符合,就在HelloWorld 中显示“Welcome, max”
,否则显示“Invalid user or Password”。 package
tutorial;
import com.opensymphony.xwork2.ActionSupport;
publicclass Login extends ActionSupport { private String name; private String password;
private String message;
public String getName() {
return name;
}
publicvoid setName(String name) {
https://www.doczj.com/doc/e310168548.html, = name;
}
public String getPassword() {
return password;
}
publicvoid setPassword(String password) {
this.password = password;
}
public String getMessage() {
return message;
}
@Override
public String execute() {
if("max".equals(name) &&"Secret".equals(password)) {
message ="Welcome, "+ name;
}else{
message ="Invalid user or password";
}
return SUCCESS;
}
}
例4 classes/tutorial/Login.java
<%@ page contentType="text/html; charset=UTF-8" %> <%@ taglib prefix="s" uri="/struts-tags"%>
例4 Login.jsp
例4 classes/struts.xml中Login Action的配置
运行Tomcat,在浏览器地址栏中键入
http://localhost:8080/Struts2_Action/Login.jsp,出现如图4所示页面。
图4 Login.jsp输出页面
分别在User name中输入“max”和“secret”,点击“Submit”按钮,出现如图5所示页面。
图5 Login成功页面
在浏览器地址栏中键入http://localhost:8080/Struts2_Action/Login.jsp,分别在User name中输入“Scott”和“password”,点击“Submit”按钮,出现如图6所示页面。
图6 Login失败页面
Struts 2.0更厉害的是支持更高级的POJO访问,如user.getPassword()。我们可以用另一写法实现例4。首先,将name和password从Login类中分离出来,到新建类User中。这样对我们开发多层系统尤其有用。它可以使系统结构更清晰。
package tutorial;
import com.opensymphony.xwork2.ActionSupport;
publicclass LoginX extends ActionSupport {
private User user;
private String message;
publicvoid setUser(User user) {
https://www.doczj.com/doc/e310168548.html,er = user;
}
public User getUser() {
return user;
}
public String getMessage() {
return message;
}
@Override
public String execute() {
if("max".equals(user.getName()) &&"secret".equals(user.getPassw ord())) {
message ="Welcome, "+ user.getName();
}else{
message ="Invalid user or password";
}
return SUCCESS;
}
}
例5 classes/tutorial/LoginX.java
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
例5 LoginX.jsp
例5 classes/struts.xml中的LoginX Action配置
很多时候我的同事会问我:“如果我要取得Servlet API中的一些对象,如request、response或session等,应该怎么做?这里的execute不像Struts 1.x的那样在参数中引入。”开发Web应用程序当然免不了跟这些对象打交道。在Strutx 2.0你可以有两种方式获得这些对象:非IoC(控制反转Inversion of Control)方式和IoC方式。
1.非IoC方式
要获得上述对象,关键Struts 2.0中
com.opensymphony.xwork2.ActionContext类。我们可以通过它的静态方
法getContext()获取当前Action的上下文对象。另外,
org.apache.struts2.ServletActionContext作为辅助类(Helper Class),可以帮助您快捷地获得这几个对象。
o HttpServletRequest request = ServletActionContext.getRequest();
o HttpServletResponse response =
ServletActionContext.getResponse();
o HttpSession session = request.getSession();
如果你只是想访问session的属性(Attribute),你也可以通过
ActionContext.getContext().getSession()获取或添加session范围
(Scoped)的对象。
2.IoC方式
要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的
意愿,通过实现相应的接口做到这点。具体实现,请参考例6 IocServlet.java。
package tutorial;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
publicclass NonIoCServlet extends ActionSupport {
private String message;
public String getMessage() {
return message;
}
@Override
public String execute() {
ActionContext.getContext().getSession().put("msg", "Hello World from Session!");
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getRespon
se();
HttpSession session = request.getSession();
StringBuffer sb =new StringBuffer("Message from request: ");
sb.append(request.getParameter("msg"));
sb.append("
Response Buffer Size: ");
sb.append(response.getBufferSize());
sb.append("
Session ID: ");
sb.append(session.getId());
message = sb.toString();
return SUCCESS;
}
}
例6 classes/tutorial/NonIoCServlet.java
package tutorial;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
publicclass IoCServlet extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {
private String message;
private Map att;
private HttpServletRequest request;
private HttpServletResponse response;
public String getMessage() {
return message;
}
publicvoid setSession(Map att) {
this.att = att;
}
publicvoid setServletRequest(HttpServletRequest request) {
this.request = request;
}
publicvoid setServletResponse(HttpServletResponse response) {
this.response = response;
}
@Override
public String execute() {
att.put("msg", "Hello World from Session!");
HttpSession session = request.getSession();
StringBuffer sb =new StringBuffer("Message from request: ");
sb.append(request.getParameter("msg"));
sb.append("
Response Buffer Size: ");
sb.append(response.getBufferSize());
sb.append("
Session ID: ");
sb.append(session.getId());
message = sb.toString();
return SUCCESS;
}
}
例6 classes/tutorial/IoCServlet.java
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags"%>
Message from session:
例6 Servlet.jsp
例6 classes/struts.xml中NonIocServlet和IoCServlet Action的配置
运行Tomcat,在浏览器地址栏中键入
http://localhost:8080/Struts2_Action/NonIoCServlet.action?msg=Hello%2 0World!或
http://localhost:8080/Struts2_Action/IoCServlet.action?msg=Hello%20W orld!,出现如图7所示页面。
图7 Servlet.jsp的输出页面
在Servlet.jsp中,我用了两次property标志,第一次将escape设为false为了在JSP中输出
转行,第二次的value中的OGNL为“#session.msg”,它的作用与
session.getAttribute("msg")等同。
关于property或其它标志,可以参考我的上一篇文章《常用的Struts 2.0的标志(Tag)介绍》。
SSH框架搭建 Struts2.3.12+Spring3.2.2+Hibernate4.2.0 编号:SSH-S2-S3-H4 版本:V1.1 级别:公开 编写时间:2013-03-18
目录 1 导言 (1) 1.1 目的 (1) 1.2 范围 (1) 1.3 说明 (1) 2 搭建Struts2 (2) 2.1 搭建所需jar包 (2) 2.2 整合步骤 (2) 2.2.1 创建项目 (2) 2.2.2 导入jar包 (2) 2.2.3 配置web.xml (4) 2.2.4 创建web (4) 2.2.5 创建jsp页面 (5) 2.2.6 配置struts.xml (6) 2.2.7 配置Tomcat (6) 2.2.8 部署项目 (7) 2.3 测试 (8) 2.3.1 启动Tomcat (10) 2.3.2 测试Tomcat (10) 2.3.3 测试Struts (11) 3 整合Spring3 (12) 3.1 整合所需jar包 (12) 3.2 整合步骤 (12) 3.2.1 导入jar包 (12) 3.2.2 配置web.xml (12) 3.2.3 配置struts.xml (13) 3.2.4 配置spring.xml (13) 3.3 测试 (14)
3.3.1 启动Tomcat (14) 3.3.2 测试登录 (14) 4 整合Hibernate4 (15) 4.1 整合所需jar包 (15) 4.2 整合步骤 (15) 4.2.1 导入jar包 (15) 4.2.2 创建数据库ccc (15) 4.2.3 创建对象User (16) 4.2.4 生成映射文件User.hbm.xml (17) 4.2.5 创建dao (18) 4.2.6 创建service (19) 4.2.7 创建web (20) 4.2.8 配置jdbc.properties (21) 4.2.9 配置db.xml (22) 4.2.10 配置spring.xml (24) 4.2.11 配置struts.xml (24) 4.3 测试 (25) 4.3.1 启动Tomcat (25) 4.3.2 测试登录 (25)
2012年第11卷第6期 产业与科技论坛2012.(11).6 Industrial &Science Tribune Struts2框架工作原理及应用体会 □宋 君 张家爱 【摘要】通过针对特定用户的分析,搭建以Struts2为技术核心的旅行社管理系统。本文简单的介绍了MVC 、 Struts2的工作原理,同时总结了在项目制作过程中所得到的心得。 【关键词】 Struts2;MVC ;FilterDispatcher ;Action 【基金项目】本文为大学生科技创新院级基金项目(编号:2011070)成果 【作者单位】宋君,吉林农业科技学院信息工程学院;张家爱,吉林农业科技学院信息工程学院教师 本着锻炼自我与积极参与到实用性技术的目标,以发掘自身创新意识为前提。利用空闲时间,在老师的指导下,进行了一次大学生创新项目的实践性活动。本着实用原则,以某中小旅行社为客户(根据用户需求,匿名),以Struts2框架为基点,进行了一次旅行社管理系统的开发。在项目结束之余, 特将在项目过程中经历的种种认识进行了简单的总结,希望让阅读本文的朋友们,更多的参与到此类活动中。 一、基础思想— ——MVC 简述作为时下经典框架之一, MVC 具有其独特的价值。MVC 框架简单的说,就是将数据模型与用户视图进行分离。通过控制器进行协调处理的一种结构是框架。同时,也是本文中要讨论的Sturts2框架的基础思想。 M 是指模型层(Model ),V 是指用户视图(View ),C 则是指控制器 (Controller )。这种划分方式是以将模型层与视图层进行代码分离,从而降低两者之间的耦合性,使同一程序可以使用不同形式进行表现。不同层之间的修改不会或尽量少的印象到其他层功能的史前为前提。有效的提高的代码的维护性和设计难度。 图1 二、 Struts2工作原理(一)Struts2框架组成。Struts2框架由三个主要部分组成:核心控制器、业务控制器,以及由用户实现的业务逻辑组件。这里我们将侧重于核心控制器与业务控制器的理解与说明。 (二)核心控制器:FilterDispatcher 。FilterDispatcher 是Struts2框架的核心控制器,在此,我们可以将FilterDispatcher 看作一个类似于过滤网的过滤器。当用户发出请求,并到达Web 硬哟那种时,该过滤器会过滤用户请求。如果用户请求的结尾为action ,则将该请求转入Struts2框架进行处理。当Struts2框架获得了*.actio 请求后,会根据请求前面“*”的那部分内容,决定调用哪个业务逻辑组件作为响应单位。这里需要说明的是Struts2用来处理用户请求的Action 实例并不是业务控制器,而是作为Action 的代理———正因为Struts2的一大特点,与Servlet API 的非耦合性,使得用户实现的业务控制器无法直接处理用户请求。有效的提高了后期调试维护的效率。而Struts2框架再次提供了了一系列的拦截器。这些拦截器负责将HttpServletRequest 请求的参数解析出来,传入Action 中,并毁掉Action 的Execute 方法来处理用户请求。用户实现的Action 类仅作为Struts2的Action 代理的代理目标。用户实现的业务控制器则包含了对用户请求的处理。用户的请求数据包含在HttpServletRequest 对象中,而用户的Action 类无需访问HttpServletRequest 对象。拦截器负责将HttpServletRequest 里的请求数据解析出来,并传给业务逻辑组件Action 实例。 (三)业务控制器。业务控制器就是前文提到的用来实现用户Action 的实力,这里的每个Action 类通常包含有一个execute 方法,当业务控制器处理完用户的请求后,该方法将会针对此次处理返回一个字符串— ——该字符串就是一个逻辑树图名。当程序开发人员开发出系统所需要的业务控制器后,还需要针对性的配置Struts2的Action ,即需要配置Ac- tion 的以下三个部分:(1)Action 所处理的URl 。(2)Action 组件所对应的实现类。(3)Action 里包含的逻辑试图和物理资源之间的对应关系。每个Action 都要处理一个用户请求,而用户请求则总是包含有指定的URL 。当核心控制器过滤用户请求,并调用后,根据请求的URL 和Action 处理URL 之间的对应关系来处理转发。 · 342·
软件项目主要阶段及各个阶段主要工作 Document number:WTWYT-WYWY-BTGTT-YTTYU-2018GT
软件项目主要分为哪些阶段各个阶段主要做哪些工作 本人在两个中小型软件开发企业工作过几年,也做过几年的项目管理工作。走过一些弯路也得出一些项目管理方面的体会,在此进行总结,希望能够与其他一些项目管理人员或对项目管理有兴趣的同事共同探讨一些中小型项目管理的问题及方法。? 大部分中小型软件开发企业的软件项目经常遇到的一些问题可能包括:项目时间紧、项目组成员经常加班;项目需求变更频繁;项目进行过程中可能就有项目团队成员离职或调离到其他项目组;项目重复性建设问题严重,每个项目都需要从框架开始重新开发,难以重用已有项目的成果等等。我觉得通过较好的规划和管理能够在一定程度上提高项目的成功率或者说提高项目的质量,降低开发成本,缩短项目开发时间。? 我理解项目管理有两个大的划分方法一是通用的项目管理体系,也就是PMP 中所说的5个项目管理过程组9个知识领域44个项目管理过程;二是具体业务领域的按项目生命期划分的各阶段的管理。本文主要从项目生命期各阶段的管理方面进行总结。? 我个人分析一个软件项目生命期大体需要经过的流程(这只是我个人的一个划分,有可能不是很全面):可行性分析、需求、设计、开发、测试、实施、维护、总结。? 下面我针对每个阶段谈一下自己的体会。? 一、可行性分析? 一般的项目都是通过外部招标的形式得到的。对于有些公司在应标的时候对项目就要有个取舍。如果在特殊时期为了生存可能只要不是太赔的项目都会尽量承接。? 但是一般项目在承接前最好在经济、技术等方面进行可行性分析,而且这种可行性分析最好是管理者、市场、技术等人员都参与,因为市场人员一般不懂(或不通)技术,技术不懂(或不通)市场,因此只有大家在一起共同分析讨论才能够得出比较可行的结果。可行性分析的结果一方面可以作为是否承接项目的依据,另一方面也可以作为承接项目方式或与客户谈判的依据。比如经分析项目工作量很大,如果按标书金额开发有可能会赔,那么可以与用户探讨是否将来能有个二期的项目;另外如果用户要求的时间比较紧,可是经分析很难按标书时间完成,那么也可以和用户同共探讨是否可以在正式签定合同时延长系统交付时间等。当然这些与用户的探讨工作一般是需要公司高层领导出面协调的,有时单独靠项目组是没有能力达成理想的结果的。? 另外在此阶段最好对项目的成本和需要的资源进行一下估算。? 二、需求? 需求实际要细分为需求调研、需求分析、需求确认、需求管理等。? 因为对于需求要想说清楚可能需要较长的篇幅,所以在此不进行展开。? 在此只是先强调一下需要相当重要,如果早期需求做的不够仔细会给项目的后期工作带来很多的隐患。?
Struts 2作业 1.简述什么是MVC? 答:MVC 的全称为model-view-controller(模型-视图-控制器)。MVC 是一种开发应用程序的模式,这个模式已经具有了很好的框架架构,并且十分容易维护。使用MVC 开发出来的应用程序一般包括以下几块内容:·控制器(Controller):控制器类处理客户端向Web 应用程序发出的请求,获取数据,并指定返回给客户端,用来显示处理结果的视图。·模型(Model):模型类代表了应用程序的数据,这些数据通常具有一个数据验证逻辑,用来使得这些数据必须符合业务逻辑。·视图(View):视图类是Web 应用程序中用来生成并显示HTML 格式的服务器端对客户端请求的响应结果的模板文件 2.Struts 2以(WebWork)为核心,采用(拦截器)的机制来处理用户的 请求。 3.简述一个请求在Struts 2框架中的处理流程,请按自己对框架的理解叙述。答:1-用户提交自己的请求;2-由web.xml拦截,转发到action进行处理;3- Struts.xml根据相应的action配置,调用相应的方法来处理,并根据结果转发到不同的页面。 4.不属于Action接口中定义的字符串常量是( B )? A)SUCCESS B)FAILURE C)ERROR D)INPUT 5.资源文件的后缀名为(D)? A)txt B)doc C)property D)properties 6.在JSP页面中可以通过Struts 2提供的(D)标签来输出国际化信息。 A)
Struts2中数据标签使用示例 S truts2提供了大量丰富的标签供使用,它不再像S truts1中一样,将种类标签进行分门列别,但可以根据其使用的用途用以区别。本文通过对S truts2中数据标签的学习,来对S truts2中标签的学习起到一个抛砖引玉的作用。 文中将介绍Action标签、Bean标签、Data标签、Include标签、P aram标签、Set标签、T ext标签、P roperty 标签等标签。 代码下载:https://www.doczj.com/doc/e310168548.html,/y1ps2Mjpc3NiLKuetMOpCsZOOypD6KSdo8-46Zy2wpoMcABeo4vOC NJXtWDEO93-TXgZogwAF YxSOni5BEG2EoN65OFwHdG71v-/St ruts2DataTags.rar?download 一、