今天是Sturts1的最后一天,老佟下午做了一个综合性练习,十分经典!通过这个练习也让我感觉到了老佟的功力深厚。这个练习明天我再做。
今天的重点内容有:MappingDispatchAction、动态的ActionForm、预显表单、struts国际化和文件上传!
一、MappingDispatchAction
我们知道一个DispatcherAction可以处理多个用户请求(通过sturts-config.xml配置),但一个DispatchAction只能有一个ActionForm。这就是它的最大缺点,所以Sturts为我们提供了一个折中的处理办法——MappingDiapatchAction(位于Action与DispatchAction之间)。
我们在工程中新添加一个MappingDispathAction:
import javax.servlet.http.*; import org.apache.struts.action.*; import org.apache.struts.actions.MappingDispatchAction; public class TestMappingDispatchAction extends MappingDispatchAction { // add处理 public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("TestDispatchAction.add"); return mapping.findForward("success"); } // find处理 public ActionForward find(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("TestDispatchAction.find"); return mapping.findForward("success"); } } |
在struts-config.xml添加:
<action path="/add" type="cn.itcast.cc.actions.TestMappingDispatchAction" parameter="add" name="AddActionForm"> </action> <action path="/find" type="cn.itcast.cc.actions.TestMappingDispatchAction" parameter="find" name="FindActionForm"> </action> |
此时JSP页面中的请求连接必须修改为:
<html:link action="/add">add</html:link> <html:link action="/find">find</html:link> |
老佟推荐使用MappingDispatchAction。在特殊情况下使用Dispatched或Action吧!
二、动态的ActionForm
我们在使用ActionForm时,我们必需手动添加代码。如果ActionFrom非常多时我们就需要手动添加大量代码。动态的ActionForm则不老板娘我们手动添加代码。
例,处理用户登陆的动态ActionForm,向struts-config.xml中添加:
<form-beans> <form-bean name="dynaAction" type="org.apache.struts.action.DynaActionForm"> <form-property name="username" type="java.lang.String" /> <form-property name="password" type="java.lang.String" /> </form-bean> </form-beans> |
不需要手动编写ActionForm,“type="org.apache.struts.action.DynaActionForm"”是struts中自带的ActionForm。“name="username"”必须与表单的字段名称相对应。“type="java.lang.String"”字段值的类型,需要指定全类名。
三、预显表单
比如用户修改自己的信息,当用户修改并提交了错误信息里。表单页面需要给出提示,并回显用户提交的数据(而不是显示空表或修改之前的原表),因为用户可能修改了五个地方,确只有一个地方的数据不合法。
这个解决方法很简单,只需要使用struts的HTML标签即可。比如显示用户名的标签“<html:text property="username"/>”。因为我们在struts-config.xml中配置了这个页面的name和scope属性,所以,struts先去到scope指定的域中查找名称为name的属性指定的ActionForm。
当请求派发到指定的页面之前,Strtus会取出ActionForm中对应的字段值,并生成value=”字段值”添加到<input …>中。
除了使用插件结合html标签进行校验外,这个回显的功能也是struts的html标签的一大特色!
四、Struts国际化
还记得以前学习的WEB应用的国际化吗?(使用的是JAVA国际化组件)回忆一下,我们需要编写一个属性文件,比如名为“language.properties”它是默认的文件如果国际化组件找不到与本地语言对应的配置文件就会使用这个默认文件。中文的文件名应该为“language_zn_CN.properties”、英文的文件名为“language_en_US.properties”,它们的键名称相同,但值是相应国家的同义文字。然后我们需要调用ResourceBundle.getBundle(“language”);返回一个ResourceBundle对象,它根据计算机本地默认语言加载对应的配置文件。之后根据需要调用ResourceBundle.getString(String key); 返回需要的值。
嗯嗯,Struts中的国际化与此相同。比如我们之前使用的错误信息资源文件“MessageResources.properties”我们在struts-config.xml指定了它被做为struts的资源:
<message-resources parameter="MessageResources"></message-resources> |
同样,我们定义中文的资源文件为“MessageResources_zh_CN.properties”、英文的资源文件为“MessageResources_en_US.properties”,它们的键名相同,但值是相应国家的同义文字。struts-config.xml不需要修改。这样,Struts在加载struts-config.xml文件时,也会自动根据本地默认语言加载相应的资源文件。这样在以后的应用直,直接使用键名即可获取本地语言的值。比如:
new ActionMessage("username.exist") |
如果本地默认语言是中文,则信息值为:“用户已存在!”。如果本地默认语言是英文,则信息值为:“user name already exist!”。
五、文件上传
这个也很简单哦~~(说着简单,看着也简单,做就是另一回事儿了!)。
我们以前的文件上传是怎么实现的?需要加载“commons-fileupload”和“commons-io”两个jar包,在处理文件上传表单的servlet中调用“ServletFileUploadObj.parseRequest(request);”方法解析request,然后遍历它返回的List并调用“FileItemObj.isFormField()”判断这一项是表单字段还是文件上传,如果是文件上传则保存文件…。
Struts中的文件上传也需要使用“commons-fileupload”和“commons-io”两个jar包。我们设计的表单必须使用struts的html标签,在文件上传标签处使用“<html:file…>”:
file: <html:file property="file"></html:file> |
在对应的ActionForm中需要添加一个“FormFile”类型的成员,它用于存放提交的文件信息和文件输入流。Ok,这样我们就可以在处理表单的Action中直接获取文件提交字段了!
今天做一下简单的总结,没有添加代码详细说明。框架是简单了程序的开发,这是十分有意义的,它可以节省很多不必要的工作,利于项目的扩展与维护。它使得程序员可以节省更多的时间用于学习或做项目研究,怎么能说成是毁程序员的饭碗呢?!
今天下午的那个练习十分经典,这个我明天来做一下。突然从WEB基础跳到框架的学习,多少有些不习惯,尤其是第一天。不过现在好些了,也更期待学习hibernate框架和spring框架,并将他们应用于项目中!
加油!
我总给自己加油,当然也有那些关心我的亲人和朋友们,感谢他们!