<html:checkbox property="booleanProperty" />
用来显示单个的选择框,通过对该标签初始化的操作,可以看出许多隐藏在Struts框架“背后”的故事。
假定流程是这样:
1. Jsp页面显示所有用户的列表,只包含姓名,想看某用户的详细信息,就要点击这个用户的名字,通过hyperlink或其他方式传递一个用户ID到Action类中。
2. 在Action类中,通过传来的ID,连接数据库搜寻出该用户的所有信息,其中有一个表示用户在注册时候选择的是否接受订阅的信息。
3. 然后再由Action传到前台jsp页面将用户的详细信息逐条进行显示。
在前台显示用户是否接受订阅信息在jsp页面中用一个checkbox Struts标签表示。也就是说要根据数据库的信息,来初始化这个checkbox是否被选中的状态。
其实最终生成的html只要如下,包含 “checked” 这条就可以,
<input type="checkbox" name="booleanProperty" value="on" checked="checked">
但由于<html:checkbox/>并没有一个可以表示是否被选中的属性供我们设置,而我们想用jsp scriptlet或EL表达式通过判断在标签内部手动加上这么一条都会报错(比如:<%=checked?”checked”:””%> 其实都不知道把这东西放到哪里合适),那么问题出现了,到底应该怎样根据数据库的用户信息来初始化这个checkbox的选中状态呢?
我们知道,ActionForm在比如用户注册的时候,接受用户输入的信息,然后传递到Action类中以供处理。但如我们这种情况,用户是通过一个超链接到达了Action,根本就没有进行什么输入,又怎么用ActionForm呢?
其实真实的情况是这样,不管你来Action类之前有没有什么表单的输入,只要在struts-config.xml配置了这个action的name属性,那么这个虚无的没有任何用户输入数据的表单ActionForm对象照样会被实例化并传递到Action类中。如:
<action path="/tagUse" type="TagAction" name="tagHandlerForm">
而我们在Action类中可以测试一下,看看这个被传进来ActionForm倒底是什么。
form.getClass().getName() form==null?
事实证明确实有个正如我们在配置文件中指定的ActionForm类对象被传了进来,只不过由于没有前台输入表单的缘故,该对象内的属性都是null而已。
ActionForm的生命周期是从request来到response回去,比如用户注册JSP,数据是从request来,而从数据库取值再返回JSP就是response。只要在这个scope,这个ActionForm就会和jsp页面绑定在一起,而这种FormBean字段与jsp控件之间通过控件property属性的绑定,是Struts内置的,或是说隐性的,不可被其他方式所取代的。这是这种隐性的绑定,解决了checkbox初始化的问题。
我们可以这样做,首先取得确实的ActionForm
TagHandlerForm myForm = (TagHandlerForm)form;
然后再将该formbean中的属性一一设定为从数据库取来的值
myForm.setName("abcd");
这里注意:在Action类中的execute方法
ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
我们用的这个form是从方法中传来的,虽然我们在该方法内对这个参数的引用改变是无效的,但却可以改变引用的内容。所以当设置完了以后,与前台JSP页面在这个request – response 范围内紧密,隐性绑定着的ActionForm的内容,也发生了变化。这样,从Action类response到JSP页面的时候,checkbox就得到了我们期待的初始化。
看一下Struts的官方文档,其中有这么一句关于<html:checkbox />的
NOTE: The underlying property value associated with this field should be of type boolean
说白了就是要你把关于这个checkbox的属性,在ActionForm里设成boolean. 表面上看这只是一个在JSP上显示名字的值罢了
(<html:checkbox property="booleanProperty" />),为什么要设置成boolean,用String不是更直接?但正是因为ActionForm的这种隐式的数据绑定,使我们可以仅用上面的一条语句便将checkbox正确的初始化。
再看一下配置文件
<action path="/tagUse"
type="strutsTutorial.PrepareTagAction"
name="tagHanderForm"
attribute="tagInfo">
attribute的真正意思是“显式”生成一个在指定scope中的对象用于“取代”默认的name 所定义的ActionForm,一旦声明了这个属性(还必须在Action类中将其放入scope才行 request.setAttribute("tagInfo",aTag);),ActionForm本身所具有的那种与JSP紧密而隐式的数据绑定,便被破坏了。所以如果用这种设置attribute的方式返回了JSP页面,控件就必须显式赋值 <html:text property="name" value="${tagInfo.name}"/>,但像checkbox这种没办法显示赋值的标签,它就无能无力了(借助javascript应该也可以)。
而对于我们这个假定的流程来说,更好的做法应该是,准备两个类,TagHandlerForm 和 Tags。TagHandlerForm类只用来收集/显示从jsp页面来/去的信息(即典型的ActionForm类);Tags类用来存储从database取得的信息(应该是一个POJO的数据封装类)。它们其实很相像,拥有近乎相同的属性,可以说前者是后者的子集,但也不是绝对,比如form类包含一个hidden field的属性,用来在Action类的处理逻辑中做以区别,而pojo类其实也没必要存储这个。但pojo类至少应该包括form类需要在jsp用来显示的所有属性。这样,当用户提交表单的时候,把ActionForm的内容复制到pojo类中,然后再完全脱离form类的情况下进行数据处理(也就是说从presentation/control layer转到model layer),反之亦然。这也正是mvc2设计模式希望我们做到的。
所以上面的做法可以再修改一下
Tags aTag = new Tags(); 数据类
BeanUtils.copyProperties(myForm,aTag); 数据转移
request.setAttribute("tagInfo",aTag); 在这里设置一个request scope的属性对象是不会影响到ActionForm的隐性绑定,而且form类中有些值是与JSP控件无法隐性绑定的比如<html:img />标签(通过多加一个数据类对象,我们则可以 <html:img page=”${tagInfo.imgSrc}”> 动态加载属于用户的图片), 或者数据类中我们还有些附加值想带到JSP去。
相关推荐
Struts框架是Java Web开发中常用的MVC框架之一,它为开发者提供了一种结构化、易于维护的应用程序构建方式。在Struts中,ActionForm类是处理用户输入数据的核心组件,它封装了请求参数并负责业务逻辑验证。本文将...
当用户提交表单时,Struts框架会自动将请求参数绑定到ActionForm对象的属性上。这个过程被称为数据绑定,可以使用`PropertyUtils`或`BeanUtils`来实现。之后,ActionForm对象会被传递给Action,Action可以根据这些...
当用户通过HTML表单提交请求时,这些数据会被发送到服务器,并由Struts框架自动绑定到ActionForm实例的属性上。ActionForm的每个属性对应表单的一个字段,这样就形成了一个对象模型,方便后续业务逻辑处理。 Struts...
Struts框架中的ActionForm乱码问题以及Servlet全局过滤器的转义编码处理是Java Web开发中常见的字符编码问题。在开发基于Struts的Web应用时,乱码主要出现在三个方面:页面显示乱码、参数传递乱码以及国际化资源文件...
主要是actionForm的基本验证,重写validate方法,返回actionErrors,然后根据资源文件显示错误。 这是一个demo例子,直接导入eclispe中即可。 并且这部分内容会在相应的博客中介绍,稍后会更新博客。
当用户提交表单时,Struts框架会自动将表单数据绑定到ActionForm实例中。 2. **创建ActionForm** 首先,我们需要创建一个ActionForm类,继承自Struts的`ActionForm`基类。在这个类中,为每个表单字段声明对应的...
Struts学习笔记之ActionForm ActionForm是Struts框架中的一种重要组件,用于封装和处理用户的表单数据。在Struts中,ActionForm是继承自JavaBeans的,主要用于处理用户的表单数据和业务逻辑。下面是ActionForm的...
这个过程涉及到如何将客户端的数据组织成一个集合,如List,并将其绑定到ActionForm的属性上。在本篇中,我们将详细探讨如何实现这一目标。 首先,ActionForm是Struts框架中用于接收和验证用户输入的数据的类。它...
博客文章"Struts学习笔记之ActionForm - xiaodaoxiaodao——蓝小刀的自言自语 - BlogJava.mht"可能包含更深入的实践示例和经验分享,包括如何处理ActionForm的生命周期、动态Form Beans、国际化等话题。通过阅读这篇...
在Struts中,通过`<html:form>`标签或`<s:form>`标签(Struts2)来指定表单与ActionForm的关联,同时通过`<html:text>`、`<html:submit>`等标签绑定表单字段与ActionForm属性。 2. **Struts1中的资源绑定** 在...
4. **使用ActionForm**: 将Spring的ApplicationContext引入Struts,使ActionForm能够通过依赖注入获取SessionFactory,然后在业务逻辑中调用Hibernate的方法进行数据库操作。 5. **配置过滤器**: 设置Struts与Spring...
ActionForm是Struts框架中的一个重要组件,主要用于处理用户从视图层提交的数据。在传统的Struts开发中,ActionForm类通常用于封装请求参数并传递给业务逻辑层进行处理。 动态ActionForm的概念是为了提高代码的灵活...
ActionForm在早期的Struts1中被广泛用于接收和验证用户输入,但在Struts2中,这个概念已经被更先进的模型驱动机制所取代。不过,这里提到的"ActionForm自动填充表单"可能是指Struts2中的一种特性,即模型驱动...
同时,`org.apache.struts.util.PropertyMessageResources`和`org.apache.struts.action.ActionFormBean`类是数据绑定的关键,它们负责将请求参数映射到ActionForm的属性。 在开发工具方面,IDE如Eclipse或IntelliJ...
最近自学java中的框架-struts写了一些小例子,这都是很经典的程序,如果大家瞧得起要下载去看看,顺便给俺找找不足的地方。我的qq 821865130 email qingtian_hechen@163.com 希望大家能多多给我帮助。在此谢谢各位!...
然而,在Struts 2中,ActionForm的概念已经被废弃,取而代之的是更强大的模型驱动(ModelDriven)和拦截器(Interceptor)机制,这些机制使得数据绑定和验证更为灵活。 3. **Action和ActionForm的组合**: - **...
【ActionForm】是Java Web开发中的一个概念,主要在Struts框架中被广泛使用。它是一种模型层对象,用于接收用户从视图层(通常是一个HTML表单)传递过来的数据,并将这些数据转发到控制器(Controller)进行业务逻辑...
Struts ActionForm Bean捕获表单数据 11 Struts的其他组件 12 Validation Framework for Struts 12 Struts TagLib 12 BeanUtils 12 Collections 13 Digester 13 Struts配置文件简介 13 有关Struts ...
Struts2则直接将Action的属性作为输入属性,不再需要额外的ActionForm,支持更丰富的对象类型,如业务对象,简化了数据绑定。 在表达式语言上,Struts1整合了JSTL EL,但支持有限。Struts2引入了更强大的OGNL,提供...