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; // 结果
/**
public boolean isResult() {
return result;
}
public void setResult(boolean result) {
this.result = result;
}
public List getTbScoreList() {
return tbScoreList;
}
/**
}
[/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序列化/反序列化工具,我们组就开发了一套。挺好用的,在前后台做数据转换很方便。