在配置struts-config.xml时,scope属性有两个值,一个是session,另一个是request,如果我们不配置的话,默认值为session。session值与request值有什么区别呢?
session是作为一个变量保存在程序中,它的生命周期较长,如果服务器不关闭的话,它会一直存在于系统中,这样很占用资源。而request则不同,它只是作为表单中的一个变量,在一次转发过程中有效,在再次转发或者重定向时,request对象会被释放,这样有利于节省系统的资源。
虽然session有它的缺点,但是在一些需要长期保存数据的场合,session的优越性还是明显可见的。比如我们有多个表单之间传递数据时,这时我们就需要使用session而不是request。
在我刚刚完成的一个Demo中,我发现在html中使用checkbox时,在页面重新进行访问时,如果我们不选择对象的话,session会取得上次的变量值,也就是说Struts中并不会像处理textbox一样每次访问重新取得input输入域中的值。如果checkbox没有把选中时,它存在于session中的值不会被重写清空。
我们如何解决这个问题呢?那就是在首次调用Action时来清空ActionForm中的值,这样就能够避免checkbox在没有被选择时还可以保存上次的值,还是简单看一下代码吧:
public class StepActionForm extends ActionForm {
private String username;
private String[] productId;
private String address;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String[] getProductId() {
return productId;
}
public void setProductId(String[] productId) {
this.productId = productId;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public void resetForm(){
this.username=null;
this.address=null;
this.productId=null;
}
}
public class StartAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
StepActionForm saf=(StepActionForm)form;
saf.resetForm();
return mapping.findForward("success");
}
}
<body>
<form action="end.do" method="post">
用户信息:${StepActionForm.username }
产品信息:
<c:forEach var="p" items="${StepActionForm.productId}" varStatus="vs">
产品:${p }
<c:if test="${vs.count!=fn:length(StepActionForm.productId)}">
,
</c:if>
</c:forEach>
地址信息:${StepActionForm.address}
<input type="submit" value="完成"/>
</form>
</body>