Как вызвать метод контроллера из jsp с помощью ajax

#ajax #spring #jsp #spring-mvc

#ajax #spring #jsp #spring-mvc

Вопрос:

Я использую spring boot, maven 3.2.5. Я работаю над простым веб-приложением maven, используя spring boot, следуя шаблону mvc. я пытаюсь вызвать метод контроллера из jsp, предъявляя иск ajax.

это мой метод jsp javascript, который вызывает вызов ajax для вызова метода контроллера.

 function listExistingUser()
	{	
	
	alert("listExistingUser");

		$.ajax({
			type : "GET",
			url : '${home}/loginController/listExistingUser',
			dataType : "json",
		    crossDomain:true,
			success : function(data) {
				//console.log(data);
				//alert(data.toString());
				checkValidUser(data);	
			},
			error : function(data) {
					
			}
			});
	}   

Ниже приведен мой класс контроллера.

 @Controller
@RequestMapping("/loginController")
public class LoginController {
	
	@Autowired
	LoginService loginService;
	
	@RequestMapping(value = "/listExistingUser", method = RequestMethod.GET)
	 @ResponseBody
	public Object getAuthentication(@ModelAttribute("studentId") int studentId,
			   HttpServletRequest request, HttpServletResponse response)
			   {
				System.out.println("listExistingUser is called in controller");
			   }
}  

когда я запускаю свое приложение, я могу получить доступ к login.jsp по указанному ниже URL
http://localhost:9090/seperation-management/pages/login.jsp

когда я нажимаю кнопку отправки, также вызывается метод javascript на странице jsp, alert("listExistingUser"); но я не могу вызвать свой метод контроллера.

где я допускаю ошибку. кто-нибудь может мне помочь.

Ответ №1:

в метод contoller необходимо внести некоторые изменения

 @RequestMapping(value = "/listExistingUser", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<Object> getAuthentication(){
System.out.println("listExistingUser is called in controller");
return new ResponseEntity<Object>(object,HttpStatus.OK); 
}
  

вам не нужно иметь @modelAttribute аннотацию, поскольку вы не связываете какой-либо объект с запросом. и хорошей практикой является возврат ResponseEntity вместо возврата Object .

если вам нужно получить идентификатор из входящего запроса, подобного этому siteName/listExistingUser/1 , используйте этот метод.

 @RequestMapping(value = "/listExistingUser/{id}", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<Object> getAuthentication(@PathVariable("id") int id){}
  

если вы хотите получать значения из URL-адреса, подобного этому
siteName/listExistingUser?id=1 , используйте вместо этого этот метод.

 @RequestMapping(value = "/listExistingUser", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<Object> getAuthentication(@RequestParam("id") int id){}
  

Ответ №2:

Этот пример работает в моем приложении:

JSP:

 <script type="text/javascript" charset="utf-8">
        function getDesc() {
            $.getJSON("desclist.json", {
                sel1Id : $('select#COMPSNT_NM').val()
            }, function(data) {
                var html = '';
                var len = data.length;
                for (var i = 0; i < len; i  ) {
                    html  = '<option value="'   data[i]   '">'
                              data[i]   '</option>';
                }
                $('select#COMPSNT_DS').html(html);
            });
        }

        $(document).ready(function() {
            $('#COMPSNT_NM').change(function() {
                getDesc();
            });
        });
</script>
  

Контроллер:

 @RequestMapping(value = "desclist.json")
@ResponseStatus(HttpStatus.OK)
public @ResponseBody List<String> sectionList(@RequestParam(value = "sel1Id", required = true) String sel1Id,
        ModelMap modelMap) {

    List<PARAM_SEQ_2> list = new ArrayList<>();
    List<String> list2 = new ArrayList<>();
    list = paramSeq2Service.findByField2(sel1Id);
    for (PARAM_SEQ_2 prm : list) {
        list2.add(prm.getCOMPSNT_DS());
    }
    return list2;

}