【struts2】名为dispatcher的ResultType

  1)基本使用

  名称为“dispatcher”的ResultType,在struts-default.xml里的配置如下:

<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>

  通过配置可以看出,它对应的实现类是ServletDispatcherResult。

  如果采用JSP作为视图的实现技术,那么这个ResultType是最常用的。在这个ResultType的实现中,调用了javax.servlet.RequestDispatcher类的forward方法,也就是说它相当于是对RequestDispatcher的一个再包装。

  既然是这样,那么在Servlet中使用RequestDispatcher来进行页面跳转的特性,也就自然被“dispatcher”这个ResultType继承下来了。那么Servlet中的RequestDispatcher,到底有什么特性呢?那就是是通过RequestDispatcher来进行页面跳转,将会保持是同一个请求对象。这有什么好处呢?由于是同一个对象,那就意味着有同样的数据,而请求对象里面数据众多,在Servlet的request对象里面,典型有如下数据:

  • 参数区(parameter),就是用户在页面上填写并提交的数据

  • Head区,由浏览器在发出请求的时候,自动加入到请求包的数据

  • 属性区(Attribute),由开发人员存储在属性区的值,通常是通过request.setAttribute方法、request.getAttribute方法来进行访问

  • cookie区,由浏览器在发出请求的时候,自动把相关的Cookie数据通过request传递到服务端

  好处是不是很大?因此这也是使用Struts2来进行web开发中最常使用的ResultType。

  2)特殊用法

  在<result>元素的定义中可以使用Action的execute方法运行之后的数据。怎么做呢?一起来看看示例。或许我们都已经习惯于以下这种简单的<result>配置:

<result name="toWelcome">/s2impl/welcome.jsp</result>  

  里面用于指定jsp位置的字符串都是固定的。如果我们希望这个字符串是活动的,可以根据某些参数值来变化,该怎么做到呢?如果我们在Action中定义一个folder字符串,并在execute中或validate中对它进行赋值,这里我们放到validate中,代码如下:

package cn.javass.hello.struts2impl.action;

import com.opensymphony.xwork2.ActionSupport;

public class HelloWorldAction extends ActionSupport {
private String account;
private String password;
private String submitFlag;
private String folder;

public String execute() throws Exception {
this.businessExecute();
return "toWelcome";
}
public void validate(){
this.folder = "s2impl"; //放在这里的原因是:validate先与execute执行,如果fieldError里面有值,execute就不执行了
if(account==null || account.trim().length()==0){
this.addFieldError("account", this.getText("k1"));
}
if(password==null || password.trim().length()==0){
this.addFieldError("password", this.getText("k2"));
}
if(password!=null && !"".equals(password.trim()) && password.trim().length()<6){
this.addFieldError("password", this.getText("k3"));
}
}
/**
* 示例方法,表示可以执行业务逻辑处理的方法,
*/
public void businessExecute(){
System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag);
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSubmitFlag() {
return submitFlag;
}
public void setSubmitFlag(String submitFlag) {
this.submitFlag = submitFlag;
}
public String getFolder() {
return folder;
}
public void setFolder(String folder) {
this.folder = folder;
}

}

  那么,在<result>的定义中就可以引用folder这个变量,示例如下:


<package name="helloworld"  extends="struts-default">
<action name="helloworldAction" class="cn.javass.hello.struts2impl.action.HelloWorldAction">
<result name="toWelcome" type="dispatcher">/${folder}/welcome.jsp</result>
<result name="input">/${folder}/login.jsp</result>
</action>
</package>

  这样配置的结果和前面写死的路径效果时完全一样的。仔细观察一下你会发现,“${folder}”的写法跟以前在jsp上写的el表达式类似,而里面的“folder”是跟Action的属性相对应的。

  3)更完整的配置方式

  平时我们把result对应的jsp的路径,直接作为<result>元素中的文本来配置,这是简化的写法,实际上对于dispatcher还有两个参数可以配置,示例如下:

