HTTP协议
- 请求部分 --- 说白了就是浏览器发送给服务器的数据格式
- 请求行 --- 提交方式,HTTP版本号etc
- 请求头 --- 键值对型式的数据
- user-agent --- 浏览器版本
- referer --- 页面来源(防盗链)
- 请求体 --- 具体数据
- get 没有,直接在地址栏显示
- post 有
- 响应部分 --- 服务器返回给浏览器的数据格式
- 响应行 --- 响应状态码,HTTP版本号etc
- 200 正常
- 404 找不到文件资源
- 500 服务器内部错误
- 302 重定向
- 304 本地缓存
- 响应头 --- 同样是键值对型式
- content-disposition ---设置该头信息可以告诉浏览器下载对应的文件
- location --- 重定向
- refresh --- 刷新页面(可以指定刷新之后的页面和刷新时间)
- content-type --- 告诉浏览器文件的类型
- 响应体 --- 具体显示在页面的数据
- 响应行 --- 响应状态码,HTTP版本号etc
servlet继承体系
Servlet接口
-
init(),service(),destroy()...
-
GenericServlet实现类 --- (sun公司的野心)
getServletConfig(),getServletContext()...
-
HttpServlet子类 -- (专门针对HTTP协议的)
doGet(HttpServletRequest req,HttpServletResponse resp) doPost(HttpServletRequest req,HttpServletResponse resp) ...
-
ServletContext接口
API:
- 定义一组方法,servlet 使用这些方法与其 servlet 容器进行通信,例如,获取文件的 MIME 类型、分发请求或写入日志文件。
作用
1.获得全局初始化参数
-
2.获得文件的MIME的类型
getMimeType(String filename)
-
3.作为域对象存取数据
setAttribute(String name,Object object),getAttribute(String name),removeAttribute(String name)
-
4.读取web项目中的文件
InputStream getResouceAsStream(String path) --- 直接返回输入流对象 getRrealPath(String path) --- 返回文件路径 ---------------------------------------------------------------------- 以后用万能方法(万能方法与ServletContext接口没有关系) --- 项目名.Class.getClassLoader.gerResouceAsStream(../相对classes目录下的文件所在的路径,这里是一个相对路径)
HttpServletRequest和HttpServletResponse
继承体系
根接口 -- ServletRequest (sun公司设计之初的野心,期望将来如果有其他协议可以使用此根接口,使用时只需对此根接口进行扩充即可)
- 子接口 -- HttpServletRequest (用来扩充ServletRequest根接口的,扩充
ServletRequest
的接口可以提供额外的特定协议的数据(例如, HTTP 数据是由HttpServletRequest
提供的.
- request --- 请求
- 创建和销毁:客户端向服务器发送请求,服务器创建一个request,服务器对本次请求做出响应后,request被服务器销毁
- 作用范围:一次请求
- response --- 响应
- 服务对客户端的请求做出响应
session和cookie
-
首先明确几个基本概念:
- 会话:从打开浏览器到关闭浏览器称为一次会话,会话中可能存在多次请求和响应
- cookie和session都是会话技术
- 为什么使用会话技术:私有的数据,购物信息数据保存在会话技术中
- 一次请求:从浏览器发出请求到服务第一次响应叫一次请求
- 会话:从打开浏览器到关闭浏览器称为一次会话,会话中可能存在多次请求和响应
session和cookie存在的意义在于存储页面数据,例如访问记录,登录记录,购物车信息,表单记录等等,这也就是为什么使用会话技术
-
什么时候用cookie什么时候用session?
- session和cookie原则上讲可以互换使用【不知道理解的对不对】,只不过session更安全,存储的数据也没有大小限制,但是消耗服务器资源;cookie相对不安全,存储的数据个数和大小(4K)均有限制。。
-
session
- 基于cookie的服务器为每个用户单独开辟的存储空间,不同于cookie存贮在浏览器中,session是存贮在服务器上的,浏览器每次访问服务器时将存在cookie中的sessionID发送给服务器,服务器根据这个sessionID将数据检索出来使用。
-
cookie
需要特别注意的是:在编写cookie工具类时,requeset.getCookies()得到的是一组cookie,对cookie[]数组遍历得到的是cookie对象,cookie对象是以键值对型式存在,需要根据键找值,因此判断某个name的cookie是否存在必须是name.equals(cookie.getName())
-
在需要对cookie进行清空时:
Cookie cookie = new Cookie("history", null); cookie.setMaxAge(0);//这句必须有,这样才能删除持久性cookie
转发和重定向
-
转发和重定向:
- 转发:服务器自己跳转到指定位置,
是由浏览器自己转发,一次请求一次响应(也就是所谓的同一次请求),只能转发到当前服务器中request.getRequestDispatcher("/转发的页面或servlet路径").forword(request,response)
- 重定向:是服务器告诉浏览器页面重定向到哪里,两次请求两次响应,重定向可以定向到任一网站
- 转发和重定向都是服务器在接到客户端的请求后服务器内部自己处理这次请求的方式,之前一直把转发理解为浏览器行为,以为是浏览器自己转发,实际上是服务器接到一次请求后自己跳转到指定位置,且只能是当前服务器中的位置**
- 转发:服务器自己跳转到指定位置,
什么时候用转发什么时候用重定向
JSP
-
为什么要用JSP开发动态页面(与服务器、数据库进行通信,页面的数据动态显示)
-
因为如果单纯使用servlet开发,写一个页面就会如下:
request.getWriter().print("<form action = '' method = ''>"); request.getWriter().print("<div></div>"); request.getWriter().ptint("</form>");
-
有了JSP技术,配合JSTL标准标签库和EL表达式就会大大简化页面的开发
像以上代码可以直接写在JSP中作为HTML,与servlet的连接可以采用以下例子的方式: <c:forEach items="${cart}" var="cart" varStatus="status"> <div>${cart.key } --- ${cart.value }</div> </c:forEach>
-
-
JSP内置对象
- 内置对象:顾名思义就是可以在JSP中直接使用的java对象
内置对象
- 例如 JSP内置对象就是能在JSP中直接使用的对象,即可以用这些对象调用对应的方法
-
JSP 的9大内置对象及其对应的servlet对象
- request --- HttpServletRequest
- response --- HttpServletResponse
- session --- HttpSession
- Applacation --- ServletContext
- page --- Object
- pageContext --- pageContext
- out --- JspWriter
- exception--- throwable
- config --- servletConfig
-
EL常用内置对象
- pageContext --- 数据类型就是pageContext,用于获取其他8个JSP内置对象,然后再在el表达式中调用
- pageScope --- 以下4个都是map集合对象
- requestScope
- sessionScope
- applicationScope
- cookie
- 此外还有获取页面参数,获取请求头,获取全局初始化参数等等其余5个标签
- 我所理解的JSP内置对象和EL内置对象的区别和关系
- 首先明确一点的是,JSP内置对象的使用必须写在<% %>,<%! %>,<%= %>这三个脚本中,而EL表达式的出现则是为了解决JSP书写麻烦的问题,EL表达式中的对象中有一个特殊的pageContext,借助这个内置对象可以获取JSP中的其他8个内置对象,进而实现JSP内置对象所能实现的所有功能,此外,还包含了四个JSP的作用域,以及一个cookie对象,这样通过EL表达式就可以完成对JSP页面中java代码的编写。
作用域
- JSP中有四个作用域【这个作用域到底是个范围概念,使用时得用对应的JSP对象调用方法例如:
pageContext.setAttribute()和request.getAttribute(),同时设置的这个数据还有作用的范围
】- pageScope
- requestScope
- sessionScope
- applicationScope