欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-17 08:13:59
...

一、探讨资源路径问题

目录结构:

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

目标:在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 文件夹中找到项目及内部的图片。

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

增加发布路径:

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

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


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


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

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


测试,此时图片是在项目文件夹下的(发布后,可看到图片存在于与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。






相关标签: 路径 jsp 图片