使用过滤器时的Java Servlet映射

时间:2015-02-25 06:23:20

标签: java jsp servlets

我很擅长使用Servlets和JSP,但我想知道是否有人可以帮我解决以下问题。

我的问题源于我的Servlet没有被调用,我似乎无法弄清楚原因。

目前我的噱头是我有一个名为VisitShopFilter的过滤器类,它检查客户端是否在访问商店之前登录,如果它们只是将请求转发到shop.jsp页面,如果它们不是然后它将它们转发到login.jsp页面。

这是VisitShopFilter:

   @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpSession sess = ((HttpServletRequest)servletRequest).getSession();
    if(sess.getAttribute("loggedIn") == null){
            servletRequest.getRequestDispatcher("login.jsp").forward(servletRequest,servletResponse);
            return;
        }
    if(sess.getAttribute("cart") == null){
        sess.setAttribute("cart",new ShoppingCart());
    }
    servletRequest.getRequestDispatcher("shop.jsp").forward(servletRequest,servletResponse);
}

过滤器映射到URL模式/ Shop

在shop.jsp页面上,我有以下表格:<form onaction="Shop" method = "POST"> <input type = "hidden" name = "itemname" value = "testItem"/> <input type = "hidden" name = "itemprice" value = "10.00"/> <input type = "hidden" name = "itemquantity" value = "1"/> <button type="submit" class="btn btn-default btn-submit">Add to cart</button> </form>

我还有一个名为“Shop”的Servlet:

    @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("responding to post");
    if(req.getSession().getAttribute("cart") == null || req.getSession().getAttribute("loggedIn") == null){
        req.getRequestDispatcher("login.jsp").forward(req,resp);
    }

    ShoppingCart cart = (ShoppingCart) req.getSession().getAttribute("cart");
    try{
        cart.addItem(
                req.getParameter("itemname"),
                Double.valueOf(req.getParameter("itemprice")),
                Integer.valueOf(req.getParameter("itemquantity"))
        );
    }catch (NumberFormatException e){
        e.printStackTrace();
    }

    req.getSession().setAttribute("itemNamesInCart",cart.getItemNames());
    req.getSession().setAttribute("itemPricesInCart",cart.getItemPrices());
    req.getSession().setAttribute("itemQuantitiesInCart",cart.getItemQuantities());
    req.getSession().setAttribute("totalItemsInCart",cart.getTotalCartSize());
    req.getSession().setAttribute("totalPurchasePrice",cart.getTotal());

    req.getRequestDispatcher("shop.jsp").forward(req, resp);
}

我的问题是,单击表单的提交按钮时,甚至没有打印出“回复帖子”。在我的web.xml文件中,我尝试将servlet映射到/ Shop,/ shop.jsp以及一些其他的东西,包括在GET和POST方法之间切换,我似乎无法弄清楚我做错了什么。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

  

目前我的噱头是我有一个名为VisitShopFilter的过滤器类,它检查客户端是否在访问商店之前登录,如果它们只是将请求转发到shop.jsp页面,如果它们不是然后它将它们转发到login.jsp页面。

糟糕的主意。

过滤器应该是一个拦截器,它为一组资源提供通用功能(比如你检查会话的方式)。您应该将实际资源(Servlets / jsps)映射到您的终点。当过滤器完成它的工作时,它应该调用chain.doFilter(...),它允许请求处理到达其映射的终点。

过滤器应仅在异常(逻辑,业务或技术)上更改请求处理过程(通过调用其他资源)。正如您已经在代码中拥有它,它通过调用请求调度程序来实现。

答案 1 :(得分:0)

感谢大家的快速回复。

我已经考虑到你们每个人所说的并且设法从那里改进了。这两个问题最终导致我不小心在HTML文件中而不是动作,并且我没有调用chain.doFilter(req,resp)方法。