Struts2基础入门 理论_第1页
Struts2基础入门 理论_第2页
Struts2基础入门 理论_第3页
Struts2基础入门 理论_第4页
Struts2基础入门 理论_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章Struts2 基础入门本章学习内容:1. Struts2 体系结构2. Struts2 运行流程3. Struts2与Struts1的对比4. Struts2入门示例5. 跟踪用户状态 6. ValueStack的概念本章学习目标:1. 掌握Struts2体系结构2. 理解Struts2运行流程3掌握struts.xml文件的配置4能使用Struts2框架开发Web应用程序5. 掌握使用ValueStack存储数据本章简介:通过上一章的学习,我们掌握了Struts1框架的HTML标签库、Bean标签库、Logic标签库等知识。但是Struts1框架有天生的设计缺陷,包括:支持

2、的表现层技术单一、与Servlet API严重耦合,难于测试、代码严重依赖于Struts1 API,属于侵入式设计等。为了弥补以上缺陷,Struts2框架应运而生。Struts2的体系与Struts1的体系差别非常大,因为Struts2使用了WebWork的设计核心,而不是使用Struts1的设计核心。Struts2大量使用拦截器来处理用户请求,从而允许用户的业务逻辑控制器彻底与Servlet API分离。Struts2下的控制器不再像Struts1下的控制器,需要继承一个Action父类,甚至可以无需实现任何接口,Struts2的控制器就是一个包含execute方法的普通POJO类。本章主要

3、讲述Struts1存在的问题、Struts2体系结构、运行流程、使用Struts2重构用户登录、Struts2中的valueStack等知识。5.1 Struts2概述Struts1现在已经发展成为一个高度成熟的框架,不管是稳定性还是可靠性,都得到了广泛的证明。但由于Struts1存在一些设计上的缺陷,于是催生了Struts2框架。Struts2与Struts1相比,确实有很多革命性的改进,但它并不是一个全新的框架,而是在WebWork基础上发展起来。从某种意义上讲,Struts2没有继承Struts1,而是继承了WebWork框架,或者说,WebWork衍生出了Struts2,而不是Stru

4、ts1衍生了Struts2。因为Struts2是WebWork的升级,而不是一个全新的框架,因此稳定性和性能各方面都有很好的保证,而且吸收了Struts1和WebWork两者的优势,因此,Struts2是一个非常完善的MVC实现框架。5.1.1 Struts1框架存在的问题 对于Struts1框架而言,因为它与JSP/Servlet紧密耦合,因而导致了许多不可避免的设计缺陷,随着Web应用程序规模的扩大,这些缺陷逐渐变成制约Struts1发展的重要因素,这也是Struts2出现的原因。下面具体分析Struts1中存在的缺陷。(1) 支持的表现层技术单一Struts1只支持JSP作为表现层技术,

5、不提供与其它表现层技术,例如Velocity、FreeMarker等技术的整合。这一点严重制约了Struts1框架的使用,对于目前的很多Java EE应用程序而言,并不一定使用JSP作为表现层技术。(2) 与Servlet API严重耦合,难于测试因为Struts1框架是在Model 2的基本上发展起来的,因此它完全是基本Servlet API的,所以在Struts1的业务逻辑控制器内,充满了大量的Servlet API。分析以下Struts1业务逻辑控制器代码:public class LoginAction extends Action public ActionForward execu

6、te(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) . . . 当我们需要测试上面Action类的execute()方法是,该方法有4个参数:ActionMapping、ActionForm、HttpServletRequest和HttpServletResponse,初始化这4个参数比较困难。尤其是HttpServletRequest和HttpServletResponse两个参数,通常由Web容器负责实例化。因此一旦脱离了Web服务器,Acti

7、on测试非常困难。(3) 代码严重依赖于Struts1 API,属于侵入式设计正如从上面代码片段中所看到的,Struts1的Action类必须继承Struts1的基类,实现处理方法时,又包含了大量Struts1的API:如ActionMapping、ActionForm和ActionForward类。这种侵入式设计的最大缺点在于,一旦系统需要重构时,这些Action类完全没有利用价值。可见,Struts1的Action类这种侵入式设计导致了较低的代码利用。5.1.2 Struts2体系结构Struts2的体系与Struts1的体系差别非常大,因为Struts2使用了WebWork的设计核心,而

