struts2学习笔记(5)----------配置result

Action只负责处理请求,负责生成响应的视图组件,一般是JSP页面,而Action为JSP页面提供显示的数据。Action处理请求结束后,控制器根据<result>元素配置的逻辑视图跟物理视图之间的关系来响应。

浏览器,控制器和视图资源的顺序图如下:

如图所示,Action处理完一个请求后,并未直接把请求转发给任何具体的视图资源,而是返回给一个逻辑视图,struts2框架收到这个逻辑视图后,把请求转发到对应的物理视图资源,试图资源将结果呈现给用户。

1)result基本配置

struts2提供两种result:

1:局部结果:将result标签作为action标签的子元素。

2:全局结果:将result标签作为global-results的子元素。

配置result元素有俩属性:

name:指定逻辑视图名。

type:指定结果类型。

一个比较基本的result可以配置为如下这样的:

<action name="firstAction" class="com.test.action.FirstAction" method="add">
			<result name="success" type="dispatcher">
				<param name="location">/show.jsp</param>
				<param name="parse">true</param>
			</result>
		</action>

这种result配置使用了最繁琐的方式,既指定了需要映射的逻辑视图名(success),也指定了结果类型(dispatcher),并使用子元素的形式来指定实际视图资源。

对于上面使用param子元素配置结果的形式,其中param元素用于配置一个参数,与所有配置参数的地方类似,配置参数需要指定参数名和参数值。参数名由name属性指定,此处的name属性可以为两种值:

location:指定该逻辑视图对应的实际视图。

parse:指定是否允许在实际视图名中使用ognl表达式,默认为true

通常大家配置的时候都写简化的版本:

<action name="firstAction" class="com.test.action.FirstAction" method="add">
			<result name="success" type="dispatcher">/show.jsp</result>
		</action>

因为struts2默认的结果类型就是dispatcher,所以也可以这样写:

<action name="firstAction" class="com.test.action.FirstAction" method="add">
			<result name="success">/show.jsp</result>
		</action>

其实result的name也可以省略,那时候就是用默认的逻辑视图名success。

2)struts2支持的结果类型

结果类型决定了Action处理完请求后,下一步将要调用哪个视图资源来呈现处理结果。

struts2的结果类型实现了com.opensymphony.xwork2.Result接口,如果我们需要自己写一个结果类型,可以实现该接口,然后再struts.xml配置。

struts-default.xml有如下struts2提供的结果类型,该文件在struts2-core.jar的根目录下:

<result-types>
  <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult" default="false" />
  <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true" />
  <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult" default="false" />
  <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult" default="false" />
  <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult" default="false" />
  <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult" default="false" />
  <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult" default="false" />
  <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult" default="false" />
  <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult" default="false" />
  <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" default="false" />
  <result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" default="false" />
  </result-types>

chain类型:Action链式处理的结果类型。

dispatcher类型:用于指定使用jsp作为视图的结果类型。

freemarker类型:用于指定使用FreeMarker模板作为视图的结果类型。

httpheader类型:用于控制特殊的HTTP行为的结果类型。

redirect类型:用于直接跳转到其他URL的结果类型。

redirectAction类型:用于直接跳转到其他Action的结果类型。

stream类型:用于向浏览器返回一个InputStream(一般用于文件下载)

velocity类型:用于指定使用Velocity模板作为视图的结果类型。

xslt类型:用于与XML/XSLT整合的结果类型。

plainText类型:用于显示某个页面的原始代码的结果类型。

写个plainText和redirect的例子:

1.plainText ,这个结果类型下的param的name有两种类型:

location:指定实际的视图资源

charSet:指定输出页面使用的字符集

在struts.xml中做如下配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
	<!-- 这句用来配置动态方法调用 -->
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />
  <!-- 开发者模式 -->
   <constant name="struts.devMode" value="true" />
  	<package name="user" extends="struts-default" >
		<action name="firstAction" class="com.test.action.FirstAction">
			<result name="success" type="plainText">
				<param name="location">/show.jsp</param>
				<param name="charSet">GBK</param>
			</result>
		</action>
	</package>
</struts>	

Action中随便写写:

public class FirstAction extends ActionSupport{

	private String uname;

	public String getUname() {
		return uname;
	}

	public void setUname(String uname) {
		this.uname = uname;
	}

	public String execute(){

		return SUCCESS;
	}
}

运行结果如下,输出了页面的源代码:

2:redirect结果类型:顾名思义,重定向,param标签的name有location和parse两种值

与dispatcher相对,dispatcher是请求转发,而redirect是重定向,它们俩的区别就是请求转发跟重定向的区别。。。重定向会丢失所有的请求参数,请求属性以及Action中的处理结果。

使用redirect结果类型的效果是,系统将调用HttpServletResponse的sendRedirect方法来重定向指定视图资源,这种重定向的结果就是重新发送一个请求,因此所有的请求参数,请求属性,Action实例和Action中封装的属性全部丢失。

可以修改struts.xml为如下:

<action name="firstAction" class="com.test.action.FirstAction">
			<result name="success" type="redirect">
				<param name="location">/show.jsp</param>
				<param name="parse">true</param>
			</result>
		</action>

Action跟上边一样,不变,访问路径的时候加个uname参数例如:http://localhost:8080/test/firstAction?uname=zhangsan

结果并没有在页面显示uname(我在页面上用了这句:<s:property value="uname" />),正好说明了重定向丢失了action的处理结果。

3:redirectAction跟redirect很像,也会丢失前一个Action的处理结果,配置的时候它的param的name属性有两个:

