springmvc错误心得:请求路径问题
1、浏览器地址栏:域名(也叫根目录)/文件目录/a.jsp
如果:网页中超链接
<a href="/emp/${emp.id}">Delete</a>
则浏览器跳转地址: 域名(也叫根目录)/emp/数字id
如果:网站中超链接
<a href="emp/${emp.id}">Delete</a>
则浏览器跳转地址: 域名(也叫根目录)/文件目录/emp/数字id
=============================================
相对路径:是相对当前浏览器路径来说的。
如果浏览器地址:根目录/abc/1005 页面中 超链接是
<a href=”abc/1008″>scan</a>
点击超链接的结果是:根目录/abc/abc/1008 [这个需要注意啦]
关于:
request.getContextPath()得到的是 项目所在目录 :
如果项目为根目录,则得到一个””,即空的字条串【在浏览器看来:等价于-> 域名】
如果项目名为dzjc,将得到/dzjc 【在浏览器看来等价于 ->域名/dzjc】
比如下面的超链接:如果网站名不在根目录(也就是不等于域名),比如在/dzjc(也就是域名/dzjc) <a href="${pageContext.request.contextPath }/emp">hh</a> 效果等价于 <a href="/dzjc/emp" >hh</a>
<a href=”XXX.jsp”> 应该就是指当前路径下的这个xxx.jsp页面,有时候也可以在head里设置html:base来解决路径的问题,不过用的最多的还是request.getContextPath。
用EL来表示相同功能的EL为:${pageContext.request.getContextPath()}
=============================================
2、服务端控制器中:
在springmvc中,@RequestMapping
的值可以/xxx,也可以是xxx,效果一样
@RequestMapping(value="/emp/{id}",method=RequestMethod.DELETE)
特别注意一下,在rest风格中 请求页面如果是 “emp/${emp.id} ,那么处理器的RequestMapping值也要是 /emp/{id} 不要写错成 /emp 导致无法访问
另一方面:控制器的返回值 return “redirect:/emps”; 指明重定向和转发的都要用用绝对路径,否则路径解析就出错了。
一、配置文件
web.xml 配置文件和查询所有雇员信息的配置相同。
springmvc.xml配置文件,因为需要请求静态资源(加载js文件),然后利用js发送post请求。
所以要在 springmvc.xml【即转发配置器】中,添加请求静态资源的代码:
<!-- default-servlet-handler 将在 SpringMVC 上下文中定义一个 DefaultServletHttpRequestHandler, 它会对进入 DispatcherServlet 的请求进行筛查, 如果发现是没有经过映射的请求, 就将该请求交由 WEB 应用服务器默认的 Servlet 处理. 如果不是静态资源的请求,才由 DispatcherServlet 继续处理 一般 WEB 应用服务器默认的 Servlet 的名称都是 default. 若所使用的 WEB 服务器的默认 Servlet 名称不是 default,则需要通过 default-servlet-name 属性显式指定 --> <mvc:default-servlet-handler/> <!-- 前面的 mvc:default-servlet-handler 可以解决静态资源了,但是让其他经过handler的请求,又失效了,所以配置了下面的 mvc:annotation-driven 来解决问题 --> <mvc:annotation-driven></mvc:annotation-driven>
已经在springmvc基础-配置开发环境中提到过了。
二、请求测试页
第一步,跳转到待删除页
其实就是/emps请求,跳转到showGetEmps.jsp
第二步,在showGetEmps.jsp页面中配置 删除模块的超链接。
<td><a class="delete" href="emp/${emp.id}">Delete</a></td>
因为是删除方法,必须要提供post方法传递。所以需要js,而加载js属于请求静态资源。所以上文介绍了如何编辑配置文件,用来支持加载静态资源。
第三步,在showGetEmps.jsp页面中配置 form表单。
<body> <form action="" method="POST"> <input type="hidden" name="_method" value="DELETE"/> </form> ... </body>
第四步,在showGetEmps.jsp页面中,用js控制 删除的超链接以post方式发送。
<!-- SpringMVC 处理静态资源: 1. 为什么会有这样的问题: 优雅的 REST 风格的资源URL 不希望带 .html 或 .do 等后缀 若将 DispatcherServlet 请求映射配置为 /, 则 Spring MVC 将捕获 WEB 容器的所有请求, 包括静态资源的请求, SpringMVC 会将他们当成一个普通请求处理, 因找不到对应处理器将导致错误。 2. 解决: 在 SpringMVC 的配置文件中配置 <mvc:default-servlet-handler/> --> <script type="text/javascript" src="scripts/jquery-1.9.1.min.js"></script> <script type="text/javascript"> $(function(){ alert("hello jquery"); $(".delete").click(function(){ var href = $(this).attr("href"); $("form").attr("action", href).submit(); return false; }); }) </script>
三、结果响应页
还是返回showGetEmps.jsp页面
四、编辑控制器
//在所有雇员信息页,进行删除雇员操作 //跳转部分不需要了,本身就是跳转到显示有雇员信息页 @RequestMapping(value="/emp/{id}",method=RequestMethod.DELETE) public String deleteEmp(@PathVariable("id") Integer id){ employeeDao.delete(id); System.out.println("hello delete"); return "redirect:/emps"; }