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;
}
}
1 ответ:
Итак, разбивка ответа.
- Thymeleaf не является избыточным, он все равно будет отображать HTML-страницу перед отправкой клиенту. Ajax просто делает дальнейшую обработку для вас на стороне клиента.
Вы также можете использовать кнопку submit, вам просто нужно убедиться, что ваша форма правильно структурирована, и у вас есть javascript, прослушивающий вашу кнопку submit, например
$("#submitbutton").on('click', function (){//do stuff});
Ты справишься со всеми и вся исключения/проблемы в вашем контроллере Ajax, как и в случае со стандартным контроллером. Вам нужно разделить обработку вопросов на разных уровнях. например, вопросы уровня respository должно осуществляться на уровне рэп, контроллер/POJO-объект должен быть на уровне контроллера (или POJO, но если вы используете для обработки). Вы также должны фиксировать любые исключения через глобальную среду (например, ControllerAdvice).
- любые проблемы/ошибки, которые вы поднимаете, вы должны общаться обратно через обратный звонок. adminSubmit, а также управление соответствующими клиента ответ на AJAX.
Comments