<result name="toWelcome" type="dispatcher">
<param name="location">/s2impl/welcome.jsp</param>
<param name="parse">true</param>
</result>

  location参数就是咱们平时写的下一个jsp的位置,而parse参数决定了location是否可以通过使用OGNL来引用参数,默认为true。其实,前面使用${folder}来引用Action的folder属性的值的例子,就是使用的OGNL来引用参数。

  参考资料:http://www.iteye.com/topic/1124526

时间: 2024-08-08 01:09:54

【struts2】名为dispatcher的ResultType的相关文章

【struts2】名为redirect的ResultType

1)基本使用 名称为"redirect"的ResultType,在struts-default.xml里的配置如下: <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/> 通过配置可以看出,它对应的实现类是ServletRedirectResult. 这种Result同常也使用JSP作为视图技术.它包装的是j

【struts2】名为chain的ResultType

1)基本使用 名称为"chain"的ResultType,在struts-default.xml里的配置如下: <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> chain是一种特殊的视图结果,用来将Action执行完之后链接到另一个Action中继续执行,新的Action使用上一个Action的上下文(ActionContext

深入struts2.0(五)--Dispatcher类

1.1.1       serviceAction方法 在上个Filter方法中我们会看到如下代码: this.execute.executeAction(request, response, mapping); 图3.2.1  Filter方法中跳转到action图 而在ExecuteOperations类中(excute是一个实例)有如下代码: public void executeAction(HttpServletRequest request, HttpServletResponse

Struts2系列:(6)result-type和全局result

在(2)中到struts.xml中的package.action和result进行了简单介绍. 在(3)中到action进行了一些详细介绍. 在本节中,将对result进行一些详细介绍,主要包括两部分:result-type和全局的result. 1.result-type #代码角度#在Action类中,每个 action 方法均返回一个 String 类型的值, Struts 将根据这个值来决定响应什么结果. #配置角度#在struts.xml配置文件中,每个 Action 标签可包含多个

【struts2】Result和ResultType

简单的说,Result是Action执行完后返回的一个字符串,它指示了Action执行完成后,下一个页面在哪里.Result仅仅是个字符串,仅仅是用来指示下一个页面的,那么如何才能够到达下一个页面呢?下一个页面如何能正确地展示结果呢?这就该引出一个新概念--ResultType,所谓ResultType,指的是具体执行Result的类,由它来决定采用哪一种视图技术,将执行结果展现给用户. 很多时候,我们并不去区分Result和ResultType,而是笼统的称为Result.因此,Result除

【Struts2二】结果集(result-type)

在jsp/servlet中,结果集通常是指请求转发和重定向这两种! Struts2作为框架,提供了基于这两种的更多的结果集! 在struts-default.xml中定义了一些默认的结果集:          <result-types> <result-type name= "chain" class="com.opensymphony.xwork2.ActionChainResult" /> <result-type name= &

struts2的结果类型

1.从struts-default.xml入手,得到结果类型列表以及对应的处理类: <result-types> <!-- 转发到action --> <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> <!-- 转发到jsp --> <result-type name="dispatcher&quo

Struts2系列:(12)拦截器

学习拦截器 1.拦截器能够做什么?(Why 和 What) 2.如何定义拦截器?(How to use) 3.如何注册拦截器?(How to use) 4.如何使用拦截器?(How to use) 1.拦截器能够做什么? Struts2 拦截器在访问某个 Action 方法之前或之后实时拦截的可插拔的组件. 拦截器栈(Interceptor Stack): 将拦截器按一定的顺序联结成一条链. 实现原理:当请求action时,Struts 查找配置文件,根据其配置实例化拦截器对象,并形成一个列表,

Struts2框架基本使用

时间:2017-1-6 16:53 修改struts.xml配置文件不需要重启服务器. Struts2框架 一.        *   介绍Struts2        *   关于Struts2配置(关于Action配置)        *   关于Struts2结果类型    二.        *   Struts2处理请求参数        *   Struts2的类型转换(了解)        *   Struts2的校验    三.        *   Struts2的国际化