Action的作用——传递数据
本章节我们会继续讨论Action,在这里您将了解到Action的基本作用和传递数据的做法。
Action的作用
在上个章节中我们了解到所谓的Action类大体上有3个作用:
完成所需的业务逻辑
提供数据传递的中介
确定要显示的页面
现在我们知道所谓的业务逻辑的完成是在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确定页面的方式,希望大家能够理解。
在本章节中我并不打算和大家讨论关于Action类处理业务逻辑的问题和确定“页面“的问题,当然后面我会说到的,至于为什么不一下把Action的作用说完,您慢慢就会了解到的。
传递数据
现在我们来看Action类传递数据的作用,首先来回想一下我们之前做过的HelloWorld实例程序。来想一下HelloWorld程序中数据的传递方式,我们在页面上单击一个超级连接,然后会请求相应的Action,在Action方法中我们放入了消息数据,然后在页面上使用了Struts2提供的取值标签来获得值。我们从过程上来看就是这样,不知您有没有注意到在Action类中有一个属性。这个属性就是Message类的一个实例,而且我们为这个属性设置了setter和getter方法。这样做的目的就是让这个属性拥有获得数据和被访问的能力。在要显示的页面上我们使用这个属性名然后加“ .“ 的方式访问到了Message类的属性。当然这里没有体现到能接受客户端的数据。OK,我们现在来做一个实例来看一看。
这个实例是这个样子的:我们在某个页面输入用户的基本信息,然后点击提交,在另外一个页面上显示我们提交的数据。这里要提醒大家一点,实例会涉及到一些Struts2标签的一些用法,您可能不太了解,别着急,后面我会详细说到。
Step 1:
首先我们来把Struts2安装好,然后new一个jsp页面来让用户输入相关数据,这里我们要提供一个表单,让用户输入用户名和年龄和电子邮件。这里我们要引用Struts2的标签来帮助我们实现这一功能。OK ,我们来看一下这个jsp页面:
<%@ 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>
Step 2:
然后我们在new 一个jsp页面来显示上面用户的输入:
<%@ 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>
Step 3:
现在我们要new 一个Action类来作为数据传递的纽带:
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;
}
}
Step 4:
现在我们要把页面和Action关联起来,这里我就不贴代码了,大家自己动手写一下,可能会有意想不到的收获。
OK,我们的任务完成了,快来看一下:
单击提交按钮后:
做完这个小实例相信您对Action传递数据的作用会有所上升。当然这里我们是在Action类中直接定义了几个属性,有些时候我们为了业务的需要会把某个类的实例作为Action类的属性,这种方式应该怎样传递数据呢?您可以直接参考我们之前做过的“HelloWorld”实例。而且这种方式您不用关心对象的建立,Struts2会自动帮助您建立。
在页面的Struts2标签中使用“对象名.属性”的方式来引用数据。
ModelDriven接口
不过这样做有些时候不够“优雅”,因为我们在页面上,要设置数据或获得数据时总是在使用”.”的方式来获取或设置数据,这样有时候会有点导致页面有些“混乱”。有没有一种好的方式来解决它呢?
有,在Struts2中提供了这么一个接口:ModelDriven,在这个接口中止定义了一个方法:getModel,这样就能避免一些“混乱”。OK,我们马上来看一个实例:
我们要输入一个书籍的基本信息,然后再另一个页面上显示出来,仅此而已。
Step 1:
<%@ 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>
Step2 :
<%@ 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>
Step 3:
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,下个章节我们再见。
- 大小: 6.4 KB
- 大小: 4.4 KB
分享到:
相关推荐
在Android开发中,Intent是用来在组件之间传递消息的类,它包含了Action、Data、Category等关键信息。Action是Intent的一个重要属性,用来描述执行的动作,如ACTION_VIEW、ACTION_EDIT等。当多个Activity可以响应同...
7. **Struts ActionForm Bean**:ActionForm是Struts处理表单数据的载体,它捕捉来自用户表单的数据,封装后传递给Action类进行处理。 8. **Struts的其他组件** - **Validation Framework for Struts**:提供了...
Intent是Android中的一种消息对象,用于在应用程序的不同组件之间传递请求或数据。当一个Activity需要启动另一个Activity或者服务时,会使用Intent来定义其意图,其中可以包含Action、Data、Category等信息。 ...
- **Form Bean**:用于在Action类和视图之间传递数据,用户输入的数据会被封装到Form Bean中,然后由Action类处理。 4. **SQL操作**: - **添加(Insertion)**:当用户提交新增数据时,Action类会调用DAO的...
Intent不仅可以用于启动一个新的Activity,还可以启动Service、BroadcastReceiver,甚至可以传递数据。本资料"Android源码——Intent切换.zip"很可能是关于Intent在Android应用开发中的详细解析,包括Intent的创建、...
OGNL是Struts2中的表达式语言,用于在Action和JSP之间传递数据。它允许直接访问对象的属性,以及进行各种操作,如算术运算、逻辑判断等。 **6. 自定义标签** Struts2提供了丰富的自定义标签库,简化了视图层的开发...
Intent 可用于启动活动(Activity)、服务(Service),传递数据,甚至启动广播接收器(Broadcast Receiver)。本压缩包文件“安卓Android源码——Intent1.rar”很可能包含了有关Intent的源代码分析和示例,帮助...
7. 框架根据返回的结果查找对应的视图(通常为JSP页面),并将数据传递给视图以生成最终的HTTP响应。 8. 响应发送回用户浏览器。 Struts2的核心组件包括: - Struts2的配置文件(struts.xml):用于定义Action的...
3. **ActionForm**:虽然在较新的Struts版本中已经不再强制使用,但在早期版本中,ActionForm对象用于封装用户从表单提交的数据,然后传递给Action类处理。 4. **Interceptor(拦截器)**:拦截器是Struts的一个...
通过配置Action,我们可以定义特定URL映射到的方法,实现页面跳转和数据传递。 2. **Hibernate**: Hibernate 是一个强大的对象关系映射(ORM)框架,用于简化数据库操作。在项目中,Hibernate帮助我们将Java类与...
Intent常用于启动新的Activity,通过`startActivity(Intent)`方法,我们可以传递数据给新Activity,比如传递一个选择的图片或文本。 5. **启动Service**: 除了启动Activity,Intent还可以启动Service。Service是...
- **ActionForm**:在控制器层面,Struts使用ActionForm对象来收集和验证用户输入,然后传递到Action类进行处理。 - **ActionServlet**:这是Struts的核心组件,它是一个定制的Servlet,负责调度请求,处理业务...
在安卓(Android)开发中,Intent 是一个至关重要的组件,它起到了应用程序内部或者应用程序之间通信的桥梁作用。在深入理解 Android 源码的过程中,分析 Intent 的实现原理可以帮助开发者更好地利用这一功能,提高...
在Android操作系统中,Intent是四大核心组件(Activity、Service、BroadcastReceiver、ContentProvider)之间通信的重要桥梁,也是应用程序中启动活动、启动服务、传递数据的关键工具。本篇将深入探讨Intent的基本...
在安卓(Android)开发中,Intent 是一个非常关键的概念,它是应用程序之间通信的重要桥梁,用于启动其他组件(如Activity、Service、BroadcastReceiver等)并传递数据。本项目"Intent_DataSample"显然着重于演示...
ActionForm则用于在请求之间传递数据;struts-config.xml配置文件定义了各个组件之间的关联。 3. **Tomcat服务器**:Tomcat是一个开源的、轻量级的Web应用服务器,常用于运行Java Servlet和JavaServer Pages(JSP)...
开发者可以创建ActionForm类来收集、校验和传递用户输入的数据。 5. **Tiles框架集成**:Struts框架常与Tiles插件结合使用,提供更复杂的视图布局。Tiles允许你定义可重用的页面片段,然后组合成完整的页面,提高了...
ActionForm则封装了请求参数,负责在Action和视图之间传递数据。 4. **JSP和标签库**:视图层可能使用JSP(JavaServer Pages)技术,结合Struts的自定义标签库(如logic标签、bean标签等)来动态生成HTML页面。你...