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 阅读下面的代码,并在指定位置添加注释。
- <struts>
- <package name="day05" extends="struts-default">
- <interceptors>
- <!—此行代码的作用是( 注册SomeInterceptor拦截器 )-->
- <interceptorname="someInterceptor"
- class="com.tarena.interceptor.SomeInterceptor" />
- </interceptors>
- <actionname="some"
- class="com.tarena.action.SomeAction">
- <!—此行代码的作用是( 使用SomeInterceptor拦截器 )-->
- <interceptor-refname="someInterceptor"/>
- <result>/WEB-INF/jsp/ok.jsp</result>
- </action>
- </package>
- </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,内容如下:
- import java.util.Map;
- import org.apache.struts2.interceptor.RequestAware;
- import org.apache.struts2.interceptor.SessionAware;
- public classBaseAction 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;
- }
- }
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,添加如下关于登录的配置:
- <package name="login" extends="struts-default">
- <!-- 登录处理 -->
- <actionname="toLogin">
- <resultname="success">/WEB-INF/login.jsp</result>
- </action>
- <actionname="login" class="com.tarena.netctoss.action.LoginAction">
- <resultname="success">/WEB-INF/main.jsp</result>
- <resultname="login">/WEB-INF/login.jsp</result>
- </action>
- <actionname="image" class="com.tarena.netctoss.action.ImageAction">
- <resulttype="stream">
- <paramname="inputName">imageStream</param>
- </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>
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,说明该用户没有登录,返回到登录页面。
- public classLoginInterceptor extends AbstractInterceptor {
- @Override
- public Stringintercept(ActionInvocationinvocation) throws Exception {
- Map<String,Object>session = invocation.getInvocationContext().getSession();
- if(session.get("user") == null){
- //定位到登陆界面
- return "login";
- }
- return invocation.invoke();
- }
- }
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,并应用到资费的修改和删除上。
- <?xmlversion="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>
- <interceptorname="checkLogin" class="com.tarena.netctoss.interceptor.LoginInterceptor"></interceptor>
- <interceptor-stackname="checkLoginStack">
- <interceptor-refname="checkLogin"/>
- <interceptor-refname="defaultStack"/>
- </interceptor-stack>
- </interceptors>
- <global-results>
- <resultname="login" type="redirectAction">
- <paramname="actionName">toLogin</param>
- <paramname="namespace">/</param>
- </result>
- </global-results>
- <!-- 资费处理 -->
- <actionname="feeList"
- class="com.tarena.netctoss.action.fee.FeeListAction">
- <paramname="pageSize">3</param>
- <resultname="success">/WEB-INF/fee/fee_list.jsp</result>
- </action>
- <actionname="feeDelete"
- class="com.tarena.netctoss.action.fee.FeeDeleteAction">
- <interceptor-refname="checkLoginStack"/>
- <resultname="success" type="redirectAction">feeList</result>
- </action>
- <actionname="toAdd">
- <result>/WEB-INF/fee/fee_add.jsp</result>
- </action>
- <actionname="validName"
- class="com.tarena.netctoss.action.fee.ValidNameAction">
- <resulttype="json">
- <paramname="root">ok</param>
- </result>
- </action>
- <actionname="fee_*" class="com.tarena.netctoss.action.fee.FeeUpdateAction" method="{1}">
- <interceptor-refname="checkLoginStack"/>
- <resultname="success">/WEB-INF/fee/fee_modi.jsp</result>
- </action>
- </package>
- <package name="login" extends="struts-default">
- <!-- 登录处理 -->
- <actionname="toLogin">
- <resultname="success">/WEB-INF/login.jsp</result>
- </action>
- <actionname="login"
- class="com.tarena.netctoss.action.LoginAction">
- <resultname="success">/WEB-INF/main.jsp</result>
- <resultname="login">/WEB-INF/login.jsp</result>
- </action>
- <actionname="image"
- class="com.tarena.netctoss.action.ImageAction">
- <resulttype="stream">
- <paramname="inputName">imageStream</param>
- </result>
- </action>
- </package>
- </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
删除的拦截过程和修改类似,请学员自己测试。
相关推荐
程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 程序完整Struts 实现 ...
虽然Struts2号称是一个全新的框架,但这仅仅是相对Struts 1而言。Struts 2 与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框架,而是在另一个赫赫有名的框架:WebWork基础上发展起来的。从某种程度...
在深入理解Struts2的工作流程之前,我们需要先了解一些基本概念。 1. **MVC模式**: MVC模式将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。模型负责业务逻辑,视图负责显示...
在深入探讨Struts2的工作流程之前,我们先了解一下MVC模式的基本概念。MVC模式将应用逻辑分隔为三个部分:模型(Model)处理业务逻辑,视图(View)负责展示数据,控制器(Controller)协调用户输入和模型间的交互。...
这些配置是理解程序工作流程的关键。 3. **Interceptor拦截器**:拦截器允许在Action执行前后插入自定义逻辑,如日志、权限检查等。在项目中,可能会看到如`params`、`validation`、`exception`等内置拦截器的使用...
这个“struts2完整例子”压缩包提供了学习和理解Struts2核心概念的实际示例。让我们深入探讨一下Struts2的关键知识点。 1. **MVC架构**:Struts2遵循MVC设计模式,它将业务逻辑(模型)、用户界面(视图)和应用...
这个"Jquery 整合 struts2 完整例子"提供了一个很好的学习平台,可以帮助开发者理解这两者如何协同工作,提升Web开发技能。在myEclipse中,只需导入该项目,配置好Tomcat服务器,然后运行,就能看到实际效果。对于...
### Struts2的工作流程及配置文件详解 #### 一、Struts2简介 Struts2是基于MVC设计模式的Java Web开发框架之一,它继承了Struts1的优点,并在此基础上进行了大量的改进和扩展。Struts2框架的核心是拦截器...
这个"struts2完整压缩包"很可能包含了Struts2框架的全部组件、库文件、文档、示例代码以及必要的配置文件,使得开发者可以快速地在自己的项目中集成并使用Struts2。 Struts2的核心概念基于Model-View-Controller...
Struts2是一个基于MVC(Model-View-Controller)架构的Java Web框架,它是在WebWork2的基础上发展起来的。相较于Struts1,Struts2提供了许多改进和新特性,使其成为更优的选择。 首先,Struts2采用了无侵入式设计,...
Struts2框架作为Java Web开发领域中的一款经典MVC(Model-View-Controller)框架,其工作原理涉及到了一系列复杂的组件交互与流程控制。本文将深入解析Struts2的工作流程,帮助开发者理解其核心机制。 ### 一、...
总的来说,Struts2的工作流程大致为:请求到达->过滤器Dispatcher拦截->查找Action映射->创建Action实例->执行拦截器链->调用Action的execute方法->返回Result->渲染视图。这种设计允许开发者将业务逻辑、数据验证、...
包含了struts2的处理流程以及struts2的配置文件,并附有处理流程显示图,更加清楚直观。
在这个“Struts2实例小程序1”中,你将开始接触并理解Struts2的基本概念和工作流程,这对于初学者来说是一个很好的起点。 1. **Struts2入门**: - **MVC模式**:Struts2遵循MVC设计模式,将业务逻辑、数据和展示...
这个框架的工作流程简化了与Struts1相比的操作,更接近WebWork的设计,因此Struts2可视为WebWork的升级版。 在Struts2框架中,FilterDispatcher是核心控制器,它负责处理HTTP请求并控制应用程序的行为。当客户端...
### Struts1的工作流程详解 #### 一、概述 Struts1是Apache Struts的第一个版本,它是基于Java Servlet/JavaServer Pages技术构建的MVC框架。对于初学者来说,了解Struts1的工作流程是非常重要的,这有助于理解...
总之,这个"Struts2应用程序示例"是一个完整的、实践性强的学习资源,涵盖了Struts2框架的诸多关键特性。通过分析和修改这个示例,你可以快速掌握Struts2的精髓,并能自如地应用到自己的项目中。
在本示例中,"struts2完整的Hello Word例子"是帮助开发者理解并熟悉Struts2基本工作原理和配置的一个入门级教程。下面将详细介绍这个Hello World应用的关键知识点。 1. **Struts2框架概述**: Struts2作为继Struts...
Struts2框架的jar包通常包括核心库、插件、依赖库等,它们共同协作以提供完整的功能。这些jar文件是Struts2框架运行的基础,开发者需要将它们添加到项目的类路径中,以便能够利用Struts2的各种特性。 Struts2的核心...