Action的作用——传递数据
?
本章节我们会继续讨论Action,在这里您将了解到Action的基本作用和传递数据的做法。
?? ? ? ? 完成所需的业务逻辑
?? ? ? ? 提供数据传递的中介
?? ? ? ? 确定要显示的页面
现在我们知道所谓的业务逻辑的完成是在Action方法中完成的,不过要提及到的是,我们以MVC的观念来看Action类的职位属于Controller(控制器),所以在Action方法中业务逻辑的完成应当是通过调用业务逻辑层来完成的,而不是将具体的业务逻辑实现在Action方法中,要不然问题就大了。
Action类的另外一个作用就是确定要显示的页面,确定要显示的方式是以返回一个字符串然后和struts.xml的配合来完成的【通常我把这个确定显示页面的字符串称为控制字符串】。上章节我们还了解到确定要返回的页面在struts.xml中用<result>元素来定义,<result>元素默认以type=”dispather”的形式来确定要返回到的页面。这里type 的值有多种,【您可以在Struts2的文档result-types.html,找到关于type值的说明】。所以说我们之前说的Action类的作用之3:确定要显示的页面,这一条就有点小看Struts2在这方面的作用了。为什么之前这么说就是让大家理解起来简单,要不然就有点难理解Struts2确定页面的方式,希望大家能够理解。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s" %><!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>Input User Message</title></head><body> <h2>Please input your Message.</h2> <s:form action="userAction"> <s:textfield name="name" label="Your name" /> <s:textfield name="age" label="Your age"/> <s:textfield name="email" label="Your email"/> <s:submit /> </s:form></body></html>
?
?
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s" %><!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>Show Book Message</title></head><body> <h2>Here is a book Message :</h2> Book name : <s:property value="name" /><br /> Price : <s:property value="price" /><br /> PublishingHouse : <s:property value="publishingHouse" /><br /></body></html>
?
?
package com.lele.struts2.useAction.action; public class UserAction { private String name; private int age; private String email; public String execute() { return "success"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
?
?
?
?
不过这样做有些时候不够“优雅”,因为我们在页面上,要设置数据或获得数据时总是在使用”.”的方式来获取或设置数据,这样有时候会有点导致页面有些“混乱”。有没有一种好的方式来解决它呢?
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s" %><!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>Input Book Message</title></head><body> <h2>Please input book Message here.</h2> <s:form action="bookAction"> <s:textfield name="name" label="Book name" /> <s:textfield name="price" label="Price"/> <s:textfield name="publishingHouse" label="Publishing house"/> <s:submit /> </s:form></body></html>
?
?
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s" %><!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>Show User Message</title></head><body> <h2>Your Message :</h2> Name : <s:property value="name"/><br /> Age : <s:property value="age" /><br /> Email : <s:property value="email" /><br /></body></html>
?
package com.lele.struts2.useAction.model; public class Book { private String name; private double price; private String publishingHouse; public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getPublishingHouse() { return publishingHouse; } public void setPublishingHouse(String publishingHouse) { this.publishingHouse = publishingHouse; }}
?
?
Step 4:
?
package com.lele.struts2.useAction.action; import com.lele.struts2.useAction.model.Book;import com.opensymphony.xwork2.ModelDriven; public class BookAction implements ModelDriven<Book>{ private Book book; public String execute() { return "success"; } @Override public Book getModel() { book = new Book(); return book; }}
?
?
?????? Step 5:
?????? 现在我们又要使用struts.xml把页面和Action关联起来,这里我就不贴代码了。
?????? OK ,大功告成,不过没什么好演示的,这里就不贴图了。
?
好了,本章节就到这里了,简单介绍了Action类的传递数据的作用。通常情况下我们可以把要传递的数据作为Action类的属性,并且提供getter和setter方法来让客户端访问和设置数据。当Action的属性由某个类的对象来充当时,而且要对其进行数据传递,这个时候第一种方法,就会暴露出某些缺点。然后我们使用了另外一种方式,让Action类实现一个接口ModelDriven的方式来解决这个“问题”。
我们可以看到实现ModelDriven接口的方式需要我们自己创建模型对象,而我们用setter和getter方法的方式却不需要。哪种方式更适合您,您自己做选择吧。
现在我们所做的是数据借助模型层(Model)或数据直接到控制层(Controller ,Action),数据是来自于页面,又到页面中去。现在假设某个数据在session对象中,在request对象中,能不能获取或设置到呢?下个章节我们将讨论在Action类中访问Servlet API的问题。
在我们所做的实例中存在着不少的问题,比如说数据类型的校验问题,比如说数据类型转化的问题,这些目前不能很好的处理,后面我会详细的说道这些问题的解决方法。现在您要做的是把当前我们所讨论的问题解决掉,然后试试Action属性有个List类型的或者是Map类型的怎样处理呢?数据能在页面中得到能在JavaScript脚本中得到吗?得到后怎样操作这些数据呢?得不到数据怎样让脚本代码得到数据呢?
?
OK,下个章节我们再见。
?