【问题标题】:Handling JsonResponse in clientSide view technology of SpringMVCSpringMVC的clientSide视图技术中处理JsonResponse
【发布时间】:2014-08-24 18:35:40
【问题描述】:

我正在尝试在 Spring MVC 中实现以下场景。但我遇到了问题,无法决定正确的方法。 我正在使用 jsonRequest/jsonResone(Restful Webservices)

1.我有一个 SignUP.jsp 表单,其中包含一些需要提交给控制器的字段。

 <form method="POST" onsubmit="javascript:signupObj.signup()">
<table>
<tr>
<td>Username : </td>
<td><input  id="username"/></td>
</tr>
<tr>
<td>Password :</td>
<td><input id="password"/></td>

</tr>
<tr>
<td>
<button type="submit">Submit</button>
</td>
</tr>
</table>



</form>

2.onSubmit表单会调用下面提到的注册javascript函数

var signupObj  = {
showSignup : function() {
    //There are Two Ways to Declare Function The Other Way is function showSignup().Checkout the reasons
        $.ajax({
            type: "GET",
            url: "showSignup",
            success: function(response) {
                $("#signupView").html( response );
            }
        });
},
 signup : function() {   
     alert("In Signup function");
     var input = '{';
        input += '"username":"'+$('#username').val()+'",';
        input += '"password":"'+$('#password').val()+'"';
        input += '}';
        alert(input);

     $.ajax({
         type: "POST",
         url : "signup",
         contentType: "application/json; charset=utf-8",
         data: input,
         dataFilter: function (response) {
                return response;
            }, 
        // crossDomain: true,
         async:false,
             success: (function(data) {
                 alert("In ajax Sucess");
                 alert(data.profileID);
                 signupObj.redirectview("success",data);
             }),
                error : function(data,textStatus,error){
                    alert("In ajax Failure");
                     alert(error);
                     signupObj.redirectview("failure",data);
                },
             dataType: "json"
     });
     alert("ajax finished");
 },
 redirectview : function(message,data) {
     alert("inside redirect view");
     if(message == "success"){
         url = "success";
     }
     else{
            url = "error";
         }
      $.ajax({
          type: "POST",
          url : "success",
          contentType: "application/json; charset=utf-8",
          data: data,
          async:false,
          dataType: "json",
         dataFilter: function (response) {
            return response;
        }, 
         // crossDomain: true,
          success: (function(data) {
              alert("data");

          }),
            error : function(data,textStatus,error){
                alert("In ajax Failure redirect");
                 alert(error);
            },

}); }

};

3.上面的javascript函数对控制器进行ajax调用(输入为jsonRequest)

    @RequestMapping(value="/signup",method=RequestMethod.POST)
      @ResponseBody
        public ProfileDTO signup(@RequestBody LoginDTO loginDTO) {
          ProfileDTO profileDto = new ProfileDTO();
//In case no errors in backend logic
          profileDto.setError(null);
          profileDto.setProfileID("profileID");
          profileDto.setProfileName("profileName");
          System.out.println("Submitting SignUP Form Will Return ProfileID");
            return profileDto;

        }
//Below method is for success view
    @RequestMapping(value="/success",method=RequestMethod.POST)
    @ResponseBody
    public String checkSignup(@RequestBody ProfileDTO profileDto,HttpServletRequest httprequest,HttpServletResponse httpResponse
            ) {
        //model.addAttribute(loginDTO);
    System.out.println("In loginSuccess");
        return "loginSucess";
    }

4.Controller给出profileDTO的JSON Response。现在基于 profileDTO.getErrors 我必须调用 loginSuccess.jsp 或 loginFailure.jsp

现在我的问题是:

1) 如何在 ajax 调用中使用 jsonResponse 重定向到 loginSuccess.jsp 或 loginFailure.jsp,以及如何将我的 profileDTO 数据传递到 loginSuccess 视图。

2.)请建议我应该遵循的最佳实践。

【问题讨论】:

    标签: java javascript ajax json spring-mvc


    【解决方案1】:

    1.) 首先你可以像下面这样在javascript中reduce your code,直接serialize表单对象。

    var signupObj  = {
    
     signup : function() {   
         alert("In Signup function");
            $.ajax({
             type: "POST",
             url : "signup",
             data: $('#myForm').serialize(),// add "myForm" as the form id 
             async:false,
                 success: (function(data) {
                     alert("data"+data);
                     redirectView("success",data);
    
                 })
                 error : function(data, textStatus, errorThrown) {
                        alert(error_occured);
                        redirectView("error",data);
                    }
         });
     }
    
     };
    
    
     <script
     function redirectView(message,data){
    
     var url = "";
     if(message == "success"){
        url = "/success";
     }else{
        url = "/error";
     }
    
         $.ajax({
                        type: "POST",
                        url : url,
                        data: data 
                        async:false,
                        success: (function(data) {
                            alert("data"+data);
    
                        })
                        error : function(data, textStatus, errorThrown) {
                            alert(error_occured);
                        }
         });
     }
     </script>
    

    2.) 从控制器本身重定向 successfailure 视图。

    3.) 将我的 profileDTO 数据传递给 loginSuccess 视图。

    Spring MVC,从版本 3 开始,允许您使用控制器中的 @ResponseBody 注释直接返回转换为 JSON 的对象,如下所示

     @RequestMapping(value="/signup",method=RequestMethod.POST)
              @ResponseBody
                public ProfileDTO signup(@ModelAttribute("LoginDTO") LoginDTO loginDTO,BindingResult bindingResult) {
                  ProfileDTO profileDto = new ProfileDTO();
        //In case no errors in backend logic
                  profileDto.setError(null);
                  profileDto.setProfileID("profileID");
                  profileDto.setProfileName("profileName");
                  System.out.println("Submitting SignUP Form Will Return ProfileID");
    
                 return profileDto;
    
    
                }
    

    如果从控制器转发

    使用prefix of forward,,Spring 将获得指定路径的RequestDispatcher 并转发给它。该过程的一部分将包括从为该请求处理周期创建的ModelAndView 中获取模型,并将其所有属性放入HttpServletRequest 属性中。

    Servlet 容器将采用 RequestDispatcher#forward(..) 并再次使用您的 DispatcherServlet 来处理它。您的DispatcherServlet 将创建一个新的ModelAndView,并为此处理周期提供一个新模型。因此,此模型不包含之前的任何属性,但 HttpServletRequest 属性包含。

    在你的情况下,这个

    modelMap.put("key", "value");
    

    最终会进入

    HttpServletRequest request = ...;
    request.getAttribute("key");
    

    【讨论】:

    • 对于第二个 ajax 调用(即重定向视图)它进入错误函数。并且对于第一个 ajax 调用(即注册)是成功的。
    • 现在问题出在第二个ajax调用它不能调用控制器的/success。
    • @user3745727 的意思是说url : "success", 正在被调用,但它没有到达您的控制器。
    • 是成功的 ajax 调用它的 goig 到错误函数
    • 你看到url了吗,是正常还是url有问题,错误请求要么是url没有映射,要么是发送数据本身出现问题。
    猜你喜欢
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多