一口一口吃掉Struts(六)——动态ActionForm .
2014-03-25 09:20
417 查看
使用ActionForm把表单数据单独封装起来,而且提供了自动的数据验证,简化了代码的编写,给我们带来了极大的方便。
但是,ActionForm也存在一些明显的不足:
1、如果ActionForm对应的HTML表单添加或删除一些属性,ActionForm类就可能需要修改并重新编译;所以如果HTML表单是动态的,那么ActionForm就无能为力了;
2、ActionForm增加了项目中类的数量!
3、对于安全性要求不高的系统,ActionForm的数据验证并不常用,我们一般都在js中验证了
面对这些缺点,Struts引入了动态actionform概念,动态ActionForm使得用户无须为应用程序的每一个HTML表单创建具体的ActionForm类。Struts框架包中的DyanActionForm类及其子类实现了动态ActionForm.
还是边看实例边说吧!
JSP
[html]
view plaincopyprint?
<%@ 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>
<h1>
测试动态ActionForm
</h1>
<form action="TestAction.do" method="post">
username:
<input type="text" name="name" />
<br />
age:
<input type="text" name="age" />
<br />
<input type="submit" value="提交" />
</form>
</body>
</html>
配置文件
DyanActionForm类扩展了 ActionForm类。动态ActionForm支持在Struts配置文件中完成ActionForm的全部配置,无须编写任何额外的J***A代码。使用动态 form, 没有对应的类,所以,如果需要扩展属性,只需要再次配置文件中添加一个属性就可以了
[html]
view plaincopyprint?
<?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="dynamicForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="name" type="java.lang.String" />
<form-property name="age" type="java.lang.Integer" />
</form-bean>
</form-beans>
<action-mappings>
<action path="/TestAction" type="com.jialin.TestAction" name="dynamicForm"
scope="request">
<forward name="showResult" path="/ShowResult.jsp" />
</action>
</action-mappings>
</struts-config>
那么,在这个 action 里面,如何实现对动态 form 的调用 ? 同普通的ActionForm一样,Action类和JSP都可以访问动态ActionForm,而访问方式也基本一致。访问动态ActionForm与访问普通的ActionForm的最大区别在于对属性的访问方式不同。
我们传递的是 DynaActionForm, 所以,在调用的时候,我们就要把 form 强制转换成 DynaActionForm 对象。
在标准的ActionForm中,针对每一个属性都提供了getter和setter方法来读取和设置属性,而DynaActionForm把所有的属性保存在一个Map 对象中,因此访问DyanActionForm中的属性与访问Map对象中的方法类似。
Action
[java]
view plaincopyprint?
package com.jialin;
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;
public class TestAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
DynaActionForm daf=(DynaActionForm)form;
String name=daf.getString("name");
Integer age = (Integer)daf.get("age");
System.out.println("name=" + name);
System.out.println("age=" + age);
return mapping.findForward("showResult");
}
}
动态ActionForm的表单验证问题。DynaActionForm类的validate()方法没有提供任何默认的验证行为。可以通过定义扩展DynaActionForm类的子类,然后覆盖validate()方法,但是以编程方式来验证动态ActionForm并不是一种理想的办法。动态ActionForm的验证应该使用Struts的Validator验证插件。Validator插件允许采用特定的配置文件为动态的ActionForm配置验证规则,如检查必须的输入域,日期时间等。但这些验证我们一般都在客户端js中完成。
动态Action同样有它的缺点:
1、配置文件会增加,非常容易写错,而且错误不易发现。今天测试的时候,我就是把java.lang.String 写成了java.long.String 在Action中拿到的form就是null,找了老半天才解决。所以采用动态action调试比较麻烦。
2、静态ActionForm能让我们很清晰的了解表单数据信息,数据和对数据的操作是分离的,更容易让人理解。
呵呵,有利就有弊,平衡就好。
下篇继续……
但是,ActionForm也存在一些明显的不足:
1、如果ActionForm对应的HTML表单添加或删除一些属性,ActionForm类就可能需要修改并重新编译;所以如果HTML表单是动态的,那么ActionForm就无能为力了;
2、ActionForm增加了项目中类的数量!
3、对于安全性要求不高的系统,ActionForm的数据验证并不常用,我们一般都在js中验证了
面对这些缺点,Struts引入了动态actionform概念,动态ActionForm使得用户无须为应用程序的每一个HTML表单创建具体的ActionForm类。Struts框架包中的DyanActionForm类及其子类实现了动态ActionForm.
还是边看实例边说吧!
JSP
[html]
view plaincopyprint?
<%@ 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>
<h1>
测试动态ActionForm
</h1>
<form action="TestAction.do" method="post">
username:
<input type="text" name="name" />
<br />
age:
<input type="text" name="age" />
<br />
<input type="submit" value="提交" />
</form>
</body>
</html>
<%@ 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> <h1> 测试动态ActionForm </h1> <form action="TestAction.do" method="post"> username: <input type="text" name="name" /> <br /> age: <input type="text" name="age" /> <br /> <input type="submit" value="提交" /> </form> </body> </html>
配置文件
DyanActionForm类扩展了 ActionForm类。动态ActionForm支持在Struts配置文件中完成ActionForm的全部配置,无须编写任何额外的J***A代码。使用动态 form, 没有对应的类,所以,如果需要扩展属性,只需要再次配置文件中添加一个属性就可以了
[html]
view plaincopyprint?
<?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="dynamicForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="name" type="java.lang.String" />
<form-property name="age" type="java.lang.Integer" />
</form-bean>
</form-beans>
<action-mappings>
<action path="/TestAction" type="com.jialin.TestAction" name="dynamicForm"
scope="request">
<forward name="showResult" path="/ShowResult.jsp" />
</action>
</action-mappings>
</struts-config>
<?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="dynamicForm" type="org.apache.struts.action.DynaActionForm"> <form-property name="name" type="java.lang.String" /> <form-property name="age" type="java.lang.Integer" /> </form-bean> </form-beans> <action-mappings> <action path="/TestAction" type="com.jialin.TestAction" name="dynamicForm" scope="request"> <forward name="showResult" path="/ShowResult.jsp" /> </action> </action-mappings> </struts-config>
那么,在这个 action 里面,如何实现对动态 form 的调用 ? 同普通的ActionForm一样,Action类和JSP都可以访问动态ActionForm,而访问方式也基本一致。访问动态ActionForm与访问普通的ActionForm的最大区别在于对属性的访问方式不同。
我们传递的是 DynaActionForm, 所以,在调用的时候,我们就要把 form 强制转换成 DynaActionForm 对象。
在标准的ActionForm中,针对每一个属性都提供了getter和setter方法来读取和设置属性,而DynaActionForm把所有的属性保存在一个Map 对象中,因此访问DyanActionForm中的属性与访问Map对象中的方法类似。
Action
[java]
view plaincopyprint?
package com.jialin;
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;
public class TestAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
DynaActionForm daf=(DynaActionForm)form;
String name=daf.getString("name");
Integer age = (Integer)daf.get("age");
System.out.println("name=" + name);
System.out.println("age=" + age);
return mapping.findForward("showResult");
}
}
package com.jialin; 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; public class TestAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DynaActionForm daf=(DynaActionForm)form; String name=daf.getString("name"); Integer age = (Integer)daf.get("age"); System.out.println("name=" + name); System.out.println("age=" + age); return mapping.findForward("showResult"); } }
动态ActionForm的表单验证问题。DynaActionForm类的validate()方法没有提供任何默认的验证行为。可以通过定义扩展DynaActionForm类的子类,然后覆盖validate()方法,但是以编程方式来验证动态ActionForm并不是一种理想的办法。动态ActionForm的验证应该使用Struts的Validator验证插件。Validator插件允许采用特定的配置文件为动态的ActionForm配置验证规则,如检查必须的输入域,日期时间等。但这些验证我们一般都在客户端js中完成。
动态Action同样有它的缺点:
1、配置文件会增加,非常容易写错,而且错误不易发现。今天测试的时候,我就是把java.lang.String 写成了java.long.String 在Action中拿到的form就是null,找了老半天才解决。所以采用动态action调试比较麻烦。
2、静态ActionForm能让我们很清晰的了解表单数据信息,数据和对数据的操作是分离的,更容易让人理解。
呵呵,有利就有弊,平衡就好。
下篇继续……
相关文章推荐
- java之断言assert
- java监控文件夹内文件变化并且进行文件同步bigfilesync
- java.sql.DataTruncation: Data truncation
- Java和JSP中对于比较字符的方式不同,需要注意
- Java动态生成下拉单选框
- Java实现存储过程的sql处理
- Java编程之字符集问题研究
- Struts2中的process函数和excute函数
- servlet与struts2的处理
- Java的action的scpoe问题
- Java登录页面实时验证用户名密码和动态验证码
- Java日期的加减问题
- Java之美[从菜鸟到高手演变]之设计模式四
- telbook雏形
- Java之美[从菜鸟到高手演变]之设计模式三
- Java之美[从菜鸟到高手演变]之设计模式二
- Java之美[从菜鸟到高手演变]之设计模式一
- Java 8简明教程
- Java 8 Tutorial
- 扯扯Java中Finalization的意义