Servlet
Servlet是运行在Web服务器端的Java应用程序,由Java编写,具有Java语言的有点,其与Java程序最大的区别是,Servlet对象主要封装了对http请求的处理,在Web请求的处理功能方面也非常强大
概念:运行在服务器端的小程序
Servlet就是一个接口,定义了Java类被浏览器访问到(tomact识别)的规则
特点:
1.功能强大
2.可移植性
3.性能高效
4.安全性高
5.可扩展
Servlet结构体系
GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
HttpServlet:对http协议的一种封装,简化操作
1. 定义类继承HttpServlet
2. 复写doGet/doPost方法
Servlet配置
1.声明Servlet对象
<servlet>
<servlet-name>SimpleServlet</servlet-name>
<servlet-class>com.Yummy。SimpleServlet</servlet-class>
</servlet>
2.映射Servlet
<servlet-mapping>
<servlet-name>SimpleServlet</servlet-name>
<url-pattern>/SimpleServlet</url-pattern>
</servlet-mapping>
urlpartten:Servlet访问路径
1. 一个Servlet可以定义多个访问路径 : @WebServlet({"…"})
2. 路径定义规则:
1. /xxx:路径匹配
2. /xxx/xxx:多层路径,目录结构
3. *.do:扩展名匹配
执行原理:
1.当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servelt的资源路径
2.查找web.xml文件,是否由对应的<erl-pattern>标签体内容
3.如果有,则在找到对应的<servlet-class>全类名
4.tomact会将字节码文件加载进内存,并创建其对象
5.调用其方法
Servlet3.0
好处:支持注解配置,可以不需要web.xml
HTTP
概念:Hyper Text Transfer Protocol 超文本传输协议
传输协议:定义了,客户端和服务器端通信时,发送数据的格式
特点:
1. 基于TCP/IP的高级协议
2. 默认端口号:80
3. 基于请求/响应模型的:一次请求对应一次响应
4. 无状态的:每次请求之间相互独立,不能交互数据
历史版本:
1.0:每一次请求响应都会建立新的连接
1.1:复用连接
Request
1. request对象和response对象的原理
1. request和response对象是由服务器创建的。我们来使用它们
2. request对象是来获取请求消息,response对象是来设置响应消息
2. request对象继承体系结构:
ServletRequest -- 接口
| 继承
HttpServletRequest -- 接口
| 实现
org.apache.catalina.connector.RequestFacade 类(tomcat)
3. request功能:
1. 获取请求消息数据
1. 获取请求行数据
方法:
1. 获取请求方式 :GET
String getMethod()
2. ★获取虚拟目录:
String getContextPath()
3. 获取Servlet路径:
String getServletPath()
4. 获取get方式请求参数:
String getQueryString()
5. ★获取请求URI:/day14/demo1
String getRequestURI()
StringBuffer getRequestURL()
URL:统一资源定位符
URI:统一资源标识符
(URI的范围更大)
6. 获取协议及版本:
String getProtocol()
7. 获取客户机的IP地址:
String getRemoteAddr()
2. 获取请求头数据
方法:
★String getHeader(String name):通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames():获取所有的请求头名称
3. 获取请求体数据:
请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参 数
步骤:
1. 获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所 有类型数据
2. 再从流对象中拿数据
4. 其他功能:
1. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
1. String getParameter(String name):根据参数名称获取参数值
2. String[] getParameterValues(String name):根据参数名称获取参数值的数组
3. Enumeration<String> getParameterNames():获取所有请求的参数名称
4. Map<String,String[]> getParameterMap():获取所有参数的map集合
中文乱码问题:
get方式:tomcat 8 已经将get方式乱码问题解决了
post方式:
解决办法:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
2. 请求转发:在服务器内部的资源跳转方式
1. 步骤:
1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
2. 特点:
1. 浏览器地址栏路径不发生变化
2. 只能转发到当前服务器内部资源中。
3. 转发是一次请求
3. 共享数据:
域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
1. void setAttribute(String name,Object obj):存储数据
2. Object getAttitude(String name):通过键获取值
3. void removeAttribute(String name):通过键移除键值对
4. 获取ServletContext:ServletContext getServletContext()
Response
HTTP协议:
1. 请求消息:客户端发送给服务器端的数据
数据格式:
1. 请求行
2. 请求头
3. 请求空行
4. 请求体
2. 响应消息:服务器端发送给客户端的数据
数据格式:
1. 响应行
1. 组成:协议/版本 响应状态码 状态码描述
2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
1. 状态码都是3位数字
2. 分类:
1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
2. 2xx:成功。如:200
3. 3xx:重定向。如:302(重定向),304(访问缓存)
4. 4xx:客户端错误。
如:
404(请求路径没有对应的资源)
405:请求方式没有对应的doXxx方法
5. 5xx:服务器端错误。如:500(服务器内部出现异常)
2. 响应头:
1. 格式:头名称: 值
2. 常见的响应头:
1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
in-line:默认值,在当前页面内打开
attachment;filename=xxx:以附件形式打开响应体。文件下载
3. 响应空行
4. 响应体:传输的数据
Response对象
功能:设置响应消息
1. 设置响应行
1. 格式:HTTP/1.1 200 ok
2. 设置状态码:setStatus(int sc)
2. 设置响应头:setHeader(String name, String value)
3. 设置响应体:
步骤:
1. 获取输出流
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream()
2. 使用输出流,将数据输出到客户端浏览器
会话技术
1. 会话:一次会话中包含多次请求和响应。
一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
2. 功能:在一次会话的范围内的多次请求间,共享数据
3. 方式:
1. 客户端会话技术:Cookie
2. 服务器端会话技术:Session
Cookie:
1. 概念:客户端会话技术,将数据保存到客户端
(Cookie 是一些数据, 存储于你电脑上的文本文件中。
当 web 服务器向浏览器发送 web 页面时,在连接关闭后,服务端不会记录用户的信息)
步骤:
1. 创建Cookie对象,绑定数据
new Cookie(String name, String value)
2. 发送Cookie对象
response.addCookie(Cookie cookie)
3. 获取Cookie,获得数据
Cookie[] request.getCookies()
2. 实现原理 : 基于响应头set-cookie和请求头cookie实现
3. cookie在浏览器中保存的时间:
1. 默认情况下,当浏览器关闭后,Cookie数据被销毁
2. 持久化存储:
setMaxAge(int seconds)
1. 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
2. 负数:默认值
3. 零:删除cookie信息
4. cookie共享问题
1.假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
默认情况下cookie不能共享,如果要共享,则可以将path设置为"/"
setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
5. Cookie的特点和作用
1. cookie存储数据在客户端浏览器
2. 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
作用:
1. cookie一般用于存出少量的不太敏感的数据
2. 在不登录的情况下,完成服务器对客户端的身份识别
缺点:
1.cookie会被附加在每个HTTP请求中,无形中增加了流量。
2.由于在HTTP请求中的cookie是明文传递的,安全性成问题。
3. 浏览器限制Cookie的数量和大小。对于复杂的存储需求来说是不够用的。