重新加载JSP页面

时间:2011-08-14 15:07:11

标签: java jsp servlets

我在每个页面上都显示了一个授权框架,即使用户选择登录,我也希望保持该页面显示(使用jstl标签我将简单地放置此框架用户信息并链接到购物车)。我怎样才能实现这一目标?我有一些想法,但它们都破坏了我的控制器设计。

public class FrontController extends HttpServlet {

private ActionContainer actionContainer = ActionContainer.getInstance();

public FrontController() {
    super();
}
/** 
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
@SuppressWarnings("unchecked")
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    String page = null;

    try {
        Action action = actionContainer.getAction(request);
        page = action.execute(request, response);
        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(page);
        dispatcher.forward(request, response);

    } catch (ActionNotFoundException e) {
        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(PageNames.ERR_PAGE);
        request.setAttribute(AttributeNames.ERR_MESSAGE_ATTRIBUTE, "Unknown Action command: " + e.getMessage());
        dispatcher.forward(request, response);
    } catch (Exception e) {
        RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(PageNames.ERR_PAGE);
        request.setAttribute(AttributeNames.ERR_MESSAGE_ATTRIBUTE, "Exception:\n" + e.getMessage());
        dispatcher.forward(request, response);
    }
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}

/** 
 * Returns a short description of the servlet.
 * @return a String containing servlet description
 */
@Override
public String getServletInfo() {
    return "Front Controller";
}

@Override
public void init() throws ServletException {
    super.init();
    Locale.setDefault(new Locale("ru","RU"));
}    

}

我正在考虑重定向到特别针对此案例页面编写,该页面将重定向到原始页面,或者检查页面字符串是否为null并从控制器重新加载原始页面,但我无法清楚地了解如何执行此操作。

2 个答案:

答案 0 :(得分:0)

你的问题不够明确。但我想你在询问如何在用户登录后用另一个(用户名,欢迎消息和购物车详细信息)替换页面上的某个组件(登录按钮)。

如果我了解您的要求,那么在用户登录后我会做的是设置一个cookie(或localStorage中的值)。通过HttpServletResponse的addCookie方法将cookie添加到Set-Cookie响应头中。这是一个例子:

  Cookie userCookie = new Cookie("user", "uid1234");
  response.addCookie(userCookie);

然后在您的控制器中,只需检查是否设置了“user”值并采取相应的操作。一个tutorial on servlets with cookies

如果你需要处理前端组件,并在不重新加载页面的情况下更改表单上的值,我建议使用javascript来执行此操作,您可以找到并删除旧的DOM元素(用户名,欢迎辞,购物车等等。

如果您的iFrame正在进行登录,那么在成功登录后,让它在您从顶部窗口调用一个函数,在从cookie中读取更新的值后执行更新。

如果你想在前端完全处理这个问题,即Javascript,那么我会跳过使用cookie并使用localStorage。 Stackover和互联网上有很多关于localStorage的帮助,但我会建议YUI Storage Lite库使得从localStorage存储和加载数据变得非常简单。

此致

答案 1 :(得分:0)

将当前网址包含为您的身份验证表单的隐藏字段。在处理身份验证的操作中,一旦用户通过身份验证,就会重定向到此URL。

在JSP中,测试用户是否经过身份验证并包含身份验证表单或购物车。只要用户通过身份验证,就可以通过在HTTP会话中放置一个布尔值来完成此测试。