我很擅长使用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方法之间切换,我似乎无法弄清楚我做错了什么。
感谢您的帮助!
答案 0 :(得分:0)
目前我的噱头是我有一个名为VisitShopFilter的过滤器类,它检查客户端是否在访问商店之前登录,如果它们只是将请求转发到shop.jsp页面,如果它们不是然后它将它们转发到login.jsp页面。
糟糕的主意。
过滤器应该是一个拦截器,它为一组资源提供通用功能(比如你检查会话的方式)。您应该将实际资源(Servlets / jsps)映射到您的终点。当过滤器完成它的工作时,它应该调用chain.doFilter(...),它允许请求处理到达其映射的终点。
过滤器应仅在异常(逻辑,业务或技术)上更改请求处理过程(通过调用其他资源)。正如您已经在代码中拥有它,它通过调用请求调度程序来实现。
答案 1 :(得分:0)
感谢大家的快速回复。
我已经考虑到你们每个人所说的并且设法从那里改进了。这两个问题最终导致我不小心在HTML文件中而不是动作,并且我没有调用chain.doFilter(req,resp)方法。