login.jsp<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/struts-tags" prefix="s" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>用户登录</title>
  </head>
  <body>
    <form action="Login.action" method="post">
      <table align="center" border="1">
        <caption><h3>局部类型转换器</h3></caption>
<tr>
  <td>请输入用户名,密码,以英文逗号隔开</td>
</tr>
   <tr>
     <td>请输入用户信息:<input type="text" name="user" /></td>
   </tr>
   <tr>
     <td><input type="submit" value="提交"/></td>
   </tr>
      </table>
    </form>
  </body>
</html>
welcome.jsp<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/struts-tags" prefix="s" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>转换成功</title>
</head>
<body>
<p>用户名为:<s:property value="user.name" /></p>
<p>密码为:<s:property value="user.password"</p>
</body>
<html>
User.javapackage lee;public class User { private String name;
private String password; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}}
UserConverter.javapackage lee;import java.util.Map;
import ognl.DefaultTypeConverter;public class UserConverter extends DefaultTypeConverter { public Object convertValue(Map context, Object value, Class toType) { if(toType == User.class) {

String[] params = (String[])value;
User user = new User();
String[] userValues = params[0].split(",");
user.setName(userValues[0]);
user.setPassword(userValues[1]); return user;
}
else if(toType == String.class) {

User user = (User)value;
return "<" + user.getName() + "," + user.getPassword() + ">"; 
}
return null;
}
}
LoginAction.javapackage lee;import com.opensymphony.xwork2.Action;public class LoginAction implements Action {

private User user;
private String tip; public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public String getTip() {
return tip;
} public void setTip(String tip) {
this.tip = tip;
} public String execute() throws Exception {

if(getUser().getName().equals("scott") && getUser().getPassword().equals("tiger")) {
setTip("转换成功!");
return SUCCESS;
}
else {
setTip("转换失败!");
return ERROR;
}
}
}
LoginAction-conversion.properties
user=lee.UserConvertersturts.xml<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="lee" extends="struts-default">
<action name="Login" class="lee.LoginAction">
<result name="success">/welcome.jsp</result>
</action>
</package></struts>struts2.1.6下测试,用到的相关jar包:
commons-fileupload-1.2.1.jar
commons-io-1.3.2.jar
commons-logging-1.0.4.jar
ognl-2.6.11.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar部署到tomcat6.0.18后,运行即报错:
2009-5-26 10:32:16 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: Error setting value
ognl.MethodFailedException: Method "setUser" failed for object lee.LoginAction@1226a77 [java.lang.NoSuchMethodException: setUser([Ljava.lang.String;)]
...
        ...
        ...
/-- Encapsulated exception ------------\
java.lang.NoSuchMethodException: setUser([Ljava.lang.String;)
...
        ...
        ...
同样的源码,在struts2.0.6下,即jar包用struts2-core-2.0.6.jar就可以正常运行,这是为什么呢?求教,2.1.6版本的在类型转换这一块有什么变化吗?

解决方案 »

  1.   

    好像你的Action 没有跟 ModelDriven关连起来!
      

  2.   

    你的程序在我的MyEclipse里跑起来没什么问题
    不过有几个出错的地方我改了
    web.xml不知你配置没有  应该在web-app标签内部加入    
    <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>struts.xml中加上
    <result name="error">/login.jsp</result>welcome.jsp中的这句话缺少后面的尖括号:
    <p>密码为:<s:property value="user.password"</p>LoginAction-convertion.properties要和LoginAction放在一个包里struts要放在WEB-INF/lib中jar包我用得比你多,不知道和这有没有关。我用的有
    commons-fileupload
    commons-io
    commons-loging-1.0.4
    commons-loging-1.1
    freeer-2.3.13
    junit-3.8.1
    ognl-2.6.11
    spring-core-2.0.8
    spring-test-2.5.6
    struts2-core-2.1.6
    xword-2.1.2