14

我有一个关于servlet重定向到相同初始页面的问题。以下是场景:假设一个用户想要购买一件物品,那么他填写金额并提交。表单被提交给servlet,可用数量与数据库中的可用数量进行核对。因此,如果订购的项目数量超过可用的数量,servlet会重定向到相同的页面,但会显示类似“item is unavailable”的消息。所以我的问题是如何实现这个案例。如何重定向到带有错误消息的同一初始页面。我不想在这里使用ajax。

我是这样想的:1.)如果生成错误,我是否应该设置上下文属性,然后在重定向后在初始页面中再次检查它,并显示已设置的消息。

此类活动的最佳实践是什么?

1
  • 将鼠标放在[servlet]您在问题上放置的标签,直到出现一个黑框,然后单击其中的信息链接。这个问题在第一个Hello World示例中已经讨论了很长时间。 评论 2013年2月1日14:01

1答案1

重置为默认值
41

最常见和推荐的场景(对于Javaserlvets/JSP世界中的服务器端验证)是将一些错误消息设置为请求属性(位于请求范围)然后使用表达式语言(参见下面的示例)。未设置错误消息时,将不显示任何内容。

但在请求中存储错误消息时,您应该转发请求到初始页面。重定向时不适合设置请求属性,因为如果使用重定向,则将完全新款请求和请求属性在请求之间重置.

如果你想重定向请求到引用页面(提交数据的页面),然后可以在会话中存储错误消息(在会话范围),即设置会话属性。但在这种情况下,您还需要当提交的请求正确时,从会话中删除该属性,因为否则,只要会话存在,就会出现错误消息。

至于上下文属性它意味着整个web应用程序都可以使用(应用范围)对于所有用户来说,加上它的寿命与web应用程序的寿命一样长,这在您的情况下几乎没有用处。如果将错误消息设置为应用程序属性它将对所有用户可见不仅是提交错误数据的人。


好的,这是一个简单的例子。

web.xml网站

<?xml version=“1.0”encoding=“UTF-8”?><web-app xmlns=“http://java.sun.com/xml/ns/javaee"xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=“http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"版本=“3.0”>测试应用程序<servlet>订购servlet<servlet-class>com.example。TestOrderServlet</servlet-class></servlet><服务映射>订购servlet<url-pattern>/MakeOrder.do</servlet-mapping></web-app>


order.jsp

<!DOCTYPE html><html><头部><title>测试页面</title><meta http-equiv=“Content-Type”Content=“text/html;charset=UTF-8”></头><body><h1>测试页面</h1><form action=“MakeOrder.do”method=“post”>${errorMessage}<p>输入金额:<input type=“text”name=“itemAmount”/></p><input type=“submit”value=“submit Data”/></form></body></html>


选项1:将错误消息设置为请求属性

包com.example;导入javax.servlet.http。HttpServlet;导入javax.servlet.http。HttpServletRequest;导入javax.servlet.http。HttpServletResponse;导入javax.servlet。ServletException;导入java.io.IOException;公共类TestOrderServlet扩展了HttpServlet{protected void doPost(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException、IOException{int amount=0;尝试{金额=Integer.parseInt(request.getParameter(“itemAmount”));}catch(NumberFormatException e){//做点什么或什么}如果((金额>0)&&(金额<100)){//金额可以request.getRequestDispatcher(“/index.jsp”).forward(请求,响应);}else{//无效金额//将一些错误消息设置为请求属性。if(金额<=0){request.setAttribute(“errorMessage”,“Please submit a amount of least 1”);} 如果(金额>100){request.setAttribute(“errorMessage”,“订购的商品数量太大。当前可用数量不超过100个。”);}//使用forward返回order.jsp页面request.getRequestDispatcher(“/order.jsp”).forward(请求,响应);}}}


选项2:将错误消息设置为会话属性

测试订单Servlet.java

包com.example;导入javax.servlet.http。HttpServlet;导入javax.servlet.http。HttpServletRequest;导入javax.servlet.http。HttpServletResponse;导入javax.servlet。Servlet异常;导入java.io.IOException;公共类TestOrderServlet扩展了HttpServlet{protected void doPost(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException、IOException{int amount=0;尝试{金额=Integer.parseInt(request.getParameter(“itemAmount”));}catch(NumberFormatException e){//做点什么或什么}如果((金额>0)&&(金额<100)){//金额可以//如果会话没有使用指定名称绑定的对象,则removeAttribute()方法不执行任何操作。request.getSession().removeAttribute(“错误消息”);request.getRequestDispatcher(“/index.jsp”).forward(请求,响应);}else{//无效金额//将一些错误消息设置为会话属性。if(金额<=0){request.getSession().setAttribute(“errorMessage”,“Please submit a amount of least 1”);} 如果(金额>100){request.getSession().setAttribute(“errorMessage”,“订购的商品数量太大。当前可用数量不超过100。”);}//使用重定向返回referer页面response.sendRedirect(request.getHeader(“Referer”));}}}

相关阅读:

  • 我确实被重定向回我的登录页面,但出现了错误,但如果我登录成功并单击“返回”,它仍会显示“错误消息”。 评论 2018年4月20日20:56
  • @AnnadatePiyush嗯,这是预期的行为。浏览器中的“后退”按钮功能可以让您“回到历史”中(通常使用浏览器缓存)。如果最后一个操作是“错误消息”,则会再次显示。阅读此处了解更多信息:web浏览器中的“后退”按钮是如何工作的?.
    – 信息01
    评论 2018年4月21日23:38
  • 这很有帮助。那么我需要参加会议。 评论 2018年4月30日11:35

您的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.