2013-08-08 4 views
1

Spring MVC를 처음 사용합니다. SimpleController와 함께 Spring MVC를 사용하는 기존 시스템이 있습니다. 버튼을 제출하면 아약스 호출이 발생하며 컨트롤러는 ajax 호출을 호출하고 modelview 객체를 반환합니다.AJAX를 사용하는 Spring MVC

이 시나리오에서는 질문이 있습니다. 이 modelview 객체는 view, jsp 페이지를 반환하고 Ajax 호출 성공시 다른 URL로 리디렉션되는 windows.href.location을 호출합니다. 누군가이 두 사람 중 어떤 사람이 부름을받을 수 있도록 도와 줄 수 있습니까?

뷰의 jsp가 렌더링되고 성공 함수에서 지정된 URL로 다시 리디렉션됩니까? 제발 도와주세요.

답변

2

@ControllerView 또는보기 이름을 반환합니다. DispatcherServlet은 을 렌더링하기 위해 View을 사용합니다. 렌더링 된 jsp을 HTTP 응답 본문에 씁니다. 이것이 AJAX 호출이받는 것입니다. 나는 가정 같은 방법 그래서 당신은

$.ajax({ 
    type: "POST", 
    url: someUrl, 
    data: someData, 
    success: function(data){ 
     windows.href.location = someNewLocation; 
    }, 
    error: function(X) { 
    }  
}); 

성공 콜백에서 data 변수는 HTTP 응답 본문에 포함 년대 렌더링 jsp에서 모든 HTML이 포함되어 있습니다. 위와 같은 방법에서는 data으로 아무 것도하지 않지만 모두 다운로드했습니다. windows.href.location을 다시 지정하여 페이지의 위치를 ​​변경하기 만하면됩니다. 따라서 볼 수있는 것은 jsp이 아니고 someNewLocation이 가리키는 웹 페이지입니다.

0

일반적으로 우리는 렌더링 된 페이지 (예 : JSP)를 반환하는 아약스 호출을 원하지 않습니다. 따라야 할 것이 있습니다. RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1 다음은 내가 작업중인 프로젝트의 컨트롤러입니다.

@Controller 
public class MilestoneController extends BaseRESTController { 

    protected static final String ACCEPT_JSON = "Accept=application/json"; 

    @Resource private GuidelineService _guidelineService; 


    @RequestMapping(value="/guideline/{id}/milestones", method= RequestMethod.GET, headers=ACCEPT_JSON) 
    public @ResponseBody List<Milestone> getMilestones(@PathVariable("id") Long guidelineId) { 
     return _guidelineService.getGuideline(guidelineId).getMilestones(); 
    } 


    @RequestMapping(value="/guideline/{id}/milestones/new", method= RequestMethod.GET, headers=ACCEPT_JSON) 
    public @ResponseBody Milestone addMilestones(@PathVariable("id") Long guidelineId) { 
     return _guidelineService.newMilestone(guidelineId); 
    } 


    @RequestMapping(value="/guideline/{id}/milestones", method={RequestMethod.POST, RequestMethod.PUT}, headers=ACCEPT_JSON) 
    public @ResponseBody ResponseEntity<String> updateUpdateMilestone(@PathVariable("id") Long guidelineId, @RequestBody Milestone milestone) { 
     _guidelineService.updateMilestone(guidelineId, milestone); 
     return new ResponseEntity<String>(HttpStatus.ACCEPTED); 
    } 

} 

@ResponseBody를 사용하여 classpath에 jackson이 있으면 JSON으로 반환 값을 렌더링합니다. @RequestBody는 클라이언트의 POST 및 PUT json을 허용합니다. 내 updateUpdateMilestone() 메서드에서는 값을 반환 할 필요가 없도록 어떻게 202 (HttpStatus.ACCEPTED)를 반환하는지 알 수 있습니다.

는 @Sotirios가

$.ajax({ 
    type: "POST", 
    url: someUrl, 
    data: someData, 
    success: function(data){ 
     windows.href.location = someNewLocation; 
    }, 
    error: function(X) { 
    }  
}); 

당신의 컨트롤러 방법은

@RequestMapping(value="/somePage", method={RequestMethod.POST}, 
headers="Accept=application/json") 
    public @ResponseBody String doStuff(@RequestBody SomeObject obj) { 
     // do stuff here.... 
     return "viewName" 
    } 

@ResponseBody없이 컨트롤 이름으로 뷰를 렌더링하기 위해 노력할 것입니다 무언가 같이 할 필요가 게시 된 것을 사용합니다.

+0

HTTP 응답 본문이 전송 된 것과 관계없이 브라우저는 현재 위치에서 someNewLocation으로 이동합니다. –

+0

많은 HTML을 반환하지 않습니다. 즉, 렌더링 된 JSP – denov

+0

당신은 그것을 바꿔 말할 수 있습니까? 컨트롤러가 XML, HTML, JSON 또는 바이너리 데이터를 반환하는지 여부에 관계없이 ajax 함수는 '데이터'의 내용을 무시합니다. 그래서 그 의미에서, 그것은 정말로 중요하지 않습니다. –

관련 문제