Как я могу обновить свою модель данных сессий на странице веб-приложения java-сервлета фронт-контроллера без перезагрузки веб-страницы?
У меня есть MVC-структурированное веб-приложение. у меня есть оба application-
, session-
, а также request
данных в области, и я использую пользовательскую среду MVC на основе запросов, похожую на Spring и Struts. Я использовал ответ на этот вопрос в качестве учебника.
У меня есть объект Java называется ShowModel
, который передается как данные области сеанса. Я использую это для отслеживания выбора пользователями видимых компонентов на веб-страницах.
Все возможные варианты видимости представлены флажком. Все они установлены по умолчанию для видимого / проверенного при первой установке данных сеанса.
У меня есть прослушиватель на всех флажках, который регистрирует изменения, по имени класса "toggle", и отправляет его идентификатор и checked
/ unchecked
статус по ajax серверу / сервлету. См. Пример кода 1. Я хочу сказать, что мой опыт работы с ajax очень ограничен.
Поскольку все мои вызовы перехватываются моим сервлетом Front Controller, мне нужно было выполнить соответствующее действие, чтобы выполнить ajax POST
-запрос. Этот код был успешно достигнут и выполнен. Смотрите пример кода 2.
Моя проблема, однако, заключается в том, что мой шаблон действий вызывает перенаправления. И каким-то таинственным образом текст ответа ajax-объекта оказывается полностью HTML -страницей моей индексной страницы.
Моя модель данных уже обновлена, но, как оказалось, это неправильный подход из-за паттерна стратегии фронт-контроллера.
Так кто-нибудь знает, как я могу обновить переменные объекта моей области сеанса, не перезагружая всю страницу?
Пример кода 1
$(document).ready(
function() {
$('.toggle').change(function() {
var id = this.value;
var checked = this.checked;
var json = new Object();
json.id = id;
json.checked = checked;
$.ajax({
url: "selectionmodelupdate",
type: 'POST',
dataType: 'json',
data: JSON.stringify(json),
contentType: 'application/json',
mimeType: 'application/json',
success: function (data) {
$('.event').each(function (index, event) {
//Here I will put code, to update the ".event"'s to be visible or not
});
},
error:function(data,status,er) {
console.log(arguments);
alert("error: "+data+" status: "+status+" er:"+er);
}
});
});
});
});
Пример кода 2
public class SelectionModelUpdateAction implements Action {
@Override
public String execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpSession session = request.getSession();
ShowModel showModel = (ShowModel) session.getAttribute("showmodel");
AppData appData = AppData.getInstance();
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream()));
String json = "";
if(br != null){
json = br.readLine();
}
JsonObject jsonobject = new JsonParser().parse(json).getAsJsonObject();
boolean checked = jsonobject.get("checked").getAsBoolean();
String id = jsonobject.get("id").getAsString();
if(id.equals("A")){
showModel.setASelected(checked);
response.getWriter().write("{isSuccess: true}");
return "index";
}
else if (id.equals("B")){
showModel.setBSelected(checked);
response.getWriter().write("{isSuccess: true}");
return "index";
}
else if (id.equals("C")){
showModel.setCSelected(checked);
response.getWriter().write("{isSuccess: true}");
return "index";
}
response.getWriter().write("{isSuccess: false}");
return "index";
}
}