struts2 的跳转方式

在struts2中有4中跳转方式

1. dispatcher        请求转发(默认),只跳到jsp页面
2. redirect         重定向到jsp
3. redirectAction        重定向到action
4. chain           转发到action

在说这之前,让我们说下请求转发和重定向的概念,如果你已经了解转发和重定向,可以跳过,直接看下面。

转发和重定向

1. 转发是服务器内部之间进行的

重定向是用户重新向服务器发送新的请求

2. 转发地址栏不会改变

重定向由于是重新发送的新请求,地址栏会改变

3. 转发共用一个作用域对象,相当于A.jsp页面的内容添加到B.jsp页面中。

重定向,会得到一个信的作用对象

4. 转发的速度比较重定向快(因为重定向重新发送请求)

什么时候用转发和重定向?

前后两个页面,有数据传递,用请求转发,没有则用重定向。

比如servlet查询了数据需要在页面显示,就用请求转发。

比如servlet做了update操作跳转到其他页面。就用重定向。

下面让我们步入正题,先看看页面效果和项目的结构

1.项目结构

2.看看页面的效果图,先页面枯燥,就加了个背景图片。记得自己修改。

让我们看下具体的实现细节,不要被神秘遮住了眼,其实它并不神秘。

  1. userIndex.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	/* 项目名称 */
	String path = request.getContextPath();
	// 获取传输协议  
	String http = request.getScheme();
	// 获取服务器名称
	String serverName = request.getServerName();
	// 获取服务器端口号
	Integer serverPort = request.getServerPort();
	// 拼接起来的项目URL
	String bath = http + "://" + serverName + ":" + serverPort + path;
	System.out.println(bath);
%>   
<!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 style="background-image: url(‘image/bg1.jpg‘);">
<!-- 跳转方式 -->
<a href="<%=bath %>/jump/jumpDipatcher?param=1">dispatcher 默认方式,请求转发</a><br/>
<a href="<%=bath %>/jump/jumpDipatcher?param=2">redirect 重定向到jsp页面</a><br/>
<a href="<%=bath %>/jump/jumpDipatcher?param=3">redirectAction 重定向到Action</a><br/>
<a href="<%=bath %>/jump/jumpDipatcher?param=4">chain 转发到Action</a><br/>
</body>
</html>

2.对于 login.jsp 和 error.jsp 和success.jsp。其实没有什么内容,只是一个页面,在这里不写了。

不过你测试的时候,要写,当然名字你也可以自己写(毕竟是来测试,不是正规开发).

3.TestJump

package com.struts2.control;

/**
 * @author admin
 * 测试跳转方式
 */
public class TestJump {

	private String param; 

	public String getParam() {
		return param;
	}

	public void setParam(String param) {
		this.param = param;
	}

	public String testDispatcher(){
		if("1".equals(param)){
			System.out.println("-----Dispatcher--------");
			return "dispatcher";
		}else if("2".equals(param)){
			System.out.println("-----Redirect--------");
			return "redirect";
		}else if("3".equals(param)){
			System.out.println("-----RedirectAction--------");
			return "redirectAction";
		}else if("4".equals(param)){
		        System.out.println("-----Chain--------");
			return "chain";
		}
		return null;
	}
	public String returnUserIndex(){
		return "userIndex";
	}
	public String returnChain(){
		return "chain";
	}
}

4.看下struts.xml 是如何配置的,面纱即将揭晓。如果你对配置中的属性不知道,请参考上章

http://11144439.blog.51cto.com/11134439/1926477

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">   
   
<struts>
	<package name="jumps" extends="struts-default" namespace="/jump">
		<action name="jumpDipatcher" class="com.struts2.control.TestJump" method="testDispatcher">
			<!-- 请求转发,跳转到jsp页面 -->
			<result name="dispatcher" type="dispatcher">/success.jsp</result>
			<!-- 重定向到jsp页面 -->
			<result name="redirect" type="redirect">/success.jsp</result>
			<!-- 重定向到Action -->
			<result name="redirectAction" type="redirectAction">
			        <!-- 这里是要跳转到Action的 package的namespace,
			           注意  / 不要忽略了。
			         -->
				<param name="namespace">/jump</param>
				<!-- 这个是action中的name 看下图 -->
				<param name="actionName">returnUserIndex</param>
			</result>
			<!-- 转发到chain -->
			<result name="chain" type="chain">
				<param name="namespace">/jump</param>
				<param name="actionName">returnChain</param>
			</result>
		</action>
		<action name="returnUserIndex" class="com.struts2.control.TestJump" method="returnUserIndex">
			<result name="userIndex" type="redirect">/login.jsp</result>
		</action>
		<action name="returnChain" class="com.struts2.control.TestJump" method="returnChain">
			<result name="chain" type="redirect">/login.jsp</result>
		</action>
	</package>
</struts>

这个是转发Action中的配置关系图(redirectAction重定向到Action也是一样的道理)

5.上面的配置中有没有发现什么?是不是感觉有跳转同一个页面的?没错,看下图

如果按照上面配置是不是感觉代码又减少了,没有错,下面是配置,记得修改Action中返回字符串要和全局中的一致。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">   
   
