JSP 和 Servlet 中的绝对路径和相对路径

JSP Servlet 中的绝对路径和相对路径问题困扰了我好几天,经过努力之后将其部分心得和大家共享。

       前提:假设你的 Http 地址为 http://192.168.0.1/ 你的 web 应用为 webapp ,那么你的 web 应用 URL http://192.168.0.1/webapp/

       web 应用的目录结构:

       webapp/

              web-inf/

                 classes/

                     lib/

                     web.xml

                              <servlet-mapping>

                               <servlet-name>handleservlet</servlet-name>

                               <url-pattern>/handleservlet</url-pattern> 此映射是相对于当前 web 应用的

                             </servlet-mapping>

              user/

a.jsp

b.jsp

              images/

              css/

              js/

             

       所有相对路径都是由“ / ”开头的。如: /image/a.gif /user/main.jsp ,大家知道在 html 中的相对路径是这样的:

       有个 html 文件: a.html ,其中有 <link href="one.css" rel="stylesheet" type="text/css"> ,其中 href 属性表示引用的 css 文件的路径。

one.css :表示 one.css a.hmtl 处于同一个目录

user/one.css :表示 one.css 处于 a.html 所在目录的子目录 user 中。

../one.css :表示 one.css 位于 a.hmtl 上一级目录下,

../../one.css :表示 one.css 位于 a.hmtl 上一级目录的上一级目录下,

./ :表示和 a.hmtl 同一目录

我们称上述相对路径为 html 相对路径

1、 服务器端的地址

服务器端的相对地址指的是相对于你的 web 应用的地址,这个地址是在服务器端解析的(不同于 html javascript 中的相对地址,他们是由客户端浏览器解析的)也就是说这时候在 jsp servlet 中的相对地址应该是相对于你的 web 应用,即相对于 http://192.168.0.1/webapp/ 的。

其用到的地方有:

forwarder servlet 中的 request.getRequestDispatcher(address); 这个 address 是在服务器端解析的,所以,你要 forwarder a.jsp 应该这么写: request.getRequestDispatcher(“/user/a.jsp”) 这个 / 相对于当前的 web 应用 webapp ,其绝对地址就是: http://192.168.0.1/webapp/user/a.jsp

sendRedirect :在 jsp <%response.sendRedirect("/rtccp/user/a.jsp");%>

2、 客户端的地址

所有的 html 中的相对地址都是相对于 http://192.168.0.1/ 的,而不是 http://192.168.0.1/webapp/ 的。

Html 中的 form 表单的 action 属性的地址应该是相对于 http://192.168.0.1/ 的,所以,如果提交到 a.jsp 为: action ”/webapp/user/a.jsp” ;提交到 servlet action ”/webapp/handleservlet”

Javascript 也是在客户端解析的,所以其相对路径和 form 表单一样。

3、 站点根目录和 css 路径问题

我们称类似这样的相对路径 /webapp/…. 为相对于站点根目录的相对路径。

当在 jsp 中引入 css 时,如果其相对路径相对于当前 jsp 文件的,而在一个和这个 jsp 的路径不一样的 servlet forwarder 这个 jsp 时,就会发现这个 css 样式根本没有起作用。这是因为在 servlet 中转发时 css 的路径就是相对于这个 servlet 的相对路径而非 jsp 的路径了。所以这时候不能在 jsp 中用这样的路径: <link href="one.css" rel="stylesheet" type="text/css"> 或者 <link href="../../one.css" rel="stylesheet" type="text/css"> 类似 href="one.css" ../../one.css html 相对路径是相对于引用这个 css 的文件的相对路径。而在 servlet 中转发时就是相对于这个 servlet 的相对路径了,因为 jsp 路径和 servlet 路径是不一样的,所以这样的引用肯定是出错的。

所以这个时候,要用站点根目录,就是相对于 http://192.168.0.1/ 的目录,以“ / ”开头。

因此上述错误应更正为 href=”/webapp/one.css” 类似的站点根目录的相对目录。这样在 servlet 转发后和 jsp 中都是相对于站点根目录的相对路径,就能正确使用所定义的 css 样式了。

 


声明:以上为转贴,不代表本人观点,与本帖有关的一切后果,均与本人无关。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JSPServlet,可以通过设置虚拟路径来引用上传文件的图片。以下是一个示例代码,演示如何设置虚拟路径: 1. 在Servlet,获取应用程序的实际路径,并将其设置为ServletContext的属性: ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取应用程序的实际路径 String applicationPath = request.getServletContext().getRealPath(""); // 设置虚拟路径 String virtualPath = "/uploads"; // 虚拟路径,可以根据需要修改 // 将虚拟路径保存到ServletContext的属性 request.getServletContext().setAttribute("virtualPath", virtualPath); // 其他文件上传处理逻辑... } ``` 2. 在JSP,使用EL表达式获取ServletContext的属性,并将虚拟路径与上传文件名拼接成完整的URL: ```html <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <img src="${pageContext.servletContext.getAttribute('virtualPath')}/${fileName}"> ``` 在上述代码,`${pageContext.servletContext.getAttribute('virtualPath')}`通过EL表达式获取ServletContext的属性值,`${fileName}`为上传的文件名。将两者拼接在一起,就可以得到完整的图片URL。 请注意,在设置虚拟路径时,需要确保虚拟路径与实际存储文件的目录相对应。在示例,虚拟路径为`/uploads`,则上传的文件应该存储在实际路径下的`uploads`目录。你可以根据实际情况修改虚拟路径和存储目录的名称。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值