Ajax 将空数据发送到控制器
Ajax sends null data into controller
我有一个 liferay portlet 并使用 Spring MVC。我想使用 Ajax 将基本对象发送到控制器中。问题是控制器只接收空对象。
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ page import="graphui.GraphUIConstants" %>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<portlet:resourceURL var="sendPersonURL" id="<%= GraphUIConstants.SEND_PERSON %>" />
<script>
function URL_SEND_PERSON_KEY() { return '${sendPersonURL}'; }
function sendPerson(){
var company = new Object();
company.id = 1;
company.name = "coName";
var person = new Object();
person.name = "James";
person.age = 40;
person.email = "james@james.com";
person.company = company;
var personInJSON = JSON.stringify(person);
AUI().use('aui-io-request', function(A){
A.io.request(URL_SEND_PERSON_KEY(), {
method: 'post',
data: personInJSON,
on: {
success: function() {
alert(this.get('responseData'));
}
}
});
});
}
</script>
<div>
<ul>
<li>${name};</li>
<li>${age};</li>
<li>${email};</li>
</ul>
<button class="btn btn-primary" onclick="sendPerson()"> Send </button>
</div>
Person.java
public class Person {
private String name;
private int age;
private String email;
public Person() {
}
public Person(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Company.java
public class Company {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
GraphUIConstants.java
public class GraphUIConstants {
public static final String SEND_PERSON = "sendPerson";
}
GraphUI-portlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="graphui" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
</bean>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.GsonHttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
<bean class="org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<bean class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<!-- Spring MVC Message Source -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="useCodeAsDefaultMessage" value="true"/>
<property name="basenames">
<list>
<value>content.graph</value>
</list>
</property>
</bean>
</beans>
liferay-portlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.2.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_6_2_0.dtd">
<liferay-portlet-app>
<portlet>
<portlet-name>GraphUI</portlet-name>
<instanceable>true</instanceable>
<requires-namespaced-parameters>false</requires-namespaced-parameters>
<ajaxable>true</ajaxable>
<header-portlet-javascript>/scripts/jquery-1.9.1.js</header-portlet-javascript>
</portlet>
<role-mapper>
<role-name>administrator</role-name>
<role-link>Administrator</role-link>
</role-mapper>
<role-mapper>
<role-name>guest</role-name>
<role-link>Guest</role-link>
</role-mapper>
<role-mapper>
<role-name>power-user</role-name>
<role-link>Power User</role-link>
</role-mapper>
<role-mapper>
<role-name>user</role-name>
<role-link>User</role-link>
</role-mapper>
</liferay-portlet-app>
GraphViewController.java
package graphui;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.portlet.ModelAndView;
import org.springframework.web.portlet.bind.annotation.ActionMapping;
import org.springframework.web.portlet.bind.annotation.RenderMapping;
/**
*
* Controller for VIEW mode of portlet.
*/
@Controller("graphViewController")
@RequestMapping(value = "VIEW")
public class GraphViewController{
private static final String MODEL_KEY_NAME = "name";
private static final String MODEL_KEY_AGE = "age";
private static final String MODEL_KEY_EMAIL = "email";
private Person repository = new Person("pete", 33, "pete@pete.com");
Gson gson = new GsonBuilder().setPrettyPrinting().create();
private static final Logger logger = Logger.getLogger(GraphViewController.class);
@ActionMapping(GraphUIConstants.SUBMIT_FORM)
public void handleActionRequest(ActionRequest request, ActionResponse response)throws Exception {
logger.info("action phase executed");
if (request.getParameter("name") != null)
repository.setName(request.getParameter("name"));
if (request.getParameter("age") != null)
repository.setAge(Integer.parseInt(request.getParameter("age")));
if (request.getParameter("email") != null)
repository.setEmail(request.getParameter("email"));
}
@RenderMapping
public ModelAndView handleRenderRequest(RenderRequest request, RenderResponse response, ModelMap model) {
logger.info("render phase executed");
model.addAttribute(MODEL_KEY_NAME, gson.toJson(repository.getName()));
model.addAttribute(MODEL_KEY_AGE, gson.toJson(repository.getAge()));
model.addAttribute(MODEL_KEY_EMAIL, gson.toJson(repository.getEmail()));
return new ModelAndView("index", model);
}
@ResourceMapping(GraphUIConstants.SEND_PERSON)
public void savePerson(@ModelAttribute("person") Person jsonString, ResourceRequest request, ResourceResponse response) {
logger.info("savePerson method was executed");
String name = jsonString.getName();
String age = Integer.toString(jsonString.getAge());
String email = jsonString.getEmail();
String name2 = request.getParameter(MODEL_KEY_NAME);
String age2 = request.getParameter(MODEL_KEY_AGE);
String email2 = request.getParameter(MODEL_KEY_EMAIL);
String name3 = ParamUtil.getString(request, MODEL_KEY_NAME);
String age3 = ParamUtil.getString(request, MODEL_KEY_AGE);
String email3 = ParamUtil.getString(request, MODEL_KEY_EMAIL);
logger.info("Person name is " + name);
logger.info("Person age is " + age);
logger.info("Person email is " + email);
logger.info("Person name is " + name2);
logger.info("Person age is " + age2);
logger.info("Person email is " + email2);
logger.info("Person name is " + name3);
logger.info("Person age is " + age3);
logger.info("Person email is " + email3);
}
}
当我通过 Ajax 发送 Person 对象时,我在日志中收到此消息:
12:52:18,726 INFO [GraphViewController:65] savePerson method was executed
12:52:18,728 INFO [GraphViewController:79] Person name is null
12:52:18,728 INFO [GraphViewController:80] Person age is 0
12:52:18,729 INFO [GraphViewController:81] Person email is null
12:52:18,729 INFO [GraphViewController:83] Person name is null
12:52:18,729 INFO [GraphViewController:84] Person age is null
12:52:18,729 INFO [GraphViewController:85] Person email is null
12:52:18,730 INFO [GraphViewController:87] Person name is
12:52:18,731 INFO [GraphViewController:88] Person age is
12:52:18,731 INFO [GraphViewController:89] Person email is
AUI().use('aui-io-request', function(A){
A.io.request(URL_SEND_PERSON_KEY(), {
method: 'post',
dataType: 'json',
data: {"<portlet:namespace />person" : JSON.stringify(person)},
contentType: "application/json",
on: {
success: function() {
alert(this.get('responseData'));
}
}
});
});
我有一个 liferay portlet 并使用 Spring MVC。我想使用 Ajax 将基本对象发送到控制器中。问题是控制器只接收空对象。
index.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ page import="graphui.GraphUIConstants" %>
<%@ taglib uri="http://java.sun.com/portlet_2_0" prefix="portlet"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<portlet:resourceURL var="sendPersonURL" id="<%= GraphUIConstants.SEND_PERSON %>" />
<script>
function URL_SEND_PERSON_KEY() { return '${sendPersonURL}'; }
function sendPerson(){
var company = new Object();
company.id = 1;
company.name = "coName";
var person = new Object();
person.name = "James";
person.age = 40;
person.email = "james@james.com";
person.company = company;
var personInJSON = JSON.stringify(person);
AUI().use('aui-io-request', function(A){
A.io.request(URL_SEND_PERSON_KEY(), {
method: 'post',
data: personInJSON,
on: {
success: function() {
alert(this.get('responseData'));
}
}
});
});
}
</script>
<div>
<ul>
<li>${name};</li>
<li>${age};</li>
<li>${email};</li>
</ul>
<button class="btn btn-primary" onclick="sendPerson()"> Send </button>
</div>
Person.java
public class Person {
private String name;
private int age;
private String email;
public Person() {
}
public Person(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
Company.java
public class Company {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
GraphUIConstants.java
public class GraphUIConstants {
public static final String SEND_PERSON = "sendPerson";
}
GraphUI-portlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="graphui" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
</bean>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.json.GsonHttpMessageConverter" />
</mvc:message-converters>
</mvc:annotation-driven>
<bean class="org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<bean class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<!-- Spring MVC Message Source -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="useCodeAsDefaultMessage" value="true"/>
<property name="basenames">
<list>
<value>content.graph</value>
</list>
</property>
</bean>
</beans>
liferay-portlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 6.2.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_6_2_0.dtd">
<liferay-portlet-app>
<portlet>
<portlet-name>GraphUI</portlet-name>
<instanceable>true</instanceable>
<requires-namespaced-parameters>false</requires-namespaced-parameters>
<ajaxable>true</ajaxable>
<header-portlet-javascript>/scripts/jquery-1.9.1.js</header-portlet-javascript>
</portlet>
<role-mapper>
<role-name>administrator</role-name>
<role-link>Administrator</role-link>
</role-mapper>
<role-mapper>
<role-name>guest</role-name>
<role-link>Guest</role-link>
</role-mapper>
<role-mapper>
<role-name>power-user</role-name>
<role-link>Power User</role-link>
</role-mapper>
<role-mapper>
<role-name>user</role-name>
<role-link>User</role-link>
</role-mapper>
</liferay-portlet-app>
GraphViewController.java
package graphui;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.portlet.ModelAndView;
import org.springframework.web.portlet.bind.annotation.ActionMapping;
import org.springframework.web.portlet.bind.annotation.RenderMapping;
/**
*
* Controller for VIEW mode of portlet.
*/
@Controller("graphViewController")
@RequestMapping(value = "VIEW")
public class GraphViewController{
private static final String MODEL_KEY_NAME = "name";
private static final String MODEL_KEY_AGE = "age";
private static final String MODEL_KEY_EMAIL = "email";
private Person repository = new Person("pete", 33, "pete@pete.com");
Gson gson = new GsonBuilder().setPrettyPrinting().create();
private static final Logger logger = Logger.getLogger(GraphViewController.class);
@ActionMapping(GraphUIConstants.SUBMIT_FORM)
public void handleActionRequest(ActionRequest request, ActionResponse response)throws Exception {
logger.info("action phase executed");
if (request.getParameter("name") != null)
repository.setName(request.getParameter("name"));
if (request.getParameter("age") != null)
repository.setAge(Integer.parseInt(request.getParameter("age")));
if (request.getParameter("email") != null)
repository.setEmail(request.getParameter("email"));
}
@RenderMapping
public ModelAndView handleRenderRequest(RenderRequest request, RenderResponse response, ModelMap model) {
logger.info("render phase executed");
model.addAttribute(MODEL_KEY_NAME, gson.toJson(repository.getName()));
model.addAttribute(MODEL_KEY_AGE, gson.toJson(repository.getAge()));
model.addAttribute(MODEL_KEY_EMAIL, gson.toJson(repository.getEmail()));
return new ModelAndView("index", model);
}
@ResourceMapping(GraphUIConstants.SEND_PERSON)
public void savePerson(@ModelAttribute("person") Person jsonString, ResourceRequest request, ResourceResponse response) {
logger.info("savePerson method was executed");
String name = jsonString.getName();
String age = Integer.toString(jsonString.getAge());
String email = jsonString.getEmail();
String name2 = request.getParameter(MODEL_KEY_NAME);
String age2 = request.getParameter(MODEL_KEY_AGE);
String email2 = request.getParameter(MODEL_KEY_EMAIL);
String name3 = ParamUtil.getString(request, MODEL_KEY_NAME);
String age3 = ParamUtil.getString(request, MODEL_KEY_AGE);
String email3 = ParamUtil.getString(request, MODEL_KEY_EMAIL);
logger.info("Person name is " + name);
logger.info("Person age is " + age);
logger.info("Person email is " + email);
logger.info("Person name is " + name2);
logger.info("Person age is " + age2);
logger.info("Person email is " + email2);
logger.info("Person name is " + name3);
logger.info("Person age is " + age3);
logger.info("Person email is " + email3);
}
}
当我通过 Ajax 发送 Person 对象时,我在日志中收到此消息:
12:52:18,726 INFO [GraphViewController:65] savePerson method was executed
12:52:18,728 INFO [GraphViewController:79] Person name is null
12:52:18,728 INFO [GraphViewController:80] Person age is 0
12:52:18,729 INFO [GraphViewController:81] Person email is null
12:52:18,729 INFO [GraphViewController:83] Person name is null
12:52:18,729 INFO [GraphViewController:84] Person age is null
12:52:18,729 INFO [GraphViewController:85] Person email is null
12:52:18,730 INFO [GraphViewController:87] Person name is
12:52:18,731 INFO [GraphViewController:88] Person age is
12:52:18,731 INFO [GraphViewController:89] Person email is
AUI().use('aui-io-request', function(A){
A.io.request(URL_SEND_PERSON_KEY(), {
method: 'post',
dataType: 'json',
data: {"<portlet:namespace />person" : JSON.stringify(person)},
contentType: "application/json",
on: {
success: function() {
alert(this.get('responseData'));
}
}
});
});