环境: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
<s:radio list="#{0:'保密',1:'男',2:'女'}" value = "2" name= "sex"
key = "login.register.sex"></s:radio>
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呢?查了各种资料都解决不了,其实还是细节问题,我把别人的代码拷来执行就没有问题,怎么运行这个就有问题了,仔细检查下来,发现有一个全角的冒号在里面...
另外如果下面这样使用标签,也会出现这样的错误:
<s:radio list="sexList" listKey="key" value = "usex" listValue="value" name="usex"
key = "login.register.sex"></s:radio>
那是因为没有走action(validator没有通过,返回界面),或者走了action却没有对这个集合进行初期化,直接解决的方法是初期
化list的工作放到prepare拦截器中,因为prepare是在validate拦截器之前执行,即实现prepareble接口。
public class LoginRegister extends ActionSupport implements Preparable {
...
@Override
public void prepare() throws Exception {
List<LoginRegisterSexDto> sexList = new ArrayList<LoginRegisterSexDto>();
...
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中的正规表达式没有起作用,如下:
<field-validator type = "regex" short-circuit="true">
<param name = "expression"><![CDATA[(\w{6,20})]]></param>
<message>${getText("name.rule")}</message>
</field-validator>
整个
LoginRegister-validation.xml文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name = "uname">
<field-validator type = "requiredstring" short-circuit="true">
<message key = "name.required"></message>
</field-validator>
<field-validator type = "regex" short-circuit="true">
<param name = "expression"><![CDATA[(\w{6,20})]]></param>
<message>${getText("name.rule")}</message>
</field-validator>
</field>
<field name = "upassword">
<field-validator type = "requiredstring" short-circuit="true">
<message>${getText("password.required")}</message>
</field-validator>
<field-validator type = "regex" short-circuit="true">
<param name = "expression"><![CDATA[(\w{6,20})]]></param>
<message>${getText("password.rule")}</message>
</field-validator>
</field>
<field name = "repassword">
<field-validator type = "requiredstring" short-circuit="true">
<message>${getText("repassword.required")}</message>
</field-validator>
<field-validator type = "regex" short-circuit="true">
<param name = "expression"><![CDATA[(\w{6,20})]]></param>
<param name = "min">6</param>
<param name = "max">20</param>
<message>${getText("repassword.rule")}</message>
</field-validator>
<field-validator type = "fieldexpression" short-circuit="true">
<param name = "expression"><![CDATA[repassword==upassword]]></param>
<message>${getText("repassword.equal")}</message>
</field-validator>
</field>
<field name = "uage">
<field-validator type = "int">
<param name = "min">0</param>
<param name = "max">120</param>
<message>${getText("age.rule")}</message>
</field-validator>
</field>
<field name = "uemail">
<field-validator type = "email">
<message>${getText("email.rule")}</message>
</field-validator>
</field>
<field name = "uphone">
<field-validator type = "regex">
<param name = "expression"><![CDATA[^1{358}\d(9)$]]></param>
<message key ="phone.rule"></message>
</field-validator>
</field>
</validators>
资源文件: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位
参考资料:
http://80eye.diandian.com/post/2010-05-25/17206015
http://bbs.csdn.net/topics/110118066
http://www.blogjava.net/landor2004/archive/2009/04/11/265016.html
http://blog.csdn.net/greencacti/article/details/7170086
http://wenku.baidu.com/view/e65397acd1f34693daef3ec6.html
讨论帖:
http://www.oschina.net/question/1050450_113121
感谢热心的前辈!!本文如有不正,请指出。
以上。