在【Struts2一】 Struts Hello World http://bit1129.iteye.com/blog/2109365中配置了一个简单的Action,配置如下
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="/simple" namespace="/simple" extends="struts-default">
<action name="helloworld" class="com.tom.actions.HelloWorldAction" method="executeAction">
<result name="success">/htmls/user.jsp</result>
</action>
</package>
</struts>
result转发的四个常用类型
action配置项的子元素result包含两个属性,name和type,name属性值匹配action处理的结果,type则表示action结果的跳转类型,包含四个基本值:
1. dispatcher 表示forward,即请求跳转,当不指定type属性时,默认值就是dispatcher。request从当前action跳转到另一个视图(可以是jsp,action或者velocity等)时保持不变,跳转对用户是透明的
2. type=redirect,重定向
2.1 重定向表示重新发起一个请求,用户可以看到浏览器URL发生变化,因为是两个不同的请求,因此,当前action所对应的request,与之后的request是完全独立的,后面的request不能共享当前action对应 的request的设置的属性值
2.2 Struts2支持当前的action传递一些参数给给后面的视图,例如
<result type="redirect">/pages/abc.jsp?userId=${user.id}</result>
它表示,转发到/pages/abc.jsp时,可以带一个请求参数userId,参数值是${user.id},它表示从当前action的user对象中取出id属性,action有getUser()方法,user对象有getId()方法,这是ognl表达式
3.type=redirectAction,重定向到某个Action
3.1 跳转到同包内的Action,使用如下配置
<result type="redirectAction">helloworld</result>
它表示跳转到当前action所在包(package)下的namespace为helloworld的action
3.2 其它包下面的Action,使用如下配置
<result type="redirectAction">
<param name="actionName">otherAction</param>
<param name="namespace">otherNamespace</param>
</result>
4.plainText 纯文本内容
plainText表示要跳转的view以纯文本的方式返回内容,使用如下配置,当访问当前action时,返回的是abc.jsp的原始内容,而不是把abc.jsp解析成html代码的内容
<result type="plainText">
<param name="location">abc.jsp</param>
<param name="charSet">UTF-8</param> <!--表示以UTF-8的编码读取abc.jsp,而不是使用系统默认的字符编码-->
</result>
例子
1. /htmls/user.jsp
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<!--message定义在Action中,可以直接使用${message}-->
<!--message定义在URL的请求参数中,则使用${param.message}-->
Hello, ${message}
</body>
</html>
2. HelloWorldAction.java
package com.tom.actions;
public class HelloWorldAction {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String executeAction() {
setMessage("Welcome to the Struts2 world");
return "success";
}
}
3. struts.xml
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="resultType" namespace="/resultType" extends="struts-default">
<action name="plainText" class="com.tom.actions.HelloWorldAction" method="executeAction">
<result name="success" type="plainText">/htmls/user.jsp</result>
<!--浏览器看到的响应结果是user.jsp原始内容包括<html>等标签-->
</action>
<action name="dispatcher" class="com.tom.actions.HelloWorldAction" method="executeAction">
<result name="success" type="dispatcher">/htmls/user.jsp</result>
<!--因为是跳转,request不变,所以user.jsp中${message}应该被替换掉-->
</action>
<action name="redirect1" class="com.tom.actions.HelloWorldAction" method="executeAction">
<result name="success" type="redirect">/htmls/user.jsp</result>
<!---浏览器地址兰完整显示了user.jsp的请求地址http://localhost:8688/web/htmls/user.jsp-->
<!--${message}显示为空字符串,也就是说,如果直接请求jsp,如果jsp中JSTL没有匹配值,则显示为空-->
</action>
<action name="redirect2" class="com.tom.actions.HelloWorldAction" method="executeAction">
<result name="success" type="redirect">/htmls/user.jsp?message=${message}</result>
<!--user.jsp使用${param.message}这个JSTL表达式来接收参数-->
</action>
<action name="redirectAction1" class="com.tom.actions.HelloWorldAction" method="executeAction">
<!--HelloWorldAction转发到dispatcher这个action-->
<!--dispatcher这个action因为是forward到/htmls/user.jsp,因此,user.jsp能够获得dispatcher action的请求数据-->
<!--浏览器看到的最终URL是dispatcher这个action的URL-->
<result name="success" type="redirectAction">dispatcher</result>
</action>
<action name="redirectAction2" class="com.tom.actions.HelloWorldAction" method="executeAction">
<result name="success" type="redirectAction">
<param name="actionName">otherAction</param>
<param name="namespace">otherNamespace</param>
</result>
</action>
</package>
<package name="other" namespace="/resultType/otherNamespace" extends="struts-default">
<!--redirectAction2要跳转到这里来,那么这个action的namespace必须以是redirectAction2所在namespace为前缀-->
<action name="otherAction">
<!--使用ActionSupport来返回user.jsp,因为ActionSupport没有定义message,所有user.jsp中的message显示为空-->
<result>/htmls/user.jsp</result>
</action>
</package>
</struts>
全局(package范围的)result
对于一个项目来说,有些result的配置是统一的,而不是局限于某个包中,比如<result name="error">error.jsp>/result>,这个result应该是整个项目通用,Struts提供了一个global result的设置,
<global-results>
<result name="error">error.jsp</result>
<result name="exception">exception.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Throwable" result="exception">
</exception-mapping>
</global-exception-mappings>
遗憾的是globlal-results和global-exception-mappings,只能定义在package级别,即它们只能定义为package的子元素,定义成package的子元素后,那么同一个struts.xml其他package下的action就不能使用这些项目级别的result配置,解决办法,是定义一个抽象基本包,在这个base包中防止这些项目级别的全局配置,那么让各个包继承自这个包即可
1. struts.xml配置
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="base" namespace="" extends="struts-default" abstract="true">
<global-results>
<result name="error">/htmls/error.jsp</result>
<result name="exception">/htmls/exception.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Throwable" result="exception">
</exception-mapping>
</global-exception-mappings>
</package>
<package name="resultType" namespace="/resultType" extends="base">
<action name="error" class="com.tom.actions.HelloWorldAction" method="errorCall">
<!--不需要指定<result type="error"></result>来响应HelloWorldAction的error,由全局的result配置响应-->
</action>
<action name="exception" class="com.tom.actions.HelloWorldAction" method="exceptionCall">
<!--不需要指定<result type="exception"></result>来响应HelloWorldAction的exception,由全局的result配置响应-->
</action>
</package>
</struts>
2. HelloWorldAction.java代码
package com.tom.actions;
public class HelloWorldAction {
private String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String executeAction() {
setMessage("Welcome to the Struts2 world");
return "success";
}
public String errorCall() {
return "error";
}
public String exceptionCall() {
throw new NullPointerException("This is a NPE");
}
}
3.
分享到:
相关推荐
- Struts2拥有丰富的插件库,如Struts2-dojo-plugin、Struts2-convention-plugin等,可以方便地集成第三方库。 7. **国际化与本地化**: - Struts2提供对多语言的支持,通过资源包(Properties文件)实现内容的...
当用户通过浏览器发送请求时,Struts2会将请求转发给相应的Action处理。 - **执行流程**: - 用户发起HTTP请求。 - 请求被Struts2的前端控制器(FilterDispatcher)拦截。 - FilterDispatcher根据配置找到对应的...
根据提供的信息,我们可以推断出这是一本关于Struts 2框架的书籍——《Struts 2实战 Struts 2 in action 的中文版》。本书主要介绍了Struts 2框架的相关概念、工作原理以及实际应用案例等内容。接下来,我们将根据...
Struts2的核心组件包括Action、Result、Interceptor(拦截器)等,这些组件通过特定的接口进行交互。Action接口定义了处理用户请求的方法,如execute(),开发者通常会自定义Action类来实现业务逻辑。Result接口则...
1. **Struts2基础**:介绍Struts2的基本概念,包括配置文件、Action类、结果类型和视图解析。 2. **OGNL表达式语言**:Struts2使用OGNL(Object-Graph Navigation Language)进行数据绑定和表达式操作,学习如何...
"Struts2InAction.war"可能包含了书中的所有示例代码,覆盖了各种主题,包括Action、拦截器、结果类型、OGNL表达式、表单验证、国际化等。通过阅读和运行这些代码,开发者可以更直观地了解Struts2的运作方式和实际...
Struts2内置了多种结果类型,如dispatcher(重定向或转发到一个JSP页面)、stream(下载文件)等,也可以自定义结果类型。 5. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为默认表达式语言,...
#### 三、Struts2高级特性 - **OGNL表达式语言**:Object-Graph Navigation Language (OGNL) 是一种强大的表达式语言,用于访问Java对象的属性和方法。Struts2内置了对OGNL的支持,可以方便地在JSP页面中使用OGNL...
Struts2 Result类型是Struts2框架中一个关键的概念,它是动作执行完成后跳转到下一个页面或处理逻辑的核心机制。Result类型定义了如何处理动作执行的结果,使得开发者能够灵活地控制应用程序的流程。 首先,我们...
- **Struts2**: Struts2中的Action更像是工厂模式下的产品,每个Action实例都是线程安全的。Struts2提供了ActionSupport基类来简化Action的实现。Action本身可以是任何实现了特定接口的Java对象,甚至是普通的POJO。...
在这个"struts2简单实例(类型转换)"中,我们将探讨Struts2如何处理不同类型的数据转换,以及如何创建一个简单的演示应用。 首先,让我们理解什么是类型转换。在Web应用程序中,用户通过表单提交的数据通常是字符...
在项目中使用Struts2时,我们需要配置struts2的主配置文件(struts.xml),定义Action、结果类型、拦截器栈等。Action是业务逻辑的入口点,Result表示一个操作完成后转向的页面或结果。拦截器是Struts2的一大特色,...
Struts2允许动态地确定转发的目标,通过在Action类的方法上使用`@Result`注解或在结果类型中设置属性。例如: ```java @Action("myAction") public String execute() { // 业务逻辑... return "success"; // ...
1. OGNL(Object-Graph Navigation Language)表达式注入:这是Struts2最著名的漏洞类型,由于框架在处理用户输入时没有进行充分的过滤和验证,攻击者可以通过构造恶意的OGNL表达式来执行任意代码,从而导致远程代码...
Struts2支持多种结果类型,如dispatcher(转发到JSP)、stream(下载文件)、redirect(重定向)。结果配置可以根据Action执行的结果(success、error等)决定跳转到哪个视图。 在提供的“struts2 demo”压缩包中,...
2. **配置文件**:Struts2使用XML配置文件(struts.xml或struts.properties)来定义Action、结果类型、拦截器等。这些配置是理解程序工作流程的关键。 3. **Interceptor拦截器**:拦截器允许在Action执行前后插入...
Struts2支持多种结果类型,如dispatcher(默认,转发到JSP),redirect(重定向到URL),freemarker(使用FreeMarker模板引擎渲染)等。 **9. 国际化和主题** Struts2支持多语言环境,通过资源文件(如message....
4. **结果类型(Result Types)**:Struts2支持多种结果类型,如`dispatcher`(默认,将结果转发到JSP页面)、`stream`(用于文件下载)、`redirect`(重定向URL)等,可以根据不同的需求选择合适的结果类型。...