◆struts高级部分(一)◆
◆struts如何解决重复提交问题?使用Token指令牌:
☆就是在进入表单页面之前,先通过<a href="mytoken.do"></a>进入一个Action,在该Action中设置一个Token指令 (this.saveToken(request)),然后再进入表单页面,在表单页面的Action中先检查Token指令是否被设置 (this.isTokenValidat(request)),是则再执行打印,打印完之后记得还要取消Token指令牌设置 (this.resetToken(request))。
◆struts如何解决上传问题?
☆因为上传的时候依然使用html标签,所以上传的内容还是首先被提交到XXXXForm.java中去,在该文件中
可以通过FormFile类型去接收上传的文件,也就是在XXXXForm.java中这样定义变量:
private FormFile pic; //pic就是表单中的上传控件名:<html:file property="pic"></html:file>
但是注意,所有上传的文件都必须封装,在Form表单中就进行封装:
<html:form action="" method="post" enctype="multipart/form-data"> //多媒体数据表单封装
☆struts上传有个问题就是需要自己写IO流才能正常保存上传文件。
如何获取当前绝对路径??
String uploadPath = this.getServlet().getServletContext().getRealPath("/")"
此路径就是当前工作的WebRoot在硬盘上的目录,但是我们一般需要建立一个专门存放上传文件的文件
夹(upload),还要取得文件名,以便做IO操作,那又该如何处理呢??
uploadPath = uploadPath+"uploadPath//"+uploadForm.getPic().getFileName();
现在就是写IO流操作了:
OutputStream out = new FileOutputStream(new File(uploadPath));
FormFile ff = uploadForm.getPic();
byte b[] = ff.getFileData();
out.write(b);
out.close();
那能否自己给上传的文件重命名呢??最重要的是要取得文件的后缀名:
uploadForm.getPic().getFileName().split("//.")[1];
◆struts高级部分(二)◆
☆Struts中最常用的两个Action:
。ForwardAction
。DispatchAction //是struts1.2中才有的特性, 1.1中就没有
☆动态ActionForm
验证框架
☆ForwardAction用处:就是为每个单独的jsp文件配置一个别名称。有部分开发人员提出:
将程序中所有jsp文件放在WEB-INF之下,之后每个jsp页面之间不能直接有任何联系,之间
通过在struts-config.xml中配置映射路径进行访问:
例如,根目录下有个html文件,其中有个超链接<a href="wjr.do">,要求就是通过它连接到WEB-INF之下的
Hello.jsp文件,那么该如何配置路径呢??
首先打开struts-config.xml,然后做如下添加即可:
<action-mappings>
<action path="/wjr"
type="org.apache.struts.actions.ForwardAction"
parameter="/WEB-INF/Hello.jsp">
</action>
</action-mappings>
这时WEB-INF/Hello.jsp文件就只能通过wjr.do来访问了
☆DispatchAction使用(分发Action):
有如下一种情况:
只有一个Servlet,但是可以通过一个status区分,因此需要在struts配置文件中增加一个parameter属性
先新建Form,Action 取名demo,第一步一样,并添加一个属性:name。
在第二步选择:org.apache.struts.actions.DispatchAction,而不是以前的org.apache.struts.action.Action了
并且在该页面再设置一个属性parameter值为:status。
然后根目录下新建dispatch.jsp,其中表单内容为:
<html:form action="demo.do" method="post">
输入姓名:<html:text property="name"></html:text>
<html:hidden property="status" value="insert"/>
/*上面设置设置隐藏域值是与struts-config.xml中的path="/demo"的action相对应,并
且需要将相应action中增加一个属性值:parameter="status"
这时完整的action就等于:
<action
attribute="demoForm"
input="/form/demo.jsp"
name="demoForm"
path="/demo"
scope="request"
type="com.strutsAdv2.action.DemoAction"
parameter="status"/>
*/
<html:submit value="提交"></html:submit>
</html:form>
☆那么这时action中属性值:parameter="status" 就对应了表单文件中隐藏域的value="insert",这个insert有什么用呢?
这时呢就需要进入相应的XXX.java中将execute()方法改为insert()方法就可以了,这时执行的就是insert()这个方法了,
当然,如果insert()方法和execute()方法同时存在,当然insert方法就不会执行了而只执行execute方法了。
☆动态ActionForm使用:
我们发现在struts中一个action就必须对应一个ActionForm,这是很不方便,能否一个Form对应多个action呢??
能! 在struts中提供了一个动态的ActionForm:叫着DynaActionForm。如何使用呢??
☆首先在struts配置文件中添加<form-bean/>:
在配置文件添加之前记得先写好表单文件,以免出错:
<html:form action="demo.do" method="post">
输入姓名:<html:text property="name"></html:text>
<html:hidden property="status" value="insert"/>
<html:submit value="提交"></html:submit>
</html:form>
现在就在struts配置文件中添加<form-bean/>:
<form-bean name="demoForm" type="com.strutsAdv2.form.DemoForm" /> //这个是之前生成的demoForm,不需要添加
<form-bean name="mldnForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name="password" type="java.lang.String" /> //在表单文件中就需要先设置这两个输入框
<form-property name="name" type="java.lang.String" />
</form-bean>
☆现在呢就需要把之前生成的action改动一下:
<action
attribute="demoForm"
input="/form/demo.jsp"
name="demoForm"
path="/demo"
scope="request"
type="com.strutsAdv2.action.DemoAction"
parameter="status"/>
要把上面的改为现在的动态ActionForm:mldnForm
<action
attribute="mldnForm"
input="/form/demo.jsp"
name="mldnForm"
path="/demo"
scope="request"
type="com.strutsAdv2.action.DemoAction"
parameter="status"/>
或者你新建一个Action,主要就是修改attribute和name属性值为你刚才新建的动态<form-bean name="mldnForm"/>
☆注意这时path还是path="/demo"哦,因为表单文件中的action="demo.do"没有变,所以进到这个demo对应的DemoAction.java中,
意思就是这个新的Form对应的Action还是同样使用的DemoAction.java,但是有点不同:
需要把DemoForm demoForm = (DemoForm) form;改为DynaActionForm demoForm = (DynaActionForm) form;
此时取得表单属性值方法也有点不一样了:整个insert方法修改后如下:
public ActionForward insert(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
// DemoForm demoForm = (DemoForm) form;// TODO Auto-generated method stub
DynaActionForm demoForm = (DynaActionForm)form ;
System.out.println("** 姓名:"+demoForm.getString("name")); //这里的参数就是配置文件中
System.out.println("** 密码:"+demoForm.getString("password"));//的<form-property name="name">属性。
return null;
}
☆由此可见使用动态DynaActionForm可以有效减少ActionForm类的数量。但是使用DynaActionForm没法
做验证。因此struts框架又提供了一个验证框架解决此问题:validate。
☆struts验证框架☆
☆第一步,建立动态form-bean,添加验证规则
在WEB-INF下新建一个validation.xml文件,先在该文件中做xml的DTD声明,然后根目录:<form-validation>,
假如我现在想验证上面我们建立的<form-bean name="mldnForm"/>中的mldnForm,该如何设置这个新建立的XML文件呢?
答案是不行的。因为mldnForm不是动态验证框架,它根本就不能被验证。要想使用验证框架,就是在建立Form,Action时,
第一步建Form时就需要选择单选按钮:Dynamic FormBean(以前我们选的是默认的New FormBean),Dynamic Type
也要选择带验证的动态Form:org.apache.struts.validator.DynaValidatorForm。
所以这时我们新建(或修改为下面的)一个动态验证Form:mldn,并添加name,password两个属性,然后店完成,就会生成如下内容:
<form-bean name="mldnForm"
type="org.apache.struts.validator.DynaValidatorForm">
<form-property name="password" type="java.lang.String" /> //在表单文件中就需要先设置这两个输入框
<form-property name="name" type="java.lang.String" />
</form-bean>
现在就在配置文件validation.xml中添加验证规则:
<form-validation>
<formset>
<form name="mldnForm">
<field property="name" depends="required">
<arg key="err.name" resource="true"/>
</field>
<field property="password" depends="required">
<arg key="err.password" resource="true"/>
</field>
</form>
</formset>
</form-validation>
☆第二步,在资源文件中配置相应错误信息:
因此属性文件根据配置文件validation.xml中内容就需要添加如下内容:
err.name = /u59d3/u540d //姓名
err.password = /u5bc6/u7801 //密码
errors.required= <li> {0} /u4e0d/u80fd/u4e3a/u7a7a/uff01/uff01/uff01 //不能为空
☆第三步,配置struts-config.xml文件:
需要在相应action中添加一个validate属性,表示这个Form可以被动态验证,这时action如下:
<action
attribute="mldnForm"
input="/form/demo.jsp"
name="mldnForm"
path="/demo"
scope="request"
type="com.strutsAdv2.action.DemoAction"
parameter="status"
validate="true"/>
这时就配好了吗??还没有。因为该验证框架是一个组件,所以需要配置此组件:增加一个插件。那该如何写该插件呢??
1.新建,找到 Struts1.2中的Struts1.2 Plugin,然后next,
2.Plugin class选择:org.apache.struts.validator.ValidatorPlugIn
3.然后在该页面点击add添加属性:property=pathnames,value=/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml
然后点完成,
这时在struts-config.xml文件中就自动增加了如下内容:
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathnames"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>
该插件表示通过配置的路径就能找到验证规则文件位置。
好,现在就在dispatch.jsp文件中添加一个错误标签:<html:errors/>,但是一定注意这时要把<action/>中的input
值修改:input="/dispatch.jsp"
☆
◆
◆使用验证框架之后,程序也可以通过JavaScript进行错误的提示:
把表单页面中的<html:errors/>删掉,然后在Form表单之后添加如下内容:
<html:form action="demo.do" method="post" οnsubmit="return validateMldnForm(this)" >
<html:javascript formName="mldnForm"/>
就这样直接使用就OK了,其中的方法你通过浏览器打开页面文件查看原文件就能看到这些自动添加进来的代码。
◆
◆
☆
☆