JSP —— jsp页面访问资源 路径问题

来源:互联网 发布:mac air哪个键是insert 编辑:程序博客网 时间:2024/06/11 18:09

一、探讨资源路径问题

目录结构:


目标:在index.jsp中显示night_block.jpg


测试1:相对于工程根文件夹的路径。URL正确,未知错误

<body><img alt="加载失败了" src="WEB-INF/images/innerImages/night_block.jpg"/></body>

结果:无法显示,HTTP 响应头显示url正确:

Request URL:http://localhost:8088/JWebStudyJSP/WEB-INF/images/innerImages/night_block.jpg

测试2:直接图片名。URL 错误

<body><img alt="加载失败了" src="night_block.jpg"/></body>
结果:无法显示,HTTP 响应头显示url错误:

Request URL:http://localhost:8088/JWebStudyJSP/night_block.jpg


测试3:相对于页面的路径。URL 正确,未知错误

<body><img alt="加载失败了" src="./WEB-INF/images/innerImages/night_block.jpg"/></body>
结果:无法显示,HTTP 响应头显示url 正确

Request URL:http://localhost:8088/JWebStudyJSP/WEB-INF/images/innerImages/night_block.jpg



到此,问题还没解决,且WebContent 目录下面的内容是默认发布的,也能在发布后的webapps 文件夹中找到项目及内部的图片。

后面通过增加发布路径,具体如下:

增加发布路径:

说明:为了保持结构一致,Deploy Path 结构与Source 结构保持相同。


测试:无论怎样测试,还是无法访问图片。而多次尝试后发现,页面是无法直接访问WEB-INF下面的资源的,而上面图片中无论是第二项还是第三项目,发布后的图片路径都是一样的,都还位于WEB-INF/image/innerImages/night_block.jpg 处。


修改为下面发布路径,将innerImages下的内容直接发布到项目文件夹下,能正确显示图片:



测试,此时图片是在项目文件夹下的(发布后,可看到图片存在于与WEB-INF目录同级的位置),所以src 直接取文件名:

<body><img alt="加载失败了" src="night_block.jpg"/></body>


分析:将所有图片资源发布到项目目录下(与WEB-INF同级),优点是页面中src 直接写图片全名即可,缺点是图片文件与该位置的其它文件混在一起。



问题:将所有图片放在与WEB-INF目录同级位置显得很杂乱,为此还是想将图片放在WEB-INF下,那么如何访问WEB-INF目录下的文件?

其实没必要这么执着于放在WEB-INF 下,只要不在WEB-INF 下,其它地方都可访问,所以在项目文件夹下建一个与WEB-INF 同级的文件夹images或多层文件夹用于保存资源,页面中通过相对于项目文件夹的路径访问资源即可。如:建一个与WEB-INF同级的resource 文件夹,里面再分类各种资源,实现简单且易于管理,访问时src="resource/.../night_block.jpg"


同理,对于jsp页面与其它资源,放在WEB-INF下面也不能直接访问,但可以通过访问servlet ,在servlet中通过request 获得RequestDispatcher 实例,用该实例的forward()方法访问。servlet中关键代码如下:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {if(request.getParameter("login").equals("loginOn")){RequestDispatcher dispatcher=request.getRequestDispatcher("WEB-INF/jsp/welcome.jsp");//访问WEB-INF/jsp下的页面dispatcher.forward(request,response);}else if(request.getParameter("login").equals("loginOff")){HttpSession session=request.getSession();System.out.println("有用户下线!");session.invalidate();}}
注:

这种方式是要通过提交表单访问servlet 来实现的,在MVC 的C中可采用此方式。

如果是单独请求图片,也可通过这种方式访问WEB-INF下的图片,此时需将contentType设为images/jpeg等。图片一般都是嵌入页面的,所以单独请求图片很少使用。


二、总结路径问题

1、web 发布装配是将Source 中目录中的内容复制到Deploy Path 所指定位置,以"/"代替项目根路径。

2、WEB-INF中的资源不能直接访问,只能通过servlet方式访问(无论是普通servlet,还是SpringMVC 的DispatcherServlet ),所以资源文件最好放在与WEB-INF同级的目录中,这样发布时便不需要再配置Web Deployment Assembly。






0 0