actionName:想要重定向到的action的name

namespace:想要重定向到的action所在的命名空间

3)动态结果

可以在result的物理资源视图名上使用通配符或者OGNL表达式。。。。

4)全局结果

写在<global-results>标签里,该全局结果对所有Action都有效,如果一个Action里包含了与全局结果相同名字的结果,那么局部的结果会覆盖全局的,当Action处理用户请求结束后,它会先去局部result里找,如果没找到才去全局找

全局的result配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
	<!-- 这句用来配置动态方法调用 -->
  <constant name="struts.enable.DynamicMethodInvocation" value="true" />
  <!-- 开发者模式 -->
   <constant name="struts.devMode" value="true" />
  	<package name="user" extends="struts-default" >
  	<!-- 全局result -->
  	<global-results>
  		<result name="error">/error.jsp</result>
  	</global-results>
		<action name="*Action" class="com.test.action.LoginAction" method="{1}">
			<result name="success">/success.jsp</result>
		</action>
	</package>
</struts>	

struts2学习笔记(5)----------配置result,布布扣,bubuko.com

时间: 2024-10-03 21:53:18

struts2学习笔记(5)----------配置result的相关文章

struts2学习笔记之八(result)

strust2的开发步骤 编写一个发送请求的页面,表单或超链接 编写一个action类 1. 推荐实现action接口或继承actionsupport 2. 为所有请求参数,包括需要传到下一个页面显示的数据提供filed 并提供相应的setter和getter 3. 要有无参的构造器 4. 处理请求的方法,该方法不能有形参声明 5. 处理请求的返回值是String 在struts.xml文件配置action struts.xml配制方法 常量配置 包配置和命名空间配置 这种设计是为了企业应用的模

Struts2学习笔记二 配置详解

Struts2执行流程 1.简单执行流程,如下所示: 在浏览器输入请求地址,首先会被过滤器处理,然后查找主配置文件,然后根据地址栏中输入的/hello去每个package中查找为/hello的namespace,然后在包下寻找名为HelloAction的action,反射创建控制器HelloAction对象,调用method指定的方法hello,拿到返回值“success”,去result的配置节找success对应的页面(hello.js),呈现给用户. 2.Struts的架构,具体参考这里

Struts2学习笔记(二)——配置详解

1.Struts2配置文件加载顺序: default.properties(默认常量配置) struts-default.xml(默认配置文件,主要配置bean和拦截器) struts-plugin.xml(配置插件) struts.xml(配置action或者常量等) struts.properties(常量配置) web.xml(配置JavaEE,如:监听器和过滤器) 2.Struts2配置文件详解 1)default.properties default.properties是Struts

Struts2学习笔记 - 结果类型result

所谓结果类型就是struts.xml文件中,action中的result节点,如下图,这个result的其中一个属性是type,它包含很多种类型,不同类型可以有不同的效果,下面将会介绍一些 1. 文件下载Stream stream 种类是用来下载文件用的,先来看看例子 <action name="download" class="cn.com.test.action.DownloadAction"> <result type="strea

struts2学习笔记(6)------配置struts2中的异常处理

我们平常的异常处理是直接在方法中手动捕捉异常,当捕捉到特定异常后,返回特定逻辑视图名.这样的缺点是代码与异常处理耦合太多,一旦要改变异常处理方式,需要修改代码! struts2提供给了一种更好的方式来处理异常------声明式的方式管理异常处理,我们可以通过再方法里将出现的异常throw出去,抛给struts2框架处理,然后再struts2中默认开启着异常映射功能,该功能在struts-default.xml中配置的一个拦截器,如下: <interceptor name="exceptio

struts2学习笔记(二)—— 获取登录信息及计算在线人数

实现目的: 1.点击"Login"的超链接,进入登录页面 2.填写登录信息,提交表单,将用户信息保存进Session 3.显示用户名,并计算在线人数 4.点击"Logout"的超链接,在线人数减一,并使Session失效 Struts2实现: 1.配置web.xml文件 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:/

struts2学习笔记(8)-------struts2的ajax支持

struts2支持一种stream类型的Result,这种类型的Result可以直接向客户端浏览器响应二进制,文本等, 我们可以再action里面生成文本响应,然后在客户端页面动态加载该响应即可. 直接看例子: public class LoginAction { private String user; private String pass; private InputStream inputStream; public InputStream getInput(){ return inpu

Struts2 学习笔记(概述)

Struts2 学习笔记 2015年3月7日11:02:55 MVC思想 Strust2的MVC对应关系如下: 在MVC三个模块当中,struts2对应关系如下: Model: 负责封装应用的状态,并实现应用的功能.通常分为数据模型和业务逻辑模型,数据模型用来存放业务数据,比如订单信息.用户信息等:而业务逻辑模型包含应用的业务操作,比如订单的添加或者修改等. 封装应用状态:某些应用数据封装起来,使得视图只能通过接口获取对应的数据 响应状态查询:对应用的状态改变进行处理 暴露应用功能:暴露接口 通

struts2学习笔记(7)------------ognl表达式

OGNL表达式(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言.是一种可以方便地操作对象属性的开源表达式语言. Struts2自行维护一个特定范围的"银行",Action将数据放入其中,而JSP页面可从中取数据,表面上似乎看起来像是jsp可以直接访问Action数据.. 当Action属性不再是简单的值,而是某个对象,数组,集合时,就需要使用ognl表达式来访问这些对象,数组,集合内的数据了. 1)ognl的stack Conte