关于Form
突出要求的是Form只是用来存表单数据,只是数据提供者。在这个层次中不要去访问模型层。在Form这块流程中,服务还未响应到response,所以,在其实现中只能传递mapping和request.
Sturts架构中的Action默认读取setXXXX,标签也默认读取getXXX所以,必须规范的实现,同时需使用reset方法来清空数据,如配置中使用 validate=true 那实现中也要编写此方法,其返回为ActionErrors。
使用的方法为:
1 设定各属性值的 getXXX();setXXX(Stirng XXX) 方法。
2 设定reset() 方法,将各属性置为null.
3 调用 public ActionErrors validate(ActionMapping mapping,HttpservletRequest request) 方法
ActionErrors errors = new ActionErrors()
一般来判断 XXX==null || xxx.length()<1是否空值来操作 errors.add("XXX",new ActionMessage("资源文件描述")
return erros
关于Action
Action只是个控制角色。它只是来判断模型及其它JAVA文件的计算结果来实现控制转向,不必要放入太多的固定的硬代码在里面。还是为了实现MVC的需要而严格的。这里调用模型层去完成持久化。在Action中如果计划向视图层传递对象时,必须使用setAttribute方法,而且建议此方法参数中的键值为另一对象(一个JAVA文件)的常量,这样也是为了方便控制。实现分离。
如:必须实现execute方法,在方法中再进行比Form简单验证更复杂的验证,实现持久化,然后转向。
使用的一些特殊的方法:
1。设定ActionMessages error = new ActionMessages();
2。根据逻辑判断使用 error.add(ActionMessages.GLOBAL_MESSAGE,new ActionMessage("配置文件"));
3。来判断error是否为空实现转向:
if(!errors.isEmpty()){
saveErrors(request,errors);
return new ActionForward(mapping.getInput());
}
同样可以使用一个特殊的方法 return new ActionForward("转发名","/地址","true")
第一个转发名代表实例的名字,第二是路径,第三个代表是重定向(false为转发)
struts 关于视图
<html:link forward="search"><bean:message key="mainMenu.search"/></html:link>
这转向代表向控制方要求转向动作:在配置文件 里有 <forward name="search" path="/search.jsp"/> 直接转向的说明。
另外可以使用 <html:link page="/action/viewsignin"> 这个代表要连接到<action>中去进行解析。一般action中的配置如下
<action
path="/viewsignin"
parameter="/page/view.jsp"
type="org.apache.struts.actions.ForwardAction"
scope="request"
name="loginForm"
validate="false"
input="/index.jsp">
</action>
<message-resources>的使用
<message-reseources key="images" parameter="imagesResources"/>
当调用时:<bean : message key="images.show " bundle="images"/>
struts 令牌 解决重复提交 :
首先:要在表单页的上一个控制页面,也就是说,如果想用表单提交时,要先利用sturts的转发机制,从一个action转到表单页,在这个转发action中,要定义一个“令牌” 很简单, saveToken(request);然后再由此ACTION转向到实际录入拥有FORM的页面,由此FORM页面再向下一个ACTION提交。(这时会在表单页自动生成一个hidden 保存了一个和时间相关的计算值)
其次 : 在表单提交后的action中,进行一个判断 if(isTokenValid(reqeust)) 如果表单提交的串值与session中的相符那就完成动作,同时session清空此串值(restToken(request);)。此时如果后退再提交,就出错,同时再次改写saveToken返回目的页,如录入或者主页面。
1 . <html:link page="/tokenaction.do?token=insertUser">用户注册</html:link>
2.<action path="/tokenaction" type="com.token.action.PreInsert" parameter="token">
<forward name="regUser" path="/reguser.jsp"></forward>
</action>
3. public class PreInsert extends DispatchAction {
public ActionForward insertUser(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
this.saveToken(request);
return mapping.findForward("regUser");
}
}
4.<html:form action="/reguser">
5. <action attribute="regForm" input="/reguser.jsp" name="regForm"
path="/reguser" scope="request"
type="com.token.struts.action.RegAction" validate="false" >
<forward name="mutiSubmit" path="/reguser.jsp"></forward>
</action>
6. RegAction类excute方法内
ApplicationResources.properties :error.mutiSubmit=<script>alert("you shouldn't submit form twice !");</script>
ActionMessages errors=new ActionMessages();
if(!this.isTokenValid(request)){
errors.add("mutiSubmit",new ActionMessage("error.mutiSubmit"));
this.saveErrors(request, errors);
return mapping.findForward("mutiSubmit");
}else{
this.resetToken(request);
……..
}
验证 (application.properties)
命令 native2ascii –encoding gbk f:\1.txt f:\2.txt
username=\u7528\u6237\u540d :
password=\u5bc6\u7801 :
name.error=<script>alert("\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a!");</script>
name.length=<script>alert("\u7528\u6237\u540d\u957f\u5ea6\u5fc5\u987b\u662f6-12\u4f4d!");</script>
pwd.error=<script>alert("\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a!");</script>
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if(username==null||username.equals("")){
errors.add("user",new ActionMessage("name.error"));
return errors;
}
if(username.length()<6||username.length()>12){
errors.add("userlength", new ActionMessage("name.length"));
request.setAttribute("usercheck",username);
return errors;
}
if(password==null||password.equals("")){
errors.add("pass",new ActionMessage("pwd.error"));
return errors;
}
return errors;
}
突出要求的是Form只是用来存表单数据,只是数据提供者。在这个层次中不要去访问模型层。在Form这块流程中,服务还未响应到response,所以,在其实现中只能传递mapping和request.
Sturts架构中的Action默认读取setXXXX,标签也默认读取getXXX所以,必须规范的实现,同时需使用reset方法来清空数据,如配置中使用 validate=true 那实现中也要编写此方法,其返回为ActionErrors。
使用的方法为:
1 设定各属性值的 getXXX();setXXX(Stirng XXX) 方法。
2 设定reset() 方法,将各属性置为null.
3 调用 public ActionErrors validate(ActionMapping mapping,HttpservletRequest request) 方法
ActionErrors errors = new ActionErrors()
一般来判断 XXX==null || xxx.length()<1是否空值来操作 errors.add("XXX",new ActionMessage("资源文件描述")
return erros
关于Action
Action只是个控制角色。它只是来判断模型及其它JAVA文件的计算结果来实现控制转向,不必要放入太多的固定的硬代码在里面。还是为了实现MVC的需要而严格的。这里调用模型层去完成持久化。在Action中如果计划向视图层传递对象时,必须使用setAttribute方法,而且建议此方法参数中的键值为另一对象(一个JAVA文件)的常量,这样也是为了方便控制。实现分离。
如:必须实现execute方法,在方法中再进行比Form简单验证更复杂的验证,实现持久化,然后转向。
使用的一些特殊的方法:
1。设定ActionMessages error = new ActionMessages();
2。根据逻辑判断使用 error.add(ActionMessages.GLOBAL_MESSAGE,new ActionMessage("配置文件"));
3。来判断error是否为空实现转向:
if(!errors.isEmpty()){
saveErrors(request,errors);
return new ActionForward(mapping.getInput());
}
同样可以使用一个特殊的方法 return new ActionForward("转发名","/地址","true")
第一个转发名代表实例的名字,第二是路径,第三个代表是重定向(false为转发)
struts 关于视图
<html:link forward="search"><bean:message key="mainMenu.search"/></html:link>
这转向代表向控制方要求转向动作:在配置文件 里有 <forward name="search" path="/search.jsp"/> 直接转向的说明。
另外可以使用 <html:link page="/action/viewsignin"> 这个代表要连接到<action>中去进行解析。一般action中的配置如下
<action
path="/viewsignin"
parameter="/page/view.jsp"
type="org.apache.struts.actions.ForwardAction"
scope="request"
name="loginForm"
validate="false"
input="/index.jsp">
</action>
<message-resources>的使用
<message-reseources key="images" parameter="imagesResources"/>
当调用时:<bean : message key="images.show " bundle="images"/>
struts 令牌 解决重复提交 :
首先:要在表单页的上一个控制页面,也就是说,如果想用表单提交时,要先利用sturts的转发机制,从一个action转到表单页,在这个转发action中,要定义一个“令牌” 很简单, saveToken(request);然后再由此ACTION转向到实际录入拥有FORM的页面,由此FORM页面再向下一个ACTION提交。(这时会在表单页自动生成一个hidden 保存了一个和时间相关的计算值)
其次 : 在表单提交后的action中,进行一个判断 if(isTokenValid(reqeust)) 如果表单提交的串值与session中的相符那就完成动作,同时session清空此串值(restToken(request);)。此时如果后退再提交,就出错,同时再次改写saveToken返回目的页,如录入或者主页面。
1 . <html:link page="/tokenaction.do?token=insertUser">用户注册</html:link>
2.<action path="/tokenaction" type="com.token.action.PreInsert" parameter="token">
<forward name="regUser" path="/reguser.jsp"></forward>
</action>
3. public class PreInsert extends DispatchAction {
public ActionForward insertUser(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
this.saveToken(request);
return mapping.findForward("regUser");
}
}
4.<html:form action="/reguser">
5. <action attribute="regForm" input="/reguser.jsp" name="regForm"
path="/reguser" scope="request"
type="com.token.struts.action.RegAction" validate="false" >
<forward name="mutiSubmit" path="/reguser.jsp"></forward>
</action>
6. RegAction类excute方法内
ApplicationResources.properties :error.mutiSubmit=<script>alert("you shouldn't submit form twice !");</script>
ActionMessages errors=new ActionMessages();
if(!this.isTokenValid(request)){
errors.add("mutiSubmit",new ActionMessage("error.mutiSubmit"));
this.saveErrors(request, errors);
return mapping.findForward("mutiSubmit");
}else{
this.resetToken(request);
……..
}
验证 (application.properties)
命令 native2ascii –encoding gbk f:\1.txt f:\2.txt
username=\u7528\u6237\u540d :
password=\u5bc6\u7801 :
name.error=<script>alert("\u7528\u6237\u540d\u4e0d\u80fd\u4e3a\u7a7a!");</script>
name.length=<script>alert("\u7528\u6237\u540d\u957f\u5ea6\u5fc5\u987b\u662f6-12\u4f4d!");</script>
pwd.error=<script>alert("\u5bc6\u7801\u4e0d\u80fd\u4e3a\u7a7a!");</script>
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if(username==null||username.equals("")){
errors.add("user",new ActionMessage("name.error"));
return errors;
}
if(username.length()<6||username.length()>12){
errors.add("userlength", new ActionMessage("name.length"));
request.setAttribute("usercheck",username);
return errors;
}
if(password==null||password.equals("")){
errors.add("pass",new ActionMessage("pwd.error"));
return errors;
}
return errors;
}