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
<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
后面通过增加发布路径,具体如下:
增加发布路径:
说明:为了保持结构一致,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 同级的文件夹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。
上一篇: 头疼的图片上传显示问题
下一篇: struts标签的使用总结