如何在前端控制器java servlet Web应用程序页面中更新我的会话范围数据模型,而无需重新加载网页?

时间:2014-03-27 15:10:11

标签: java ajax jsp servlets front-controller

我有一个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";
    }
}

0 个答案:

没有答案