<struts>
	<package name="jumps" extends="struts-default" namespace="/jump">
		<!-- 全局跳转,抽取重复的result,简化配置 -->
		<global-results>
			<result name="success">/success.jsp</result>
			<result name="login">/login.jsp</result>
		</global-results>

		<action name="jumpDipatcher" class="com.struts2.control.TestJump" method="testDispatcher">
			<!-- 重定向到Action -->
			<result name="redirectAction" type="redirectAction">
				<param name="namespace">/jump</param>
				<param name="actionName">returnUserIndex</param>
			</result>
			<!-- 转发到chain -->
			<result name="chain" type="chain">
				<param name="namespace">/jump</param>
				<param name="actionName">returnChain</param>
			</result>
		</action>
		<action name="returnUserIndex" class="com.struts2.control.TestJump" method="returnUserIndex">
		</action>
		<action name="returnChain" class="com.struts2.control.TestJump" method="returnChain">
		</action>
	</package>
</struts>

6.说了这么多,让我们测试下结果如何

  1. dispacher 请求转发跳转.测试如图

  2. redirect 重定向 jsp,效果如下图

  3. redirectAction 重定向到Action,效果如下图

4. chain 转发到Action ,效果如图

到这里告一段落,重要的是要亲自动手,亲自动手,亲自动手。好了重要的事情,已经说了三遍。收工,打造回府搂媳妇去了。

时间: 2024-10-13 00:28:42

struts2 的跳转方式的相关文章

Struts2的动态方法,及result跳转方式,全局结果以及默认的action的配置

Action动态方法的调用 首先我们需要在struts.xml中去配置一个常量值如下 那么去哪找呢?找到Struts-core.jar并打开 method属性 <action name="login" class="cn.ssh.ch08.UserAction" method="lgoin"> <result name="success">/success.jsp</result> <

jsp中几种跳转方式和参数共享

整理了一下jsp入门中的跳转和数据共享问题,写成这篇博文希望对大家有帮助,参考文章列在后面: 常用的跳转方式有以下几种: (1)href超链接标记,属于客户端跳转 (2)使用javascript完成,属于客户端跳转 (3)提交表单完成跳转,属于客户端跳转 (4)使用response对象,属于客户端跳转 (5)使用requestDispatcher类,属于服务器跳转 下面一一来看 (1)href超链接标记 这个比较简单,通常写到a标签里即可,来完成指定位置的动态跳转比较方便 代码:<a href=

URI跳转方式地图导航的代码实践

本文转载至 http://adad184.com/2015/08/11/practice-in-mapview-navigation-with-URI/ 前言 之前介绍了我正在做的是一款定位主打的应用 然后最近我们需要做一个定位导航的功能 能够让用户从当前位置导航到指定目的地(默认以驾车的方式导航) 手机上的导航方式 分应用内导航和应用外导航 应用内导航是指使用地图服务提供的SDK(比如高德,百度等等) 直接将导航功能嵌入到我们自己的APP内部但是这个方案我个人不喜欢 一是接入要一定的时间 二是

微信小程序详解——页面之间的跳转方式【路由】和参数传递

微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能.今天我们来研究小程序页面之间的跳转方式. 1.先导 在Android中,我们Activity和Fragment都有栈的概念在里面,微信小程序页面也有栈的概念在里面.微信小程序页面跳转有四种方式: 1.wx.navigateTo(OBJECT): 2.wx.redirectTo(OBJECT): 3.wx.switchTab(OBJECT): 4.wx.navi

(转)JSP三种页面跳转方式的比较

使用JSP大约有下列三种跳转方式: 1. response.sendRedirect(); 2. response.setHeader("Location",""); 3. <jsp:forward page="" /> 经过试验得到下面的一些规则: 一. response.sendRedirect() 此语句前不允许有out.flush(),如果有out.flush(),会有异常: java.lang.IllegalStateExc

Android之Activity的几种跳转方式

 1.显示调用方法 Intent intent=new Intent(this,OtherActivity.class);  //方法1 Intent intent2=new Intent(); intent2.setClass(this, OtherActivity.class);//方法2 intent2.setClassName(this, "com.zy.MutiActivity.OtherActivity");  //方法3 此方式可用于打开其它的应用 intent2.set

页面跳转方式的总结

个人经常用到的页面跳转方式: 凡是js用到的跳转方式,php基本都可以用 1.通过js自身的window.open打开非模态窗口 top.window.open("alarm_add_con.php?wd_id=40&wd_name='hello'"); 关闭子窗口,并刷新父窗口,刷新父窗口不清除父窗口的临时变量 echo "<script>"; echo "opener.location.reload();"; //刷新父窗

Jsp 四种跳转方式

四种跳转方式 request.getRequestDispacher().forward()跳转: (1)服务器端跳转. (2)执行后立即跳转. <jsp:forward>跳转: (1)实际上是对上面 forward 方法的封装,属于服务器端跳转,跳转之后地址栏不改变. (2)执行到后立刻跳转.跳转之前的语句会执行,跳转之后的语句将不会执行.如果在 JSP 中使用了 JDBC 的话,必须在跳转之前进行数据库的关闭,否则数据库将无法关闭. response.sendRedirect()跳转: (

HTTP 对Location跳转方式的特殊处理

我们知道,某些情况下由于网站迁移,权限,页面错误时我们可能需要跳转页面到错误页面,如 1.HTTP/1.1 404 Not Found 2.HTTP/1.1 301 Moved Permanently 3.HTTP/1.1 302 Moved Temporarily 但是我们发送响应码只是一种状态机制,因此往往我们需要选择合适的跳转方式,Location跳转是一种常见的方式,特别对于做SEO的同学来说 下面我们通过php语言来说明(结果与编程语言无关) index.php <?php heade