几乎每个基于Web的业务应用程序都需要将数据存储在各种数据库中。 对于Struts 2初学者来说,开发Web应用程序时面临的最大挑战是将存储在其数据库中的数据显示到浏览器的呈现页面。
开发用于处理数据的最佳方法可能需要大量的精力。 出色的应用程序需要良好的用户界面(UI)和良好的后端实现。 Struts 2的强大之处在于它能够提供具有以下功能的Model-View-Controller(MVC)模式的清晰实现:
-
动作
- 作为框架体系结构的一部分,Actions通过将所有业务逻辑放在一个位置来提供简洁的实现。 动作充当将数据从请求自动传输到结果页面的渠道。 结果
- 一个UI,代表用户从应用程序到Web浏览器的需求。 拦截器
-
通过实施常见的操作(如验证,日志记录语句和错误检查)来消除多个操作的开销,并提高性能,这是多个操作所共有的。
拦截器在后处理和预处理中都被调用。 对于一个动作请求,可能会有一堆拦截器。
价值栈
- 一个对象,其中包含在处理请求期间关联的所有数据。
图1显示了Struts 2框架的组件。
图1. Struts 2动作,拦截器和结果
在本文中,了解基于Web的应用程序中的动态数据处理。 您将探索如何在运行时使用一些特殊的用例发送用户数据,例如用用户数据值预填充表单,以及设置UI字段以显示值列表中的默认值。 本文重点介绍Struts 2 Action类与结果页面之间动态数据流的实现细节。
使用Struts 2 ValueStack进行动态数据处理
ValueStack是Struts 2的强大功能之一,可在处理请求期间保存所有数据。 动作类还以bean形式存储数据。 (在Struts 2中,您可以使用getter和setter方法。)将数据存储在动作类对象中之后,Struts 2会将这些数据以Action
对象的形式放入ValueStack中。 ValueStack存储了一堆对象,这些数据将暴露给框架的其他部分。
在图2中, action
类使用getter和setter方法设置两个变量的值。 在处理请求期间,此数据将保存到ValueStack。 HelloWorld.jsp将从ValueStack中获取这些变量的值,并使用Struts 2标记库中的<s:property>标记显示这些值。
图2. ValueStack上的数据
静态数据与动态数据
如果预先知道将在UI上显示的数据,则可以将其称为静态数据。 通过直接在JavaServer Pages(JSP)中进行编码,可以轻松处理静态数据。 图3显示了静态数据情况。
图3.静态数据
如果用户要显示从用户数据库检索到的数据,则需要一种机制来适当地处理Action和JSP中的数据并在UI上显示数据。 对于Struts 2,这种类型的场景的构造块是Action
类和ValueStack。 通过使用getter和setter方法, Action
类将用户值保存到ValueStack上。 之后,JSP将获取匹配的变量名的值,并将其显示在UI上。 参见图4。
图4.动态数据
使用用户数据设置UI字段和标签
Struts 2提供了一个标记库,该标记库以丰富且可重复使用HTML显示数据,以帮助您创建基于表单的交互式应用程序。 Struts 2带有通用标签(控制标签和数据标签)和UI标签。 UI标签旨在从ValueStack(将操作添加的数据添加到ValueStack)或数据标签中获取数据。 以下是Struts 2 UI标签<select标签>的示例。
- 编写
Action
类以将数据显示到UI上,如清单1所示。清单1.编写
Action
类以将数据显示到UI上publicclass DisplayAction extends ActionSupport { private List state = new ArrayList(); private List status = new ArrayList(); public String execute() { setState(this.state); setStatus(this.status); return "success"; } //getter and setter method for state variable// public List getState() { return state; } publicvoid setState(List state) { //implement the application specific logic to retrieve the data from the database here// //Here for displaying the data on UI, we are using few hardcoded values// state.add("Defect"); state.add("Task"); state.add("User Stories"); } public List getStatus() { return status; } publicvoid setStatus(List status) { //implement the application specific logic to retrieve the data from the database here// //Here for displaying the data on UI, we are using few hardcoded values// status.add("New"); status.add("Fixed") status.add("Resolved"); status.add("Closed"); } }
在此示例中,
DisplayAction
类使用一些值设置ArrayList
对象的状态和状态。Action
类会将这些数据保存到ValueStack上,JSP将使用该数据集在UI上显示。 - 要在JSP端处理数据,需要编写<select>标记,该标记将获取
state
和status
的值,如清单2所示:清单2.编写<select>标签,该标签将获取
state
和status
的值<%@ page language="java" contentType="text/; =ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s"uri="/struts-tags" %> <html> <title>Sample Display Page</title> <body> <s:select list="%{status}" name="Status"></s:select> <s:select list="%{state}" name="State"></s:select> </body> </html>
- 使用struts.xml映射配置
Action
和JSP,如清单3所示。清单3.使用struts.xml映射配置
Action
和JSP<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="sample.exmaple" extends="struts-default"> <action name=”DisplayAction” class=”com.sample.example.DisplayAction”> <result name=”success”>/DisplayPage.jsp </result> </action> </package> </struts>
在上面的代码示例中:
-
Action
类具有名为state
和status
的列表变量。 - 通过使
state
和status
类型为arraylist
,将数据添加到Action
类中。 -
<s:select>
具有与Action
类中定义的名称相同的list参数(强制性)。 - 使用
%{<list-variable>}
放置这些列表变量。 - JSP中的列表变量的名称必须与
Action
类中给定的名称匹配。
图5显示了输出示例。
图5.输出1:状态列表的显示
在图6中,<select>标记Status
用在Action
类中放置的值初始化。
图6.输出2:状态列表的显示
<select>标记State
也使用Action
类中放置的值进行初始化。
在预填充的UI字段中设置默认值
假设用户有一个值列表。 用户希望从列表中的元素中设置一个值作为UI加载后的默认值。
在下面的示例中,用户具有一个组合框,并希望在加载UI后显示最后一个值。
- 修改
Action
类,并添加默认值的代码,如清单4所示。清单4.修改
Action
类并添加默认值的代码publicclass DisplayAction extends ActionSupport { private List state = new ArrayList(); private List status = new ArrayList(); private String defaultState = ""; private String defaultStatus = ""; public String execute() { //set status and state list values// setState(this.state); setStatus(this.status); //set default values for state and status which //a user wants to display on the User Interface setDefaultState("Task"); setDefaultStatus("Closed"); return "success"; } //getter and setter method// public List getState() { return state; } publicvoid setState(List state) { //implement the application specific logic to retrieve //the data from the database here// //Here for displaying the data, we are using few //hardcoded values state.add("Defect"); state.add("Task"); state.add("User Stories"); } public List getStatus() { return status; } publicvoid setStatus(List status) { //implement the application specific logic to retrieve //the data from the database here// //Here for displaying the data, we are using few //hardcoded values// status.add("New"); status.add("Fixed"); status.add("Resolved"); status.add("Closed"); } public String getDefaultState() { return defaultState; } publicvoid setDefaultState(String defaultState) { this.defaultState = defaultState; } public String getDefaultStatus() { return defaultStatus; } publicvoid setDefaultStatus(String defaultStatus) { this.defaultStatus = defaultStatus; } }
在上面的
Action
类中,该示例添加了两个更多的getter / setter方法,以使用<select>
标记的默认值设置变量。 - 修改后的JSP代码如清单5所示。
清单5.修改后的JSP代码
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="s" uri="/struts-tags" %> <html> <title>Sample Display Page</title> <body> <s:select list="%{status}" name="Status" value="%{defaultStatus}"></s:select> <s:select list="%{state}" name="State" value="%{defaultState}"></s:select> </body> </html>
在这种情况下,struts.xml映射保持不变。
在上面的代码示例中:
- 在
Action
类中,要显示的默认值保存在两个字符串变量中。 - 在JSP中,可以使用
<select>
标记的value
参数来处理这些值。 -
Action
类中的默认值变量的名称必须与结果JSP中的名称匹配。
图7显示了输出示例。
图7.输出1:状态默认值的显示
在图8中,在加载UI时,已将“ 关闭”设置为“状态”列表的默认值。
图8.输出2:状态默认值的显示
加载UI时,已将任务设置为“状态”列表的默认值。
摘要
Struts 2是第二代Web应用程序框架,已超过Java Servlet。 它包含了常用的MVC设计模式。 Struts 2自动执行常见任务,从而使您腾出时间来利用基于SML的配置进行操作到结果页面的映射。 该框架涵盖了基于Web的应用程序实施的底层细节,并提供了一个结构化软件。
在本文中,您了解了Struts 2功能作为一个完整的框架。 您探索了一些最常见的用例以及Struts 2强大功能所提供的解决方案。
翻译自: https://www.ibm.com/developerworks/web/library/wa-dynamicstruts/index.html