`

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
分享到:
评论

相关推荐

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView...

    Google Android SDK开发范例大全的目录

    3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView...

    Google+Android+SDK开发范例大全

    3.7 简易的按钮事件——Button事件处理 3.8 手机页面的转换——setContentView的应用 3.9 调用另一个Activity——Intent对象的使用 3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前一个...

    Google Android SDK开发范例大全(完整版附部分源码).pdf

    3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与...

    Google Android sdk 开发范例大全 部分章节代码

    3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView...

    Google Android SDK 开发范例大全01

    3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView...

    Google Android SDK 开发范例大全02

    3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView...

    Google Android SDK开发范例大全(完整版)

    3.10 不同Activity之间的数据传递——Bundle对象的实现 3.11 返回数据到前一个Activity——startActivityForResult方法 3.12 具有交互功能的对话框——AlertDialog窗口 3.13 置换文字颜色的机关——Button与TextView...

    Struts2 in action中文版

    3.4 向对象传递数据 51 3.4.1 对象支持的JavaBean属性 52 3.4.2 ModelDriven动作 54 3.4.3 域对象用作数据转移的潜在危险 55 3.5 案例研究:文件上传 56 3.5.1 通过struts-default包获得内建的支持 56 3.5.2 ...

    java8stream源码-java8:Java8——函数式编程

    —— 函数式编程 介绍 该存储库包含例如 Java 8 In Action 和 Java 8 Lambdas Pragmatic Functional Programming 一书中的源代码。 同时自己也做了一些扩展使用,修复了源码中的bug。 例如 Java 8 In Action 中的源...

    外文翻译 stus MVC

    Struts——an open-source MVC implementation This article introduces Struts, a Model-View-Controller implementation that uses servlets and JavaServer Pages (JSP) technology. Struts can help you control...

    Java Web编程宝典-十年典藏版.pdf.part2(共2个)

    3.10.2 如何在超链接中传递多个参数 3.10.3 重定向后出现404错误 3.11 精彩回顾 第4章 体验面向对象 1IavaBean技术 4.1 本章学习任务 4.1.1 本章知识体系 4.1.2 实例开发任务 4.2 JavaBean简介 4.2.1 JavaBean产生...

    非常不错的中文struts2教程[CHM]

    1、OGNL —— 数据运转的催化剂 2、Result机制,让视图更丰富 3、Struts2配置详解 4、Struts2中的Action 5、Struts2中的参数传递 6、标签库,永恒的争论话题 7、拦截器详解 8、配置,灵活还是简单? 9、深入plugin ...

Global site tag (gtag.js) - Google Analytics