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结果: