帮忙解决struts2初学者遇到的一个问题

        我是一个初学者,正在学Struts2,再练习课后的一个题目时遇到了一个问题,自己调试也没调出来,所以向请大家帮个忙。     
        题意如下:
            设计页面,输入学生信息:学号、性别、出生年月、专业、总学分等,采用不同的验证方法,确保满足以下条件:
          (1)学号前两位大于“09”,并且后面四位必须是数字;
          (2)出生年月必须保证年龄大于等于18岁;
          (3)专业不能为空;
          (4)总学分在0-80分之间。
     我所用的书里用了两种校验方法:一种是在Action类中进行校验;另一种是用struts2的框架进行校验。我用第一种校验成功了,但第二种校验出错了。

   对于第二种校验方法,校验学号前两位大于“09”,我的想法是:将页面返回的String类型的学号“id”,转化为一个拥有“firstTwo”和“lastFour”属性的类,然后在struts2的校验框架里使用

<field name="user.id">
     
<field-validator type="fieldexpression">
          
<param name="expression">
            
<![CDATA[(id.firstTwo>9)]]>
          
</param> 
          
<message>学号前两位必须大于09</message>
       
</field-validator>
</field>
进行校验。
      但运行项目时会报这样的错误:

   警告: Error setting expression 'user.id' with value '[Ljava.lang.String;@c19fbf'
ognl.MethodFailedException: Method "setId" failed for object org.model.User@11402c4 [java.lang.NoSuchMethodException: org.model.User.setId([Ljava.lang.String;)]


  第一个界面如下:

      
       望高手给调试一下,说明错误的原因,小弟不胜感激!


整个小项目的源代码如下:


 首先是web.xml的配置:
<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">  
   
<display-name>struts</display-name>  
    
<filter>  
        
<filter-name>struts2</filter-name>  
        
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
        
    
</filter>  
    
<filter-mapping>  
        
<filter-name>struts2</filter-name>  
        
<url-pattern>/*</url-pattern>  
    </filter-mapping>  
    <welcome-file-list>  
        <welcome-file>login.jsp</welcome-file>  
    </welcome-file-list>  
</web-app>  

其次是struts.xml的配置:
   
<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE struts PUBLIC 
   
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
   
"http://struts.apache.org/dtds/struts-2.3.dtd"> 
<struts> 
 
  
 
   
<package name="default" extends="struts-default"> 
      
       
<action name="accept" class="org.action.LoginAction"> 
           
<result name="success">/welcome.jsp</result> 
           
<result name="error">/login.jsp</result>
       
</action> 
   
</package> 
</struts>

接着是Action类:此类在src中的org.action包中
package org.action;
import org.model.User;

//import java.util.Calendar;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction extends ActionSupport{
       
private User user;
       
public User getUser() {
           
return user;
        }

       
       
public void setUser(User user) {
           
this.user = user;
        }

       
public String execute(){
           
           
if(hasErrors()){
               
return "input";
            }

           
           
return "success";
        }
  
上一个类中的User类,此类在org.model包中

 
package org.model;
import java.util.Date;

   

    
public class User{
       
private Id id;
       
private String sex;
       
private String name;
       
private Date bir;
       
private String profession;
       
private int score;
       
public Id getId() {
           
return id;
        }

       
public void setId(Id id) {
           
this.id = id;
           
        }

       
public String getSex() {
           
return sex;
        }

       
public void setSex(String sex) {
           
this.sex = sex;
        }

       
public String getName() {
           
return name;
        }

       
public void setName(String name) {
           
this.name = name;
        }

       
public Date getBir() {
           
return bir;
        }

       
public void setBir(Date bir) {
           
this.bir = bir;
        }

       
public String getProfession() {
           
return profession;
        }

       
public void setProfession(String profession) {
           
this.profession = profession;
        }

       
public int getScore() {
           
return score;
        }

       
public void setScore(int core) {
           
this.score = core;
        }

       
       
       
    }

User类中的Id类与如下,与User类在同一个包中:
package org.model;

public class Id{
  
private int firstTwo;
  
private String lastFour;
  
public int getFirstTwo(){
      
return firstTwo;
   }

  
public String getLastFour(){
      
return lastFour;
   }

   
public void setFirstTwo(int firstTwo) {
       
this.firstTwo = firstTwo;
    }

   
public void setLastFour(String lastFour) {
       
this.lastFour = lastFour;
    }

   
}

如下是转换器,它放在org.converter包中:
package org.converter;
import java.util.Map;
import org.model.Id;
import org.apache.struts2.util.StrutsTypeConverter;
public class IdConverter extends StrutsTypeConverter {

   
   
public Object convertFromString(Map arg0, String[] arg1, Class arg2) {
        Id id
= new Id();
        String s
= String.valueOf(arg1);
        id.setFirstTwo(Integer.parseInt(s.substring(
0, 2)));
        id.setLastFour(s.substring(s.length()
-4));
       
return id;
    }


   
   
public String convertToString(Map arg0, Object arg1) {
       
       
return null;
    }

  
}

    
如下是转换器的配置文件,文件名是:LoginAction-conversion.properties  ,文件与Id在一个包下,及org.model包中:
id=org.converter.IdConverter
如下是 struts的校验文件,它与Action类在同一个包中,即org.action包:
<!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="user.id">
    
<field-validator type="fieldexpression">
         
<param name="expression">
           
<![CDATA[(id.firstTwo>9)]]>
         
</param>
         
<message>学号前两位必须大于09</message>
      
</field-validator>
   
</field>


   
<field name="user.profession">
     
<field-validator type="requiredstring">
        
<param name="trim">true</param>
        
<message>专业不能为空!</message>
     
</field-validator>
   
</field>
   
<field name="user.score">
     
<field-validator type="int">
       
<param name="min">0</param>
       
<param name="max">80</param>
       
<message>学分必须在0-80之间</message>
     
</field-validator>
   
</field>

</validators>

posted on 2012-09-11 12:57 清泉.. 阅读(1149) 评论(1)  编辑  收藏

评论

# re: 帮忙解决struts2初学者遇到的一个问题 2012-09-12 18:46 清泉..

调了几天终于知道错误了!原来是这里出了错:
public Object convertFromString(Map arg0, String[] arg1, Classarg2) {
Id id = new Id();

String s = String.valueOf(arg1);
id.setFirstTwo(Integer.parseInt(s.substring(0, 2)));
id.setLastFour(s.substring(s.length()-4));
return id;
}
其中:“String s = String.valueOf(arg1);”,Sring的valueOf(..)方法并不能将字符串数组转换为字符串!!!
刚开始用这个方法,我也犹豫了一下,并没有认真地查API,自己想当然的认为可以,所以就用了。还有一个错误是:转换器的配置文件的位置不对!必须和Action类放在同一个包下,而不是与需要转换的类放在同一个包下!  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2012年9月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

导航

统计

常用链接

留言簿

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