struts的执行流程
客户端请求被StrutsPrepareAndExecuteFilter拦截之后,调用doFilter方法
在doFilter中调用execute.executeAction(request,response, mapping);
也就是ExecuteOperations类的executeAction方法
在该方法中调用了dispatcher的serviceAction方法,也就是Dispatcher类的serviceAction方法。
在该方法中首先根据要调用的action的namespace、actionName,methodName获取了ActionProxy,也就是要调用的Action的一个代理类实例(动态代理),通过proxy.execute()方法来执行Action的调用过程,该调用过程使用的是责任链设计模式。该方法就是StrutsActionProxy中的execute方法:
在execute方法中,返回的是invocation.invoke()的返回值。
DefaultActionInvocation中的invoke方法就利用责任链模式,调用目标action的各个拦截器,最终调用Action的方法,resultCode=invokeActionOnly()方法。
在invokeAction方法中,使用OGNL调用action类的method方法,获取返回值。
当DefaultActionInvocation执行完action之后,处理结果:
executeResult()方法
该方法最终会调用StrutsResultSupport的execute方法,并调用其doExecute方法,也就是实现类的doExecute方法。
例如ServletDispatcherResult中的doExecute方法:
public void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { if (LOG.isDebugEnabled()) { LOG.debug("Forwarding to location " + finalLocation); }
PageContext pageContext = ServletActionContext.getPageContext();
if (pageContext != null) { pageContext.include(finalLocation); } else { HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); RequestDispatcher dispatcher = request.getRequestDispatcher(finalLocation);
//add parameters passed on the location to #parameters // see WW-2120 if (StringUtils.isNotEmpty(finalLocation) && finalLocation.indexOf("?") > 0) { String queryString = finalLocation.substring(finalLocation.indexOf("?") + 1); Map<String, Object> parameters = getParameters(invocation); Map<String, Object> queryParams = urlHelper.parseQueryString(queryString, true); if (queryParams != null && !queryParams.isEmpty()) parameters.putAll(queryParams); }
// if the view doesn't exist, let's do a 404 if (dispatcher == null) { response.sendError(404, "result '" + finalLocation + "' not found"); return; }
//if we are inside an action tag, we always need to do an include Boolean insideActionTag = (Boolean) ObjectUtils.defaultIfNull(request.getAttribute(StrutsStatics.STRUTS_ACTION_TAG_INVOCATION), Boolean.FALSE);
// If we're included, then include the view // Otherwise do forward // This allow the page to, for example, set content type if (!insideActionTag && !response.isCommitted() && (request.getAttribute("javax.servlet.include.servlet_path") == null)) { request.setAttribute("struts.view_uri", finalLocation); request.setAttribute("struts.request_uri", request.getRequestURI());
dispatcher.forward(request, response); } else { dispatcher.include(request, response); } } } |
第二章 线程安全
第一节 什么是线程安全
线程安全是指,在一个进程中,如果有多线程并发执行的情况,那么每个线程执行的过程中,都要保证数据和结果的一致性.反之则线程不安全.
其根源是: 在多线程环境中,是否有临界资源,临界资源是否为线程安全的临界资源.
第二节 Struts2是否线程安全
Struts2是线程安全的框架:
原因: Struts2为每个请求单独创建一个Action对象.
优点: 每个线程一个Action对象,对象属性数据线程独立.可以保存请求参数
缺点: 每次请求都需要创建Action对象,降低处理效率,提高内存压力.不适用于髙并发,大数据访问的项目.
注意: 因为Struts2框架创建Action对象使用的是反射技术.必须为Action类提供一个无参构造方法.
第三章 Struts2配置文件详解二
第一节 结果配置 : result标签
result标签为action标签的子标签.
所有的type类型都已经在struts-default.xml中定义过了,每一个结果类型都有一个struts2中的java类相对应。
dispatcher | org.apache.struts2.dispatcher.ServletDispatcherResult |
chain | com.opensymphony.xwork2.ActionChainResult |
redirect | org.apache.struts2.dispatcher.ServletRedirectResult |
redirectAction | org.apache.struts2.dispatcher.ServletActionRedirectResult |
plainText | org.apache.struts2.dispatcher.PlainTextResult |
如果想了解详情,可以直接通过类名查看源码,也可以直接从javadoc文档中查找。
dispatcher:
chain:
例如:
redirect:
redirectAction:
例如:
plainText:
ResultsAction.java
package com.bjsxt.demo.action;
import com.opensymphony.xwork2.ActionSupport;
public class ResultsAction extends ActionSupport {
private String type;
public String getType() { return type; }
public void setType(String type) { this.type = type; }
@Override public String execute() throws Exception { System.out.println("type = " + type); return type; } }
|
OtherAction.java
package com.bjsxt.demo.action;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
/** * 如果是forward跳转,就可以获取对上一个action的请求参数如果是redirect跳转,就不能获取对上一个action的请求参数 * * @author Administrator */ public class OtherAction extends ActionSupport { private String myHello;
public String getMyHello() { return myHello; }
public void setMyHello(String myHello) { this.myHello = myHello; }
@Override public String execute() throws Exception { System.out.println("你已经访问了OtherAction的execute()方法");
HttpServletRequest req = ServletActionContext.getRequest(); String typeStr = req.getParameter("type"); System.out.println("typeStr = " + typeStr);
String helloStr = req.getParameter("myHello"); System.out.println("重定向请求参数:myHello = " + helloStr);
return SUCCESS; }
}
|
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" /> <constant name="struts.devMode" value="true" /> <package name="resultPkg" namespace="/result" extends="struts-default"> <action name="resultAction" class="com.bjsxt.demo.action.ResultsAction"> <!-- forward跳转到jsp页面 --> <!-- dispatcher(默认值),只能跳转到jsp --> <result name="DIS" type="dispatcher"> /success.jsp </result> <!-- forward跳转到一个action --> <!-- chain:跳转到javabean(应用控制器) --> <result name="CHA" type="chain"> <!-- 要forward到的action名称 --> <param name="actionName">otherAction</param> <!-- 要forward到的action所在命名空间 --> <param name="namespace">/other</param> <!-- 要forward到的action应该执行的方法,如果不设置,则默认为execute方法 --> <!-- <param name="method"></param> --> </result> <!-- 重定向到jsp页面 --> <result name="RED" type="redirect"> /success.jsp </result> <!-- 重定向到javabean --> <!-- 重定向到一个action --> <result name="REA" type="redirectAction"> <!-- 要重定向到的action名称 --> <param name="actionName">otherAction</param> <!-- 要重定向到的action所在命名空间 --> <param name="namespace">/other</param> <!-- 所带参数 --> <param name="myHello">myNameIsZhangSan</param> </result> <!-- 将结果页面按照源码返回给客户端 --> <result name="PLA" type="plainText"> <param name="location">/pla_success.jsp</param> <param name="charSet">utf-8</param> </result> </action> </package> <package name="otherPkg" namespace="/other" extends="struts-default"> <action name="otherAction" class="com.bjsxt.demo.action.OtherAction"> <!-- dispatcher表示forward到一个jsp页面 --> <result name="success" type="dispatcher"> /other/other_success.jsp </result> </action> </package> </struts>
|
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>struts_demo_002</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> </web-app> |
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <a href="result/resultAction.action?type=DIS">dispatcher</a><br> <a href="result/resultAction.action?type=CHA">chain</a><br> <a href="result/resultAction.action?type=RED">redirect</a><br> <a href="result/resultAction.action?type=REA">redirectAction</a><br> <a href="result/resultAction.action?type=PLA">plainText</a><br> </body> </html> |
success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> 成功页面 </body> </html> |
pla_success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <% String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/"; %> <% out.print(basePath); %> </body> </html> |
other/other_success.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> otherAction的成功页面 </body> </html> |
第二节
常量可以被配置在多个文件中,常量按照下面的顺序来查找,后面查找到的常量可以覆盖先前查找到的常量值:
1、struts-default.xml
2、struts-plugin.xml
3、struts.xml
4、struts.properties
5、web.xml
所有可用常量:
常量配置一 : struts.xml文件中的constant标签
constant标签与package标签平行.
配置应用字符集
配置自定义访问扩展名
配置开发者模式
配置自动重新加载WEB应用
常量配置二 :struts.properties
Struts2框架提供了灵活的常量配置方式.除了使用struts.xml配置文件配置常量以外,还可以通过properties配置文件来配置框架常量数据.
要求:
文件命名: struts.properties
文件存放位置: classpath下. 即src或WebContent/WEB-INF/classes文件夹中
示例:
第四节 全局配置
配置默认动作引用 :default-action-ref标签
配置默认的Action类引用 :default-class-ref标签
这个标签在struts-default.xml配置文件中以配置.默认Action类为:
com.opensymphony.xwork2.ActionSupport
默认服务行为是: 无任何逻辑行为.直接返回Action.SUCCESS
配置全局结果集 :global-results标签
package标签中子标签的配置顺序
Struts2框架配置文件中,package标签为程序员常用配置标签.其中有若干子标签.现阶段已学的标签配置顺序如下:
第五节 配置文件加载顺序
Struts中不仅只有程序员编写的配置文件.其配置文件分为三大类别,具体如下:
1. 框架内置核心配置文件: struts-default.xml
2. 框架插件配置文件:struts-plugin.xml
3. 开发自定义配置文件: struts.xmls
其配置文件加载顺序为:
第四章 访问ServletAPI
第一节 解耦访问方式
优势: 解耦访问方式可以让代码可以脱离中间价组件环境进行代码的测试.可以在一定的程度上提供开发的效率.
借助Struts2提供的API访问ServletAPI
通过ActionContext类访问ServletAPI
第二节 耦合访问方式
通过ServletActionContext类访问ServletAPI
通过实现ServletRequestAware接口访问HttpServletRequest
第五章ActionContext详解
第一节ActionContext定义
ActionContext是一个Map集合结构的数据容器. 是Action的上下文对象.
ActionContext中保存的是当前执行中的Action对象,在执行过程中有关联的数据信息. 如:
1. Request变量作用域数据
2. Session变量作用域数据
3. ServletContext变量作用域数据
4. ActionInvocation对象
5. Local数据
6. Conversion Errors等
Struts2框架会为每个线程创建一个ActionContext对象.因为ActionContext对象线程独立,所以线程安全.
Struts2框架为了绑定ActionContext对象与对应线程的关系, 使用了ThreadLocal容器来管理ActionContext对象.
PS: 上下文就是与这个对象有关系的其他对象组成的一个集合.
第二节ActionContext对象获取
ActionContext对象是通过类中定义的静态方法getContext()获取的.
因ActionContext对象是通过静态方法获取的.也可以在非Action类中调用这个方法并访问ActionContext对象中的数据.
注意: ActionContext对象是基于请求对象HttpServletRequest创建的.所以在非请求启动的线程代码中不能访问ActionContext.如: Filter接口中的init()方法.
第三节ActionContext执行流程
第四节ActionContext中的主要数据对象
补充: ThreadLocal
ThreadLocal应用
代码:
结果:
模拟ThreadLocal实现
尽量理解,不做重点掌握.
第六章 值栈和OGNL表达式
第一节 什么是值栈
值栈 ValueStack : 其是ActionContext中的一个数据对象. ValueStack是栈数据结构实现的类型.
栈的特征: 先进后出 [FILO : First InLast Out]
数据: 值栈的栈顶元素是处理当前请求的Action对象.
《struts2 in action》
第二节 OGNL表达式简介
什么是表达式: 表达式就是使用简单的语法来完成相对复杂的功能. 如: EL,Regex,OGNL等.
OGNL表达式: 对象图形导航语言(Object-Graph Navigation Language). 其优势如下:
1. 能够访问对象的普通方法
2. 能够访问类的静态属性和静态方法
3. 强大的操作集合类对象的能力
4. 支持赋值操作和表达式串联
5. 在Struts2框架中,可以结合Struts2标签库访问OGNL上下文和ActionContext
第三节 OGNL类库简单应用
OGNL表达式将数据集合看成是上下文[context], 将简单数据对象看成是根对象[root].
在Struts2框架体系中,通过Struts2标签库可以使用OGNL表达式访问代码执行过程中的数据. OGNL表达式将ActionContext对象看成是上下文对象, 将ValueStack对象看成是根对象.
通过OGNL表达式访问ValueStack对象:
OGNL表达式将ValueStack对象中Action内部的property,直接看作是ValueStack对象的property.
第四节Struts2标签库 & OGNL表达式
Step1: web.xml配置文件
注意: Struts2标签库需要前端控制器来解析.所以使用Struts2标签库的页面在访问的时候,必须先经过StrutsPrepareAndExecuteFilter的过滤. 使用方案如下:
1. 在web.xml配置文件中修改前端控制器的过滤路径匹配规则
2. 所有使用Struts2标签的页面都经过Action进行请求转发, 推荐使用本方式.当前示例使用方式
Step2: 代码
Step3: struts.xml配置文件
Step4: JSP代码
index.jsp
success.jsp 当前页面保存位置为: /WEB-INF/success.jsp
Step5: 访问Action
Step6: 访问结果
第七章 类型转换
第一节 简单类型请求数据处理
如果请求参数的数据类型为八种基本类型,对应包装类型,常用基础类型[如:String, Date等]. Struts2框架会负责数据类型的自动转换.不需要程序员手工转换,减少重复代码. 可以通过属性驱动模式处理请求参数. 详见第八章第一节
第二节 自定义类型请求数据处理
如果请求参数与Action类中的自定义类型属性有关系.可以通过域驱动模式处理请求参数.详见第八章第二节
第三节 复杂类型请求数据处理
如果请求参数是复杂数据,那么Struts2框架可能无法提供合适的数据转换方式.如:一个请求参数[ path.action?point=(100,200) ]对应的是一个自定义Java类型对象[ class Point{} ]. 如果出现了这种情况,且有反复应用的可能.那么可以使用Struts2框架提供的类型转换器来实现数据的处理.
使用converter进行数据转换,必须提供一个properties配置文件,其位置在classpath下,文件命名为:xwork-conversion.properties. 文件内容为:需要转换的实体类名=转换器类名.
案例: 将请求参数字符串”(100,200)”转换成自定义类型对象
Step1: web.xml配置文件
Step2: 请求JSP代码
Step3: 代码
自定义类Point代码
Action代码
类型转换器代码
转换器配置文件xwork-conversion.xml
Step4: struts.xml配置文件
Step5: 结果JSP代码注意页面位置:/WEB-INF/success.jsp
Step6: 访问Action
Step7: 访问结果
第八章 数据校验
Struts2框架中提供了完善的服务器端校验机制. 想要使用Struts2框架提供的校验机制, 自定义Action类必须继承Struts2框架提供的ActionSupport类. 校验逻辑定义在validate方法中.
案例: 验证登录信息完整性
Step1: web.xml配置文件
Step2: 请求JSP代码
index.jsp
Step3: 代码
Step4: struts.xml配置文件
Step5: 结果JSP代码
success.jsp
login.jsp
Step6: 访问Action
提交合法数据
提交不合法数据
Step7: 访问结果
正确结果
错误结果
校验机制执行流程
Struts2框架的校验机制有明确的执行流程.具体如下:
校验相关方法详解
所有的数据校验逻辑都是建立在自定义Action类继承ActionSupport类的基础之下的.
validate方法
当自定义Action继承ActionSupport类时,validate方法一定会被调用,且在服务方法执行前被调用.
这个方法中通常用于定义通用的验证逻辑.
方法签名为:
addFieldError方法
此方法为ActionSupport类定义的方法. 其功能是向错误信息集合中添加错误信息. 此错误信息粒度细致,定位到属性校验错误信息.
方法签名为:
参数详解:
fieldName: 为属性错误信息命名
errorMessage: 具体错误信息描述
方法根源:
此方法调用了ValidationAwareSupport中定义的addFieldError方法.
ValidationAwareSupport类中定义了Map集合属性:fieldErrors.此属性中保存属性错误信息.Map集合的key是字符串类型,value是List集合类型.也就是说,一个错误信息命名(fieldName)可以对应若干错误信息描述(errorMessage)
addActionError方法
此方法为ActionSupport类定义的方法. 其功能是向错误信息集合中添加错误信息.此错误信息粒度粗糙,定位到动作校验错误信息. 此错误信息是用于描述动作(Action)的校验错误,所以没有错误信息命名.
方法签名为:
参数详解:
anErrorMessage: 具体错误信息描述.
方法根源:
此方法调用了ValidationAwareSupport中定义的addActionError方法.
ValidationAwareSupport类中定义了Collection集合属性:actionErrors.此属性中保存属性错误信息.集合泛型为字符串.一个动作可以有若干错误信息.
validateXxx方法
此结构的方法由Struts2框架自动调用.定义与调用规则如下:
当前请求对应的服务方法为login. 那么Struts2框架会检索提供服务的Action类中是否定义了validateLogin方法.如果定义了validateLogin方法,则调用方法进行数据校验.
且validate校验方法一定会被调用.
如果与当前请求对应的服务方法为execute.那么Struts2框架只会调用validate方法进行数据校验.
Action代码示例:
第九章 拦截器 Interceptor
拦截器的作用
拦截器是为Action增加扩展功能的组件. 一般用于编写Action的公共处理功能. 如:权限控制,日志等.
注意: 拦截器在Struts2框架中是单例的.注意线程安全问题.
struts2的action是线程安全的,对每次访问,都会实例化一个action实例。
拦截器相关概念
拦截器: 与过滤器类似的一种Struts2框架组件. 在Action服务方法执行前后,为服务方法增加扩展功能. Struts2框架的核心功能基本都是通过拦截器实现的.
拦截器栈: 多个拦截器以栈的形式组合在一起就是拦截器栈.在某种程度上,可以将拦截器栈看作是一个功能复杂的大型拦截器.
拦截器分类
普通拦截器: 拦截粒度粗糙, 只能对配置的请求路径映射进行拦截
方法拦截器: 拦截粒度细致, 可以对配置的包含方法或排除方法进行选择性拦截
拦截器相关设计模式
拦截器的应用是使用代理设计模式实现的.
多个拦截器的配合是使用责任链设计模式实现的.
拦截器的执行流程
拦截器实现步骤
1. 编写拦截器
2. 配置拦截器(struts.xml)
3. 使用拦截器(struts.xml)
普通拦截器案例:
Step1: web.xml配置文件
Step2: 请求JSP代码 index.jsp
Step3: 代码
Action代码
拦截器代码: 实现Interceptor接口
拦截器代码: 继承AbstractInterceptor
Step4: struts.xml配置文件
Step5: 结果JSP代码注意页面位置:/WEB-INF/success.jsp
Step6: 访问Action
Step7: 访问结果 : 控制台输出结果
方法拦截器案例:
Step1: web.xml配置文件
Step2: 请求JSP代码
Step3: 代码
Action代码
拦截器代码
Step4: struts.xml配置文件
Step5: 结果JSP代码注意页面位置:/WEB-INF/success.jsp
成功 : success.jsp
失败 : login.jsp
Step6: 访问Action
Step7: 访问结果
登录: 控制台结果
注册: 控制台结果
注销: 控制台结果
ActionInvocation详解
ActionInvocation称为动作执行器.是Struts2框架中用于处理请求的核心类之一.其与ActionProxy(动作代理器)配合完成具体的业务服务功能.
ActionInvocation是一个接口类型. 其默认使用的实现类为DefaultActioninvocation.这个类内部保有大量与Action服务流程相关的资源,如:
Actioninvocation常用方法:
ActionProxy详解
ActionProxy称为动作代理器. 是Struts2框架中用于处理请求的核心类之一.其与ActionInvocation(动作执行器)配合完成具体的业务服务功能.
ActionProxy是一个接口类型. 其默认使用的实现类为DefaultActionProxy.这个类内部保有大量与Action配置相关的资源,如:
ActionProxy常用方法:
拦截器相关配置标签详解
<interceptors>
此为package标签的子标签. 在package标签中只能定义0或1次.定义时需定义在action标签之前. 代表定义若干个拦截器.且当前标签不能为空标签,必须为其定义至少一个子标签: interceptor标签或interceptor-stack标签.
<interceptor>
此标签为interceptors标签的子标签. 在interceptors标签中可以定义0~n次.没有特定的顺序要求. 代表定义一个拦截器. 当前标签可以为空标签.可定义的子标签有: param标签.
子标签param: 为当前拦截器中的属性赋值. 详见<param>
属性:
name : 必要属性, 为当前拦截器命名,此属性值需要全局唯一.
class : 必要属性, 配置当前拦截器类的全命名.
<interceptor-stack>
此标签为interceptors标签的子标签. 在interceptors标签中可以定义0~n次.没有特定的顺序要求. 代表定义一个拦截器栈. 当前标签可以为空标签(空的拦截器栈无实际意义). 一个拦截器栈在某种意义上可以看作是一个复杂的拦截器. 可定义的子标签有: interceptor-ref标签.
子标签interceptor-ref引用其他已配置的拦截器,代表当前拦截器栈中装载的拦截器对象. 详见: <interceptor-ref>
属性:
name : 必要属性, 为当前拦截器栈命名,此属性值需要全局唯一.
< interceptor-ref>
此标签为interceptor-stack标签和action标签的子标签. 在interceptor-stack标签和action标签中可以定义0~n次.代表引用已定义好的拦截器或拦截器栈. 此标签可以为空标签. 可以定义的子标签有: param标签.
子标签param: 为当前引用的拦截器中的属性赋值.详见<param>
属性:
name : 必要属性, 代表引用的拦截器或拦截器栈. 具体数据为拦截器或拦截器栈的name属性值.
< default-interceptor-ref>
此标签为package标签的子标签.在package标签中只能定义0或1次.定义时需定义在interceptors标签之后,action标签之前. 当前标签没有子标签. 代表当前包中所有的action在不配置interceptor-ref的时候,默认使用的拦截器.
属性:
name : 必要属性, 代表引用的拦截器或拦截器栈. 具体数据为拦截器或拦截器栈的name属性值.
<param>
此标签用于为属性赋值. 必须是其他标签的子标签. 当前标签没有子标签.
属性:
name : 必要属性, 代表要赋值的属性的property命名.
标签体:
标签体数据就是具体的数据值.
拦截器相关配置标签案例
第十章 文件上传
第一节 单一文件上传
案例
Step1: web.xml配置文件
Step2: 请求JSP代码
Step3: 代码
Step4: struts.xml配置文件
Step5: 结果JSP代码注意页面位置:/WEB-INF/success.jsp
Step6: 访问Action 略
Step7: 访问结果 略
第二节 批量文件上传
案例
Step1: web.xml配置文件
Step2: 请求JSP代码
Step3: 代码
Step4: struts.xml配置文件
Step5: 结果JSP代码注意页面位置:/WEB-INF/success.jsp
Step6: 访问Action 略
Step7: 访问结果 略
总结
JSP页面元素
form表单提交方式必须是POST
form表单MIME-type的值必须是multipart/form-data.即: enctype=”multipart/form-data”
Action类定义
File类型属性处理上传文件
String类型属性处理文件名和文件类型
插件包
commons-io.jar
commons-fileupload.jar
第十一章 文件下载
第一节 使用响应流处理文件下载
案例
Step1: web.xml配置文件
Step2: 请求JSP代码
Step3: 代码
Step4: struts.xml配置文件
Step5: 结果JSP代码 无
Step6: 访问Action 略
Step7: 访问结果 略
第二节 使用Struts2框架提供的结果集处理文件下载
案例
Step1: web.xml配置文件
Step2: 请求JSP代码
Step3: 代码
Step4: struts.xml配置文件
Step5: 结果JSP代码无
Step6: 访问Action 略
Step7: 访问结果 略
第十二章 Struts2 & AJAX
第一节 通过ServletAPI实现AJAX访问
案例
Step1: web.xml配置文件
Step2: 请求JSP代码
接收服务器返回普通信息
接收服务器返回JSON对象
Step3: 代码
处理普通返回消息
处理JSON返回消息
Step4: struts.xml配置文件
Step5: 结果JSP代码无
Step6: 访问Action 略
Step7: 访问结果 略
第二节 通过Struts2插件实现AJAX访问
Struts2框架提供了JSON消息处理插件.使用需导入依赖类库:
1. commons-beanutils-1.8.0.jar
2. commons-collections-3.1.jar
3. commons-lang-2.4.jar
4. commons-logging-1.1.3.jar
5. ezmorph-1.0.6.jar
6. json-lib-2.3-jdk15.jar
7. struts2-json-plugin-2.3.28.1.jar
依赖此插件实现的AJAX服务端功能,向客户端发送的数据统一为JSON格式.
案例
Step1: web.xml配置文件
Step2: 请求JSP代码
Step3: 代码
实体类型
Action类
Step4: struts.xml配置文件
Step5: 结果JSP代码无
Step6: 访问Action 略
Step7: 访问结果 略
第十二章 Struts2的注解实现
Struts2框架的注解开发模式由插件实现.使用注解需要导入插件类库:
1. struts2-convention-plugin-2.3.28.1.jar
使用插件开发Struts2代码需遵循下述规则:
1. Action类必须定义在action包中.此包可以有父包.
2. 部分版本要求Action必须继承ActionSupport类.
Struts2框架的注解开发模式并不是非常友好.难以大幅提高开发效率.应用场景相对较少.
案例
Step1: web.xml配置文件
Step2: 请求JSP代码
Step3: 代码
Step4: struts.xml配置文件 无
Step5: 结果JSP代码略
Step6: 访问Action略
Step7: 访问结果略