GVKun编程网logo

Spring和Ajax

44

关于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

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和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会导致问题

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 请求]

Ajax 响应中文乱码 [SpringMVC 使用 @ResponseBody 处理 Ajax 请求]

Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到 HTTP response body 里。

Spring 使用 AnnotationMethodHandlerAdapter 的 handleResponseBody 方法,AnnotationMethodHandlerAdapter 使用 request header 中 "Accept" 的值和 messageConverter 支持的 MediaType 进行匹配,然后会用 "Accept" 的第一个值写入 response 的 "Content-Type"。
一般的请求都是通过浏览器进行的,request header 中 "Accept" 的值由浏览器生成。

有人跟踪 @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用户注册实例

总结

以上是小编为你收集整理的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用户注册实例等相关知识,可以在本站进行查询。

本文标签: