gpt4 book ai didi

jsp - 将通知消息设置为应在 sendRedirect 后显示的请求属性

转载 作者:行者123 更新时间:2023-12-04 15:46:42 25 4
gpt4 key购买 nike

我创建了两组 servlet: View 和 Controller /处理程序

  • View :执行简单的读取并将数据转发到 JSP
  • Controller :执行数据库更新或插入并向 JSP 或 View 类型的 servlet 发送通知

  • 此处的通知是用户的状态消息。示例:“您已成功更新等等……”

    如果我在 Controller 中使用 requestDispatcher.forward() 并且用户通过确认重新发送刷新(在 Controller 将控制传递给 View /jsp 之后)页面,则有可能执行重复操作

    如果我使用 response.sendRedirect() 我似乎无法发送任何通知而不在 session 中设置这些

    有没有好的设计实践可以帮助这里?任何处理这种特定场景的 java w/o 框架的 MVC 的良好链接都将不胜感激。

    我没有使用 Spring 或 Struts - 只是普通的旧 HTTPServlets

    示例 - Controller :
    public XServlet extends HttpServlet{
    public void processRequest(request, response) throws ...{
    //Do some stuff here
    if(success){
    setUserMessage("Hooray ur profile pic is uploaded!");
    } else {
    setUserMessage("Oh no! We couldn't upload that file its too biG!");
    }

    //Send the notification
    request.setAttribute("status", getUserMessage());
    request.getRequestDispatcher("editProfile.jsp").forward(request, response);
    }
    }

    这样做意味着如果用户尝试刷新页面,控件将再次传递给此 Controller ,并且某些操作可能会不必要地重复。

    但是,如果我使用 sendRedirect(),那么我无法在不求助于 session 属性或将其附加到 url 的情况下显示状态消息。

    最佳答案

    您正在寻找“flash scope”。

    The flash scope is backed by a short living cookie which is associated with a data entry in the session scope. Before the redirect, a cookie will be set on the HTTP response with a value which is uniquely associated with the data entry in the session scope. After the redirect, the presence of the flash scope cookie will be checked and the data entry associated with the cookie will be removed from the session scope and be put in the request scope of the redirected request. Finally the cookie will be removed from the HTTP response. This way the redirected request has access to request scoped data which was been prepared in the initial request.



    在简单的 Servlet 术语中,如下所示:
  • 创建 flash 作用域并添加条目:
    String message = "Some message";

    // ...

    Map<String, Object> flashScope = new HashMap<>();
    flashScope.put("message", message);
  • 在重定向之前,将其存储在以唯一 ID 为键的 session 中,并将其设置为 cookie:
    String flashScopeId = UUID.randomUUID().toString();
    request.getSession().setAttribute(flashScopeId, flashScope);
    Cookie cookie = new Cookie("flash", flashScopeId);
    cookie.setPath(request.getContextPath());
    response.addCookie(cookie);

    // ...

    response.sendRedirect(request.getContextPath() + "/someservlet");
  • 在下一个请求中,找到 flash cookie,将其映射回请求范围并删除 cookie:
    if (request.getCookies() != null) {
    for (Cookie cookie : request.getCookies()) {
    if ("flash".equals(cookie.getName())) {
    Map<String, Object> flashScope = (Map<String, Object>) request.getSession().getAttribute(cookie.getValue());

    if (flashScope != null) {
    request.getSession().removeAttribute(cookie.getValue());

    for (Entry<String, Object> entry : flashScope.entrySet()) {
    request.setAttribute(entry.getKey(), entry.getValue());
    }
    }

    cookie.setValue(null);
    cookie.setMaxAge(0);
    cookie.setPath(request.getContextPath());
    response.addCookie(cookie);
    }
    }
    }

  • 这可以使用特定于上下文的帮助器方法(如 setFlashAttribute() 和带有响应包装器的 servlet 过滤器)进一步抽象化。

    关于jsp - 将通知消息设置为应在 sendRedirect 后显示的请求属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32410695/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com