8、不是使用Struts1的设计核心。Struts2大量使用拦截器来处理用户请求,从而允许用户的业务逻辑控制器彻底与Servlet API分离。Struts2的体系结构主要包括Struts2控制器组件、Struts2配置文件和Struts2标签库等3部分。1 Struts2的控制器组件Struts2的控制器组件是Struts2框架的核心,事实上,所有MVC框架都是以控制器组件为核心的。Struts2的控制器由两个部分组成:核心控制器FilterDispatcher和业务控制器Action。(1) 核心控制器:FilterDispathcherFilterDispatcher是Struts2框架的核

9、心控制器,该控制器作为一个Filter运行在Web应用程序中,它负责拦截所有的用户请求,当用户请求到达时,该Filter会过滤用户请求。如果用户请求以action结尾,该请求将被转入Struts2框架处理。Struts2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用那个业务控制器,例如,对于login.action的请求,Strtus2调用名为login的Action来处理该请求。(2) 业务控制器业务控制器Action需由用户自己实现,在配置文件中进行配置,以供核心控制器FilterDispatcher来使用。实际上,Struts2应用程序起作用的业务控制器不

10、是用户自定义的Action,而是系统生成的Action的代理,但该Action代理以用户定义的Action为目标。以下是Struts2的Action代码示例:public class LoginAction /封装用户请求参数的uid属性private String uid;/封装用户请求参数的pwd属性private String pwd;/处理用户请求的execute方法public String execute() throws Exception/如果登录成功,则进入主页面if("scott".equals(this.uid) && "ti

11、ger".equals(this.pwd)return "success"/否则进入登录失败错误提示页面return "fial"/getter、setter方法public String getPwd() return pwd;public void setPwd(String pwd) this.pwd = pwd;public String getUid() return uid;public void setUid(String uid) this.uid = uid;以上Action代码无需实现任何父接口,无需继承任何Struts2基

12、类,该Action类完全是一个POJO(普通、传统的Java对象),因此具有很好的复用性。归纳起来,Struts2的Action类有如下优势:1. Action类完全是一个POJO类,因此具有很好的代码重用性。2. Action类无需与任何Servlet API耦合,因此进行单元测试非常简单。3. Action类的execute方法仅返回一个字符串作为处理结果,该处理结果可映射到任何的视图,甚至是另一个Action。2 Struts2的配置文件当Struts2创建系统的Action代理时,需要使用Struts2的配置文件。Struts2的配置文件有两份:(1) 配置Action的struts.

13、xml文件(2) 配置Struts2全局属性的perties文件(可选)struts.xml文件内定义了Struts2的系列Action,定义Action时,指定该Action的实现类,并定义该Action处理结果与视图资源之间的映射关系。以下是struts.xml配置文件的示例:<struts> <!- Struts2的Action都必须配置在package里面 -> <package name="default" extends="struts-default"><!-继承自默认包 -&g

14、t; <!- 定义一个login的Action类,实现类为LoginAction ->on"> <!- 定义结果与视图资源的映射关系 -> <result name="success">/index.jsp</result> <result name="fail">/fail.jsp</result> </action> </package></struts>在上面的struts.xml文件中,定义了一个Action,定义Actio

15、n时,不仅定义了Action实现类,而且通过”name”属性指定访问该Action的逻辑名,此处为“login”。其中”result”元素用于指定execute方法返回值和视图资源之间的映射关系。对于如下配置片段: <result name="success">/index.jsp</result> 表示当execute方法返回”success”字符串时,流程将转发至index.jsp页面。除此之外,Struts2还有一个配置Struts2全局属性的properties文件:perties。该文件的示例如下: #指定Struts2

16、标签的主题为普通主题 struts.ui.theme=simple perties文件的形式是一系列的key、value对,它指定了Struts2应用程序的全局属性。3 Struts2标签库Struts2的标签库提供了非常丰富的功能,这些标签库不仅提供了表现层数据处理,而且提供了基本的流程控制功能,还提供了国际化、Ajax支持等功能。通过使用Struts2的标签,开发者可以最大限度的减少页面代码的书写量。以下是使用Struts2标签实现的登录页面:<% page language="java" import="java.util.*&qu

17、ot; pageEncoding="UTF-8"%> <!导入struts2标签库-><% taglib uri="/struts-tags" prefix="s" %><html> <body> <s:form action="login.action"> 用户名:<s:textfield name="uid"/><br/> 密码:<s:textfield name="pwd"/

18、><br/> <s:submit value="登录"/><s:reset value="重置"/> </s:form> <body><html>其中<s:form>标签用于生成HTML提交表单,<s:textfield>标签用于生成HTML中的<input type=”text”>输入框。5.1.3 Struts2 运行流程Struts2使用拦截器作为处理,以用户的业务逻辑控制器为目标,创建一个控制代理。控制器代理负责处理用户请求,处理用户

19、请求时回调业务控制器的execute方法,该方法的返回值将决定了Struts2将怎样的视图资源呈现给用户。图1.5.1显示了Struts2运行流程。ActionContextCleanUp其它的过滤器(如 SiteMesh等)FilterDispatcherAction代理配置管理器struts.xml调用Action拦截器1拦截器2拦截器3ActionResult拦截器3拦截器2拦截器1Action映射器标签库视图模板-jsp-FreeMarker-等等HTTP响应HTTP请求图 1.5.1 Struts2运行流程图Struts2框架的处理流程如下:(1) 浏览器发送请求,例如请求/logi

20、n.action(2) 核心控制器FilterDispatcher根据请求决定调用合适的Action(3) WebWork的拦截器链自动对请求应用通用功能,例如workflow、validation或文件上传等功能(4) 回调Action的execute方法,该方法先获取用户请求参数并调用业务逻辑组件来处理用户请求(5) Action的execute方法处理结果信息将被输出到浏览器中,可以是HTML页面、图像,也可以是PDF文档或其它文档。此时支持的视图技术非常多,既支持JSP,也支持Velocity、FreeMarker等模板技术。5.2 Struts2与Struts1的对比Struts2在

21、Struts1上做出了巨大的改进,以下是Struts1和Struts2在各方面的简要对比。(1) Action实现类方面:Struts1要求Action类需继承父类;Struts2中的Action无需任何特定要求,只有一个包含execute方法的POJO类都可以用作Struts2的Action(2) 线程模式方面:Struts1中的Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有请求,所以在Action中定义的资源必须是线程安全的或同步的;Struts2中的Action对象会为每个请求产生一个实例,因此没有线程安全问题。(3) 封装请求参数方面:Struts

22、1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承类,开发者必须创建大量的ActionForm类来封装用户请求参数;Struts2直接使用Action属性来封装用户请求参数,避免了开发者需要大量开发ActionForm类。(4) 表达式语言方面:Struts1整合了JSTL,因此可使用JSTL表达式语言。这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;Struts2可以使用JSTL,但同时整合了一种更强大和灵活的表达式语言:OGNL(Object Graph Notation Language 对象图形导航语言),因此,Struts2下

23、的表达式语言功能更加强大。(5) 绑定值到视图方面:Struts1使用标签JSP机制把对象绑定到视图页面;Struts2使用ValueStack(值栈)技术,使标签库能够访问值,而不需要将对象和视图页面绑定在一起。5.3 使用Struts2重构用户登录在第一章中,我们使用Struts1框架开发过一个简单的用户登录示例,下面使用Struts2框架重构该示例。重构该示例涉及到以下内容:(1) 导入Struts2框架jar包到Web工程(2) 创建模型(3) 创建控制器(4) 创建视图(5) 对Struts2框架进行配置(6) 发布、运行此示例5.3.1 导入Struts2框架jar包到Web工程创

24、建一个Web工程,命名为struts5l,从/struts/binaries/ 下载Struts2库文件(本示例使用2.1.6版本),下载后解压缩,在apps目录下找到struts2-blank-2.1.6.war文件。如图1.5.2所示:图1.5.2 Struts2 apps目录文件列表将文件解压缩,把其中lib目录下面的9个jar包,复制到项目的”WEB-INF/lib”文件夹下,如图1.5.3所示:图1.5.3 开发Struts2应用程序的jar包5.3.2 创建模型本示例汲及到两个JavaBean。(1)UserInfo.java:用于描述用户的实体类。代码如下:public clas

25、s UserInfo implements private String uid;/用户名private String pwd;/密码private String realName;/真实姓名private Date birthday;/出生日期/无参构造函数public UserInfo()/有参构造函数public UserInfo(String uid, String pwd, String realName, Date birthday) super();this.uid = uid;this.pwd = pwd;this.realName = realName;this.birthd

26、ay = birthday; /getter、setter方法省略(2) UserService.java: 用于处理业务逻辑的JavaBean。为了简化操作,本JavaBean模拟数据库来判断登录是否成功。代码如下:public class UserService/构造一个Map对象,用于存入UserInfo的集合private Map userInfoMap=new HashMap();/构造一个UserService静态对象,实现单例工厂模式private static UserService userService=new UserService();/构造函数私有,做成为单例模式,模

27、拟数据库产生UserInfo的集合private UserService()try/实例化一个SimpleDateFormat对象,用于转换字符串为日期SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");/实例化多个UserInfo类UserInfo u1=new UserInfo("admin","admin","张三",sdf.parse("1978-3-4");UserInfo u2=new UserInfo("ht&q

28、uot;,"ht","李四",sdf.parse("1980-11-12");UserInfo u3=new UserInfo("soft","soft","王五",sdf.parse("1979-12-4");UserInfo u4=new UserInfo("com","com","胡海军",sdf.parse("1987-7-4");UserInfo u5=new Use

29、rInfo("kitt","kitt","张小玲",sdf.parse("1985-6-4");/加入Map集合userInfoMap.put(u1.getUid(), u1);/加入u1userInfoMap.put(u2.getUid(), u2);/加入u2userInfoMap.put(u3.getUid(), u3);/加入u3userInfoMap.put(u4.getUid(), u4);/加入u4userInfoMap.put(u5.getUid(), u5);/加入u5catch(Exceptio

30、n e)e.printStackTrace();/定义静态方法,实例化自己public static UserService newInstance() return userService;public UserInfo login(String uid,String pwd)/判断用户输入的用户名是否在集合中if(this.userInfoMap.containsKey(uid) /存在,进一步比较密码是否正确UserInfo findUserInfo=(UserInfo)this.userInfoMap.get(uid);/通过uid键得到一个UserInfoif(findUserInf

31、o.getPwd().equals(pwd) /如果密码也相等,说明登录成功 return findUserInfo;return null;/否则用户名相等,但密码不相等,登录失败return null;/不存在,表明登录失败,返回null;5.3.3 创建控制器Struts2下的控制器不再像Struts1下的控制器,需要继承一个Action父类,甚至可以无需实现任何接口,Struts2的控制器就是一个普通的POJO类。事实上,Struts2的Action就是一个包含execute方法的普通Java类。以下是用于处理用户请求的Action类的代码:public class LoginActi

32、on /封装用户请求参数的uid属性private String uid;/封装用户请求参数的pwd属性private String pwd;/处理用户请求的execute方法public String execute() throws Exception /调用模型进行业务逻辑错误 UserInfo userInfo=UserService.newInstance().login(this.uid, this.pwd); if(userInfo!=null) /如果登录成功 /转发到成功页面,该success与struts.xml配置文件中<result>相对应 return &

33、quot;success" /转发到失败页面,该fail与struts.xml配置文件中<result>相对应 return "fail"/getter、setter方法public String getPwd() return pwd;public void setPwd(String pwd) this.pwd = pwd;public String getUid() return uid;public void setUid(String uid) this.uid = uid;注意:Struts2的Action类中包含的多个属性可用于封装用户的

34、请求参数 5.3.4 创建视图这里要与Action的属性方法名保持一致 本示例包括视图由三个JSP文件构成。(1) login.jsp:用于提供登录页面,代码如下: <body> <form action="login.do" method="post"> 用户名:<input type="text" name="uid"/><br/> 密码:<input type="text" name="pwd"/><br

35、/> <input type="submit" value="提交"/> <input type="reset" value="重置"/> </form> </body>(2) index.jsp:登录成功后的主页面,用于显示登录的用户信息。代码如下:<% page language="java" import="java.util.*" pageEncoding="UTF-8"%><

36、html> <head> <title></title> </head> <body> <h2> 恭喜你,登录成功! </h2> </body></html>(3) fail.jsp:登录失败后的错误页面。代码如下: <body> <h3> <font color="red">用户名或密码错误!<br/> </font>系统将在<div id="remainDiv" style

37、="display:inline;color:blue">5</div> 秒后返回登录页面,要立即返回请点击<a href="login.jsp">登录</a> </h3> <script type="text/javascript"> var remain=4;/定义剩余秒数变量 var varremainDiv=document.getElementById("remainDiv");/得到remainDiv表单元素 setTimeout(&qu

38、ot;backLogin()",1000); function backLogin() /定义显示剩余秒数函数 varremainDiv.innerHTML=remain; remain-; if (remain=0) /如果剩余秒数为0,跳转到登录页面 window.location="login.jsp" setTimeout("backLogin()",1000); /否则继续执行backLogin函数 </script> </body>5.3.5 配置Struts2应用程序Struts2应用程序采用两个基于XML

39、的配置文件来配置应用程序。这两个配置文件为web.xml和struts.xml,web.xml适用于所有的JavaWeb应用程序,它是Web应用程序的发布描述文件。对于Struts2应用程序,还应该配置和Struts2相关的特殊信息。struts.xml文件是Struts2框架的专属配置文件,在该文件中可配置Action、拦截器、result等Struts2一系列组件1添加web.xml文件并配置FilterDispatcherFilterDispatcher是Struts2框架的核心控制器,该控制器作为一个Filter运行在Web应用程序中,它负责拦截所有的用户请求,当用户请求到达时,该Fi

40、lter会过滤用户请求。如果用户请求以action结尾,该请求将被转入Struts2框架处理。为了让FilterDispatcher过滤器起作用,必须在web.xml文件中进行相关的配置。在web.xml 文件中配置FilterDispatcher 代码如下:<!- 配置Struts2的核心控制器FilterDispatcher -><filter> <!- filter名称 -> <filter-name>struts2</filter-name> <!- filter实现类 ->ruts2.dispatcher.Fil

41、terDispatcher</filter-class></filter><!- 配置filter的映射部分 -><filter-mapping> <!- filter名称 -> <filter-name>struts2</filter-name> <!- 所有用户请求,都会被FilterDispatcher拦截 -> <url-pattern>/*</url-pattern></filter-mapping> FilterDispatcher作为一个标准filt

42、er,配置在 Web 应用中,负责拦截用户的所有请求。 并且还有加载Struts2 配置文件的职责。但这里并未告诉它如何加载 Struts2 的配置文件,以及Struts2 的配置文件放在哪里及文件名是什么。FilterDispatcher默认加载WEB-INF/classes 路径下的 struts.xml文件。如果需要Struts2 的配置文件不在WEB-INF路径下,或者改变了文件名,则应采用如下方式配置:<!- 配置Struts2的核心控制器FilterDispatcher -><filter> <!- filter名称 -> <filter-

43、name>struts2</filter-name> <!- filter实现类 -> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> <!- 通过init-param配置节重新指定Struts2配置文件的位置 -> <init-param> <param-name>config</param-name> <!- 指定struts.xml在WEB-INF目录下 -> <pa

44、ram-value>struts-default.xml,struts-plugin.xml,./struts-config-user.xml param-value默认从classes目录下加载,”./”代表classes的上级目录,即:WEB-INF目录</param-value> </init-param></filter><!- 配置filter的映射部分 -><filter-mapping> <!- filter名称 -> <filter-name>struts2</filter-name

45、> <!- 所有用户请求,都会被FilterDispatcher拦截 -> <url-pattern>/*</url-pattern></filter-mapping>在上面的配置中,指定了Struts2 的配置文件struts-config-user.xml 文件,并且该文件位于WEB-INF目录下。该文件作为 init-param参数载入,载入时指定了参数名config。 config 是 Struts2 固定的参数名, Struts2负责解析该参数,并加载该参数的指定的配置文件。对于以上Struts2配置文件方式,需要注意以下2点:(

46、1) "."表示后退到WEB-INF目录,不能直接写成 struts-default.xml,struts-plugin.xml,struts-config-user.xml(2) 如果设置了<param-name>config </param-name>参数, 那么struts-default.xml等struts2 默认加载的文件也需指定2添加Struts2配置文件并配置ActionAction是业务逻辑控制器,它负责获取用户提交的请求数据,并调用模型进行数据处理,然后根据处理结果,转发请求到不同的视图。下面是本示例LoginAction的配置代

47、码: <!DOCTYPE struts PUBLIC"-/Apache Software Foundation/DTD Struts Configuration 2.1/EN""/dtds/struts-2.1.dtd"><struts> <!- Struts2的Action都必须配置在package里面 -> <package name="default" extends="struts-default"><!-继

48、承自默认包 -> <!- 定义一个login的Action类,实现类为LoginAction -> <action name="login" class="com.soft.struts5l.web.struts.action.LoginAction"> </action> </package></struts>表1.5.1对Action配置属性做了说明。 表1.5.1 <action>配置属性属性描述package指定配置Action所在包。Struts2框架使用包来管理Ac

49、tion,每个包就是多个Action引用的集合。配置包时,必须指定name属性。还可指定一个可选的extends属性,表示继承其它包。Struts2框架的默认的包为struts-defaultname指定 Action的名称。FilterDispatcher根据该属性来匹配用户请求的Actionclass用于指定Action的实现类。在配置时需要给出Action类的完整类名,即应该把类的包名也包含在内。3 配置Result<result>元素用于把一个逻辑名映射到特定的URL,通过这种方式,Action类或者JSP文件无需指定实际的URL,只要指定逻辑名就能实现请求转发或者重定向,

50、这可以减弱控制组件和视图之间的耦合,并且有助于维护JSP文件。下面是本示例Result的配置代码: <!- 定义一个login的Action类,实现类为LoginAction -> <action name="login" class="com.soft.struts5l.web.struts.action.LoginAction"> <!- 定义结果与视图资源的映射关系 -> <result name="success">/index.jsp</result> <re

51、sult name="error">/fail.jsp</result> </action>表1.5.2对Result配置属性做了说明。 表1.5.2 <result>配置属性属性描述name指定该result的逻辑名,与Action的execute返回值对应。该属性为可选,如果省略,Struts2会默认name的属性值为“success”。type可选属性。用于指定result结果类型。默认为dispatcher,表示将响应转发到浏览器指定的位置,如果取值为redirect表示将响应重定向到浏览器指定的位置。 上面的映射文件定义了

52、name为login的Action,即:该Action将负责处理login.action 的请求。该Action将调用自身的execute方法,如果execute方法返回success字符串,请求将被转发到/index.jsp页面;如果execute方法返回fail字符串,则请求被转发到/fail.jsp页面。 以上在Action中配置的Result属于局部Result,局部Result只能被该Action引用。全局Result单独配置,所有的Action都可引用。全局的Result配置在global(全球的,总体的)-results元素里。下面是配置全局Resul代码: <global

53、-results> <result name="error">/error.jsp</result> </global-results>可以为Web应用程序做一个专用于显示错误信息的页面error.jsp。然后给所有的Action都来共享。在这种情况下,可把error.jsp配置成全局的Result。经过以上配置后,该示例struts-config-user.xml文件最终代码如下:<!DOCTYPE struts PUBLIC"-/Apache Software Foundation/DTD Struts Conf

54、iguration 2.1/EN""/dtds/struts-2.1.dtd"><struts> <!- Struts2的Action都必须配置在package里面 -> <package name="default" extends="struts-default"><!-继承自默认包 -> <!- 定义一个login的Action类,实现类为LoginAction -> <action name=&quo

55、t;login" class="com.soft.struts5l.web.struts.action.LoginAction" > <!- 定义结果与视图资源的映射关系 -> <result name="success">/index.jsp</result>(默认name=“success”) <result name="fail">/fail.jsp</result> </action> </package></struts

56、>5.3.6 发布、运行此示例通过MyEclipse 工具开发的struts5l应用程序的目录结构如图1.5.4:Struts2框架struts-config.user.xml配置文件Struts2框架JAR包图1.5.4 struts5l 应用程序目录结构发布此应用程序到Tomcat容器中,在浏览器中输入: 运行结果如图1.5.5:图1.5.5 登录页面 输入用户名与密码,如果登录失败,会转到fail.jsp页面,如图1.5.6:图 登录失败页面如果登录成功,会转到index.jsp页面,显示登录用户的详细信息,如图1.5.7:图登录成功index.jsp页面提问:Struts2中Ac

57、tion控制器的execute方法完全与Servlet API 隔离,如果要将成功登录的用户信息保存到会话中,该如何实现呢?5.4 跟踪用户状态上述Action处理完用户登录后,仅仅执行了简单的页面转发,并末跟踪用户状态信息,通常,当一个用户登录成功后,需要将用户信息添加到Session状态信息。为了访问HttpSession实例, Struts2提供了一个ActionContext类,该类提供了一个getSession方法,但该方法的返回值类型并不HttpSession而是Map。实际上,Struts2为了简化Action类的测试,将Action类与Servlet API 完全分离,但Str

58、uts2的系列拦载器会负责Map和HttpSession之间的转换。为了可以跟踪会话信息,修改Action类的execute方法,修改后的execute方法代码如下:public class LoginAction /封装用户请求参数的uid属性private String uid;/封装用户请求参数的pwd属性private String pwd;/处理用户请求的execute方法public String execute() throws Exception /调用模型进行业务逻辑错误 UserInfo userInfo=UserService.newInstance().login(this.uid, this.pwd); if(userInfo!=null) /如果登录成功 /将userInfo的信息,添加到会

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论