幫忙解決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>
題意如下:
設計頁面,輸入學生信息:學號、性別、出生年月、專業、總學分等,采用不同的驗證方法,確保滿足以下條件:
(1)學號前兩位大于“09”,并且后面四位必須是數字;
(2)出生年月必須保證年齡大于等于18歲;
(3)專業不能為空;
(4)總學分在0-80分之間。
我所用的書里用了兩種校驗方法:一種是在Action類中進行校驗;另一種是用struts2的框架進行校驗。我用第一種校驗成功了,但第二種校驗出錯了。
對于第二種校驗方法,校驗學號前兩位大于“09”,我的想法是:將頁面返回的String類型的學號“id”,轉化為一個擁有“firstTwo”和“lastFour”屬性的類,然后在struts2的校驗框架里使用









但運行項目時會報這樣的錯誤:
警告: 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的配置:

















其次是struts.xml的配置:

















接著是Action類:此類在src中的org.action包中






















上一個類中的User類,此類在org.model包中

































































































如下是轉換器的配置文件,文件名是:LoginAction-conversion.properties ,文件與Id在一個包下,及org.model包中:




























