关于Spring和Ajax的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于1.(ajaxStart和ajaxSend)和2.(ajaxStop和ajaxComplete)之间有什么区别?、
关于Spring和Ajax的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于1.(ajaxStart和ajaxSend)和2.(ajaxStop和ajaxComplete)之间有什么区别?、ajax – 当Spring框架从3.0.2升级到3.2.0时,Spring JSON会导致问题、Ajax 响应中文乱码 [SpringMVC 使用 @ResponseBody 处理 Ajax 请求]、Ajax+SpringMVC+Spring+Mybatis+MySql+js用户注册实例等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- Spring和Ajax
- 1.(ajaxStart和ajaxSend)和2.(ajaxStop和ajaxComplete)之间有什么区别?
- ajax – 当Spring框架从3.0.2升级到3.2.0时,Spring JSON会导致问题
- Ajax 响应中文乱码 [SpringMVC 使用 @ResponseBody 处理 Ajax 请求]
- Ajax+SpringMVC+Spring+Mybatis+MySql+js用户注册实例
Spring和Ajax
我可以将Spring表单标签库与Ajax结合使用吗?我无法在控制器内部检索表单输入参数。它们始终为 null 。
实际上,逻辑上是永远不提交表单。但是然后我只能将字符串发送到控制器,而不能将对象发送到映射到Spring commandBean 的表单提交中。
接受 commandBean的* 表单 *
<form:form method="POST" commandName="clinicBean"> Clinic Name: <form:input path="name" type="text" /><br/> Clinic Address: <form:input path="address" type="text"/><br/> <input type="button" value="Create Clinic" onclick="clinicAjax()"/></form:form>
Ajax函数调用 Spring控制器
function clinicAjax(){ alert(''Inside Clinic Ajax Method''); $.ajax({ url: ''clinicAjax'', type: ''POST'', success: alert(''Ajax Successful'') });}
Spring Controller方法:
@RequestMapping(value="clinicAjax",method=RequestMethod.POST) public @ResponseBody String createClinic(@ModelAttribute("clinicBean") Clinic clinic){ System.out.println("Ajax call successful"); System.out.println(clinic); System.out.println(clinic.getName()); System.out.println(clinic.getAddress()); return "SUCCESS"; }
在System.out.println()语句中,它始终为 null 。
答案1
小编典典问题在于您没有在任何地方对表格进行序列化,因此不会将其发送到服务器。
将您的JavaScript代码更改为:
function clinicAjax(){ alert(''Inside Clinic Ajax Method''); $.ajax({ url: ''clinicAjax'', data: yourFormElement.serialize(); /* i.e. $(''#formId'').serialize(); */ type: ''POST'', success: alert(''Ajax Successful'') });}
yourFormElement
用代表您的表单的jQuery对象替换,它应该可以工作。
1.(ajaxStart和ajaxSend)和2.(ajaxStop和ajaxComplete)之间有什么区别?
基本上就是这个问题(括号很重要)
答案1
小编典典.ajaxStart()
并且.ajaxStop()
针对
所有 请求 一起使用 ,ajaxStart
在第 一个
同时请求开始时ajaxStop
触发,然后在该同时批处理的 最后一个
完成时触发。
因此,假设您一次发出3个请求,ajaxStart()
在第一个请求开始时ajaxStop()
触发,在最后一个请求返回时(它们不一定按顺序完成)触发。
这些事件 没有 任何参数,因为它们是针对一批请求的:
.ajaxStart( handler() ).ajaxStop( handler() )
.ajaxSend()
并.ajaxComplete()
在
每个请求 发送/完成后触发一次。这就是为什么这些处理程序传递参数而全局/批处理参数不传递的原因:
.ajaxSend( handler(event, XMLHttpRequest, ajaxOptions) ).ajaxComplete( handler(event, XMLHttpRequest, ajaxOptions) )
对于单个文档来源,您需要遵循的是API的Global
Ajax Events部分。
ajax – 当Spring框架从3.0.2升级到3.2.0时,Spring JSON会导致问题
我正在使用Spring框架版本3.0.2和Hibernate(NetBeans 6.9.1)使用Web应用程序.后来我才知道有一个错误导致上传多个文件时出现问题,正如我之前的questions中提到的那样.
我已经完成了努力获得解决方案,但无法成功.因此,我将Spring版本升级到3.2.0.
使用早期版本(3.0.2),AJAX在Jackson 1.9.8(下载版本为page)中运行良好,但是在更高版本(3.2.0)下,一切正常,但AJAX调用在JavaScript代码中的每个地方都发出错误警告.
当在国家选择框中选择其中一个国家/地区时,在一个地方有一个场景,从Spring控制器和DAO一起检索相应的状态列表.在Spring控制器中使用URL映射的方法如下,
@RequestMapping(value="ajax/GetStateList", method=RequestMethod.GET)
public @ResponseBody List<Object[]> getStateSelectBox(HttpServletRequest request)
{
return cityService.getStateSelectBox(request.getParameter("countryId"));
}
在国家/地区选择框中选择国家/地区时,将调用此方法. getStateSelectBox()方法在其中一个DAO类中定义,如下所示,
@Service
@Transactional(readOnly = true, propagation=Propagation.REQUIRES_NEW)
public final class CityDAO implements CityService
{
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
@SuppressWarnings("unchecked")
public List<Object[]> getStateSelectBox(String id)
{
List<Object[]> list = sessionFactory.getCurrentSession()
.createquery("select s.stateId, s.stateName from StateTable s where countryId.countryId=:id order by s.stateId")
.setParameter("id", Long.parseLong(id)).list();
for(Object[]o:list)
{
System.out.println(o[0]+" : "+o[1]);
}
return list;
}
}
foreach循环仅用于演示,它显示所有状态及其对应于AJAX请求提供的countryId的id,但List不返回给JSP.
用于发送此AJAX请求的JavaScript代码会发出错误警报.似乎JSON映射存在一些问题.同样的事情是使用早期版本的Spring框架(3.0.2).我不确定为什么这会导致更高版本的Spring 3.2.0出现问题.我可能会缺少Spring版本3.2.0吗?
如果您需要查看JavaScript代码,那么实现此目的的完整JavaScript代码如下所示.
function getStates(countryId)
{
if(countryId==""||countryId==null||countryId==undefined||isNaN(countryId))
{
var str="<select id='cmbStates' name='cmbStates' onchange='errorMessage(this.value);'><option value=''>Select</option></select>";
$('#stateList').html(str);
alert("Please select an appropriate option.");
return;
}
var div=document.createElement("div");
div.id="temp";
document.body.appendChild(div);
$.ajax({
datatype:"json",
type: "GET",
contentType: "application/json",
url: "/wagafashion/ajax/GetStateList.htm",
data: "countryId=" + countryId+"&t="+new Date().getTime(),
success: function(response)
{
if(typeof response==='object'&&response instanceof Array)
{
var str="<select id='cmbState' name='cmbState' onchange='errorMessage(this.value);'><option value=''>Select</option>";
var l=response.length;
for(var i=0;i<l;i++)
{
str+="<option value='"+response[i][0]+"'>"+$('#temp').text(response[i][1]).html()+"</option>";
}
str+="</select>";
$('#stateList').html(str); // select Box is written to #stateList div
$('#temp').remove();
}
},
error: function(e)
{
alert('Error: ' + e);
}
});
}
可以肯定的是,Jackson库位于类路径上,我在服务器端没有收到任何错误或异常. AJAX请求成功,它通过Spring转到DAO,列表类型为List< Object []>从数据库中检索,但它不是JSON对JSP的响应(可以/应该映射到JavaScript数组).据推测,似乎JSON映射缺少某些东西,但是早期版本的Spring并不是这样.
编辑:
我试图解析List< Object []>在两个框架中,3.0.2和3.2.0等
List<Object[]> list = cityService.getStateSelectBox(request.getParameter("countryId"));
ObjectMapper objectMapper=new ObjectMapper();
try
{
objectMapper.writeValue(new File("E:/Project/SpringHibernet/wagafashionLatest/temp.json"), list);
}
catch (IOException ex){}
temp.json文件包含以下字符串.
[[21,"Gujarat"],[22,"Maharashtra"],[23,"Kerala"],[24,"New Delhi"]]
在这两种情况下(两个框架).因此,在两种情况下,JSON响应似乎都应该相同.
temp.json文件也可以反序列化,如下所示.
try
{
ObjectMapper mapper=new ObjectMapper();
List<Object[]> list = mapper.readValue(new File("E:/Project/SpringHibernet/wagafashionLatest/temp.json"), new TypeReference<List<Object[]>>() {});
for(Object[]o:list)
{
System.out.println(o[0]+" : "+o[1]);
}
}
catch (IOException ex)
{
}
它工作正常,foreach循环迭代List类型List< Object []>.因此,问题可能是由Spring框架本身引起的.还需要什么,我不确定.为什么杰克逊没有映射?
解决方法:
我正在使用Spring 3.1.3并且我发现Jackson映射尝试在响应中创建根对象.这是Jackson2映射器.我没有尝试使用较旧的杰克逊映射器.如果你也升级了杰克逊,你可能会看到同样的问题.
在过去,对象数组将被映射为类似的东西
[{name:'name1',id:4},{name:'name2',id:6}]
现在我发现它们为对象提供了一个自动生成的对象名称,所以它返回了类似的东西
{ objectArray: [{name:'name1',id:4},{name:'name2',id:6}]}
所以你需要引用response.objectArray [0]而不是能够直接引用响应[0]
无论如何,JSON响应很可能在某种程度上改变了格式.您应该查看新响应并查看需要在javascript中进行哪些更改以使其映射新结构.
Ajax 响应中文乱码 [SpringMVC 使用 @ResponseBody 处理 Ajax 请求]
Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到 HTTP response body 里。
有人跟踪 @ResponseBody 的实现类发现其默认的编码是 iso-8859-1,
解决办法,在 spring mvc 的配置文件中手工配置 bean:
<!-- 启动 SpringMVC 的注解功能,完成请求和注解 POJO 的映射 -->
<bean>
<propertyname="messageConverters">
<list>
<bean>
<propertyname="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</list>
</property>
</bean>
这样通过配置 AnnotationMethodHandlerAdapter 类 messageConverters 属性来指定编码。
记住,需要把 bean 部分加入到 <context:component-scan base-package="com.zlscw.mvc" /> 前面,
这样就可以在 jquery 中直接调用而不出现乱码了。
------------------------------------------- 这篇文章说的很到位
近日用 Spring3 的 MVC 写东西,深感其之于 Webwork/Struts2 的便利,但是在通过 @ResponseBody 这个 annotation 输出一个 json 字符串的时候,发现页面上获得的 json 字符串中文字符出现了乱码的现象。通过 firefox 观察返回的字符串,中文部分全部变成了???????的形式,初步判定是返回时,spring 处理 @ResponseBody 使用了错误的编码。
因为我在 web.xml 中已经配置了 Spring 的 CharacterEncodingFilter,并且强制将 request 和 response 的编码都指定为 utf-8,所以出现乱码的原因肯定是在 Spring 内部某处的逻辑了。
把 log4j 中关于 spring 的输出级别调为 debug,通过访问出问题的地址,发现 Spring 在处理 @ResponseBody 这个 annotation 的时候,org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter 使用了 org.springframework.http.converter.StringHttpMessageConverter 进行处理,于是打开了 Spring 的源码,看看这个类究竟做了哪些事情。
不看不要紧,一看吓一跳,里面竟然是这样定义其默认编码的:
1 | publicstaticfinalCharset DEFAULT_CHARSET = Charset.forName("ISO-8859-1"); |
顿时心生 N 种不爽:堂堂 Spring,竟然还在其中用西欧字符集作为其默认编码,坑爹啊!(很多 spring 的类中,涉及编码的已经都是 utf-8 了,比如负责 JSON 视图的 MappingJacksonHttpMessageConverter,就是默认使用 UTF-8)。本来想直接修改 spring 的源码重新打包一个 jar 出来,后来看 spring 的 java doc 发现,其父类 org.springframework.http.converter.AbstractHttpMessageConverter 中的 getDefaultContentType 方法是可以重写的:
By default, this returns the first element of the supportedMediaTypes property, if any. Can be overridden in subclasses.
心想这下就简单了,你的 DEFAULT_CHARSET 不是 final 么?那我自己继承一个出来,按照我的需求定义为 utf-8 不就得了?代码如下:
01 | publicclassUTF8StringHttpMessageConverter extendsStringHttpMessageConverter { |
02 |
03 | privatestaticfinalMediaType utf8 = newMediaType("text", "plain", |
04 | Charset.forName("UTF-8")); |
05 | privatebooleanwriteAcceptCharset = true; |
06 |
07 | @Override |
08 | protectedMediaType getDefaultContentType(String dumy) { |
09 | returnutf8; |
10 | } |
11 |
12 | protectedList<Charset> getAcceptedCharsets() { |
13 | returnArrays.asList(utf8.getCharSet()); |
14 | } |
15 |
16 | protectedvoidwriteInternal(String s, HttpOutputMessage outputMessage) |
17 | throwsIOException { |
18 | if(this.writeAcceptCharset) { |
19 | outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets()); |
20 | } |
21 | Charset charset = utf8.getCharSet(); |
22 | FileCopyUtils.copy(s, newOutputStreamWriter(outputMessage.getBody(), |
23 | charset)); |
24 | } |
25 |
26 | publicbooleanisWriteAcceptCharset() { |
27 | returnwriteAcceptCharset; |
28 | } |
29 |
30 | publicvoidsetWriteAcceptCharset(booleanwriteAcceptCharset) { |
31 | this.writeAcceptCharset = writeAcceptCharset; |
32 | } |
33 |
34 | } |
然后,在 spring 的配置文件中添加如下 bean 声明,用自己写的类替换掉原有的 StringHttpMessageConverter:
1 | <beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> |
2 | <propertyname="messageConverters"> |
3 | <list> |
4 | <beanid="utf8StringHttpMessageConverter"class="xxx.xxx.UTF8StringHttpMessageConverter"/> |
5 | </list> |
6 | </property> |
7 | </bean> |
再看通过 @ResponseBody 返回的 json 字符串,终于中文都可以正常显示了。
------------------------------------------- 下面有一些解释
但我们一般会在标注 @ResponseBody 的方法上返回 String 或 byte [] 类型的结果,期望的 "Content-Type" 的值应为 "text/plain" 或 "application/octet-stream"。
这样导致了浏览器不能正确处理返回的内容。
实际上 Spring 在用 HttpMessageConverter 处理的过程中首先会判断 response header 中有没有写入 "Content-Type",如果没有写入的话才会使用 request header 中 "Accept" 的第一个值。
但是由于 Spring 对 HttpServletResponse 进行了封装,实际上使用的是 ServletServerHttpResponse,这个类有一个对真正的 HttpServletResponse 的引用。
判断 response header 的过程中使用的是 ServletServerHttpResponse 的 getHeaders () 方法,但该方法并没有返回真正的 HttpServletResponse 中的 header。(这应该有问题吧?)
所以我们虽然可以在 Controller 的方法中加入对 HttpServletResponse 的引用,然后设置 "Content-Type" 的值,但是并不会起作用。
来处理 @ResponseBody,该类再使用一些 HttpMessageConverter 来具体处理信息。
Chrome 生成的值为 application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,**
所以最后写入 response 中 "Content-Type" 的值为 "application/xml" 或 "application/x-ms-application"。
------------------------------------------------- 其实这个注解完全可以不用,直接使用 response 往输出流里面写。
使用 jQuery ajax 调用的返回 json,中文乱码问题
Jquery :
$.ajax({
url: ''/test/testAction.do?method=test'',
type: ''POST'',
dataType: ''json'',
timeout: 5000,
async: false,
error: function(){
alert ('' 获取数据失败!'');
},
success: function(json){
jsObject= eval_r(json);
}
});
return jsObject;
JSONArray json = JSONArray.fromObject (SysList);//SysList 是一个 List
// 设置 response 的 ContentType 解决中文乱码
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print(json.toString());
return null;
Ajax+SpringMVC+Spring+Mybatis+MySql+js用户注册实例
总结
以上是小编为你收集整理的Ajax+SpringMVC+Spring+Mybatis+MySql+js用户注册实例全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
今天关于Spring和Ajax的分享就到这里,希望大家有所收获,若想了解更多关于1.(ajaxStart和ajaxSend)和2.(ajaxStop和ajaxComplete)之间有什么区别?、ajax – 当Spring框架从3.0.2升级到3.2.0时,Spring JSON会导致问题、Ajax 响应中文乱码 [SpringMVC 使用 @ResponseBody 处理 Ajax 请求]、Ajax+SpringMVC+Spring+Mybatis+MySql+js用户注册实例等相关知识,可以在本站进行查询。
本文标签: