java web从零单排第九期《struts2》action的转发与重定向

来源:互联网 发布:林非比淘宝模特 编辑:程序博客网 时间:2024/05/21 10:48

1.转发操作:

转发操作本质上是request的共享可以在request作用域中存入对象,最终在jsp页面中显示。

我们以上一节为例,只需更改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/dtd/struts-2.0.dtd"><struts>   <package name="Maybe" extends="struts-default">        <action name="login" class="controller.Login">       <result name="success" type="dispatcher">/true.jsp</result>       <result name="false">/false.jsp</result>       <result name="input">/login.jsp</result>   </action>   </package></struts>


这个result标与前面的配置文件相比,多了一个type属性:dispatcher。意味着这个操作是一个“foward”操作,即转发操作,其实这里dispatcher加的比较多余,因为struts2默认的type就是dispatcher,所以有无dispatcher都一样的。

 

2.更改true.jsp文件:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ taglib uri="/struts-tags" prefix="s"%><!DOCTYPE body PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html>  <body>     ${logininfo.username}      <br>     <s:property value="logininfo.username"/>  </body></html>

${logininfo.username} 是EL表达式,可以输出logininfo.username的值

 <s:property value="logininfo.username"/>是struts2标签,也是用来输出值用的,关于struts2标签,在后续的学习中将会学到,这里给同学们演示一下struts2标签的作用,再用标签之前,一定要加上:

<%@ taglib uri="/struts-tags" prefix="s"%>


 

3.运行结果:

 

4.有关result属性type值,在struts2底层配置文件,struts-default.xml中的results-types节点下的相关配置:

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


 

result-types是可以返回的种类。dispatcher有一个属性default,且值为true,含义是如果在result标记中不注明type,则默认就是dispatcher转发操作。

上面列表中有几个result对象是开发中经常使用到的,例如,result的类型是redirect时,通常由action重定向到1个jsp页面是使用,而redirectAction通常在重定向到一个action。

 

5.由action重定向到action-无参数

上一节介绍action转发到jsp页面并显示action中属性的例子,下面介绍在项目中应用中最常见的技术点:从一个action重定向到另一个action。

在电子商务的项目中,经常遇到的场景就是:登陆成功后,则显示全部的书籍列表。这种情况就是一个典型的从登陆的action重定向到另一个列表的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/dtd/struts-2.0.dtd"><struts>   <package name="Maybe" extends="struts-default">        <action name="login" class="controller.Login">       <result name="success" type="redirect">/true.jsp</result>       <result name="false">/false.jsp</result>       <result name="input">/login.jsp</result>   </action>   </package></struts>


运行程序,输入正确的用户名密码,点击提交之后并没有显示任何数据,说明数据并没有传过来,也就是说经过redirect之后,并没有共用一个request对象。

 

下面介绍一个展示图书列表的重定向操作:

7.创建起始控制层Login.java

(1) 新建登陆验证类,代码如下:

package controller;public class Login {public String execute(){return "list";}}

代码return “list”在本里要实现的是1个“重定向”的操作,目的是改变浏览器的URL地址,执行List.action而列出图书列表。重定向的操作为:由Login.action转发到List.action。

8.创建目的控制层List.java

package controller;import java.util.ArrayList;public class List {private ArrayList booklist = new ArrayList();public ArrayList getBooklist() {return booklist;}public void setBooklist(ArrayList booklist) {this.booklist = booklist;}public String execute(){booklist.add("book1");booklist.add("book2");booklist.add("book3");booklist.add("book4");booklist.add("book5");return "bookListJsp";}}


上述代码声明了1个ArrayList变量booklist,然后使用execute方法向这个booklist存放书籍的名称,return “bookListJsp”表示转发到一个用于显示书籍列表的JSP页面。

9.在struts文件中进行配置

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtd/struts-2.0.dtd"><struts>   <package name="Maybe" extends="struts-default">        <action name="login" class="controller.Login">       <result name="list" type="redirectAction">         <param name="actionName">List</param>       </result>            </action>          <action name="List" class="controller.List">       <result name="bookListJsp">/bookListJsp</result>     </action>   </package></struts>


下列标记的功能是从当前的action,即login重定向到List这个action,其中重定向的关键操作是type的属性值:redirectAction。

<result name="list" type="redirectAction">         <param name="actionName">List</param>       </result>    


10.创建显示列表的JSP页面

用于显示书籍列表的bookListJsp.jsp的代码如下:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%><%@ taglib uri="/struts-tags" prefix="s" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <body>    <s:iterator value="booklist" var="list">      <s:property value="list"/>      <br>    </s:iterator>  </body></html>

这里使用了struts2标签来进行遍历输出,value属性是被循环的集合包括List,Set,数组,Map。

11.直接运行login.action     地址立即变为List.action结果: