Thymeleaf обновить страницу ответить теперь с помощью AJAX



В дополнение к моему предыдущему вопросу об использовании Thymeleaf и предотвращении обновления страницы:



Http://forum.thymeleaf.org/Preventing-page-refresh-Thymeleaf-amp-Spring-MVC-td4029155.html



В основном у меня было рабочее приложение Spring MVC, которое использует Thymeleaf для сохранения данных формы. Когда пользователь сохранит данные, страница будет обновляться (так как я хотел оставить их на странице для дополнительных правок), и я хотел исключить обновление страницы.



Я закодировал некоторые Javascript чтобы использовать jQuery Ajax для отправки данных в мой контроллер Spring MVC. Хитрость заключалась в том, чтобы не использовать кнопку submit, а просто обычную кнопку и привязать к ней функцию JS для отправки данных на сервер.



Все это, кажется, работает идеально, но я хочу убедиться, что понимаю, что происходит. В частности, мне интересно, если Thymeleaf сейчас лишними. Я не думаю, что это потому, что при первоначальной загрузке страницы Thymeleaf все еще привязан к Бобу данных. От использования отладчика на серверная сторона в контроллере выглядит так, что post-запрос вызывает сопоставленный метод и передает данные в модель.

Я был бы признателен за ваши комментарии относительно того, является ли это правильным способом достижения этой цели.

Наконец, как я могу справиться с ошибкой, скажем, например, хранилище не сохраняет данные по какой-либо причине?



Большое спасибо.



Вот важные части формы:



<FORM id="adminDataForm" action="#" th:action="@{/admin_ajax}" th:object="${adminFormAjax}" method="post">


<input type="button" value="Save Changes" id="post" onClick="sendData()" />


Вот Javascript:



function sendData()
{
$.ajax(
{
type: "POST",
data: $("#adminDataForm").serialize(),
cache: false,
url: "/admin_ajax",
success: function(data)
{
alert("Your changes have been saved");
},
error: function()
{
alert("Error - Data not saved");
}

});
}


Вот контроллер:



@SessionAttributes("adminFormAjax")
@Controller
public class TestController
{
final static protected long INDEX_RA = 2L;

@Autowired
private AdminDataRepository rep;

@RequestMapping(value="/admin_ajax", method=RequestMethod.GET)
public String adminFormAjax(Model model)
{
AdminData ad = rep.findById(INDEX_RA);

// If there is no configuration record, create one and assign the primary key
if(ad == null)
{
ad = new AdminData();
ad.setId(INDEX_RA);
}

model.addAttribute("adminFormAjax", ad);
return "adminFormAjax";
}

@RequestMapping(value="/admin_ajax", method=RequestMethod.POST)
public @ResponseBody AdminData adminSubmit(@ModelAttribute("adminFormAjax") AdminData ad, Model model)
{
rep.save(ad);
model.addAttribute("adminFormAjax", ad);
return ad;
}

}
769   1  

1 ответ:

Итак, разбивка ответа.

  1. Thymeleaf не является избыточным, он все равно будет отображать HTML-страницу перед отправкой клиенту. Ajax просто делает дальнейшую обработку для вас на стороне клиента.
  2. Вы также можете использовать кнопку submit, вам просто нужно убедиться, что ваша форма правильно структурирована, и у вас есть javascript, прослушивающий вашу кнопку submit, например

    $("#submitbutton").on('click', function (){//do stuff});

  3. Ты справишься со всеми и вся исключения/проблемы в вашем контроллере Ajax, как и в случае со стандартным контроллером. Вам нужно разделить обработку вопросов на разных уровнях. например, вопросы уровня respository должно осуществляться на уровне рэп, контроллер/POJO-объект должен быть на уровне контроллера (или POJO, но если вы используете для обработки). Вы также должны фиксировать любые исключения через глобальную среду (например, ControllerAdvice).

  4. любые проблемы/ошибки, которые вы поднимаете, вы должны общаться обратно через обратный звонок. adminSubmit, а также управление соответствующими клиента ответ на AJAX.

Comments

    Ничего не найдено.