- 浏览: 748929 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lengzl:
请问,那个Node 是哪个包里面的类?
JAVA 二叉树的递归和非递归遍历 -
gongchuangsu:
总结的很好,感谢感谢
JAVA 二叉树的递归和非递归遍历 -
Caelebs:
666666666 居然是10年发的,难怪截屏自动保存的名字是 ...
截图工具 -
jijiqw:
是注解不是注释。。。
Spring @Transactional (一) -
letueo:
[b][b][b][b][b][b][b][b][b][b][ ...
Spring @Transactional (一)
初学struts的人我认为首先应该把struts1.2学精,何为精,就是明白struts的控制流程以及它核心API的实现原理(比如Action/DispatchAction/MappingDispatchAction/LookupDispatchAction/ActionForm的实现原理)然后自己会写一个“山寨版”的struts1.2,只有到达这样的程度你才能深刻体会struts1.2的MVC,也才证明你学会了struts1.2,当你再学习struts2.0的时候会非常的容易,那么玩转struts1.2的关键就是能够玩转ActionForm,在此我把自己学习struts1.2时ActionForm的使用及其实现原理贴出来晒一晒,还望各位不要见笑,给些意见。
ActionForm的应用
(一)、ActionForm的特性
1.创建一个form类必须继承于四个父类中的一个,要么继承ActionForm,要么继承ValidatorForm,要么继承ValidatorActionForm,要么继承
2.一个form类中的每一个属性都将和页面中form表单中的每一个表单元素一一对应
Example:
一个表单为:
<form>
<input type="text" name="username"></input>
<input type="password" name="password"></input>
<input type="text" name="email"></input>
</form>
一个与之对应的form类
public class UserForm extends ActionForm{
private String username;
private String password;
private String email;
private String address;
//下面省略getter和setter方法
}
一个引用了该form类的appAction:
<form-beans>
<form-bean name="userForm" type="form.UserForm"></form-bean>
</form-beans>
<action-mappings>
<action path="/test" type="action.TestAction" name="userForm" attribute="uf" scope="request"></action>
</action-mappings>
3.在引用了form-bean的action中name属性的值就是form-bean中name的值
4.这个userForm默认会被放在session中,使用scope可以指定存储该form对象的地方,自然attribute就是用来给存放在该范围中的form对象起的别名,如果不设置attribute
属性那么attribute默认的就使用name的值
(二)、普通HTML表单使用Form的工作原理
ActionServlet对struts-config进行解析时,当解析到某个action中存在一个属性name,那么ActionServlet中的RequestProcessor就会根据该name的值找到对应的form-bean然后创建一个对应的form类实例,放在我们定义的存储范围中,当表单提交到该action对应的appAction之前也就是到达FC的时候,FC会做以下事情
1.根据路径找到对应的内存中存放着的配置对象中的action
2.根据action中的attribute属性,从session中得到一个对应的form实例
3.该form实例调用reset方法对自己进行清空
4.用表单中的值去填充该form实例
5.如果要该form要进行验证那么就该form就会调用validate方法按照我们规定的验证规则进行验证
(三)、struts表单使用Form的工作原理
1.利用struts的HTML标签库定义的HTML元素其实是服务器端的java代码,java代码是编译型代码而HTML则是解释型代码,所以在使用struts的HTML标签库定义的HTML元素要更加的严谨,只要某个元素甚至是某个属性没有定义对,那么编译就不能通过从而抛出异常,例如在使用struts的HTML标签库定义表单的时候action属性是在编译的时就要被确定的如果action属性所定义的提交路径是空或者是错误,那么服务器在编译的时候就会抛出500的异常,而不像普通HTML表单action属性是在提交的时候才确定的
2.原理跟普通HTML表单使用Form的工作原理大同小异,不同在于当服务器对form表单进行编译的时候会向action所指定的地址发一个请求,看是否正确,所以这个时候其实就已经提交了一次表单,当表单到达FC的时候跟上面做的几件事情中就第三件不同,不同在于表单和form中的值都将互相填充,这就是struts对表单的回添机制
Example:
表单为:
//先导入struts的html标签库
<html:form action="test.do" method="post">
<html:text property="username"></html:text>
<html:text property="salary"></html:text>
中文<html:multibox property="lang" value="zh"></html:multibox>
英文<html:multibox property="lang" value="en"></html:multibox>
俄语<html:multibox property="lang" value="ey"></html:multibox>
<html:submit value="click me"></html:submit>
</html:form>
form类为:
public class UserForm extends ActionForm{
private String username;
private double salary=1000.00;
private String[] lang;
//省略getter和setter方法
}
配置文件为:
<form-beans>
<form-bean name="userForm" type="form.UserForm"></form-bean>
</form-beans>
<action-mappings>
<action path="/test" type="action.TestAction" name="userForm" attribute="uf">
<forward name="success" path="/show.do"></forward>
</action>
<action path="/show" type="action.ShowAction" >
<forward name="success" path="/test.do"></forward>
</action>
</action-mappings>
经验:
1.显示页面之前服务器会向text.do发送一次请求,该请求也就是提交表单
2.当上面的请求到FC的时候会用form中的值去填充这个表单然后回显给用户所以用户看到的页面显示结果是salary文本框中有一个值为1000
3.当用户再次提交表单,请求到达FC的时候服务器会首先检查你所提交的表单元素的值跟session中这个form与之对应的属性的值是否相同,如果相同就直接利用该form去填充表单,如果不相同就先把提交的表单元素的值赋给form中与之对应的属性再利用form去填充表单
4.该实例有一个问题,就是当用户第一次选择了两种语言,然后提交,第二次用户一种语言都没选,然后提交,这时候回显的结果出人意料,复选框中的值既然是第一次用户所选择的值,原因是,复选框有一个特性,如果用户什么都不选择,那么提交表单的时候就不提交复选框,如果我们使用get请求提交的话就能明显的看到这种情况表单提交的属性只有username和salary两个,这两个元素即使没有值也会提交,就因为这一点,当表单到达FC的时候,服务器只看到提交的两个表单元素username和salary,然后检查form中的属性也只会检查username和salary两个,而不会检查lang,如果表单中的username和salary与form中与之对应的username和salary属性不一样,那么就先把表单中的username和salary值赋给form中的username和salary属性,然后利用form去填充表单,如果一样,那么就利用原来的form去填充表单,在这两种情况下form中的lang属性都将不会被检查更不用提改变,所以lang用的还是上一次的值,自然回显的时候form中的复选框的值就是上一次的值
5.解决这一问题可以有两种办法,在提交表单以后就把session中的form对象给删除掉,每一次提交都新创建一个form对象也就是在页面的末尾加一个
<%session.removeAttribute("uf")%>
第二种解决办法是在UserForm中覆盖父类的reset方法,该reset方法将在form填充之前做,这样我们就能在reset中把我们想要复位的属性先复位
当然利用第二种是最好的
5.我们可以利用struts的form回添机制进行回添操作,回添的时机是在form到达页面之前,可以在Action中来做也可以在reset中来做
(四)、Form与实体对象之间的关系
有的时候我们为了方便会把取到的form中的值直接拷贝到实体对象中去然后把实体对象再存储到数据库中,这样给我们的编程带来了很多的方便,但前提是实体对象中需要拷贝的属性,form中要拷贝过去的属性,与form对应的表单元素他们三者必须一一对应.这样我们就可以把表单中的值得到封装到form中然后再把form中与实体对象中属性相同的值拷贝到实体对象中
Example:
entity:
public class User{
private String name;
private String password;
private double salary;
private String address;
//省略getter和setter方法
}
form:
public class UserForm{
private String name;
private String password;
private String salary;
//省略getter和setter方法
}
表单:
<form>
<input type="text" name="name"></input>
<input type="password" name="password"></input>
<input type="text" name="salary"></input>
</form>
1.把表单中的值赋值给UserForm
2.把UserForm中的值拷贝到User对象中:
//下面这条语句是在action的某个方法中做的所以form直接可以用
BeanUtils.copyProperties(user,form);
3.将user对象存放在数据库中
ActionForm的应用
(一)、ActionForm的特性
1.创建一个form类必须继承于四个父类中的一个,要么继承ActionForm,要么继承ValidatorForm,要么继承ValidatorActionForm,要么继承
2.一个form类中的每一个属性都将和页面中form表单中的每一个表单元素一一对应
Example:
一个表单为:
<form>
<input type="text" name="username"></input>
<input type="password" name="password"></input>
<input type="text" name="email"></input>
</form>
一个与之对应的form类
public class UserForm extends ActionForm{
private String username;
private String password;
private String email;
private String address;
//下面省略getter和setter方法
}
一个引用了该form类的appAction:
<form-beans>
<form-bean name="userForm" type="form.UserForm"></form-bean>
</form-beans>
<action-mappings>
<action path="/test" type="action.TestAction" name="userForm" attribute="uf" scope="request"></action>
</action-mappings>
3.在引用了form-bean的action中name属性的值就是form-bean中name的值
4.这个userForm默认会被放在session中,使用scope可以指定存储该form对象的地方,自然attribute就是用来给存放在该范围中的form对象起的别名,如果不设置attribute
属性那么attribute默认的就使用name的值
(二)、普通HTML表单使用Form的工作原理
ActionServlet对struts-config进行解析时,当解析到某个action中存在一个属性name,那么ActionServlet中的RequestProcessor就会根据该name的值找到对应的form-bean然后创建一个对应的form类实例,放在我们定义的存储范围中,当表单提交到该action对应的appAction之前也就是到达FC的时候,FC会做以下事情
1.根据路径找到对应的内存中存放着的配置对象中的action
2.根据action中的attribute属性,从session中得到一个对应的form实例
3.该form实例调用reset方法对自己进行清空
4.用表单中的值去填充该form实例
5.如果要该form要进行验证那么就该form就会调用validate方法按照我们规定的验证规则进行验证
(三)、struts表单使用Form的工作原理
1.利用struts的HTML标签库定义的HTML元素其实是服务器端的java代码,java代码是编译型代码而HTML则是解释型代码,所以在使用struts的HTML标签库定义的HTML元素要更加的严谨,只要某个元素甚至是某个属性没有定义对,那么编译就不能通过从而抛出异常,例如在使用struts的HTML标签库定义表单的时候action属性是在编译的时就要被确定的如果action属性所定义的提交路径是空或者是错误,那么服务器在编译的时候就会抛出500的异常,而不像普通HTML表单action属性是在提交的时候才确定的
2.原理跟普通HTML表单使用Form的工作原理大同小异,不同在于当服务器对form表单进行编译的时候会向action所指定的地址发一个请求,看是否正确,所以这个时候其实就已经提交了一次表单,当表单到达FC的时候跟上面做的几件事情中就第三件不同,不同在于表单和form中的值都将互相填充,这就是struts对表单的回添机制
Example:
表单为:
//先导入struts的html标签库
<html:form action="test.do" method="post">
<html:text property="username"></html:text>
<html:text property="salary"></html:text>
中文<html:multibox property="lang" value="zh"></html:multibox>
英文<html:multibox property="lang" value="en"></html:multibox>
俄语<html:multibox property="lang" value="ey"></html:multibox>
<html:submit value="click me"></html:submit>
</html:form>
form类为:
public class UserForm extends ActionForm{
private String username;
private double salary=1000.00;
private String[] lang;
//省略getter和setter方法
}
配置文件为:
<form-beans>
<form-bean name="userForm" type="form.UserForm"></form-bean>
</form-beans>
<action-mappings>
<action path="/test" type="action.TestAction" name="userForm" attribute="uf">
<forward name="success" path="/show.do"></forward>
</action>
<action path="/show" type="action.ShowAction" >
<forward name="success" path="/test.do"></forward>
</action>
</action-mappings>
经验:
1.显示页面之前服务器会向text.do发送一次请求,该请求也就是提交表单
2.当上面的请求到FC的时候会用form中的值去填充这个表单然后回显给用户所以用户看到的页面显示结果是salary文本框中有一个值为1000
3.当用户再次提交表单,请求到达FC的时候服务器会首先检查你所提交的表单元素的值跟session中这个form与之对应的属性的值是否相同,如果相同就直接利用该form去填充表单,如果不相同就先把提交的表单元素的值赋给form中与之对应的属性再利用form去填充表单
4.该实例有一个问题,就是当用户第一次选择了两种语言,然后提交,第二次用户一种语言都没选,然后提交,这时候回显的结果出人意料,复选框中的值既然是第一次用户所选择的值,原因是,复选框有一个特性,如果用户什么都不选择,那么提交表单的时候就不提交复选框,如果我们使用get请求提交的话就能明显的看到这种情况表单提交的属性只有username和salary两个,这两个元素即使没有值也会提交,就因为这一点,当表单到达FC的时候,服务器只看到提交的两个表单元素username和salary,然后检查form中的属性也只会检查username和salary两个,而不会检查lang,如果表单中的username和salary与form中与之对应的username和salary属性不一样,那么就先把表单中的username和salary值赋给form中的username和salary属性,然后利用form去填充表单,如果一样,那么就利用原来的form去填充表单,在这两种情况下form中的lang属性都将不会被检查更不用提改变,所以lang用的还是上一次的值,自然回显的时候form中的复选框的值就是上一次的值
5.解决这一问题可以有两种办法,在提交表单以后就把session中的form对象给删除掉,每一次提交都新创建一个form对象也就是在页面的末尾加一个
<%session.removeAttribute("uf")%>
第二种解决办法是在UserForm中覆盖父类的reset方法,该reset方法将在form填充之前做,这样我们就能在reset中把我们想要复位的属性先复位
当然利用第二种是最好的
5.我们可以利用struts的form回添机制进行回添操作,回添的时机是在form到达页面之前,可以在Action中来做也可以在reset中来做
(四)、Form与实体对象之间的关系
有的时候我们为了方便会把取到的form中的值直接拷贝到实体对象中去然后把实体对象再存储到数据库中,这样给我们的编程带来了很多的方便,但前提是实体对象中需要拷贝的属性,form中要拷贝过去的属性,与form对应的表单元素他们三者必须一一对应.这样我们就可以把表单中的值得到封装到form中然后再把form中与实体对象中属性相同的值拷贝到实体对象中
Example:
entity:
public class User{
private String name;
private String password;
private double salary;
private String address;
//省略getter和setter方法
}
form:
public class UserForm{
private String name;
private String password;
private String salary;
//省略getter和setter方法
}
表单:
<form>
<input type="text" name="name"></input>
<input type="password" name="password"></input>
<input type="text" name="salary"></input>
</form>
1.把表单中的值赋值给UserForm
2.把UserForm中的值拷贝到User对象中:
//下面这条语句是在action的某个方法中做的所以form直接可以用
BeanUtils.copyProperties(user,form);
3.将user对象存放在数据库中
发表评论
-
Struts2 xwork中ActionContext和ServletActionContext介绍
2011-03-21 11:26 1440ActionContext(Action上下文) ... -
Struts,Hibernate,Spring经典面试题收藏
2010-12-06 08:44 1332Struts,Hibernate,Spring经 ... -
struts-config.xml 详解
2010-12-03 12:04 967弄清楚struts-config.xml中各项元素的作用,对于 ... -
struts global-exceptions用法
2010-12-03 11:56 1575在用struts框架写web程序时,有可能会遇到很多异常,如u ... -
<servlet-mapping>元素及其子元素
2010-12-03 11:04 1403<servlet-mapping>元素 ... -
servlet mapping 规则
2010-12-03 10:43 1434servlet mapping有三种<url-patte ... -
常用log4j配置
2010-12-03 09:48 926常用log4j配置 常用log4j配置,一般可以采用两种方 ... -
Log4j简介
2010-12-03 09:47 803在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用 ... -
log4j配置祥解
2010-12-03 09:46 994第一步:加入log4j-1.2.8.j ... -
数据库连接池DBCP
2010-12-02 14:54 1060概念:数据库连接池负责分配、管理和释放数据库连接,它允许应用程 ... -
Hibernate持久化对象三种状态的区分,以及save,update,saveOrUpdate,merge,persist等的使用
2010-11-12 20:22 1575Hibernate的对象有3种状态,分别为:瞬时态(Trans ... -
Hibernate持久化对象
2010-11-12 20:20 1226一,持久化对象: 1,置于session管理下的对象叫做持久化 ... -
hibernate核心类简介
2010-11-12 20:16 1165Hibernate Hibernate是一 ... -
J2EE是什么语言
2010-11-11 12:42 5994****** 版权声明 ******** * 在完整保留 ... -
Hibernate最基础的示例
2010-11-04 15:06 1478有关Spring的知识大部分都已经温习完毕,今天开始转向H ... -
struts+spring+hibernate是怎样的架构?
2010-11-01 17:21 1094struts+spring+hibernate是怎 ... -
快速整合struts+spring+hibernate
2010-11-01 17:17 976说明: 使用平台:Eclipse3.2、MyEclipse5 ... -
Spring整合Hibernate
2010-11-01 15:34 1184Spring整合Hibernate的价值在于Spring为Hi ... -
一些有用的网址
2010-11-01 15:10 1008http://wenku.baidu.com/view/7ab ... -
Spring和Hibernate整合开发
2010-11-01 15:00 1091想的很复杂,用起来就那么回事. 怎么回事呢??? 就是把h ...
相关推荐
Struts1.2驱动包是Java Web开发中一个重要的组件,它是Apache Struts框架的特定版本,用于支持基于Model-View-...对于初学者和经验丰富的开发者来说,理解和掌握Struts1.2可以帮助构建高效、可维护的Web应用程序。
理解这三者之间的交互是掌握Struts1.2的关键。 此外,手册会涵盖ActionForm、ActionMapping、ActionForward等核心组件的使用方法。ActionForm用于封装HTTP请求参数,ActionMapping定义了请求与Action之间的映射,...
在Struts1.2中处理表单提交,特别是当表单数据包含列表对象时,需要理解一些核心概念和技术。这篇博客文章可能详细探讨了如何在Struts1.2中处理这类情况。 首先,让我们来了解Struts1.2中的表单提交流程。当用户在...
对于初学者,建议从理解MVC模式入手,然后学习Struts1.2的基本组件和配置,如Action、ActionForm、ActionMapping等。接着,实践创建简单的示例项目,掌握数据传递、请求处理和页面跳转。进阶学习可以涉及Tiles、验证...
2. `docs`目录:文档资料,包括API参考、用户指南等,帮助开发者理解Struts1.2的工作原理和使用方法。 3. `examples`目录:包含了一些示例应用,展示了Struts1.2的各种功能和最佳实践,是学习和调试的好材料。 4. `...
ActionForm是Struts 1.2中用于处理用户输入数据的核心组件,它负责在用户界面(JSP)与控制器(Action)之间传递数据。表单验证是确保用户提交的数据符合业务规则和数据完整性的重要环节。 在Struts 1.2中,...
Struts1.2标签是Java Web开发中Struts框架的一部分,它提供了一种在JSP页面中更加便捷、可维护的方式来处理业务逻辑和控制流程。Struts1.2标签库大大简化了视图层的开发,使开发者可以避免过多地在JSP中编写Java脚本...
本项目"基于Struts1.2的上传下载Demo"是针对该框架的一个实践示例,旨在帮助开发者理解和解决在Struts1.2环境中进行文件上传与下载的问题。 首先,让我们深入了解一下Struts1.2中的文件上传功能。在Struts1.2中,...
通过这个简单的Struts1.2文件上传示例,我们可以学习到如何在Java Web环境中处理文件上传,理解MVC框架如何与外部库协同工作,以及如何在实际应用中确保文件上传的安全性。这对于任何想要深入理解Struts1.2或者进行...
Struts 1.2虽然在现代Web开发中已经被Struts 2或者Spring MVC等更新的框架取代,但它的设计理念和模式对于理解MVC架构和Web应用的开发仍然具有重要的学习价值。在学习和使用Struts 1.2时,开发者应关注其核心组件的...
在学习Struts 1.2 API时,你需要理解每个组件的作用,熟悉它们之间的交互方式,以及如何在实际项目中配置和使用。此外,深入理解MVC模式对于更好地掌握Struts至关重要。实践中,你可能还会接触到Spring、Hibernate等...
然而,理解Struts 1.2的架构和设计模式仍然是学习Web开发历史和理解现代框架演进过程的重要部分。通过深入研究这个压缩包中的类库和源码,开发者可以更好地理解MVC模式、标签库的使用,以及如何构建基于HTTP的Web...
Struts1.2源代码和文档对于深入理解其工作原理和扩展功能具有极大的价值。 首先,让我们来了解一下Struts1.2的核心组件: 1. **ActionServlet**:这是Struts的核心控制器,它是一个Servlet,负责接收来自客户端的...
在这个名为"ShoppingMall"的项目中,我们可以推测这是一个简单的商城购物系统,利用Struts1.2的核心特性实现了用户浏览商品、添加到购物车以及进行结算等功能。 首先,让我们深入了解Struts1.2框架。它是Apache软件...
这个“struts1.2+spring2.0 登录例子”是一个整合了这两个框架的示例项目,旨在帮助开发者理解如何在实际应用中集成和使用它们。下面将详细阐述这两个框架的核心概念、集成方式以及登录功能的实现。 **Struts1.2...
Struts1.2 是一个基于MVC(Model-View-Controller)设计模式的Java ...在现代Web开发中,尽管Struts1.2已经相对过时,但了解其工作原理和使用方法,对于理解其他MVC框架,尤其是Spring家族的框架,仍然具有一定的帮助。
Struts1.2是Apache软件基金会的一个开源项目,它是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架。这个框架的主要目的是...通过实际操作,可以更深入理解Struts1.2框架的工作原理和使用方法。
通过深入理解这些知识点,并结合源码学习,开发者可以更好地利用Struts1.2框架构建高效、可维护的Web应用。不过需要注意,尽管Struts1.2在过去的开发中发挥了重要作用,但随着技术的发展,现在已经有了更新的替代品...
在Struts1.2框架中,最重要的组成部分包括Action、ActionForm、ActionServlet、配置文件(struts-config.xml)以及JSP视图。以下是对这些关键组件的详细解释: 1. **Action**:Action类是业务逻辑的入口点,处理...