2012-05-12 15 views
5

AJAX와 Spring MVC 사용에 관한 문제가 발생했습니다. 필드가 많은 양식이 있고 각 필드는 클릭 한 연관된 ​​단추에 따라 데이터를 검색합니다.Ajax 요청 - 스프링 컨트롤러에서 다른 메소드 호출

내 단추 하나 하나마다 AJAX 요청을 호출해야합니다. 각 응답은 관련 필드에 표시됩니다.

일단 다른 버튼을 클릭하면 스프링 컨트롤러에서 다른 메소드를 호출 할 수 있는지 궁금합니다.

즉, 동일한 컨트롤러에서 각 요청이 다른 메소드를 호출하는 동일한 컨트롤러에 여러 개의 ajax 요청을 만들고 싶습니다. 현재

// when get account detail is clicked it will call this method 
@RequestMapping(method=RequestMethod.POST) 
    public @ResponseBody String getAccountDetails(@RequestParam(value="accountid") String accountid){ 

    return somefunct.getAccountDetails(accountid); 

    } 



// when get account summary is clicked it will call this method 
@RequestMapping(method=RequestMethod.POST) 
    public @ResponseBody String getAccountSummary(@RequestParam(value="accountid") String accountid){ 

     return somefunct.getAccountSummary(accountid); 

    } 



/* when submit button is clicked... Form is submitted for saving*/ 
@RequestMapping(method=RequestMethod.POST) 
    public String submitForm(){ 
     // save here 
     return "myform"; 
    };*/ 

, 나는 단 하나의 AJAX 요청을 할 수 있습니다 :

이 예를 참조하십시오. 다른 AJAX 요청에 대해 다른 기능을 사용할 수 있도록이 코드를 어떻게 수정할 수 있습니까?

답변

8

먼저 서버의 상태를 수정하지 않고 서버에서 데이터를 검색 할 때 일반적으로 인정되는 표준은 POST가 아닌 HTTP GET 메서드를 사용하는 것입니다. 따라서 처음 두 메서드에서는 HTTP 메서드를 잘못 사용하고있는 것입니다.

둘째, RequestMapping 주석의 value 속성을 사용하여 개별 URL 패턴을 특정 메소드에 매핑 할 수 있습니다.

셋째, 계정 세부 정보 자원을 표현하는 가장 편안하고 방법은 PathVariable 주석을 사용하여 실제 경로에 식별 계정 아이디를 포함하는 것입니다 :

@RequestMapping(value="/account/{accountid}/details", method = RequestMethod.GET) 
public @ResponseBody String getAccountDetails(@PathVariable(value="accountid") String accountid){ 

return somefunct.getAccountDetails(accountid); 

} 

다음, 당신은 다른를 사용하여 계정 요약을 표시 할 수 URL이 경로의 처음 두 부분은 "계정"을 다시 한 번있는 나무, 그리고 계정 아이디와 같은 내장되어 URL 패턴 :

// when get account summary is clicked it will call this method 
@RequestMapping(value="/account/{accountid}/summary", method=RequestMethod.GET) 
public @ResponseBody String getAccountSummary(@PathVariable(value="accountid") String accountid){ 

    return somefunct.getAccountSummary(accountid); 

} 
이제

, 당신의 반면에 방법을 제출는 부작용이 . 이는 요청이 끝날 때 서버의 상태가 달라진다는 것을 나타내는 멋진 방법 일 뿐이며 해당 리소스에 대한 GET 요청은 변경 전과 다를 것입니다. 자원을 수정하거나 콜렉션에 자원을 추가 할 때 사용할 적절한 HTTP 메소드는 HTTP POST 메소드입니다. 컬렉션을 대체 할 때 HTTP Method PUT이 일반적으로 받아 들여지는 선택 방법입니다.

PUT과 POST의 또 다른 차별화 요소는 PUT이 멱등 원 (itempotent)이라는 것입니다. 즉, 반복되는 동일한 요청이 서버의 상태를 변경하지 않는다는 것을 의미합니다. 같은 요청을 여러 번 치는 것이 더 많은 레코드를 생성하면 POST를 사용하십시오.

마지막으로이 요청을 URL에도 매핑 할 수 있습니다. 아래의 예에서는 새 계정 레코드를 만들고 데이터베이스의 계정 컬렉션에 새 레코드를 삽입한다고 가정했습니다. 따라서 POST를 사용했습니다. PathVariable을 사용하여 URL 경로에서 accountid를 가져 오도록 매개 변수 목록을 수정하고 요청 본문에 객체를 보낼 수 있도록 RequestBody 주석을 추가했습니다.이 객체는 Java 객체로 비 직렬화 될 수 있습니다.

/* when submit button is clicked... Form is submitted for saving*/ 
@RequestMapping(value="/account/{accountid}", method=RequestMethod.POST) 
    public String submitForm(@PathVariable String accountid, @RequestBody Account account){ 
     // save here 
     return "myform"; 
} 

스프링 MVC에 대한 자세한 내용은 Spring documentation on Spring MVC을 확인하십시오.

+2

와우! 나는 그 대답에 대해 매우 감사한다!그것은 매우 도움이되었다! 신의 축복이 당신의 친절! 다시 한 번 감사드립니다! –

+0

도와 드릴 수있어서 기쁩니다. 행운을 빕니다! :) – jmort253

관련 문제