早上花时间补完最后一点小总结:
1、关于 /:可以代表当前WEB 应用的根目录,也可以代表WEB 站点的根目录。
1)、/ 如果交给浏览器解析,则代表WEB 站点的根目录;如果交给WEB 服务器解析,代表当前WEB 应用的根目录。
2)、代表当前WEB 应用的根目录:在web.xml 文件中,映射路径;请求的转发
代表当前WEB 站点的根目录:超链接的 href 属性;请求的重定向中的 /
2、关于绝对路径:
1)、写绝对路径肯定不会有问题,写相对路径可能会发生问题。
2)、绝对路径:相对于当前WEB 应用的路径。在/ 代表站点根目录的时候需要在前面加上 contextPath
例如:<form action="<%= request.getContextPath() %>/processStep1" method="post">
例如:response.sendRedirect(request.getContextPath() + "/shoppingcart/step2.jsp");
3、表单的重复提交:
1)、重复提交的情况:
①、在表单提交到Servlet 而Servlet又通过请求转发的方式响应了一个 JSP 或HTML 页面,此时地址栏里还保留着Servlet 的那个路径,在响应页面点击“刷新”。
②、在响应页面没有到达时,重复点击“提交按钮”。
③、点击“返回”,再点击“提交”。
2)、不是重复提交的情况:
①、点击“返回”,“刷新”原表单页面,再“提交”。
3)、如何避免表单重复提交
在表单中做一个标记,提交到Servlet 时,检查标记是否存在且是否和预定的标记一样。若一致,则受理请求,并销毁标记;若不一致或没有标记,则直接响应提示信息:“重复提交”。
标记,仅提供一个隐藏域?行不通。因为 清除标记:没有方法清除固定的请求参数。
把标记放在 request 中?行不通。因为 表单页面刷新后,request 已经被销毁,再提交表单是一个新的 request。
把标记放在 session 中?可以!思路:
>在原表单页面,生成一个随机值token,
>在原表单页面把token 值放入 session 属性中
> 在原表单页面,把token 值放入隐藏域中
>在目标的Servlet 中,获取session 和隐藏域中的token 值
> 比较两个值是否一致,若一致,受理请求且把session 域中的token 属性清除,若不一致,则响应提示页面:重复提交。
over。