Servlet 笔记
B/S 浏览器/服务器
网络通信
- IP
- 端口
- 传输协议
- 基本协议
- TCP:安全协议,三次握手,速度慢
- UDP:不安全,速度快
- 基本协议
C/S 客户端/服务器
服务器(Tomcat)
安装了服务器软件的计算机
服务器软件:接收请求,处理请求,做出响应
web服务器软件
在web服务器软件,部署项目,浏览器访问 (web容器)
常见的Java相关web服务器:
webLogic : oracle
- webSphere : IBM
JBOSS : JBOSS
TomCat : Apache基金组织
download
下载
解压
- 安装路径无中文
启动
修改端口号:
conf/server.xml
关闭
ctrl + c
配置部署
放到
webapps
目录下/hello : 虚拟目录/访问目录
简化部署:打包为 war包,自动解压和删除
配置路径
Server.xml -> TomCat的整体配置文件
<Host> <Context docBase="D:\\" path="\"/> </Host>
热部署
/conf/Catalina/localhost
下创建
xxx.xml
文件
动态项目与静态项目
动态:
-- 根目录
-- WEB-INF 目录
--classes : 字节码文件
--lib : jar包
-- web.xml : 配置
Servlet : server applet
一个接口
被浏览器访问到(TomCat识别)
快速入门
创建JavaEE项目
实现Servlet接口
- Servlet接口 service 方法,提供服务
实现抽象方法
配置
Web.xml
<servlet>
<servlet-name>add_servlet</servlet-name>
<servlet-class>com.servlet.AddServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>add_servlet</servlet-name>
<url-pattern>/page/求和/hello</url-pattern>
</servlet-mapping>
原理
示例
Servlet 方法
注意配置Servlet
init : 初始化方法 在Servlet创建时执行,只会执行一次
何时创建
默认第一次被访问
<servlet> <servlet-name>Demo1</servlet-name> <servlet-class>com.KawYang.Servlet.Demo1Test</servlet-class> <!-- 1. 第一次访问时 负数 -1 2. 服务器启动时 正数 0 或 1--> <load-on-startup>-1</load-on-startup> </servlet>
Servlet 是单例的
- 多个用户访问
存在线程安全问题
- 解决:尽量不在Servlet定义成员变量,即使定义了成员变量,不要对其修改值
- 多个用户访问
Service : 提供服务的方法,每次Servlet被访问时执行
destroy : 销毁方法,在Servlet
正常关闭
时执行- 服务器被关闭时执行
- Servlet 结束之前
ServletConfig : Servlet配置
getServletInfo : 获取版本,作者…
Servlet 生命周期
创建 -> 提供服务 -> 被销毁
Servlet 3.0
支持注解配置,不需要 xml
注解配置
配置资源路径
@WebServlet(urlPatterns = "/Demo1")
@WebServlet("/Demo1") //value 可以省略
public class Demo1Test implements Servlet {
@Override
...
}
IDEA与Tomcat
IDEA会为 每个web项目创建一份配置文件
08-Jun-2020 15:32:33.041 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /Users/mac/Library/Caches/IntelliJIdea2019.3/tomcat/_Demo1
工作空间项目 和 TomCat部署的文本项目
- 真正访问的是
部署
项目,对应工作空间下 web文件的所有内容 - WEB-INF 下文件不能被访问
- 真正访问的是
断点调试
Debug 运行
Servlet体系结构
Servlet (接口) -> GenericServlet (类)-> HttpServlet (类)
GenericServlet
其他方法默认空实现,只将Service进行抽象
HttpServlet
对Http协议 简化操作 和 Web的封装
- 继承HttpServlet
- 复写
doGet、doPost
配置
- urlPatterns : 访问路径 可以定义多个,名为value 可以省略
- /xx
- /xx/xx
- 目录结构
- /* 优先级最低
* .do
- 不能用/
Http
特点
基于 TCP/IP 的高级协议
默认端口 80
- 基于请求响应模型的。一次请求对应一个响应
- 无状态协议:每次请求之间相互独立,不能交互数据
历史版本
1.0 : 每次请求都建立新的连接
1.1:复用连接
请求消息数据格式
请求行 : 请求方式 请求url 请求协议/版本
- GET : 在请求行中,url中 ,长度有限,不安全
- POST : 数据在请求体中,长度无限制,安全
请求头 : 名称 : 值
Referer :从哪里来,
- 防盗链
- 统计
Connection : keep-alone 复用
请求空行 : 空行,分割作用
请求体 : userName=Jary
Request
- 服务器创建 Request 和 response
- Request 获取请求消息,response 设置响应消息
Request 继承结构
。。。
Request功能
请求行数据
- GET /test/Demo1?name=zhangsan HTTP/1.1
- 方法
- String getMethod() : GET
- String getContextPath() : 虚拟路径 /test
- String getServletPath() : Servlet 路径 /Demo1
- String getQueryString() : 参数name=zhangsan
- String getRequestURI() :/test/Demo1
- String getRequestURL() : http://loaclhost/test/Demo1
- String getProtocol() : HTTP/1.1 版本
- String getRemoteAddr() : 客户IP
- URL : 统一资源定位符
http://loaclhost/test/Demo1
- URI :统一资源标识符
/test/Demo1
请求头数据
- 方法
- String getHeader(String name) : 获取请求头信息
- Enumeration
getHeaderNames() : 获取请求头名称
- 方法
请求体数据
- 还有POST方式,才有请求体
- 步骤:
- 获取流对象
- getReader() : 获取字符输入流,智能操作字符
- ServletInputStream getInputStream() : 获取字节输入流,可操作所有类型数据
- 再从流对象中拿出数据
- 获取流对象
BufferedReader br = req.getReader(); String line = null; while((line = br.readerLine()) != null){ System.out.println(line); }
其他方法
获取请求参数
- String getParameter(String name) => 获取值
- String getParameterValues(String name) => hobby=xx&hobby=game
- Enumeration
GetParameterNames() => 获取名称 - Map
getParameterMap() => 获取所有参数的集合
中文乱码
Tomcat8 解决get中文乱码
req.setCharacterEncoding("utf-8");
请求转发 :exclamation:
获取请求转发器对象
使用转发
req.getRequestDispatcher("http://www.baidu.com").forward(req, resp);
特点
- 浏览器地址栏没有变
- 服务器内部资源
- 转发使用一次请求
共享
- 域对象 : 一个有作用范围的对象
- request域:一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法
- setAttribute(String name, Object obj) : 存储数据
- getAttribute(String name) : 取值
- removeAttribute(String name) : 删除
- 域对象 : 一个有作用范围的对象
获取ServletContext
ServletContext servletContext = request.getServletContext(); System.out.println(servletContext);
登录练习 :exclamation:
响应消息数据格式
响应消息
响应行
- 格式 : 协议/版本 响应状态码 状态码描述
- 状态码:三位
- 1xx : 服务器接收客户端消息,没有接收完成
- 2xx : OK
- 3xx : 重定向 302 ,资源跳转;304 访问缓存
- 4xx :客户端错误, 404 ; 405 无Post/Get方法
- 5xx :服务器错误
响应头
- 头名称 : 值
- Content-Type : 响应体数据编码格式
- Content-disposition : 打开响应体格式
- 默认 : in-line 当前页面中展示
- attachment;filename=xxx : 附件格式打开,文件下载
响应空行
响应体
- 传送的数据
方法
状态码:setStatus(int c)
响应头 : setHeader(String name, String value)
响应体 :
步骤
- 获去输出流
- 字符输出流
- PrintWriter getWriter()
- 字节输出流
- ServletOutputStream getOutputStream()
- 字符输出流
- 使用输出流输出到浏览器中
- 获去输出流
练习:exclamation:
重定向
//自动跳转到Demo2 重定向
//设置状态码
resp.setStatus(302);
// 设置头
resp.setHeader("location", "/HomeWork/responseDemo2");
resp.sendRedirect("/HomeWork/responseDemo2");
$ \color {red}{ forword 和 Redirect 区别}$
特点
- 地址栏发生变化
- 可访问其他服务器的资源
- 两次请求
- 不能共享数据
路径
绝对路径: 确定唯一资源
规则: 判断定义的路径是给谁用的
客户端: 添加虚拟目录(项目访问路径) => 重定向 : 建议动态获取
String contextPath = req.getContextPath();
服务器:不需要加虚拟目录 => 转发
“/HomeWork/responseDemo2” 省略 http://loaclhost:8080
相对路径 : 不可以确定唯一资源 , 不 以
/
开头,或./
开头 可以不写找到当前路径和目标资源之间的相对关系
- 服务器输出字符数据
- 服务器输出字节流
- 验证码
转发
req.getRequestDispatcher("responseDemo3").forward(req, resp);
ServletContext对象
- 代表整个web应用,可以和程序的容器
tomcat
进行通讯 - 功能
- 获取 MIME类型:
- 域对象 : 共享数据
- 获取文件的真实
服务器
路径
获取
request.getServletContext
httpServlet.getServletContext -> this.geServletContext
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
this.getServletContext();
req.getServletContext();
}
}
获取 MIME类型:
MIME ,或联网通信过程中定义的一种文件数据类型
- 格式 : 大类型/小类型 text/ html image/jpeg
String getMimeType(String file)
tomcat下的
web.xml
ServletContext servletContext = req.getServletContext(); String file = "a.jpg"; String mimeType = servletContext.getMimeType(file); System.out.println(mimeType);
域对象 : 共享数据
- setAttribute(String name, Object value)
- getAttribute(String name)
- removeAttrivute(String name)
- 范围 :共享所有用户的请求数据
获取文件的真实
服务器
路径- String getRealPath(String path)
- 配置文件 src web WEB-INF
- web => /xxx
- WEB-INF => /WEB-INF/xx
- src
已经配置到服务器
=> /WEB-INF/classes/xx
案例 : 文件下载
页面显示下载链接
点击链接弹出下载提示框
使用响应头设置资源的打开方式
Content-dispostion:attachment;filename=xxx
下载
步骤:
- 定义页面,编辑超链接href属性 ,指向Servlet ,传递资源名
- 定义Servlet
- 获取文件名
- 加载进内存
- 指定响应头
- 写出到response对象中
中文乱码
- 获取浏览器
- 返回不同的编码方式设置filename