4.Struts2转向类型详解
struts2中提供了多种视图转向类型,类型由type属性指定,如:dispatcher:请求转发(默认值)redirect:重定向到页面redirectAction:重定向到ActionplainText:原样显示要转向资源的源代码,而非显示代码的执行结果(火狐、IE8下可测试出效果,IE6下不行)。不常用。注意,对于请求转发的页面,可以是WEB-INF中页面;而重定向的页面,是不能为WEB-INF中页的。因为重定向相当于用户再次发出一次请求,而用户是不能直接访问WEB-INF中资源的。
服务器内部跳转
服务器外部跳转
先看下请求转发到的情况:
dispatcher:请求转发
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>
原理图:
dispatcher:请求转发
发布项目,启动tomcat,地址栏输入:
http://pc2014092716pel:8080/Study_Struts2/test/user
现在看看重定向到页面是什么情况!
redirect:重定向到页面
重定向到页面原理图:
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
解决重定向携带参数问题!
由上可以知道如果重定向的话,那么重定向时就无法携带参数。
要解决这个问题的话需要如此修改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>
运行结果如下:
中文参数重定向问题?
但是如果变量字符串"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>
重新部署,发布后启动后效果图如下:
中文参数重定向解决方法:
修改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>
解决方法原理图:
重新部署发布成功效果如下:
重定向到servletaction类
redirectAction:重定向到Action
原理图:
先访问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
运行截图如下:
跨包重定向问题?
redirectAction:重定向到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="/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
运行截图:
plainText:原样显示要转向资源的源代码,而非显示代码的执行结果(火狐、IE8下可测试出效果,IE6下不行)。不常用。
修改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
运行截图: