您的位置:首页 > 编程语言 > Java开发

传智播客 struts1.x 动态表单及其它

2009-10-23 23:16 288 查看
初步了解struts的标签后,接下来视频讲解的是动态表单。所谓动态表单,从名字上给人的感觉是不需要编写form的代码,直接配置form就能当正常的表单一样用。总的来说,动态表单在一定程度上可以简化程序的编写,但是如果配置成动态表单,就不能在form中应用验证方法了。所以在不需要验证,同时form中的字段又是动态表单能转换的类型时,用动态表单是比较合适的。下面就是动态表单的配置代码(仍然是前面的添加学生的应用):
<form-bean name="addStuForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="name" type="java.lang.String"/>
<form-property name="major" type="java.lang.String"/>
<form-property name="score" type="java.lang.Float"/>
<form-property name="birth" type="java.sql.Date"/>
</form-bean>
如上所示,这就是在struts的配置文件配置动态表单的代码,功能和前面的添加学生的ActionForm是一样的。在定义这个<form-bean>元素时,有两个地方时需要改变的,一个就是type属性的值,因为具体的ActionForm没有定义,所以这里换成动态表单的类DynaActionForm。第二个需要改变的就是需要在<form-bean>元素中定义<form-property>子元素来映射属性,其中name属性定义页面表单提交过来的表单字段名字,type属性定义该字段在JAVA中的类型。需要注意的是,类型只能是在struts的动态表单文档页面定义的那些类型以及数组,其它类型的字段就不能用动态表单来进行映射了。定义了动态表单以后,就需要在Action获取提交的表单参数:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

DynaActionForm addStudentForm = (DynaActionForm) form;
String name= addStudentForm.getString("name");
String major= addStudentForm.getString("major");
float score = (Float) addStudentForm.get("score");
Date birth = (Date) addStudentForm.get("birth");
PrintWriter out = response.getWriter();
out.println("[birth=" + birth + ", major=" + major + ", name=" + name
+ ", score=" + score + "]");
return null;
}
上面的代码是AddStudentAction类的execute方法,首先将传进来的ActionForm转换成动态表单,然后通过get方法取得相应的参数,该方法返回的Object类型,所以需要转型。正因为这样,而在表单中字符串的值比较常见,所以DynaActionForm也提供了getString方法,直接返回字符串。最后打印输出语句只是为了验证在Action中获取到了页面提交的参数的值。这是在Action中获取参数值,如果业务逻辑执行完,返回到页面上,这是需要访问动态表单的属性值,用EL表达式来显示时,应该用${addStudentForm.map.name}。因为动态表单实际上是将页面上的字段名字和值获取到后存入自身的Map对象中,所以要获取的话就应该先通过getMap方法得到map然后才是属性。
视频中最后三个知识点就是异常的处理、ForwardAction和DispatchAction的讲解。先来看看异常处理,异常处理时伴随着JAVA编程的,对异常进行处理有利于程序的健壮性。在struts中,分局部异常和全局异常。局部异常是指在<action>元素中配置的异常,而全局异常是在<global-exceptions>元素中配置的异常。其实两者配置都差不多,只是对异常的作用范围不一样而已。如果是局部异常,则指针对该Action的execute方法抛出的异常起作用。下面是全局异常处理的定义:
<global-exceptions>
<exception
key="some.key"
type="java.io.IOException"
handler="org.apache.struts.action.ExceptionHandler"/>
</global-exceptions>
其中exception元素的key属性指的是资源文件中的key值,这样异常也能输出国际化的信息。type属性表示需要处理的异常,同时handler则是处理异常的类,如果想要自己处理就必须继承如上所示的类,并且按要求重写相应的方法和返回相应的值。还有一个比较常用的属性就是path,表示出现异常后应该跳往哪个页面。
接下来要说明的就是ForwardAction类,它的主要作用是用来起一个转发请求的作用。比如当客户端直接访问*.jsp时候,与*.do的访问模式不一致,所以该类的一个作用就是用来统一访问web应用。还有一种情况是必须要用到,当JSP页面放在WEB-INF目录下的时候,客户端是不能直接通过*.jsp的请求访问该JSP的,如果没有ForwardAction,则需要专门写这样的Action类,而且功能都是一样的,所以struts就提供实现该功能的类。配置和普通Action的配置几乎一样,最简单的应用是只有path和forward属性。
最后要了解的就是DispatchAction类,这是在实际开发中的用的最多的一种Action,它能避免过多的Action配置。比如需要对学生进行增删改查操作,如果每个操作用一个Action将导致四个Action,而且它们除了execute方法不同外,其它基本上是一致的。所以将Action的继承类换成DispatchAction,改变原来execute方法的名字,这个名字作为页面段发送请求时的方法调用参数。比如student.do?method=add,这里student是struts配置文件中定义的action的那么属性,而method参数则是由相应<action>元素的parameter属性指定,该属性是的值对应得参数的值就是action中的方法名。struts会根据该名字去调用相应的方法。因此,这样做就合并了许多相同的Action类,减少代码量。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: