struts之四 struts的执行流程

4 篇文章 0 订阅
4 篇文章 0 订阅

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("你已经访问了OtherActionexecute()方法");

 

     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: 访问结果略

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值