<转载>SpringMVC(6):${pageContext.request.contextPath}的使用 与 绝对路径/相对路径的使用区别

2018/1/8

<import name="转载1" value="http://931360439-qq-com.iteye.com/blog/954571" >

<import name="转载2" value="https://www.cnblogs.com/langtianya/archive/2013/03/04/2942515.html">

一.问题 


       JSP中究竟采用绝对路径还是采用相对路径随着所采用技术的越来越复杂,这个问题也变得越来越难以解决。
1)采用相对路径遇到的问题
相对路径固然比较灵活,但如果想复制页面内的代码却变得比较困难,因为不同的页面具有不同的相对路径,复制后必须修改每一个连接的路径。
如果页面被多于一个的页面所包含,那么被包含页面中的相对路径将是不正确的。
如果采用Struts的Action返回页面,那么由于页面路径与Action路径不同,使得浏览器无法正确解释页面中的路径,如页面为/pages/cust/cust.jsp,图片所有目录为/images/title.gif,这时在/pages/cust/cust.jsp中的所用的路径为”http://images.cnblogs.com/title.gif”,但是如果某一个Action的Forward指向这个JSP文件,而这个Action的路径为/cust/manage.do,那么页面内容中”http://images.cnblogs.com/title.gif”就不再指向正确的路径了。
解决以上问题似乎只有使用绝对路径了。

2)采用绝对路径遇到的问题
随着不同的Web应用发布方式,绝对路径的值也不同。如Web应用发布为MyApp,则路径”/MyApp/images/title.gif”是正确的,但发布为另一应用时如MyApp2,这个路径就不对了,也许这个情况比较少,但以default方式发布Web应用时以上绝对路径也不同:”/images/title.gif”。

 

二.解决方案 

 


1)采用绝对路径,但为了解决不同部署方式的差别,在所有非struts标签的路径前加${pageContext.request.contextPath},如原路径为:
”/images/title.gif”,改为
“${pageContext.request.contextPath}/images/title.gif”。
代码” ${pageContext.request.contextPath}”的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。

缺点:
操作不便,其他工具无法正确解释${pageContext.request.contextPath}
2) 采用相对路径,在每个JSP文件中加入base标签,如:
<base href="http://${header['host']}${pageContext.request.contextPath}/pages/cust/relation.jsp" />
这样所有的路径都可以使用相对路径。

缺点:
对于被包含的文件依然无效。
真正使用时需要灵活应用1)和2),写出更加健壮的代码。

在使用的时候可以使用${pageContext.request.contextPath},也同时可以使用<%=request.getContextPath()%>达到同样的效果,同时,也可以将${pageContext.request.contextPath},放入一个JSP文件中,将用C:set放入一个变量中,然后在用的时候用EL表达式取出来。
eg:

 

<c:set var="ctx" value="${pageContext.request.contextPath}" /> 

 


三、通俗易懂的观点

 

     ${pageContext.request.contextPath} 等价于 <%request.getContextPath%>,或者可以说是<%request.getContextPath%>的EL版,<%request.getContextPath%>是JSP版!它们的意思就是取得当前项目名称(或者是--取出部署的应用程序名!这么说太官方了!试问有多少人知道“取出部署的应用程序名”的含义!不过我一看到这么说,头就大了!搞什么“孔乙己”啊!)
      什么是当前的项目名称呢?
      假定你的web application 名称为test,这个test就是当前的项目名称,不过你在浏览器中输入请求路径时,如:
http//:localhost:8080/test/hello.jsp
${pageContext.request.contextPath}或<%request.getContextPath%>就是从这个请求路径(URL)上截取(是截取)----> /test 看清楚,前面是有"/",而这个“/”代表的是-->"http//:localhost:8080",看清楚这里是没有"/"的!
      所以才有了网上那些文章写的,如果我们:
<form action="${pageContext.request.contextPath}/hello.jsp">这样写路径永远对,当然对了,因为你自己翻译${pageContext.request.contextPath}/hello.jsp其中的含义,不就是
http//:localhost:8080/test/hello.jsp 相当于你写了一全路径!当然前提是你的JSP页面等等必须放置的位置正确才可以---->所以才说明路径永远正确

       为什么这么要做呢?因为学过一些MVC模式的程序员都知道,JSP的作用是用来显示的(表现的),其他的作用最好不要在这个页面上显示,尤其是Java代码!所以就用EL表达式来替代类似有“<%%>”这样的代码格式

     最后我在说一句:用到${pageContext.request.contextPath}是在JSP页面上的! 


欢迎扫二维码关注公众号,获取技术干货

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要在项目中添加SpringMVC和MyBatis的依赖。 在pom.xml文件中添加以下依赖: ```xml <!-- SpringMVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.9</version> </dependency> <!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.7</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>2.0.6</version> </dependency> ``` 接下来,创建一个Controller来处理登录请求。这里使用@Controller注解。 ```java @Controller public class LoginController { // 处理登录请求 @RequestMapping("/login") public String login(HttpServletRequest request) { // 获取账号和密码 String username = request.getParameter("username"); String password = request.getParameter("password"); // TODO: 验证账号和密码是否正确 // 如果账号和密码正确,跳转到成功页面 return "success"; // 如果账号或密码不正确,返回登录页面 // return "login"; } } ``` 在上述代码中,@RequestMapping注解用于映射请求路径。当浏览器访问 /login 时,会调用login()方法处理请求。 接下来,在WEB-INF目录下创建一个login.jsp页面,用于显示登录表单。代码如下: ```html <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录页面</title> </head> <body> <h1>登录页面</h1> <form action="${pageContext.request.contextPath}/login" method="post"> <table> <tr> <td>账号:</td> <td><input type="text" name="username"/></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password"/></td> </tr> <tr> <td></td> <td><input type="submit" value="登录"/></td> </tr> </table> </form> </body> </html> ``` 在上述代码中,form标签的action属性指向 /login ,即提交表单时会调用LoginController的login()方法。输入框的name属性分别为username和password,与Controller中获取参数的名称对应。 最后,在web.xml文件中配置DispatcherServlet和MyBatis的SqlSessionFactory。代码如下: ```xml <!-- 配置DispatcherServlet --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/springmvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 配置MyBatis --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> ``` 在上述代码中,DispatcherServlet的配置文件为 /WEB-INF/config/springmvc-config.xml ,MyBatis的配置文件为 /WEB-INF/config/applicationContext.xml 。 完成以上操作后,启动项目,在浏览器中访问 http://localhost:8080/login ,即可看到登录页面。输入账号和密码并提交后,会调用Controller中的login()方法进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值