`

Action的作用——传递数据

阅读更多

 

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类的一个实例,而且我们为这个属性设置了settergetter方法。这样做的目的就是让这个属性拥有获得数据和被访问的能力。在要显示的页面上我们使用这个属性名然后加“ .“ 的方式访问到了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类的属性,并且提供gettersetter方法来让客户端访问和设置数据。当Action的属性由某个类的对象来充当时,而且要对其进行数据传递,这个时候第一种方法,就会暴露出某些缺点。然后我们使用了另外一种方式,让Action类实现一个接口ModelDriven的方式来解决这个“问题”。

我们可以看到实现ModelDriven接口的方式需要我们自己创建模型对象,而我们用settergetter方法的方式却不需要。哪种方式更适合您,您自己做选择吧。

现在我们所做的是数据借助模型层(Model)或数据直接到控制层(Controller ,Action),数据是来自于页面,又到页面中去。现在假设某个数据在session对象中,在request对象中,能不能获取或设置到呢?下个章节我们将讨论在Action类中访问Servlet API的问题。

在我们所做的实例中存在着不少的问题,比如说数据类型的校验问题,比如说数据类型转化的问题,这些目前不能很好的处理,后面我会详细的说道这些问题的解决方法。现在您要做的是把当前我们所讨论的问题解决掉,然后试试Action属性有个List类型的或者是Map类型的怎样处理呢?数据能在页面中得到能在JavaScript脚本中得到吗?得到后怎样操作这些数据呢?得不到数据怎样让脚本代码得到数据呢?

 

OK,下个章节我们再见。

 

  • 大小: 6.4 KB
  • 大小: 4.4 KB
1
0
分享到:
评论

相关推荐

    Android源码——Activity设置相同的action进行判断源码_new_02.7z

    在Android开发中,Intent是用来在组件之间传递消息的类,它包含了Action、Data、Category等关键信息。Action是Intent的一个重要属性,用来描述执行的动作,如ACTION_VIEW、ACTION_EDIT等。当多个Activity可以响应同...

    安卓Android源码——Activity设置相同的action进行判断源码.zip

    Intent是Android中的一种消息对象,用于在应用程序的不同组件之间传递请求或数据。当一个Activity需要启动另一个Activity或者服务时,会使用Intent来定义其意图,其中可以包含Action、Data、Category等信息。 ...

    STRUTS——SQL添加删除

    - **Form Bean**:用于在Action类和视图之间传递数据,用户输入的数据会被封装到Form Bean中,然后由Action类处理。 4. **SQL操作**: - **添加(Insertion)**:当用户提交新增数据时,Action类会调用DAO的...

    Android源码——Intent切换.zip

    Intent不仅可以用于启动一个新的Activity,还可以启动Service、BroadcastReceiver,甚至可以传递数据。本资料"Android源码——Intent切换.zip"很可能是关于Intent在Android应用开发中的详细解析,包括Intent的创建、...

    struts2——docs部分

    OGNL是Struts2中的表达式语言,用于在Action和JSP之间传递数据。它允许直接访问对象的属性,以及进行各种操作,如算术运算、逻辑判断等。 **6. 自定义标签** Struts2提供了丰富的自定义标签库,简化了视图层的开发...

    安卓Android源码——Intent1.rar

    Intent 可用于启动活动(Activity)、服务(Service),传递数据,甚至启动广播接收器(Broadcast Receiver)。本压缩包文件“安卓Android源码——Intent1.rar”很可能包含了有关Intent的源代码分析和示例,帮助...

    struts——java文件

    3. **ActionForm**:虽然在较新的Struts版本中已经不再强制使用,但在早期版本中,ActionForm对象用于封装用户从表单提交的数据,然后传递给Action类处理。 4. **Interceptor(拦截器)**:拦截器是Struts的一个...

    项目实战——————网站

    通过配置Action,我们可以定义特定URL映射到的方法,实现页面跳转和数据传递。 2. **Hibernate**: Hibernate 是一个强大的对象关系映射(ORM)框架,用于简化数据库操作。在项目中,Hibernate帮助我们将Java类与...

    安卓Android源码——Intent.rar

    Intent常用于启动新的Activity,通过`startActivity(Intent)`方法,我们可以传递数据给新Activity,比如传递一个选择的图片或文本。 5. **启动Service**: 除了启动Activity,Intent还可以启动Service。Service是...

    Struts——an_open-source_MVC_implementation

    当用户提交表单时,这些数据会被绑定到`ActionForm`对象中,然后传递给相应的`Action`类进行处理。 **Struts MVC 2 实现** Struts 1.x版本基于MVC Model 2架构,它强调了控制器的角色,`ActionServlet`负责转发请求...

    安卓Android源码——MyIntent.rar

    在安卓(Android)开发中,Intent 是一个至关重要的组件,它起到了应用程序内部或者应用程序之间通信的桥梁作用。在深入理解 Android 源码的过程中,分析 Intent 的实现原理可以帮助开发者更好地利用这一功能,提高...

    Android四大核心——Intent

    在Android操作系统中,Intent是四大核心组件(Activity、Service、BroadcastReceiver、ContentProvider)之间通信的重要桥梁,也是应用程序中启动活动、启动服务、传递数据的关键工具。本篇将深入探讨Intent的基本...

    安卓Android源码——Intent_DataSample.rar

    在安卓(Android)开发中,Intent 是一个非常关键的概念,它是应用程序之间通信的重要桥梁,用于启动其他组件(如Activity、Service、BroadcastReceiver等)并传递数据。本项目"Intent_DataSample"显然着重于演示...

    myeclipse+struts实例——2

    ActionForm则用于在请求之间传递数据;struts-config.xml配置文件定义了各个组件之间的关联。 3. **Tomcat服务器**:Tomcat是一个开源的、轻量级的Web应用服务器,常用于运行Java Servlet和JavaServer Pages(JSP)...

    J2EE项目实训——Struts框架技术.rar

    开发者可以创建ActionForm类来收集、校验和传递用户输入的数据。 5. **Tiles框架集成**:Struts框架常与Tiles插件结合使用,提供更复杂的视图布局。Tiles允许你定义可重用的页面片段,然后组合成完整的页面,提高了...

    入门学习struts——合同管理系统

    ActionForm则封装了请求参数,负责在Action和视图之间传递数据。 4. **JSP和标签库**:视图层可能使用JSP(JavaServer Pages)技术,结合Struts的自定义标签库(如logic标签、bean标签等)来动态生成HTML页面。你...

    Struts2——教程

    Struts2使用ValueStack来存储和传递数据,使得数据可以在Action和JSP之间无缝流动。 四、配置与注解 Struts2支持XML配置和注解配置两种方式。XML配置文件主要用于定义Action、结果类型、拦截器栈等,而注解则可以更...

    android Action大全

    本篇文章将深入解析Android中的Action,并结合提供的资源——"android_action大全.doc",来详细阐述Action的相关知识点。 首先,Action是Intent的一个关键组成部分。Intent在Android中是用来在组件之间传递消息的...

    struts2.2.1.1帮助文档——英文

    6. **OGNL(Object-Graph Navigation Language)**:Struts2使用OGNL作为表达式语言,用于在Action与视图之间传递数据。例如,`${user.name}`可以获取Action中`user`对象的`name`属性。 7. **Tiles**:Struts2支持...

Global site tag (gtag.js) - Google Analytics