请问怎么把javascript中的json对象传到action的list啊?

 
javascript中:var req_updateStudentScore = {"tbScoreList": [ 
                                               {"tbScoreId": "100000"}]
        };
         
          $.post(url_updateStudentScore,req_updateStudentScore,function(data){
                 alert(data.result);
             });

action中:    public  List<TbScore> tbScoreList;

 

直接这样搞会报错

StaticParametersInterceptor - Setting static parameters {}
ParametersInterceptor - Setting params NONE
ParametersInterceptor - Setting params tbScoreList[0][tbScoreId] => [ 100000 ]
InstantiatingNullHandler - Entering nullPropertyValue [target=[com.sm.yyb.action.CourseAction@1f58b1d, com.opensymphony.xwork2.DefaultTextProvider@5de7f6], property=tbScoreList]
XWorkConverter - Property: CreateIfNull_tbScoreList
XWorkConverter - Class: com.sm.yyb.action.CourseAction
OgnlValueStack - Error setting expression 'tbScoreList[0][tbScoreId]' with value '[Ljava.lang.String;@efe8b6'
ognl.NoSuchPropertyException: com.sm.yyb.action.CourseAction.tbScoreId
    at ognl.ObjectPropertyAccessor.getProperty(ObjectPropertyAccessor.java:151)
    at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.getProperty(ObjectAccessor.java:17)
    at ognl.OgnlRuntime.getProperty(OgnlRuntime.java:2210)
    at ognl.ASTProperty.getValueBody(ASTProperty.java:114)
    at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
    at ognl.SimpleNode.getValue(SimpleNode.java:258)
    at ognl.ASTProperty.getProperty(ASTProperty.java:106)
    at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
    at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
    at ognl.SimpleNode.setValue(SimpleNode.java:301)
    at ognl.ASTChain.setValueBody(ASTChain.java:227)
    at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
    at ognl.SimpleNode.setValue(SimpleNode.java:301)
    at ognl.Ognl.setValue(Ognl.java:737)
    at com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java:198)
    at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:161)
    at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:149)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.setParameters(ParametersInterceptor.java:276)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:187)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
    at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)
AnnotationValidationInterceptor - Validating /yyb/courseAction_updateStudentScore with method updateStudentScore.
ValidationInterceptor - Invoking validate() on action com.sm.yyb.action.CourseAction@1f58b1d
PrefixMethodInvocationUtil - cannot find method [validateUpdateStudentScore] in action [com.sm.yyb.action.CourseAction@1f58b1d]
PrefixMethodInvocationUtil - cannot find method [validateDoUpdateStudentScore] in action [com.sm.yyb.action.CourseAction@1f58b1d]
DefaultActionInvocation - Executing action method = updateStudentScore
JSONResult - Adding include property expression:  result
JSONWriter - Ignoring property because of include rule:  courseServer
JSONWriter - Ignoring property because of include rule:  scoreServer
JSONWriter - Ignoring property because of include rule:  studentIdString
JSONWriter - Ignoring property because of include rule:  tbCourse
JSONWriter - Ignoring property because of include rule:  tbCourseList
JSONWriter - Ignoring property because of include rule:  tbScoreList
JSONUtil - [JSON]{"result":"更新成功"}
I18nInterceptor - after Locale=zh_CN
I18nInterceptor - intercept }

[quote]java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher] [/quote]

少了ezmorph 1.0.6包

使用json-lib.jar包,以下的包是必须的:
jakarta commons-lang 2.5
jakarta commons-beanutils 1.8.0
jakarta commons-collections 3.2.1
jakarta commons-logging 1.1.1
ezmorph 1.0.6

不能直接滴,只有先以字符串的格式传进去,然后再通过json包转换。

tbScoreList在Action中是什么类型的,是怎么定义的

[quote]action中: public List tbScoreList;[/quote]
不好意思,刚没看到这句

Json-lib可以实现字符串与对象的互转,现在在Java开发中传json数据大多数都用了这个库

网址:[url]http://json-lib.sourceforge.net/[/url]

Json-lib requires (at least) the following dependencies in your classpath:
使用json-lib.jar包,以下的包是必须的:
jakarta commons-lang 2.5
jakarta commons-beanutils 1.8.0
jakarta commons-collections 3.2.1
jakarta commons-logging 1.1.1
ezmorph 1.0.6

使用教程:
[url]http://json-lib.sourceforge.net/usage.html[/url]

下载地址:
[url]http://sourceforge.net/projects/json-lib/files/json-lib/json-lib-2.4/[/url]
根据JDK版本下载相应jar包

接下来是实现代码:
1、js
使用字符串的方式传输数据
[code="javascript"]
$(function() {
$("#testBut").click(function() {
var url = "listAjax.action";
var params = {"tbScoreList": "[{'tbScoreId': '100000'}, {'tbScoreId': '200000'}]"};
$.post(url, params, function(data) {
alert(data.result);
});
});
});
[/code]

2、Bean
[code="java"]
package org.javaweb.entity;

public class TbScore {

private int tbScoreId;

public int getTbScoreId() {
    return tbScoreId;
}

public void setTbScoreId(int tbScoreId) {
    this.tbScoreId = tbScoreId;
}

}

[/code]

2、Action
[code="java"]
package org.javaweb.action;

import java.util.List;

import net.sf.json.JSONArray;

import org.javaweb.entity.TbScore;

import com.opensymphony.xwork2.ActionSupport;

/**

  • @author qiuzj
    *
    */
    public class ListAjaxAction extends ActionSupport {

    private static final long serialVersionUID = 1L;

    private List tbScoreList; // 页面传过来的数据列表

    private boolean result; // 结果

    /**

    • Action
    • @return */ public String listAjax() { for (TbScore score : tbScoreList) { System.out.println(score.getTbScoreId()); } result = true; return SUCCESS; }

    public boolean isResult() {
    return result;
    }

    public void setResult(boolean result) {
    this.result = result;
    }

    public List getTbScoreList() {
    return tbScoreList;
    }

    /**

    • 将页面传过来的字符串转换为List
    • @param tbScoreStr */ public void setTbScoreList(String tbScoreStr) { JSONArray jsonArray = JSONArray.fromObject(tbScoreStr); this.tbScoreList = (List) jsonArray.toCollection(jsonArray, TbScore.class); }

}

[/code]

我使用的是struts2-json-plugin-*.jar插件包

Struts2配置:
[code="xml"]



[/code]

[code="java"]
jsonArray.toCollection(jsonArray, TbScore.class);
[/code]
中的jsonArray.toCollection直接使用静态方法,改为:
[code="java"]
JSONArray.toCollection(jsonArray, TbScore.class);
[/code]

先将json对象转换成字符全,然后再后台获取到字符串,将字符串用json工具转换成java的数据类型,可以自己开发一套json序列化/反序列化工具,我们组就开发了一套。挺好用的,在前后台做数据转换很方便。