我有一个MVC结构的Web应用程序。我有application-
,session-
和request
范围的数据,我使用自定义的基于请求的MVC框架,类似于Spring和Struts中的框架。我使用this question's answer作为教程。
我有一个名为ShowModel
的java对象,它作为会话作用域数据传递。我用它来跟踪用户对网页上可见组件的选择。
所有可能的可见性选择都由复选框表示。首次设置会话数据时,它们都被设置为默认值visible / checked。
我在所有复选框上都有一个监听器,寄存器更改,按类名“切换”,并通过ajax将它的id和checked
/ unchecked
状态发送到服务器/ servlet。请参阅代码示例1.我想说明我对ajax的体验非常有限。
由于我的所有调用都被我的Front Controller Servlet截获,我需要做出相应的操作,以执行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";
}
}