4.Struts2转向类型详解

时间:2022-04-26 15:03:57
struts2中提供了多种视图转向类型,类型由type属性指定,如:
dispatcher:请求转发(默认值)
redirect:重定向到页面
redirectAction:重定向到Action
plainText:原样显示要转向资源的源代码,而非显示代码的执行结果(火狐、IE8下可测试出效果,IE6下不行)。不常用。
注意,
对于请求转发的页面,可以是WEB-INF中页面;
而重定向的页面,是不能为WEB-INF中页的。
因为重定向相当于用户再次发出一次请求,而用户是不能直接访问WEB-INF中资源的。

服务器内部跳转

4.Struts2转向类型详解


服务器外部跳转

4.Struts2转向类型详解

先看下请求转发到的情况:

dispatcher:请求转发

4.Struts2转向类型详解

HelloWordAction.java源码如下:

package actions;

public class HelloWordAction {

    public String some(){

        System.out.println("I am HelloWordAction.java");
return "other";
} }

新建UserAction.java源码如下:

package actions;

public class UserAction {
private String username; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String execute(){
username="xingyun";
System.out.println("username="+username);
return "success";
} }

web.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <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>/*</url-pattern>
</filter-mapping> <welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

index.jsp源码如下:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
This is my JSP page. <br>
</body>
</html>

welcome.jsp源码如下:

Welcome to Study Struts2!

show.jsp源码如下:

<%@ page isELIgnored="false" pageEncoding="ISO-8859-1"%>
<html>
<head> <title>show page</title> </head> <body>
show_username---------------------${username}
</body>
</html>

请求转发到页面struts.xml配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<package name="aaaa" namespace="/test" extends="struts-default"> <action name="bbbb" class="actions.HelloWordAction" method="some">
<result name="other">/welcome.jsp</result>
</action> <action name="user" class="actions.UserAction">
<result type="dispatcher">/show.jsp</result>
</action> </package> </struts>

原理图:

4.Struts2转向类型详解


dispatcher:请求转发

发布项目,启动tomcat,地址栏输入:

http://pc2014092716pel:8080/Study_Struts2/test/user

4.Struts2转向类型详解


现在看看重定向到页面是什么情况!

redirect:重定向到页面

重定向到页面原理图:

4.Struts2转向类型详解


redirect重定向引出的问题?

上面都不变,只修改struts.xml文件成重定向配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<package name="aaaa" namespace="/test" extends="struts-default"> <action name="bbbb" class="actions.HelloWordAction" method="some">
<result name="other">/welcome.jsp</result>
</action> <action name="user" class="actions.UserAction">
<result type="redirect">/show.jsp</result>
</action> </package> </struts>

redirect:重定向到页面

重新部署,启动tomcat,地址栏输入:

http://pc2014092716pel:8080/Study_Struts2/test/user

4.Struts2转向类型详解

解决重定向携带参数问题!

由上可以知道如果重定向的话,那么重定向时就无法携带参数。

要解决这个问题的话需要如此修改struts.xml配置为:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<package name="aaaa" namespace="/test" extends="struts-default"> <action name="bbbb" class="actions.HelloWordAction" method="some">
<result name="other">/welcome.jsp</result>
</action> <action name="user" class="actions.UserAction"> <result type="redirect">/show.jsp?username=${username}</result>
</action> </package> </struts>

修改show.jsp页面如下:

<%@ page isELIgnored="false" pageEncoding="ISO-8859-1"%>
<html>
<head> <title>show page</title> </head> <body>
show_username---------------------${paramt.username}
</body>
</html>

运行结果如下:

4.Struts2转向类型详解

中文参数重定向问题?

但是如果变量字符串"xingyun"变成"星云"就会出现乱码。

UserAction.java代码修改如下:

package actions;

public class UserAction {
private String username; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String execute(){
username="星云";
System.out.println("username="+username);
return "success";
} }

show.jsp修改如下:

<%@ page isELIgnored="false" pageEncoding="gb2312"%>
<html>
<head> <title>show page</title> </head> <body>
show_username=${param.username}
</body>
</html>

重新部署,发布后启动后效果图如下:

4.Struts2转向类型详解


中文参数重定向解决方法:

修改UserAction.java

package actions;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; public class UserAction {
private String username; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String execute() throws UnsupportedEncodingException{
//将中文内容按指定字符集进行重编码
username=URLEncoder.encode("星云","gb2312");
System.out.println("username="+username);
return "success";
} }

修改show.jsp如下:

<%@ page isELIgnored="false" pageEncoding="gb2312" import="java.net.*"%>
<html>
<head> <title>show page</title> </head> <body>
<%
//1.获取请求参数中的中文经编码后的字符串
String encoderStr=request.getParameter("username");
//2.将获取的编码后的字符串存放到字节数组中
byte[] requestBytes=encoderStr.getBytes("ISO8859-1");
//3.将该字符串按指定的字符集进行解码
String requestString=new String(requestBytes);
//4.该字符串按指定字符集进行解码
String username=URLDecoder.decode(requestString,"gb2312");
%>
username===========<%=username%>
</body>
</html>

解决方法原理图:

4.Struts2转向类型详解

重新部署发布成功效果如下:

4.Struts2转向类型详解


重定向到servletaction类

redirectAction:重定向到Action

原理图:

4.Struts2转向类型详解

先访问test/two对应的HelloWordAction.java,完成后找user对应的UserAction.java,最后重定向到show.jsp。

修改HelloWordAction.java源码如下:

package actions;

public class HelloWordAction {

    public String some(){

        System.out.println("----------------do some()");
return "some";
}
public String other(){ System.out.println("----------------do other()");
return "other";
} }

重定向到servlet_action类需要修改struts.xml配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<package name="aaaa" namespace="/test" extends="struts-default"> <action name="one" class="actions.HelloWordAction" method="some">
<result name="some">/welcome.jsp</result>
</action>
<action name="two" class="actions.HelloWordAction" method="other">
<result name="other" type="redirectAction">user</result>
</action>
<action name="user" class="actions.UserAction"> <result type="redirect">/show.jsp?username=${username}</result>
</action> </package> </struts>

重新部署发布,启动tomcat,输入地址:

http://127.0.0.1:8080/Study_Struts2/test/two

运行截图如下:

4.Struts2转向类型详解

跨包重定向问题?

redirectAction:重定向到Action

原理图:

4.Struts2转向类型详解

修改struts.xml配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<package name="aaaa" namespace="/one" extends="struts-default"> <action name="two" class="actions.HelloWordAction" method="other"> <result name="other" type="redirectAction"> <param name="namespace">/test2</param>
<param name="actionName">user</param>
</result>
</action> </package> <!--**************分开标记注释*********************--> <package name="test2" namespace="/test2" extends="struts-default"> <action name="user" class="actions.UserAction"> <result type="redirect">/show.jsp?username=${username}</result>
</action> </package> </struts>

redirectAction:重定向到Action

重新部署发布,开启tomcat,输入地址:

http://127.0.0.1:8080/Study_Struts2/one/two

运行截图:

4.Struts2转向类型详解

plainText:原样显示要转向资源的源代码,而非显示代码的执行结果(火狐、IE8下可测试出效果,IE6下不行)。不常用。

4.Struts2转向类型详解

修改struts.xml配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts>
<package name="aaaa" namespace="/one" extends="struts-default"> <action name="two" class="actions.HelloWordAction" method="other"> <result name="other" type="plainText">index.jsp</result>
</action> </package> </struts>

部署发布,开启tomcat,输入地址:

http://127.0.0.1:8080/Study_Struts2/one/two

运行截图:

4.Struts2转向类型详解


4.Struts2转向类型详解的更多相关文章

  1. C&num;进阶系列——WebApi 接口返回值不困惑:返回值类型详解

    前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解  ...

  2. C&plus;&plus;11 并发指南六&lpar;atomic 类型详解四 C 风格原子操作介绍&rpar;

    前面三篇文章<C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)>.<C++11 并发指南六( <atomic> 类型详解二 std::at ...

  3. C&plus;&plus;11 并发指南六&lpar;atomic 类型详解三 std&colon;&colon;atomic &lpar;续&rpar;&rpar;

    C++11 并发指南六( <atomic> 类型详解二 std::atomic ) 介绍了基本的原子类型 std::atomic 的用法,本节我会给大家介绍C++11 标准库中的 std: ...

  4. C&plus;&plus;11 并发指南六&lpar; &lt&semi;atomic&gt&semi; 类型详解二 std&colon;&colon;atomic &rpar;

    C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)  一文介绍了 C++11 中最简单的原子类型 std::atomic_flag,但是 std::atomic_flag ...

  5. 服务启动项 Start类型详解

    注册表的服务启动项 Start类型详解 HKLM\SYSTEM\CurrentControlSet\services\ 下的服务项.不论有没有在services.msc服务管理控制台中显示,在注册表中 ...

  6. c&num; WebApi之接口返回类型详解

    c# WebApi之接口返回类型详解 https://blog.csdn.net/lwpoor123/article/details/78644998

  7. C&plus;&plus;之string类型详解

    C++之string类型详解 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个泛型类出现,他集成的操作函 ...

  8. struts2常用标签详解&lpar;申明:来源于网络&rpar;

    struts2常用标签详解(申明:来源于网络) 地址:http://blessht.iteye.com/blog/1184960

  9. &lpar;转&rpar;C&num; WebApi 接口返回值不困惑:返回值类型详解

    原文地址:http://www.cnblogs.com/landeanfen/p/5501487.html 正文 前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi ...

随机推荐

  1. 【转】深入浅出JavaScript之闭包(Closure)

    闭包(closure)是掌握Javascript从人门到深入一个非常重要的门槛,它是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面写下我的学习笔记~ 闭包-无处不 ...

  2. u盘安装系统教程详解

    一.准备阶段 提前准备一个至少1G或以上的u盘,方便好用. 1.制作u盘启动工具 (1)工具下载,推荐IT天空的优启通 下载地址:https://www.itiankong.net/thread-37 ...

  3. USACO 2014 JAN 滑雪录像

    2. 滑雪录像{silver题3} [问题描述] 冬奥会的电视时刻表包含N (1 <= N <= 150)个节目,每个节目都有开始和结束时间.农民约翰有两台录像机,请计算他最多可以录制多少 ...

  4. PhpSms 稳定可靠的php短信发送库

    可能是目前最聪明.优雅的PHP短信发送库了.从此不再为各种原因造成的个别短信发送失败而烦忧! phpsms的任务均衡调度功能由toplan/task-balancer提供. GitHub地址:http ...

  5. ClippingNode实现新手引导高亮裁切

    ClippingNode的使用 概述 ClippingNode(裁剪节点)可以用来对节点进行裁剪,可以根据一个模板切割图片的节点,生成任何形状的节点显示. ClippingNode是Node的子类,可 ...

  6. &lbrack;转&rsqb;IOS上路&lowbar;01-Win7&plus;VMWare9&plus;MacOSX10&period;8&plus;XCode4&period;6&period;3

    本文转自:http://my.oschina.net/vigiles/blog/141689 目录[-] 1. 资源准备: 1)实体机: 2)VMWare9: 3)VM for MacOS 补丁: 4 ...

  7. Cracking the coding interview--Q1&period;6

    原文: Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, write a m ...

  8. 【LeetCode】258&period; Add Digits

    题目: Given a non-negative integer num, repeatedly add all its digits until the result has only one di ...

  9. STL中坑爹的max函数

    hdu1754永远难忘的痛,参数最好不要传耗时特别长的函数,因为会调用两次,如果是递归的话,不知道多少次呢.. 切记!切记!切记! 例如: //return max(getAns(root<&l ...

  10. HTML(九)HTML 条件注释规范

    HTML 条件注释(hack常用) IE条件注释是微软从IE5开始就提供的一种非标准逻辑语句,作用是可以灵活的为不同IE版本浏览器导入不同html元素.很显然这种方法的最大好处就在于属于微软官方给出的 ...