环境:eclipse-jee-galileo-SR2-win32+apache-tomcat-6.0.18+struts-2.3.14
最近学习struts2框架,就在此随笔谢谢,如有不足,请各位赐教。
1.工程出现下面错误:
2013-6-2 20:28:15 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: No configuration found for the specified action: 'loginRegister' in namespace: '/'. Form action defaulting to 'action' attribute's literal value.首先检查jsp中form标签里action和struts.xml里配置的action名是否相同。如果名相同的话,确认是否在相应的namespace下。如果不在同一个域名下,就在form标签里加上namespace="/xx"(xx对应struts.xml里定义的namespace值),如未指定,struts2会默认从根命名空间"/" 搜索action。
需要注意的一点是出现这样的问题,有可能是因为你在<s:form>标签里配置action时添加了.action,在<s:form>中,这个.action不需要由我们手工添加,struts2会自动为你完成这个工作,在jsp页面查看源码可以看到。
2.<s:reset>标签在出现error回显时,失效。
<s:reset>标签的含义是将<s:form>表单中的值设置成初始值,而不是单纯的清空。这一点要注意,也是出现这个问题的根本所在,在出现error后,跳回输入界面,<s:form>里的各个标签里面都是有值的,所以你<s:reset>不能设置他们为空,如果不走action,只能手动在<s:reset>标签上写js解决了。
3.使用<s:radio>标签出现下面error
org.apache.jasper.JasperException: tag 'radio', field 'list', name 'usex': The requested list key '#{0:'保密',1:'男',2:'女'}' could not be resolved as a collection/array/map/enumeration/iterator type. Example: people or people.{name} - [unknown location]
这个问题纠结了很长时间,这样写jsp不需要冲后台得到集合,怎么还会报出这个message呢?查了各种资料都解决不了,其实还是细节问题,我把别人的代码拷来执行就没有问题,怎么运行这个就有问题了,仔细检查下来,发现有一个全角的冒号在里面...
另外如果下面这样使用标签,也会出现这样的错误:
那是因为没有走action(validator没有通过,返回界面),或者走了action却没有对这个集合进行初期化,直接解决的方法是初期 化list的工作放到prepare拦截器中,因为prepare是在validate拦截器之前执行,即实现prepareble接口。
public class LoginRegister extends ActionSupport implements Preparable {...@Overridepublic void prepare() throws Exception { ListsexList = new ArrayList (); ... ActionContext.getContext().put("sexList", sexList);}
需要说明的是标签里的属性listKey,listValue是dto里的两个属性,list属性对应的是这个dto的集合。如果想回显选中的值,只需将value属性的值设置成与name值一样就可以了,但是这样在画面初期化的时候就不会有值了,如果想在初期化选中某个值的话,只需要将value属性的的值设置成对应的值就行了(value="3"),但这样又不能回显被选中的值了,如何两者兼顾了...
4.在struts2进行自定义的类型转换时,将string装换成int类型会出现下面的错误:
警告: Error setting expression 'uage' with value '[Ljava.lang.String;@4fe91e' ognl.MethodFailedException: Method "setUage" failed for object action.LoginRegister@87e704 [java.lang.NoSuchMethodException: action.LoginRegister.setUage([Ljava.lang.String;)]
如果将int换成Integer就没有问题了,不知是什么原因造成这样的问题。
5.另外还遇到一些,还没有解决,路过的大神可要帮帮呀...
跑validator的时候,出现下面的问题:
5.1出现下面的警告。
2013-6-2 21:26:02 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn 警告: Got result of null when trying to get Boolean.5.2LoginRegister-validation.xml中的正规表达式没有起作用,如下:
整个 LoginRegister-validation.xml文件如下:${getText("name.rule")}
${getText("name.rule")} ${getText("password.required")} ${getText("password.rule")} ${getText("repassword.required")} 6 20 ${getText("repassword.rule")} ${getText("repassword.equal")} 0 120 ${getText("age.rule")} ${getText("email.rule")}
资源文件:messageResource_zh_CN.properties
age.rule=年龄必须在${min}至${max}之间birth.rule=出生日期必须在1900-01-01至2012-01-01之间email.rule=请输入有效的电子邮箱格式password.required=必须输入密码password.rule=密码长度必须在6至20之间repassword.required=必须输入确认密码repassword.equal=密码与确认密码必须一致repassword.rule=确认密码格式必须在6至20之间name.required=必须输入用户名name.rule=用户名的长度必须在6至20之间phone.rule=电话号码为13位
参考资料:
讨论帖:
感谢热心的前辈!!本文如有不正,请指出。
以上。