重定向302+Location消息头
(1)什么是重定向?
服务器通知浏览器向某个地址发送请求
注:服务器可以通过发送302状态码以及Location消息头(该消息头的值是一个地址,一般称之为重定向地址给浏览器),
浏览器收到之后,会立即向重定向地址发送请求.
(2)如何重定向
response.sendRedirect(String url);
url:重定向地址
(3)重定向的一个细节
重定向之前,容器回先清空response对象上存放的所有数据
注:实体内容为空
setTimeout(function(){
location="list";
},1000); //一秒钟后访问,与重定向无关
(4)重定向的特点
- 重定向的地址url是任意的
- 重定向之后浏览器的地址会发生变化
JSP java server page
(1) jsp是什么?
sun公司指定的一种服务器端的动态页面技术规范
注:因为虽然可以使用Servlet生成动态页面,但是过于频繁(需要使用大量的out.println()语句),并且不好维护
(修改页面,就必须修改java源代码,所以sun公司才制定了jsp规范).
jsp是一个以.jsp为后缀的文件(主要内容为html和少量的java代码),容器会将jsp文件转换成一个对应的Servlet然后运行.
jsp的本质就是一个Servlet,只不过是容器自动生成的
(2) jsp文件中可以添加哪些内容?
1)html(css、js)
直接写即可
2)java代码
- 方式一:java代码片段<br>
<% java代码 %>
- 方式二:jsp表达式
<%= java表达式 %>
3)隐含对象
- 什么是隐含对象?
在jsp里面内,不需要说明,直接可以使用的对象:
`out`,`request`,`response`,
- 为什么可以直接用隐含对象?
容器在将jsp转换成对应的Servlet时,会自动添加获得这么对象的代码
4)jsp指令
- 什么是指令?
通过指令可以告诉容器,将jsp转换成Servle时进行一些额外的处理,比如导包.
- 语法:
<%@ 指令名 属性=值 %>
注:如果有多个指令用空格隔开
- page指令
import属性:指定要导入的包名,比如:
<%@page import="java.util.*,java.text.*"%>
如果要导多个包,使用`,`隔开.或者再写一个page
contentType属性:设置response.setContentType()的值"text/html;charset=utf-8"
影响由jsp生成的servlet的Java文件的编码方式
pageEncoding属性:告诉容器(Tomcat),在读取jsp文件的内容时,使用该属性指定的字符集去解码
`实际开发中,在本地服务器运行正常,换一台服务器出现乱码?`
(3) jsp文件如何执行的?
1) 阶段一:容器先将jsp转换成一个对应的Servlet
- html(css,js)------>在service方法中,使用out.write()输出
- <% java代码块%>---------->在service方法里面不改变
- <%= %>-------------->在service方法中使用out.print()输出
2) 阶段二:容器调用该Servle
- 需要将Servlet编译,然后实例化,调用对应的service方法。
为什么jsp第一次运行时比较慢,后来就块了?
第一次访问jsp时,需要将jsp中的java代码转化为对应的java类,客户端发送请求到容器,容器才会将jsp转化为对应的servlet
转发
(1)什么是转发?
- 一个web组件将未完成的处理,通过容器交给另外一个web组件继续做
注:web组件:指的是`servlet`或者是`jsp`
(2)如何转发?
- step1:绑定数据到请求对象上
request.setAttribute(String name,Object obj);
注:name---绑定名
obj---绑定值
String request.getAttribute(String name);//依据绑定名得到绑定值,有可能返回空值
- step2:获得转发器
RequestDispatcher rd = request.getRequestDispatcher(String url);
注:url:另外一个web组件的地址(转发的地址),通常是一个jsp(常用)或者servlet,通常是一个servlet获得数据之后转发给jsp来展现.
通常情况下:reqeust.getRequestDispatcher(url).forward(request,response);
- step3:转发
rd.forward(request,response);
(3)转发的特点
- 转发的地址是有限制的,要求属于同一个web应用
- 转发之后浏览器地址栏地址不变(服务器内部跳转,浏览器是不知道的)
登录操作分析
转发和重定向的区别
1) 能否共享请求对象?
- 转发可以共享request:转发是一次请求和响应期间的行为
- 重定向不可以共享request:重定向是两次请求与响应的行为
注:当请求到达容器,容器创建request对象和response对象,当response发送完毕,容器会销毁两个对象,也就是说,request对象和response对象的生存时间是一次请求和响应期间存在.
2) 目的地是否有限制?
- 转发要求转发地址属于同一个web应用
- 重定向地址是任意的
3) 浏览器地址栏是否有变化?
- 转发没有变化
- 重定向有变化
4) 一件事是否已经做完?
- 转发是一件事没有做完,让另一个web组件继续做这件事
- 重定向是一件事已经做完,再做另外一件事