`
CoderDream
  • 浏览: 478383 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

使用Struts提交多行数据

阅读更多

使用Struts提交多行数据

http://blog.flashtc.com/article.asp?id=117

以下是使用struts提交多行数据的例子,提交多行数据至SurveyListForm:

提交页面form.jsp,用于提交两条数据,注意[]的使用:

<FORM METHOD=POST ACTION="survey.jui">
<INPUT TYPE="text" NAME="surveys[0].checkPerson">
<INPUT TYPE="text" NAME="surveys[1].checkPerson">

<INPUT TYPE="submit">

</FORM> 

响应页面index.jsp(survey.jui),用于获得数据:

<logic:iterate id="survey" name="surveyListForm" property="surveys" indexId="index">

 <html:text name="survey" property="checkPerson" indexed="true"/>

</logic:iterate> 

struts-config.xml:

<form-beans>
  <form-bean name="surveyForm" type="com.fenet.insurance.crm.web.form.SurveyForm" />
  <form-bean name="surveyListForm" type="com.fenet.insurance.crm.web.form.SurveyListForm" />
</form-beans>

<action path="/survey" parameter="method" 
    type="com.fenet.insurance.crm.web.action.SurveyAction"  
    name="surveyListForm" scope="request" validate="false">
  <forward name="method1" path="/index.jsp" />
</action> 

SurveyAction:

public class SurveyAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form, 
        HttpServletRequest request, HttpServletResponse response) throws Exception {
        SurveyListForm sForm = (SurveyListForm)form;
        List list = sForm.getSurveys();
        for(int i=0; i<list.size(); i++){
            SurveyForm f = (SurveyForm)list.get(i);
            System.out.println(f.getCheckPerson());//后台打印多行数据
        }
        request.setAttribute("surveys", sForm);
        return mapping.findForward("method1");
    }
} 

SurveyListForm定义多行数据:

public class SurveyListForm extends BaseForm{

    private List surveys = new AutoArrayList (SurveyForm.class);

    /**
     * @return Returns the surveys.
     */
    public List getSurveys() {
        return surveys;
    }

    /**
     * @param surveys The surveys to set.
     */
    public void setSurveys(List surveys) {
        this.surveys = surveys;
    }

} 

SurveyForm:

public class SurveyForm extends BaseForm{
    private String checkPerson;
    /**
     * @return Returns the checkPerson.
     */
    public String getCheckPerson() {
        return checkPerson;
    }
    /**
     * @param checkPerson The checkPerson to set.
     */
    public void setCheckPerson(String checkPerson) {
        this.checkPerson = checkPerson;
    }
} 

AutoArrayList,用于自动创建List里面的对象:

public class AutoArrayList extends ArrayList {
    private Class itemClass;
    public AutoArrayList(Class itemClass) {
        this.itemClass = itemClass;
    }
    public Object get(int index) {
        try {
            while (index >= size()) {
                add(itemClass.newInstance());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return super.get(index);
    }
}
 
结论:多行数据可以使用如: <INPUT TYPE="text" NAME="surveys[0].checkPerson"> 的方式提交,Struts会自动映射成List对象。不过需要注意使用AutoArrayList进行对象的实例化

在Struts中使用JavaBean和List(多行数据)类型属性

http://tech.ccidnet.com/art/3741/20030227/533379_1.html

 

     在 Strust 中,我们可能经常要在 ActionForm 中使用其他 JavaBean 作为属性类型,这里就存在着如何使用好这些属性与 HTML Form 之间的数据交换,下面我们就这些问题做一讲解。

 

如在用户注册界面中,我们通常会将用户的联系方式形成一个单独的新的 Class ,如 Contact ,包含以下属性:电话 (tel) ,手机(cell) , Email(email) , QQ(qq) ,通信地址 (adress) 等等,这样条理也比较清晰,以下是这个

ActionForm 的部分代码:

public class RegisterForm extends ActionForm{
    private Integer id;
    private String logonName;
    private String realName;
    private Contact contact=new Contact();
    ………..
}

在这里我们需要将 Contact 实例化(在 reset 函数中需要重新实例化),这主要因为 Struts 的机制:如我们将 HTML 的Form 元素(如 email )值传给 ActionForm , Struts 需要执行的操作是getContact().setEmail(String email) ,如果这时返回的 contact 对象为空的话,那么赋值如何进行,而且Struts 也不会知道如何去实例化 Contact ,有时这些 JavaBean 的类型有可能是接口,实例化更是未知,所以关于JavaBean 类型在 ActionForm 中的实例化,你需要自行完成,而且必须完成。至于在实际操作中判断 JavaBean是否被进行过相关操作(不再是初始状态),你需要自行判断,其实也很简单,如可在 Contact 类中编写一个函数检验一下即可。

 

      ActionForm 创建完毕后,我们需要在 Jsp Form 中引用这些 JavaBean 类型的属性值,那就很简单啦,只需采用“ Form 的属性名称”+“ . ”+“ JavaBean 中的属性名称”结构构成的名称付给相关元素即可。如:

<html:text property="contact.email"/> 

通过这种方式我们就可以处理好 ActionForm 中的 JavaBean 类型的属性值了。

 

实际的情况可能更复杂些,我们有时可能要提交多行数据到后退,而且行内的数据是相关的,如我们需要提交多个用户的联系方式,这些行内的数据,如email ,电话,手机,这些数据都是和用户编码相关的,现在我们修改一下 Contact 类,添加一个用户编码 (userId)属性,这时我们构建的 ActionForm 中可能需要一个列表数据( List )类型来处理这种情况。以下是这个 ActionForm的部分代码:

public class ModifyBatchContactForm extends ActionForm{
    private List contact =new AutoArrayList (Contact.class);
    …..
} 

在以上代码中,我们同样处理了 List 类型数据的初始化。 Struts 在给 List 中的对象赋值时,当然需要先获取 List

数据,然后在获取 List 中某一个对象(通过 Index),最后给对象赋值。在这里想我们可以更详细点分析浏览器端传过来数据,字段值形式如下:contact[0].email=linux_china@hotmail.com , Struts 获取 ActionForm 中的 List数据后,通过 Index (此时为 0 )来获取 List 中封装的 JavaBean 对象,然而此时 List是空的(尽管初始化了,但是没有数据),是无法取得封装的对象的,因此我们要在 Struts 获取 List中封装的对象的时候给它创建一个,这样就保证对象的获取和赋值的成功进行,所有我们新建一个 AutoArrayList 类,继承ArrayList ,只要重写 get(int index) 方法即可,其实很简单,代码如下:

public class AutoArrayList extends ArrayList {
	private Class itemClass;

	public AutoArrayList(Class itemClass) {
		this.itemClass = itemClass;
	}

	public Object get(int index) {
		try {
			while (index >= size()) {
				add( itemClass.newInstance());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

		return super.get(index);
	}
} 

  这样我们就完成可以多行数据提交的 ActionForm设计,这里还有点提醒,如果从浏览器端传过来的行索引是跳跃是的,如缺少中间行,而你不想要这些数据的话,且首尾行 index相差很大的话,这种方式可能不太适合。这种多行提交形式比较适合对固定行的数据处理。如果行数不固定的话,你可以参考使用 MapForm 方式实现。

 

      下面我们就看看如何在 Jsp 中使用这个 ActionForm ,其实只需要执行一个循环即可:

<logic:iterate id=" contact " name=" FormName " property=" contact " indexId="index">
    <html:text name=" contact " property="userId" indexed="true" />
    <html:text name=" contact " property="email" indexed="true"/>
</logic:iterate> 

这里我们再讲解一下,代码中出现的“ contact ”(红色)都是 ActionForm 中的 List数据类型变量名称,请确保一致,请不要更改名称,这也是方便提交到后台的数据接收。“ FormName ”为在 struts-config中声明的 ActionForm 名称。 indexed="true" 可以确保生成的 html 元素的名称唯一,不要缺少这个声明。以上的Jsp 代码,你也可以使用 JSTL 来完成,就看你习惯如何了。

 

      通过以上步骤,我们完成了多行数据的提交所有环节,这样 Struts 就会完成其他所有的事情,我们的代码逻辑和实现也简单多了。

 

总结:通过以上两个例子,相以信对 ActionForm 中使用 JavaBean 和 List 类型数据不会再陌生,同时使用 Map类型,这样可创建更好的 ActionForm 设计,关于 MapForm ,请参考 http://www.jetmaven.net/documents/j_mapformInStruts.php 。不过引入这种方式后,在Validator 方面你可能要花点脑筋啦(如通过 XDoclet 生成 Validator文件可能功能不全),可能你需要手写一些代码来完成相关工作。

分享到:
评论
1 楼 changqingonly 2008-12-12  
很强大,受教了。

相关推荐

    struts中多行提交问题

    在Struts框架中处理多行数据提交的问题是一个常见的开发场景,尤其当涉及到表格形式的数据录入时。本文将深入探讨如何在Struts框架下实现多行数据的动态添加与提交,结合给定的代码示例进行详细解析。 ### Struts...

    提交多行数据到Struts的ActionForm的List属性中

    为了提交多行数据,我们通常会在HTML页面中使用多个相同的输入元素,比如表格,每个行代表一行数据。例如,我们可以创建一个表格,每行包含多个输入框,分别对应一个对象的属性。 ```html &lt;td&gt;&lt;input type=...

    struts2标签使用例子

    在压缩包中的"example"文件可能包含了一个或多个使用Struts2标签的实际示例,可以参考这些示例来理解和学习Struts2标签的用法。通过实践,你会更好地掌握这些标签的功能和用法,从而在开发过程中更加得心应手。

    struts2标签使用方法

    - 在JSP页面中使用Struts2标签和EL表达式展示或操作数据。 4. **实例应用**: - 假设有一个User对象,包含name和email属性,我们可以在Action类中创建User对象并填充属性。 - 在Action配置中,将User对象放入...

    struts2官方例子3--使用Struts2标签

    在例子中,你可以看到如何在JSP页面上使用Struts2标签,以及如何在Action类中处理这些数据。同时,还可以学习到如何配置Struts2的配置文件(struts.xml)来关联标签和Action,以及如何设置Action的属性。 总结,...

    Struts2案例翻译篇-Using Struts2 Tag

    本篇将深入讲解如何在Struts2中使用Tag,以及它们在"HelloWorld"案例中的应用。 1. **Struts2 Tags介绍** Struts2标签库是基于JSP标准标签库(JSTL)的扩展,它提供了一系列预定义的标签,用于处理表单、链接、...

    Struts2表单标签使用范例

    除了`&lt;s:textfield&gt;`,Struts2还提供了多种表单标签,如`&lt;s:password&gt;`用于创建密码输入框,`&lt;s:textarea&gt;`用于创建多行文本输入框,`&lt;s:radio&gt;`和`&lt;s:checkbox&gt;`用于创建单选按钮和复选框,以及`&lt;s:select&gt;`用于...

    struts2-tags-API,struts2标签api

    `struts2-tags-API`就是这样一个资源,它包含了Struts2标签API的详细文档,帮助开发者理解和使用这些标签。 一、Struts2标签概述 Struts2标签库是基于JSP标准标签库(JSTL)的扩展,它提供了一系列预定义的标签,...

    struts html标签例子

    使用Struts HTML标签的优点在于它们提供了强大的类型安全性和自动化绑定,降低了因手动处理表单数据而产生的错误可能性。同时,这些标签与Struts框架紧密结合,使得代码更符合MVC(模型-视图-控制器)架构,提高了可...

    struts2 表单标签的使用

    此外,Struts2表单标签还可以与其他标签结合使用,如`&lt;s:actionerror&gt;`、`&lt;s:fielderror&gt;`和`&lt;s:property&gt;`,以显示验证错误信息或动态显示数据。`&lt;s:actionerror&gt;`显示全局错误,`&lt;s:fielderror&gt;`显示特定字段的...

    struts的视图组件介绍

    通过使用JSON或XML作为数据交换格式,Struts2 Action可以直接返回数据给Ajax请求,从而更新页面的特定部分,提高用户体验。 六、主题和皮肤 Struts2允许开发者定义和切换不同的主题和皮肤,改变页面的样式和布局。...

    struts2 jar包 包含 标签

    Struts2是一个基于MVC(Model-View-Controller)设计模式的Java web框架,它极大地简化了开发过程,特别是对于创建动态、数据驱动的Web应用。在Struts2框架中,标签库是其核心功能之一,它提供了一系列的自定义标签...

    struts2标签api

    在使用Struts2标签API时,需要注意以下几点: - 标签的命名空间:通常以`s:`开头,表示它是Struts2提供的标签。 - 动态属性:很多标签都支持动态属性,允许我们根据Action类的状态动态设置属性值。 - 表单标签的...

    struts2标签使用笔记

    这段代码定义了一个使用POST方法提交的表单,其中包含了提交和重置按钮。`enctype`属性的设置表明该表单支持文件上传。 接下来的部分展示了如何使用各种UI标签来创建不同的输入控件,包括文本框、日期选择器、多行...

    如何使用Struts标记库

    使用Struts标记库的优点在于,它与Struts框架紧密结合,能够自动处理表单提交、验证和错误处理等问题,降低了开发复杂性,提高了代码的可维护性。通过合理利用这些标签,开发者可以更专注于业务逻辑,而非繁琐的HTML...

    struts2标签的使用

    1. 表单验证:Struts2标签可以与验证框架集成,当表单提交后,如果数据验证失败,标签会自动显示错误信息。 2. 动态渲染:通过标签的属性,可以在运行时动态改变标签的行为,例如根据条件决定是否显示某个元素。 3...

    struts1.2标签实例

    总结,Struts1.2标签实例对于初学者来说是非常有价值的教育资源,它可以帮助开发者快速掌握Struts框架的使用,提升Web应用开发的效率。通过深入理解和实践,开发者可以利用这些标签构建出高效、可维护的用户界面。

    struts2标签的解释

    在Struts2中,标签库是其核心特性之一,它提供了一系列预定义的标签,使得开发者可以在JSP页面中更方便地处理业务逻辑和展示数据,减少了对Java脚本的依赖,提高了代码的可读性和可维护性。 **1. Struts2标签库概述...

    struts2标签写法

    5. **使用Struts2标签的优点** - 提高可读性和可维护性:标签使得代码更清晰,降低了视图层与业务逻辑的耦合。 - 动态数据绑定:通过OGNL表达式,可以方便地访问和操作模型对象的属性。 - 强大的表单处理能力:...

    struts2标签库

    这些标签通常配合Struts2的拦截器和结果类型一起使用,可以实现数据验证、文件上传、权限控制等功能。例如,`&lt;s:fielderror&gt;`标签用于显示验证错误信息,`&lt;s:actionerror&gt;`则显示全局错误消息。 在实际应用中,...

Global site tag (gtag.js) - Google Analytics