- 浏览: 151284 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
hx0637:
楼主!小弟要面临面试了,能否指导下小弟?
面试 深圳一家公司的 -
kljismi:
你好,我现在正在开这项目的代码,但是我不明白@Privileg ...
权限管理模块分析 -
yzhw:
终于找到了
ImageSizer.java -
sunloveny:
国
struts国际化 -
jackotty:
谢谢楼主的分享
struts validator验证框架
1、动态ActionForm
动态ActionForm是为了避免标准ActionForm膨胀而设计的,使用动态ActionForm可以获得标准
ActionForm的所有功能
* 在struts-config.xml文件中定义动态ActionForm,如:
<form-beans>
<form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String" />
<form-property name="age" type="java.lang.Integer"/>
</form-bean>
</form-beans>
*在Action中使用动态ActionForm,参见DynaActionFormTestAction.java
DynaActionForm daf = (DynaActionForm)form;
String username = (String)daf.get("username");
Integer age = (Integer)daf.get("age");
动态ActionForm其实是把页面中的html元素的名字和值放到了map中,所以通过get方法可以取出相应的值
动态ActionForm采用EL表达式的输出方式,${dynabean.map.prop}, 参见:dyna_actionform.jsp
动态Action的验证,通常使用动态验证框架validator
2、采用struts上传文件
* 页面的配置,如:
<form action="upload.do" method="post" enctype="multipart/form-data">
标题:<input type="text" name="title"><br>
文件:<input type="file" name="myfile"><br>
<input type="submit" value="提交">
</form>
* ActionForm中使用FormFile来接收上传的文件,参见:UploadActionForm.java
* 在Action中调用FormFile取得上传文件数据,采用流输出,即完成上传,参见:UploadTestAction.java
* 采用<controller/>标签配置上传参数,如:<controller maxFileSize="10M"/>
3、空字段测试
* 在表单中没有input输入域,jsp脚本接收到的值为null,el表达式接收到的值为空串
* 如果表单中的值,没有输入,那么jsp脚本和el表达式接收到的值都为空串
4、测试ActionForm类型的自动转换
* boolean:yes,1,on,true都会转换成True类型,而且忽略大小写,其他情况转换成false
* Date类型的转换:
* 如果是java.sql.Date,页面日期的格式必须为yyyy-mm-dd,才可以转换
* 如果是java.util.Date,默认情况下struts无法转换
* 自定义转换器的实现步骤
* 实现converter接口,实现convert方法
* 将实现的conerter注册,通常情况采用servlet注册
* 采用servlet注册需要注意标签的配置,<load-on-startup>10</load-on-startup>(也可以采用struts plugin注册)
Struts对ActionForm的自动搜集过程:
* 将页面数据放到map中,其中map中的key为页面中的名称,map中的value为页面中的value值
* 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上,对于ActionForm中的每个属性
根据类型调用相应的Converter,然后调用相应的convert方法,将相应的字符串转换成ActionForm中指定的类型
可以通过BeanUtils.copyProperties(目标对象,源对象)方法进行对象值的复制。
DynaActionFormTestAction.java
UploadTestAction.java
UploadActionForm.java
BlankFieldActionForm.java
BlankFieldTestAction.java
TypeConvertActionForm.java
TypeConvertTestAction.java
UtilDateConverter.java
UtilDateConverterInitWithPlugin.java
UtilDateConverterInitWithServlet.java
dyna_actionform.jsp
blankfield_success.jsp
typeconvert_success.jsp
upload_success.jsp
index.jsp
struts-config.xml
动态ActionForm是为了避免标准ActionForm膨胀而设计的,使用动态ActionForm可以获得标准
ActionForm的所有功能
* 在struts-config.xml文件中定义动态ActionForm,如:
<form-beans>
<form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String" />
<form-property name="age" type="java.lang.Integer"/>
</form-bean>
</form-beans>
*在Action中使用动态ActionForm,参见DynaActionFormTestAction.java
DynaActionForm daf = (DynaActionForm)form;
String username = (String)daf.get("username");
Integer age = (Integer)daf.get("age");
动态ActionForm其实是把页面中的html元素的名字和值放到了map中,所以通过get方法可以取出相应的值
动态ActionForm采用EL表达式的输出方式,${dynabean.map.prop}, 参见:dyna_actionform.jsp
动态Action的验证,通常使用动态验证框架validator
2、采用struts上传文件
* 页面的配置,如:
<form action="upload.do" method="post" enctype="multipart/form-data">
标题:<input type="text" name="title"><br>
文件:<input type="file" name="myfile"><br>
<input type="submit" value="提交">
</form>
* ActionForm中使用FormFile来接收上传的文件,参见:UploadActionForm.java
* 在Action中调用FormFile取得上传文件数据,采用流输出,即完成上传,参见:UploadTestAction.java
* 采用<controller/>标签配置上传参数,如:<controller maxFileSize="10M"/>
3、空字段测试
* 在表单中没有input输入域,jsp脚本接收到的值为null,el表达式接收到的值为空串
* 如果表单中的值,没有输入,那么jsp脚本和el表达式接收到的值都为空串
4、测试ActionForm类型的自动转换
* boolean:yes,1,on,true都会转换成True类型,而且忽略大小写,其他情况转换成false
* Date类型的转换:
* 如果是java.sql.Date,页面日期的格式必须为yyyy-mm-dd,才可以转换
* 如果是java.util.Date,默认情况下struts无法转换
* 自定义转换器的实现步骤
* 实现converter接口,实现convert方法
* 将实现的conerter注册,通常情况采用servlet注册
* 采用servlet注册需要注意标签的配置,<load-on-startup>10</load-on-startup>(也可以采用struts plugin注册)
Struts对ActionForm的自动搜集过程:
* 将页面数据放到map中,其中map中的key为页面中的名称,map中的value为页面中的value值
* 调用BeanUtils.setProperties方法,将map中的值逐个设置到ActionForm实例上,对于ActionForm中的每个属性
根据类型调用相应的Converter,然后调用相应的convert方法,将相应的字符串转换成ActionForm中指定的类型
可以通过BeanUtils.copyProperties(目标对象,源对象)方法进行对象值的复制。
DynaActionFormTestAction.java
package com.bjsxt.struts; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.DynaActionForm; /** * 测试动态ActionForm * @author Administrator * */ public class DynaActionFormTestAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DynaActionForm daf = (DynaActionForm)form; String username = (String)daf.get("username"); Integer age = (Integer)daf.get("age"); System.out.println("username=" + username); System.out.println("age=" + age); return mapping.findForward("success"); } }
UploadTestAction.java
package com.bjsxt.struts; import java.io.FileOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.upload.FormFile; /** * 上传Action * @author Administrator * */ public class UploadTestAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { UploadActionForm uaf = (UploadActionForm)form; System.out.println("title" + uaf.getTitle()); FormFile myFile = uaf.getMyfile(); if (myFile != null) { System.out.println("fileName=" + myFile.getFileName()); FileOutputStream fos = new FileOutputStream("c:\\" + myFile.getFileName()); fos.write(myFile.getFileData()); fos.flush(); fos.close(); } return mapping.findForward("success"); } }
UploadActionForm.java
package com.bjsxt.struts; import org.apache.struts.action.ActionForm; import org.apache.struts.upload.FormFile; /** * 上传ActionForm * @author Administrator * */ public class UploadActionForm extends ActionForm { private String title; //必须采用FormFile private FormFile myfile; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public FormFile getMyfile() { return myfile; } public void setMyfile(FormFile myfile) { this.myfile = myfile; } }
BlankFieldActionForm.java
package com.bjsxt.struts; import org.apache.struts.action.ActionForm; /** * 测试空字段 * @author Administrator * */ public class BlankFieldActionForm extends ActionForm { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
BlankFieldTestAction.java
package com.bjsxt.struts; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; /** * 测试空字段 * @author Administrator * */ public class BlankFieldTestAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { return mapping.findForward("success"); } }
TypeConvertActionForm.java
package com.bjsxt.struts; import org.apache.struts.action.ActionForm; /** * struts中的类型转换测试 * @author Administrator * */ public class TypeConvertActionForm extends ActionForm { private int intValue; private double doubleValue; private boolean booleanValue; private java.sql.Date sqlDate; private java.util.Date utilDate; public int getIntValue() { return intValue; } public void setIntValue(int intValue) { this.intValue = intValue; } public double getDoubleValue() { return doubleValue; } public void setDoubleValue(double doubleValue) { this.doubleValue = doubleValue; } public boolean isBooleanValue() { return booleanValue; } public void setBooleanValue(boolean booleanValue) { this.booleanValue = booleanValue; } public java.sql.Date getSqlDate() { return sqlDate; } public void setSqlDate(java.sql.Date sqlDate) { this.sqlDate = sqlDate; } public java.util.Date getUtilDate() { return utilDate; } public void setUtilDate(java.util.Date utilDate) { this.utilDate = utilDate; } }
TypeConvertTestAction.java
package com.bjsxt.struts; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; /** * struts中的类型转换测试 * @author Administrator * */ public class TypeConvertTestAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { return mapping.findForward("success"); } }
UtilDateConverter.java
package com.bjsxt.struts; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.beanutils.Converter; /** * java.util.Date类型转换器 * @author Administrator * */ public class UtilDateConverter implements Converter { public Object convert(Class type, Object value) { System.out.println("UtilDateConverter.value=" + value); if (value == null) { return value; } if (value instanceof Date) { return value; } Date d = null; if (value instanceof String) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { d = sdf.parse((String)value); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return d; } }
UtilDateConverterInitWithPlugin.java
package com.bjsxt.struts; import java.util.Date; import javax.servlet.ServletException; import org.apache.commons.beanutils.ConvertUtils; import org.apache.struts.action.ActionServlet; import org.apache.struts.action.PlugIn; import org.apache.struts.config.ModuleConfig; public class UtilDateConverterInitWithPlugin implements PlugIn { public void destroy() { } public void init(ActionServlet servlet, ModuleConfig config) throws ServletException { System.out.println("UtilDateConverterInitWithPlugin.init()"); ConvertUtils.register(new UtilDateConverter(), Date.class); } }
UtilDateConverterInitWithServlet.java
package com.bjsxt.struts; import java.util.Date; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import org.apache.commons.beanutils.ConvertUtils; /** * 注册java.util.date转换器 * @author Administrator * */ public class UtilDateConverterInitWithServlet extends HttpServlet { @Override public void init() throws ServletException { System.out.println("UtilDateConverterInitWithServlet.init()"); ConvertUtils.register(new UtilDateConverter(), Date.class); } }
dyna_actionform.jsp
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Insert title here</title> </head> <body> 用户名称:${dynaForm.map.username }<br> 年龄:${dynaForm.map.age }<br> </body> </html>
blankfield_success.jsp
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="com.bjsxt.struts.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Insert title here</title> </head> <body> <% BlankFieldActionForm form = (BlankFieldActionForm)request.getAttribute("blankFieldForm"); %> <li>jsp脚本</li><br> 姓名:<%=form.getUsername() %><br> 密码:<%=form.getPassword() %><br> <p> <li>el表达式</li><br> 姓名:${blankFieldForm.username }<br> 密码:${blankFieldForm.password }<br> </body> </html>
typeconvert_success.jsp
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Insert title here</title> </head> <body> intValue:${typeconvertForm.intValue }<br> doubleValue:${typeconvertForm.doubleValue }<br> booleanValue:${typeconvertForm.booleanValue }<br> java.sql.dateValue:${typeconvertForm.sqlDate }<br> java.util.utilValue:${typeconvertForm.utilDate }<br> </body> </html>
upload_success.jsp
<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>Insert title here</title> </head> <body> 标题:${uploadForm.title}<br> 文件名:${uploadForm.myfile.fileName }<br> </body> </html>
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>测试ActionForm</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h1>测试ActionForm</h1> <hr> <li>测试动态ActionForm</li><br> <form action="dyanactionform.do" method="post"> 姓名:<input type="text" name="username"><br> 年龄:<input type="text" name="age"><br> <input type="submit" value="提交"> </form> <p> <li>测试struts上传文件</li><br> <form action="upload.do" method="post" enctype="multipart/form-data"> 标题:<input type="text" name="title"><br> 文件:<input type="file" name="myfile"><br> <input type="submit" value="提交"> </form> <p> <li>空字段测试</li><br> <form action="blankfield.do" method="post"> 姓名:<input type="text" name="username"><br> <input type="submit" value="提交"> </form> <p> <li>测试ActionForm类型转换器</li><br> <form action="typeconvert.do" method="post"> intValue:<input type="text" name="intValue"><br> doubleValue:<input type="text" name="doubleValue"><br> booleanValue:<input type="text" name="booleanValue"><br> java.sql.Date:<input type="text" name="sqlDate"><br> java.util.Date:<input type="text" name="utilDate"><br> <input type="submit" value="提交"> </form> </body> </html>
struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="dynaForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="username" type="java.lang.String"/> <form-property name="age" type="java.lang.Integer"/> </form-bean> <form-bean name="uploadForm" type="com.bjsxt.struts.UploadActionForm"/> <form-bean name="blankFieldForm" type="com.bjsxt.struts.BlankFieldActionForm"/> <form-bean name="typeconvertForm" type="com.bjsxt.struts.TypeConvertActionForm"/> </form-beans> <action-mappings> <action path="/dyanactionform" type="com.bjsxt.struts.DynaActionFormTestAction" name="dynaForm" scope="request" > <forward name="success" path="/dyna_actionform.jsp"/> </action> <action path="/upload" type="com.bjsxt.struts.UploadTestAction" name="uploadForm" scope="request" > <forward name="success" path="/upload_success.jsp"/> </action> <action path="/blankfield" type="com.bjsxt.struts.BlankFieldTestAction" name="blankFieldForm" scope="request" > <forward name="success" path="/blankfield_success.jsp"/> </action> <action path="/typeconvert" type="com.bjsxt.struts.TypeConvertTestAction" name="typeconvertForm" scope="request" > <forward name="success" path="/typeconvert_success.jsp"/> </action> </action-mappings> <controller maxFileSize="10M"/> <plug-in className="com.bjsxt.struts.UtilDateConverterInitWithPlugin"/> </struts-config>
发表评论
-
drp_user
2009-01-11 15:10 1190采用DispathAction * 如果覆写DispathA ... -
编程式异常 -声明式异常
2009-01-11 11:28 14791、编程式异常 * 截获异常 * 创建相应的异常消息 * ... -
struts validator验证框架
2009-01-07 23:35 2902struts validator验证框架 1、配置: * ... -
struts国际化
2009-01-07 23:18 66641、struts国际化的配置 * 在struts-confi ... -
了解Locale
2009-01-07 23:01 12741、了解缺省Locale是由操作系统决定的,Locale是由语 ... -
actionmapping
2009-01-07 22:48 14091、struts-config.xml文件中,每个<ac ... -
ActionForward的使用
2009-01-07 22:13 42001、理解全局和局部ActionForward的概念 2、red ... -
分步收集,ActionForm的scope=session
2009-01-07 21:58 1732StartAction.java package com.b ... -
DispatchAction.java
2009-01-07 19:48 1076/* * $Id: DispatchAction.java ... -
模式匹配
2009-01-07 19:41 779UserAction.java package com. ... -
jstl标签库的配置
2009-01-07 18:51 3413jstl标签库的配置 * 将jstl.jar和standar ... -
1.2.9 RequestProcessor.java
2008-12-27 17:47 1302/* * $Id: RequestProcessor.ja ... -
1.2.9 ActionServlet.java
2008-12-27 17:43 1208/* * $Id: ActionServlet.java ... -
struts_login
2008-12-27 17:32 9081、配置struts * 拷贝struts lib下的所有j ... -
struts_trainnig_cal
2008-12-26 23:17 667CalAction.java package com.bj ... -
bjsxt test_servlet
2008-12-26 22:46 1126TestServlet.java package com. ...
相关推荐
Struts学习笔记之ActionForm ActionForm是Struts框架中的一种重要组件,用于封装和处理用户的表单数据。在Struts中,ActionForm是继承自JavaBeans的,主要用于处理用户的表单数据和业务逻辑。下面是ActionForm的...
标题"验证ActionForm存到了request中"涉及到的是Struts框架中ActionForm对象的使用和处理过程。ActionForm是Struts框架的核心组件之一,它主要用于收集用户在表单中的输入数据,并将这些数据传递到Action类进行业务...
本集成开发宝典主要关注如何将这三者有效地结合,以ActionForm为切入点,深入讲解它们的整合过程。 Struts 是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,它主要用于控制应用的流程,处理用户请求...
ActionForm是Struts框架中一个关键的组件,它充当了Controller与Model之间的桥梁,负责传递用户在表单中提交的数据到业务逻辑层。本篇文章将深入探讨ActionForm中的get和set方法及其作用。 1. **ActionForm基础** ...
本文将深入探讨Struts1框架下如何通过ActionForm简化表单处理,以及实体类与ActionForm之间的交互。 ### 实体类(Entity) 在Struts框架中,实体类(如`userEntity`)用于封装业务数据,是模型(Model)的一部分。...
在Struts中,ActionForm类是处理用户输入数据的核心组件,它封装了请求参数并负责业务逻辑验证。本文将详细讨论如何在Struts中使用ActionForm的`validate`方法进行数据验证。 `validate`方法是在ActionForm中定义的...
ActionForm是Struts1中处理用户输入的核心组件,它负责接收、验证和封装来自表单的数据。在本文中,我们将深入探讨如何利用ActionForm实现表单验证,并在验证失败时追加错误信息。 1. **ActionForm介绍** ...
一个Jsp两个ActionForm分别提交.rar一个Jsp两个ActionForm分别提交.rar一个Jsp两个ActionForm分别提交.rar一个Jsp两个ActionForm分别提交.rar一个Jsp两个ActionForm分别提交.rar
当我们需要在客户端提交多行数据时,通常会利用表单来收集信息,然后将这些数据传递到服务器端的ActionForm。这个过程涉及到如何将客户端的数据组织成一个集合,如List,并将其绑定到ActionForm的属性上。在本篇中,...
主要是actionForm的基本验证,重写validate方法,返回actionErrors,然后根据资源文件显示错误。 这是一个demo例子,直接导入eclispe中即可。 并且这部分内容会在相应的博客中介绍,稍后会更新博客。
动态ActionForm则旨在解决这个问题,它允许我们在运行时动态地创建和绑定ActionForm,而不是预先定义固定的ActionForm类。 在讲解动态ActionForm的过程中,通常会涵盖以下几个关键点: 1. **ActionForm接口**:...
3. **ActionForm的使用**:如何创建ActionForm类,定义属性并添加对应的get和set方法,以及如何在struts-config.xml中配置ActionForm。 4. **数据验证**:ActionForm不仅可以收集数据,还可以进行数据验证。通过...
标题“ActionForm_Scope为Session”涉及到的是Struts框架中的一个关键概念,即ActionForm对象的作用域设置。在Struts框架中,ActionForm是用于封装请求参数并传递给业务逻辑层(通常为Servelets或JavaBeans)的模型...
本篇学习笔记主要关注的是ActionForm,它是Struts框架中用于处理用户请求的核心组件之一。 ActionForm是Struts中用于接收和验证用户输入的数据的类。当用户通过表单提交数据时,这些数据会被封装到一个ActionForm...
### ValidatorActionForm、ValidatorForm 和 ActionForm 的区别 #### 一、ActionForm 概述 **ActionForm** 是 Struts 1.x 框架中用于封装用户输入数据的一个核心类,它通常作为表单对象的 JavaBean 实现。...
在这个名为“Struts中不同的Action和ActionForm组合.rar”的压缩包中,主要探讨的是Struts框架中Action和ActionForm的组合使用方式,以及它们在处理用户请求和数据验证过程中的作用。以下是对这个主题的详细解释。 ...
在Spring框架中,如果需要在ActionForm中注入其他对象,例如数据库访问层的服务,可能会遇到问题,因为ActionForm通常是非Spring管理的bean。 针对这个问题,一种解决办法是将注入的属性声明为静态,并修改setter...