`

Struts2完整工作流程

阅读更多

 

1.1 拦截器的作用。

参考答案:

拦截器适合封装一些共通处理,便于重复利用.例如请求参数给Action属性,日志的记录,权限检查, 事务处理等.拦截器是通过配置方式调用,因此使用方法比较灵活,便于维护和扩展。

1.2 fileUpload拦截器原理。

参考答案:

该拦截器首先会调用commons-file-upload.jar组件将客户端上传的文件保存到服务器临时目录下,之后将临时目录下的文件对象给Action属性复制.当Action和Result调用完毕后,清除临时目录下的文件.因此在Action业务方法中,需要做文件复制,将临时文件转移到目标目录中。

1.3 Struts2完整工作流程。

参考答案:

a.客户发送一个Action请求,请求交给控制器

b.控制器创建一个ValueStack,将Action压入栈顶

c.控制器调用ActionInvocation组件执行请求处理

d.ActionInvocation组件调用请求相关的拦截器组件--前部分处理.

e.然后再调用Action组件业务方法

f.然后再调用Result组件处理方法

g.最后执行拦截器组件--后部分处理.

h.将响应信息输出,为客户端响应

 

2.1 阅读下面的代码,并在指定位置添加注释。

  1. <struts>
  2. <package name="day05" extends="struts-default">
  3. <interceptors>
  4. <!—此行代码的作用是( 注册SomeInterceptor拦截器 )-->
  5. <interceptorname="someInterceptor"
  6. class="com.tarena.interceptor.SomeInterceptor" />
  7. </interceptors>
  8. <actionname="some"
  9. class="com.tarena.action.SomeAction">
  10. <!—此行代码的作用是( 使用SomeInterceptor拦截器 )-->
  11. <interceptor-refname="someInterceptor"/>
  12. <result>/WEB-INF/jsp/ok.jsp</result>
  13. </action>
  14. </package>
  15. </struts>
<struts>
	<package name="day05" extends="struts-default">
		<interceptors>
          <!—此行代码的作用是( 注册SomeInterceptor拦截器 )-->
			<interceptor name="someInterceptor"
				class="com.tarena.interceptor.SomeInterceptor" />
		</interceptors>
		
		<action name="some" 
				class="com.tarena.action.SomeAction">
           <!—此行代码的作用是( 使用SomeInterceptor拦截器 )-->
			<interceptor-ref name="someInterceptor"/>
			<result>/WEB-INF/jsp/ok.jsp</result>
		</action>
	</package>
</struts>

3 编程题(改代码,写代码)

3.1 NETCTOSS登录检查拦截器

在Day04“NETCTOSS资费更新”案例基础上,添加登录检查拦截器功能。当用户没有登录的时候,不能对资费信息进行修改和删除。

参考答案:

1.按照Day02的“NETCTOSS资费的分页显示”案例中,拷贝工程的方法,拷贝struts04_3创建struts05_2工程。

2.经过拷贝创建好的工程,没有登录的内容,所以要把登录的内容整合到struts05_2中。整合登录时需要将Day04的“基于stream Result生成验证码”(struts04_1)案例的内容整合到struts05_2中,最终项目工程结构如图-4,图-5所示。

图- 4

图- 5

整合步骤如下:

a.拷贝struts04_1中ImageAction.java和LoginAction.java到struts05_2的

com.tarena.netctoss.action包下。

b.在struts05_2工程中创建BaseAction.java,放置目录请参考图-4,内容如下:

  1. import java.util.Map;
  2. import org.apache.struts2.interceptor.RequestAware;
  3. import org.apache.struts2.interceptor.SessionAware;
  4. public classBaseAction implements RequestAware,SessionAware{
  5. protected Map<String,Object>request;
  6. protected Map<String, Object>session;
  7. public void setSession(Map<String, Object>session) {
  8. this.session = session;
  9. }
  10. public void setRequest(Map<String, Object>request) {
  11. this.request = request;
  12. }
  13. }
import java.util.Map;

import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

public class BaseAction implements RequestAware,SessionAware{
	protected Map<String,Object> request;
	protected Map<String, Object> session;

	public void setSession(Map<String, Object> session) {
		this.session = session;
	}
	
	public void setRequest(Map<String, Object> request) {
		this.request = request;
	}
}

c. 拷贝struts04_1中AdminInfoDAO.java拷贝到struts05_2的com.tarena.netctoss.dao下;拷贝struts04_1中AdminInfo.java拷贝到struts05_2的com.tarena.netctoss.pojo下;拷贝struts04_1中ImageUtil.java拷贝到struts05_2的com.tarena.netctoss.util下。

d.修改struts05_2的struts.xml,添加如下关于登录的配置:

  1. <package name="login" extends="struts-default">
  2. <!-- 登录处理 -->
  3. <actionname="toLogin">
  4. <resultname="success">/WEB-INF/login.jsp</result>
  5. </action>
  6. <actionname="login" class="com.tarena.netctoss.action.LoginAction">
  7. <resultname="success">/WEB-INF/main.jsp</result>
  8. <resultname="login">/WEB-INF/login.jsp</result>
  9. </action>
  10. <actionname="image" class="com.tarena.netctoss.action.ImageAction">
  11. <resulttype="stream">
  12. <paramname="inputName">imageStream</param>
  13. </result>
  14. </action>
  15. </package>
<package name="login" extends="struts-default">

		<!-- 登录处理 -->
		<action name="toLogin">
			<result name="success">/WEB-INF/login.jsp</result>
		</action>

		<action name="login" class="com.tarena.netctoss.action.LoginAction">
			<result name="success">/WEB-INF/main.jsp</result>
			<result name="login">/WEB-INF/login.jsp</result>
		</action>

		<action name="image" class="com.tarena.netctoss.action.ImageAction">
			<result type="stream">
				<param name="inputName">imageStream</param>
			</result>
		</action>

	</package>

e. 拷贝struts04_1中的main.jsp和login.jsp到struts05_2的WEB-INF目录下。修改login.jsp的form的action,如图-6所示。

图- 6

修改main.jsp的连接,如图-7所示。

图- 7

f.测试登录功能是否成功;测试资费的列表显示,修改,删除是否成功(测试过程略)

3.创建LoginInterceptor.java拦截器,拦截器的作用是:从session去key为“user”的value,如果取到的value是null,说明该用户没有登录,返回到登录页面。

  1. public classLoginInterceptor extends AbstractInterceptor {
  2. @Override
  3. public Stringintercept(ActionInvocationinvocation) throws Exception {
  4. Map<String,Object>session = invocation.getInvocationContext().getSession();
  5. if(session.get("user") == null){
  6. //定位到登陆界面
  7. return "login";
  8. }
  9. return invocation.invoke();
  10. }
  11. }
public class LoginInterceptor extends AbstractInterceptor {
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		Map<String,Object> session = invocation.getInvocationContext().getSession();
		if(session.get("user") == null){
			//定位到登陆界面
			return "login";
		}
		return invocation.invoke();
	}
}

4.修改struts.xml,注册LoginInterceptor,并应用到资费的修改和删除上。

  1. <?xmlversion="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
  4. "http://struts.apache.org/dtds/struts-2.1.dtd">
  5. <struts>
  6. <package name="fee" extends="json-default" namespace="/fee">
  7. <interceptors>
  8. <interceptorname="checkLogin" class="com.tarena.netctoss.interceptor.LoginInterceptor"></interceptor>
  9. <interceptor-stackname="checkLoginStack">
  10. <interceptor-refname="checkLogin"/>
  11. <interceptor-refname="defaultStack"/>
  12. </interceptor-stack>
  13. </interceptors>
  14. <global-results>
  15. <resultname="login" type="redirectAction">
  16. <paramname="actionName">toLogin</param>
  17. <paramname="namespace">/</param>
  18. </result>
  19. </global-results>
  20. <!-- 资费处理 -->
  21. <actionname="feeList"
  22. class="com.tarena.netctoss.action.fee.FeeListAction">
  23. <paramname="pageSize">3</param>
  24. <resultname="success">/WEB-INF/fee/fee_list.jsp</result>
  25. </action>
  26. <actionname="feeDelete"
  27. class="com.tarena.netctoss.action.fee.FeeDeleteAction">
  28. <interceptor-refname="checkLoginStack"/>
  29. <resultname="success" type="redirectAction">feeList</result>
  30. </action>
  31. <actionname="toAdd">
  32. <result>/WEB-INF/fee/fee_add.jsp</result>
  33. </action>
  34. <actionname="validName"
  35. class="com.tarena.netctoss.action.fee.ValidNameAction">
  36. <resulttype="json">
  37. <paramname="root">ok</param>
  38. </result>
  39. </action>
  40. <actionname="fee_*" class="com.tarena.netctoss.action.fee.FeeUpdateAction" method="{1}">
  41. <interceptor-refname="checkLoginStack"/>
  42. <resultname="success">/WEB-INF/fee/fee_modi.jsp</result>
  43. </action>
  44. </package>
  45. <package name="login" extends="struts-default">
  46. <!-- 登录处理 -->
  47. <actionname="toLogin">
  48. <resultname="success">/WEB-INF/login.jsp</result>
  49. </action>
  50. <actionname="login"
  51. class="com.tarena.netctoss.action.LoginAction">
  52. <resultname="success">/WEB-INF/main.jsp</result>
  53. <resultname="login">/WEB-INF/login.jsp</result>
  54. </action>
  55. <actionname="image"
  56. class="com.tarena.netctoss.action.ImageAction">
  57. <resulttype="stream">
  58. <paramname="inputName">imageStream</param>
  59. </result>
  60. </action>
  61. </package>
  62. </struts>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
	"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<package name="fee" extends="json-default" namespace="/fee">
		
		<interceptors>
			<interceptor name="checkLogin" class="com.tarena.netctoss.interceptor.LoginInterceptor"></interceptor>
			<interceptor-stack name="checkLoginStack">
				<interceptor-ref name="checkLogin"/>
				<interceptor-ref name="defaultStack"/>
			</interceptor-stack>
		</interceptors>
		
		<global-results>
			<result name="login" type="redirectAction">
				<param name="actionName">toLogin</param>
				<param name="namespace">/</param>
			</result>
		</global-results>

<!-- 资费处理 -->
		<action name="feeList"
			class="com.tarena.netctoss.action.fee.FeeListAction">
			<param name="pageSize">3</param>
			<result name="success">/WEB-INF/fee/fee_list.jsp</result>
		</action>
		
		<action name="feeDelete"
			class="com.tarena.netctoss.action.fee.FeeDeleteAction">
			<interceptor-ref name="checkLoginStack"/>
			<result name="success" type="redirectAction">feeList</result>
		</action>
		
		<action name="toAdd">
			<result>/WEB-INF/fee/fee_add.jsp</result>
		</action>
		
		<action name="validName" 
			class="com.tarena.netctoss.action.fee.ValidNameAction">
			<result type="json">
				<param name="root">ok</param>
			</result>
		</action>
		
		<action name="fee_*" class="com.tarena.netctoss.action.fee.FeeUpdateAction" method="{1}">
			<interceptor-ref name="checkLoginStack"/>
			<result name="success">/WEB-INF/fee/fee_modi.jsp</result>
		</action>
		
		
	</package>
	
	<package name="login" extends="struts-default">
	
	<!-- 登录处理 -->
		<action name="toLogin">
			<result name="success">/WEB-INF/login.jsp</result>
		</action>
		
		<action name="login"
			class="com.tarena.netctoss.action.LoginAction">
			<result name="success">/WEB-INF/main.jsp</result>
			<result name="login">/WEB-INF/login.jsp</result>
		</action>
		
		<action name="image"
			class="com.tarena.netctoss.action.ImageAction">
			<result type="stream">
				<param name="inputName">imageStream</param>
			</result>
		</action>
		
	</package>
	
</struts>

5. 测试,访问http://localhost:8080/struts05_2/fee/feeList.action,如图-8所示。

图- 8

点击“修改”,返回到登录页面,如图-9所示。

图- 9

输入正确的用户名和密码,点击登录,进入main.jsp,如图-10所示。

图- 10

点击资费管理进入列表页,再次点击修改,进入修改页面,如图-11所示。

图- 11

删除的拦截过程和修改类似,请学员自己测试。

分享到:
评论

相关推荐

    jsp项目开发实录 Struts 实现 程序完整Struts 实现 程序完整

    程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 ...

    Struts2工作流程图

    虽然Struts2号称是一个全新的框架,但这仅仅是相对Struts 1而言。Struts 2 与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框架,而是在另一个赫赫有名的框架:WebWork基础上发展起来的。从某种程度...

    Struts2工作流程

    在深入理解Struts2的工作流程之前,我们需要先了解一些基本概念。 1. **MVC模式**: MVC模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。模型负责业务逻辑,视图负责显示...

    struts2工作流程

    在深入探讨Struts2的工作流程之前,我们先了解一下MVC模式的基本概念。MVC模式将应用逻辑分隔为三个部分:模型(Model)处理业务逻辑,视图(View)负责展示数据,控制器(Controller)协调用户输入和模型间的交互。...

    struts2小程序 struts2代码

    这些配置是理解程序工作流程的关键。 3. **Interceptor拦截器**:拦截器允许在Action执行前后插入自定义逻辑,如日志、权限检查等。在项目中,可能会看到如`params`、`validation`、`exception`等内置拦截器的使用...

    struts2完整例子

    这个“struts2完整例子”压缩包提供了学习和理解Struts2核心概念的实际示例。让我们深入探讨一下Struts2的关键知识点。 1. **MVC架构**:Struts2遵循MVC设计模式,它将业务逻辑(模型)、用户界面(视图)和应用...

    Jquery 整合 struts2 完整例子

    这个"Jquery 整合 struts2 完整例子"提供了一个很好的学习平台,可以帮助开发者理解这两者如何协同工作,提升Web开发技能。在myEclipse中,只需导入该项目,配置好Tomcat服务器,然后运行,就能看到实际效果。对于...

    Struts2的工作流程及配置文件

    ### Struts2的工作流程及配置文件详解 #### 一、Struts2简介 Struts2是基于MVC设计模式的Java Web开发框架之一,它继承了Struts1的优点,并在此基础上进行了大量的改进和扩展。Struts2框架的核心是拦截器...

    struts2完整压缩包

    这个"struts2完整压缩包"很可能包含了Struts2框架的全部组件、库文件、文档、示例代码以及必要的配置文件,使得开发者可以快速地在自己的项目中集成并使用Struts2。 Struts2的核心概念基于Model-View-Controller...

    struts2完整版

    Struts2是一个基于MVC(Model-View-Controller)架构的Java Web框架,它是在WebWork2的基础上发展起来的。相较于Struts1,Struts2提供了许多改进和新特性,使其成为更优的选择。 首先,Struts2采用了无侵入式设计,...

    Struts2 工作原理 Struts2框架 有图

    Struts2框架作为Java Web开发领域中的一款经典MVC(Model-View-Controller)框架,其工作原理涉及到了一系列复杂的组件交互与流程控制。本文将深入解析Struts2的工作流程,帮助开发者理解其核心机制。 ### 一、...

    Struts2工作机制

    总的来说,Struts2的工作流程大致为:请求到达-&gt;过滤器Dispatcher拦截-&gt;查找Action映射-&gt;创建Action实例-&gt;执行拦截器链-&gt;调用Action的execute方法-&gt;返回Result-&gt;渲染视图。这种设计允许开发者将业务逻辑、数据验证、...

    struts2框架处理流程

    包含了struts2的处理流程以及struts2的配置文件,并附有处理流程显示图,更加清楚直观。

    struts2实例小程序1

    在这个“Struts2实例小程序1”中,你将开始接触并理解Struts2的基本概念和工作流程,这对于初学者来说是一个很好的起点。 1. **Struts2入门**: - **MVC模式**:Struts2遵循MVC设计模式,将业务逻辑、数据和展示...

    Struts2详细工作流程

    这个框架的工作流程简化了与Struts1相比的操作,更接近WebWork的设计,因此Struts2可视为WebWork的升级版。 在Struts2框架中,FilterDispatcher是核心控制器,它负责处理HTTP请求并控制应用程序的行为。当客户端...

    struts1的工作流程

    ### Struts1的工作流程详解 #### 一、概述 Struts1是Apache Struts的第一个版本,它是基于Java Servlet/JavaServer Pages技术构建的MVC框架。对于初学者来说,了解Struts1的工作流程是非常重要的,这有助于理解...

    Struts2 应用程序示例

    总之,这个"Struts2应用程序示例"是一个完整的、实践性强的学习资源,涵盖了Struts2框架的诸多关键特性。通过分析和修改这个示例,你可以快速掌握Struts2的精髓,并能自如地应用到自己的项目中。

    struts2完整的Hello Word例子。

    在本示例中,"struts2完整的Hello Word例子"是帮助开发者理解并熟悉Struts2基本工作原理和配置的一个入门级教程。下面将详细介绍这个Hello World应用的关键知识点。 1. **Struts2框架概述**: Struts2作为继Struts...

    struts2所有jar包程序文件

    Struts2框架的jar包通常包括核心库、插件、依赖库等,它们共同协作以提供完整的功能。这些jar文件是Struts2框架运行的基础,开发者需要将它们添加到项目的类路径中,以便能够利用Struts2的各种特性。 Struts2的核心...

Global site tag (gtag.js) - Google Analytics