jsp中的路径与跳转
在jsp(serlvet)中,页面的"变换"有两种方式,第一重定向,第二转发:
先说重定向,它的调用方式是这样的
response.sendredirect("uri");
特点就是 转换后的uri地址会在地址栏显示不过之前的request里的数据不能传送给新的页面#
重定向就是,让服务器再发一个请求#
如下图,浏览器看到response里面的sendredirect,就会重新发一个请求,那么之前的请求所带的数据自然就没有了#
转发:
实现方式是这样的:
RequestDispatcher dispatcher=request.getRequestDispatcher("b.jsp")
dispatcher.forward(request,response);
它的特点刚好与重定向相反,转发的新的地址不会再浏览器地址栏上出现,不过request的信息在新的页面里仍然可以使用#
大致的示意图如下:
步骤2与步骤3的运行都在服务器内部,它对用户(浏览器)来说是透明的,那么新的地址,肯定不会显示在地址栏上,而且之前的request信息自然就可以用了#
先看项目框架图:
资源引用
我们先看jsp中关于资源的引用
b.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<img width="400" height="300" src="../images/b.jpg" /> 这是第一张<br/>
<img width="400" height="300" src="data:images/b.jpg" /> 这是第二张<br/>
<img width="400" height="300" src="/images/b3.jpg" /> 这是第三张<br/>
<img width="400" height="300" src="<%=request.getContextPath()%>/images/b.jpg" /> 这是第四张<br/>
<img width="400" height="300" src="PathTest/images/b.jpg" /> 这是第五张<br/>
当我们直接访问b.jsp时,效果如下
根据上面的图,我们至少能得到一个结论
在jsp中,默认的根路径是并不是项目的地址,而是只到端口号那一层#即 http://ip:port/
因而,我们在jsp中引用图片,js等资源的时候,可以用两种方式
相对地址: 就是第一张图片的样子#
绝对地址: 地址以"/"开始,并且得包括项目名称#访问第四张图片的方式,tomcat容器会解析成<img width="400" height="300" src="/PathTest/images/b.jpg" /> 这是第四张<br/>
服务器端跳转
OK我们看第一个例子:
a.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<img width="400" height="300" src="../images/a.jpg" />
<a href="../testServlet">去b页面</a>
testServlet.java
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// request.getRequestDispatcher("jsp/b.jsp").forward(request, response);
request.getRequestDispatcher("/jsp/b.jsp").forward(request, response);
}
如果使用服务器跳转,那么默认路径就是当前的项目,因而,上面两种url方式(不管url前面是否有"/")都可以#
(我解释一下,这个默认路径与上文说的jsp的默认路径不是一回事,这里是说,在代码层次,或者说在容器里,跳转到视图时,根路径指的是当前项目的路径#这个大家得明白#)
OK,我们跳转到了b.jsp
看看效果
由于是服务器端跳转,地址还是servlet的,并没有改变#
那么大家想想http://localhost:8900/PathTest/testServlet 在这个地址下(记着是服务器端跳转,"b.jsp"这个页面对用户来说就是透明的,你压根就不知道你到底访问的是那个页面# 另一方面,servlet的地址是:http://localhost:8900/PathTest/testServlet, 目录却是:http://localhost:8900/PathTest)
此时访问图片1的模式 ../images/b.jpg访问的图片地址其实就是:http://localhost:8900/images/b.jpg 怎么可能会有照片?
所以,在项目中,图片一的那种相对路径的方式是没办法两全其美的#
所以最好使用,图片四的访问方式,用绝对路径#
客户端跳转
我们改动servlet,如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("/jsp/b.jsp");
}
进入a.jsp,然后点击去b页面,效果如下:
我们把servlet换成:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("jsp/b.jsp");
}
点击去b页面后,地址栏成为http://localhost:8900/PathTest/jsp/b.jsp
显示出图片一与图片四
通过上面的例子,我们又可以得出结论
客户端跳转时,它的路径并不是相对于当前的项目#
所以,如果使用绝对路径,那么就得加上项目名称如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect(request.getContextPath()+"/jsp/b.jsp");
}
参考资料:
本文大范围的参考了
http://cxshun.iteye.com/blog/1123913
这篇博客,特此说明,并表示感谢
jsp中的路径与跳转的更多相关文章
- 关于在jsp中的路径问题
前言: jsp作为javaweb开发中常见的视图技术,我们平时在开发项目使用的过程中,经常会导入一些静态资源,比如css\js\jpg.png等图片格式的文件,这些文件的路径成了问题,经常会出现索引不 ...
- jsp中超链接路径的写法
主题 超链接不就是一个地址字符串吗?这能有什么花头? LZSB! 曾经我也是这么想的.... 最近对apache的学习让我对网页中超链接,CSS,js的路径的写法有了一些新的认识. 所以这篇文章主要分 ...
- jsp中的路径问题
在学jsp的时候我每次都遇到路径的问题,每次都不能够说100%的把这搞定,这让我很烦恼,今天下午花了点时间来把路径问题整理了下. 一:首先我们在加载项目(我的项目名称是FinalExam)是的路径是h ...
- jsp中的两种跳转方式分别是?有什么区别?
在JSP中跳转有两种方式 forward跳转:<jsp:forward page ="跳转页面地址"> response跳转:response.sendRedirect ...
- Jsp中解决session过期跳转到登陆页面并跳出iframe框架的方法
1.可以用javaScript解决在你想控制跳转的页面,比如login.jsp中的<head>与</head>之间加入以下代码: <script language=”Ja ...
- JSP中的路径
我的原则 所有路径一律使用绝对路径,就是以"/"开头的或者带host的路径.形如: /imgs/1.jpg <%= request.getContextPath()%> ...
- jsp中的setHeader页面跳转备忘录
1 <!-- response.setHeader("refresh","3;url=你想跳的页面")--> <%-- response.se ...
- JSP中的两种跳转方式分别是什么,有什么区别?
forward跳转:<jsp:forward page ="跳转页面地址"> response跳转:response.sendRedirect("跳转页面地址 ...
- JSP中解决session超时跳转到登陆页面并跳出iframe框架或局部区域的方法
当session会话超时,页面请求被重新定位到了登陆界面.但登录界面在iframe中的解决方案:在登录页面中加入下面的js代码: <script type="text/javascri ...
随机推荐
- Android Studio精彩案例(七)《ToolBar使用详解<一>》
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 本文参考博客:http://blog.csdn.net/h_zhang/article/details/51232773 http:/ ...
- Lucene查询索引
索引创建 以新闻文档为例,每条新闻是一个document,新闻有news_id.news_title.news_source.news_url.news_abstract.news_keywords这 ...
- ThreadLocal深入剖析
JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序,Threa ...
- Spark技术内幕:Shuffle Read的整体流程
回忆一下,每个Stage的上边界,要么需要从外部存储读取数据,要么需要读取上一个Stage的输出:而下边界,要么是需要写入本地文件系统(需要Shuffle),以供childStage读取,要么是最后一 ...
- Android中GridView的一些特殊属性
GridView的一些特殊属性: 1.android:numColumns="auto_fit" //GridView的列数设置为自动 2.android:columnWidt ...
- Unity UGUI图文混排(五) -- 一张图集对应多个Text
继上一篇说的更新了一张图集对应多个Text的功能,为了节省资源嘛 这里,但是也没有舍弃之前的一个Text一个图集,因为我感觉应该两个都有用,于是我重新写了一个脚本 1.其实大体跟前面的都没变,解析标签 ...
- ThreadLocal的使用[代码片段]
1.ThreadLocal定义,在一个类中定义: 在类A中: private static ThreadLocal<String> kcsHtmlPath = new ThreadLoca ...
- Python装饰器模式学习总结
装饰器模式,重点在于装饰.装饰的核心仍旧是被装饰对象. 类比于Java编程的时候的包装模式,是同样的道理.虽然概念上稍有不同但是原理上还是比较相近的.下面我就来谈一谈我对Python的装饰器的学习的一 ...
- Dynamics CRM 将实体从高级查找列表中移除不可见
有时我们不需要将某个实体显示给一般用户比如配置实体,但是这种类型的实体有时候又需要给一般用户读权限ODATA的时候得能读,站点地图上的隐藏比较容易用工具配置下权限即可.其实做到这步一般就可以了但有的客 ...
- 【OpenGL】详解第一个OpenGL程序
写在前面 OpenGL能做的事情太多了!很多程序也看起来很复杂.很多人感觉OpenGL晦涩难懂,原因大多是被OpenGL里面各种语句搞得头大,一会gen一下,一会bind一下,一会又active一下. ...