本博文讲述jsp客户端与服务器端的http、jsp内置对象与控制流和数据流实现
1.HTTP请求响应机制
HTTP协议是TCP/IP协议中的一个应用层协议,用于定义客户端与服务器之间交换数据的过程
1.1 HTTP请求
HTTP请求由请求行、消息报头、空行和请求数据4部分组成。
- 请求行由请求方法、URI和HTTP协议版本3个字段组成,之间用空格分隔。常用的请求方法有GET和POST
- 消息报头由报头域/值对组成,每行一对,报头域和值用英文冒号":"分隔。用于向服务器传递请求的附加信息及客户端本身的信息。典型的请求消息报头有Host、User-Agent、Accept等
- 空行表示消息报头的结束
- 请求数据在post方法中使用,get方法不需要请求数据。
1.2 HTTP响应
HTTP响应由状态行、消息报头、空行和响应数据4部分组成
- 状态行由HTTP协议版本、响应状态代码和响应状态文本描述3个字段组成,之间用空格分隔。常见的响应状态代码及文本描述1有200 ok(表示客户端请求成功)、404 NOT Found(表示请求资源不存在),500 Internal Server Error(表示服务器发生不可预期的错误)
- 消息报头由报头域/值对1组成,每行一对,报头域和值用英文冒号":"分隔,用于服务器向客户端传递不能在状态行放置的附加响应信息,以及关于服务器的信息和对请求资源进行下一步访问的消息。典型的响应消息报头有Date、ContentType、Content-Length等
- 空行表示响应消息报头的结束
- 响应数据是服务器在本次响应中返回给浏览器的数据。
1.3 HTTP会话机制
HTTP协议是一种无状态协议,不保存客户端每次提交的信息。一个HTTP会话代表服务器与浏览器的一次会话过程,这个过程包含连续或时断时续的多次请求响应。
2. JSP内置对象
jsp有9个内置对象
内置对象名称 | 类型 | 作用域 | 用途 |
---|---|---|---|
request | javax.servlet.ServletRequest | request | 封装了客户端的请求信息,例如包含了通过GET/POST方式传递的参数等信息 |
response | javax.servlet.ServletResponse | page | 封装了服务器端响应信息,例如包含了服务端发送到客户端的响应内容等信息 |
pageContext | javax.servlet.jsp.PageContext | page | 封装了当前页面的属性信息 |
session | javax.servlet.http.HttpSession | session | 封装了当前请求的会话信息 |
application | javax.servlet.ServletContext | application | 封装了整个应用共享的信息 |
out | javax.servlet.jsp.JspWriter | page | 用于向客户端输出信息 |
config | javax.serevlet.ServletConfig | page | 封装了JSP页面对应Servlet的配置信息 |
page | java.lang.Object | page | JSP页面类的实例,即JSP页面本身被编译后生成一个名为page的实例对象 |
exception | java.lang.Throwable | page | 封装了发生的异常信息 |
2.1 request对象
当用户通过浏览器向Web服务器发出请求时,Web服务器接收到用户的请求信息,在进行必要的逻辑处理后,对该请求作出响应。
方法声明 | 功能简介 |
---|---|
getParameter(String name) | 获取客户端提交的名称为name的请求参数值,不存在则返回null |
getParameterValues(String name) | 获取客户端提交的名称为name的所有请求参数值,不存在则返回null |
setCharacterEncoding(String emv) | 设置请求数据的字符编码类型 |
getCharacterEncoding() | 获取请求数据的字符编码类型 |
setAttribute(name,Object o) | 设置请求中name的属性值为0 |
getContentLength() | 获取请求数据的长度,单位是字节,长度未知则返回-1 |
getContentType() | 获取请求数据MIME类型;类型未知则返回null |
getProtocol() | 获取客户端向服务器传送数据的通信协议名称和版本 |
2.2 response对象
response对象代表服务器对客户端做出的响应,将JSP页面的运行结果返回给客户端,与request对象结合起来完成动态页面的交互功能。
方法声明 | 功能简介 |
---|---|
setContentType(String type) | 设置响应数据的MIME类型 |
getContentType() | 获取响应数据的MIME类型 |
setHeader(String name,String value) | 设置指定的响应报文头 |
sendRedirect(String location) | 重定向到地址为locatioin的Web资源 |
addCookie(Cookie cookie) | 向响应中添加cookie,用于在客户端保存信息 |
getWriter() | 获取响应的printWriter对象,用于输出响应数据 |
flushBuffer() | 立即将缓冲区的内容发送到客户端 |
对比项 | 请求转发 | 页面重定向 |
---|---|---|
URL地址的限制 | 只能在同一个应用中转发 | 可以1跳转到任意的URL |
地址栏URL是否有变化 | 不变 | 有变化 |
客户端请求的次数 | 一次 | 两次 |
行为的主体 | 服务端的行为 | 客户端的行为 |
请求信息是否可以共用 | 共用相同的request,所以请求的信息不会丢失 | 两次请求使用不同的request,所以请求的信息会丢失 |
2.3 Cookie机制
客户端应答速度较快,而cookie是保存信息文本。cookie机制
方法声明 | 功能简介 |
---|---|
getName() | 获取cookie的名称 |
getValue() | 获取Cookie的值 |
setValue(String value) | 创建cookie后,为褀其设置新的值、 |
getMaxage() | 获取Cookie的最大生存周期(以秒为单位),默认情况下,-1表示Cookie将持续下去,直到浏览器关闭 |
setMaxage(int expiry) | 设置Cookie过期时间(以秒为单位) |
getPath() | 返回Cookie适用的路径 |
setPath(String uri) | 设置Cookie适用的路径,如果不指定路径,与当前页面相同目录(包括1子目录下的所有URL都会返回Cookie |
2.4 session对象
方法声明 | 功能简介 |
---|---|
getAttribute(String name) | 获取session对象中国名为name的属性值,不存在则为null |
removeAttribute(String name) | 删除session对象中名称为name的属性 |
setAttribute(String name,Object value) | 设置session对象的属性,属性名为name,属性值为value |
2.5 out对象
方法声明 | 功能简介 |
---|---|
println(String x) | 向客户端发送数据的输出字符串换行 |
print(String s) | 向客户端输出字符串 |
newLine() | 向客户端输出换行,同println()类似 |
isAutoFlush() | 判断是否是自动向客户端输出缓冲区的数据 |
getBufferSize() | 获取缓冲区大小 |
getRemaining\ 获取缓冲区未使用的字节大小 |
2.6 application对象
JSP引擎启动时会产生一个application对象,之后该对象会一直保持到JSP引擎关闭。当不同用户请求可将用户信息保存在服务器端,直到服务器关闭。
方法声明 | 功能简介 |
---|---|
getAttribute(String name) | 获取application内置对象中名称为name的属性值,不存在则返回null |
reemoveAttribute(String name) | 删除application内置对象中名称为name的属性 |
setAttribute(String name,Object object) | 设置application内置对象中属性,名称为name,属性值为object |
getRealPath(String path) | 获得虚拟路径path对应的实际路径 |
getContextPath() | 获取当前web应用程序的根目录 |
3. 控制流和数据流的实现
3.1 JSP页面间流程控制
- 超链接方法
- 表单提交方法
- 页面重定向方法
- 请求转发方法
3.2 JSP页面间数据传递
- 表单传参
- URL传参
- /jsp:param标记传参
- 作用域传参(application,session,request,page)