使用Struts 2进行动态数据处理

几乎每个基于Web的业务应用程序都需要将数据存储在各种数据库中。 对于Struts 2初学者来说,开发Web应用程序时面临的最大挑战是将存储在其数据库中的数据显示到浏览器的呈现页面。

开发用于处理数据的最佳方法可能需要大量的精力。 出色的应用程序需要良好的用户界面(UI)和良好的后端实现。 Struts 2的强大之处在于它能够提供具有以下功能的Model-View-Controller(MVC)模式的清晰实现:

动作
作为框架体系结构的一部分,Actions通过将所有业务逻辑放在一个位置来提供简洁的实现。 动作充当将数据从请求自动传输到结果页面的渠道。
结果
一个UI,代表用户从应用程序到Web浏览器的需求。
拦截器
通过实施常见的操作(如验证,日志记录语句和错误检查)来消除多个操作的开销,并提高性能,这是多个操作所共有的。

拦截器在后处理和预处理中都被调用。 对于一个动作请求,可能会有一堆拦截器。

价值栈
一个对象,其中包含在处理请求期间关联的所有数据。

图1显示了Struts 2框架的组件。

图1. Struts 2动作,拦截器和结果
该图显示了Struts 2框架的组件,包括“ Web浏览器(结果)”,“ Interceptors 1、2和3,Interceptors 1、2和3”,“ Action”和“ Value stack”以及“ Session”和“ Variable 1、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上的数据
该图显示了ValueStack上的数据,包括Hello World Action和HelloWorld.jsp。

静态数据与动态数据

如果预先知道将在UI上显示的数据,则可以将其称为静态数据。 通过直接在JavaServer Pages(JSP)中进行编码,可以轻松处理静态数据。 图3显示了静态数据情况。

图3.静态数据
该图显示了静态数据。三个框,每个框的箭头都指向逆时针方向:JSP,Action和Client浏览器。

如果用户要显示从用户数据库检索到的数据,则需要一种机制来适当地处理Action和JSP中的数据并在UI上显示数据。 对于Struts 2,这种类型的场景的构造块是Action类和ValueStack。 通过使用getter和setter方法, Action类将用户值保存到ValueStack上。 之后,JSP将获取匹配的变量名的值,并将其显示在UI上。 参见图4。

图4.动态数据
动态数据图,带有标有“结果”,“ ValueStack”,“数据库”,“操作”和“客户端浏览器名称= Swati”的框。

使用用户数据设置UI字段和标签

Struts 2提供了一个标记库,该标记库以丰富且可重复使用HTML显示数据,以帮助您创建基于表单的交互式应用程序。 Struts 2带有通用标签(控制标签和数据标签)和UI标签。 UI标签旨在从ValueStack(将操作添加的数据添加到ValueStack)或数据标签中获取数据。 以下是Struts 2 UI标签<select标签>的示例。

  1. 编写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上显示。

  2. 要在JSP端处理数据,需要编写<select>标记,该标记将获取statestatus的值,如清单2所示:
    清单2.编写<select>标签,该标签将获取statestatus的值
    <%@ 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>
  3. 使用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类具有名为statestatus的列表变量。
  • 通过使statestatus类型为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后显示最后一个值。

  1. 修改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>标记的默认值设置变量。

  2. 修改后的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值