JavaWeb - Tomcat&Http&Servlet
JavaWeb - Tomcat&Http&Servlet
1 Tomcat
1.1 软件架构
-
C/S架构 - client/server
- 优点:体验好
- 缺点:对客户端和服务器都进行维护
-
B/S架构 - browser/server
- 特殊的c/s架构
- 优点:维护简单,因为通过浏览器直接访问不需要下载客户端
- 体验稍差
1.2 资源的分类
-
静态资源:
- 同一资源不同用户看到同样内容
- html,js,css
-
动态资源:
- 浏览器只能解析静态资源,响应前需要转换(tomcat)
- 同一资源不同用户看到不同内容
- jsp,aspx,php
1.3 URL请求路径
Uniform Resource Locator 统一资源定位符,互联网上资源有唯一URL
格式:
协议://域名:端口号/资源位置?参数=值
- 协议:http,https,ftp
- 域名或IP地址,访问web资源
- 端口号:程序需要端口让另一台计算机访问,http默认端口80
- 资源位置:web资源在服务器上的位置
- 参数=值:浏览器和服务器交互传递的数据
常见web服务器:
- Tomcat - 58%
- JBoss/WildFly - 20%
- Jetty - 10%
- Glassfish - 5.55%
- Weblogic - 2.8%
1.4 Tomcat的内容目录
1.4.1 内容目录
1.4.2 启动关闭Tomcat脚本
1.4.3 Tomcat启动报错
-
1 窗口弹出一闪而过
- 需配置好Java环境变量 - JAVA_HOME
-
2 8080端口被占用
- 2.1 找到占用端口相关进程并杀死进程
- 2.2 修改Tomcat端口号
- 3 如需启动两个tomcat除了设置该位置两个不同的端口
- 还需修改关闭端口
- 4 启动日志乱码问题
1.5 Tomcat项目发布三种方式
1.5.1 webapps部署
- 热部署,不需要重启Tomcat即可更新资源
- 更新需要在该目录下使用更新后的项目替换
1.5.2 server.xml 部署
- 在该文件中
标签中添加 标签 - 配置文件修改完成后,需要重启生效
1.5.3 独立xml部署
- 在tomcat/Catalina/localhost 目录下创建xml文件并添加
标签 - 支持热部署
1.6 IDE配置Tomcat
1.6.1 项目结构
1.6.2 页面资源热更新
2 Http
2.1 Http协议
2.1.1 特点:
- 基础协议:TCP协议
- 默认端口号:80端口
- 基于请求/响应模型:请求和响应成对出现,先请求后响应
- 无状态协议:各请求间相互独立,不能交互数据
2.1.2 版本
- Http/1.0 发送请求,创建一次连接,获得一个web资源,连接断开
- 每次请求都是一个新的连接,根据TCP建立
- Http/1.1 发送请求,创建一次连接,获得多个web资源,连接断开
- 长连接,多个请求可以复用同一个连接
2.1.3 报文格式
请求报文:客户端发送给服务器端的报文
响应报文:服务器端返回给客户端的报文
2.1.3.1 请求报文
格式:请求行,请求头,空行,请求体
请求行:
- 请求方式
- 协议规定7种,常用2种(get和post)
- get 请求参数拼接在URL后不安全
- URL长度限制get请求数据的大小
- 无请求体
- post请求数据大小没有限制,且请求参数安全
- URL
- 协议版本
请求头:key:value对
-
http协议类型,编码,发送内容长度等
-
Referer:直接访问没有,转发则告诉请求来自何处
-
Cookie:存放浏览器缓存cookie信息
-
User-Agent:浏览器与操作系统信息
空行
请求体:表单 POST方式提交的数据(请求参数)
- 多值使用&连接
2.1.3.2 响应报文
格式:响应行,响应头,空行,响应体
响应行:
- 协议/版本
- 状态码
- 200:请求成功
- 302:请求重定向
- 304:访问本地缓存
- 404:请求资源不存在
- 500:服务器内部错误,通常程序抛异常
- 状态码描述
响应头:
- Location:指定响应的路径,与302状态码搭配使用完成跳转
- Content-Desposition:文件下载时使用,以下载的方式解析正文
- Set-Cookie:服务器向浏览器写入Cookie
- Refresh:定时刷新
空行
响应体:返回给浏览器的数据
3 Servlet
3.1 概述
接口,类想被浏览器访问需要实现该接口
接受请求,处理逻辑,响应结果
3.2 快速实现
-
web项目
-
java类实现业务逻辑并实现servlet接口
-
web.xml种配置url-pattern:通过反射机制创建该对象并调用该对象里service方法
-
精确匹配
-
目录匹配:/aa/*
-
后缀匹配:*.xxx 比如 *.do
-
部署web项目
3.3 生命周期
默认生命周期
-
开启Tomcat不会创建实例
-
第一次访问该servlet创建实例(单实例)并调用init方法
-
接着调用service方法
-
之后每次请求访问都通过该实例创建线程访问
-
服务器关闭,servlet销毁执行destory方法
-
可以通过配置
在启动tomcat是实例化servlet对象,默认值是-1,不自动创建,建议数值4-N
体系结构
接口 Servlet:顶级接口,提供5个声明方法
|
抽象类 GenericServlet:抽象类,只需重写service方法即可
|
抽象类 HttpServlet:抽象类,处理http协议中的交互(请求,响应),根据不同请求方式做出处理,重写doGet和doPost方法
3.4 Request对象
Tomcat将HTTP请求所有信息都封装到Request对象中
Request对象API获取请求行,请求头,请求体
接收请求参数中文乱码:
- get: tomcat8及以上,内部URL编码(UTF-8),不会中文乱码
- post:
- 客户端(浏览器)编码:UTF-8
- 服务器默认解码:ISO-8859-1 拉丁文
- setCharacterEncoding("UTF-8"); 方法内首行
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求行
System.out.println("请求方式"+req.getMethod());
System.out.println("项目名"+req.getContextPath());
System.out.println("URL"+req.getRequestURI());
System.out.println("协议版本"+req.getProtocol());
System.out.println("IP"+req.getRemoteAddr());
System.out.println("--------------------------------------------");
//获取请求头
System.out.println(req.getHeader("Host"));
//获取请求头所有信息
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()) {
String s = headerNames.nextElement();
System.out.println(s+":"+req.getHeader(s));
}
System.out.println("--------------------------------------------");
//获取请求参数
System.out.println("用户名"+req.getParameter("username"));
//获取多个值的参数
String[] hobbies = req.getParameterValues("hobby");
System.out.print("hobby: ");
for (String hobby : hobbies) {
System.out.print(hobby+" ");
}
System.out.println();
//获取所有
Map<String, String[]> parameterMap = req.getParameterMap();
parameterMap.forEach((k,v)->{
System.out.print(k+":");
for (String s : v) {
System.out.print(s+" ");
}
System.out.println();
});
System.out.println("--------------------------------------------");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
doGet(req,resp);
}
}
3.5 请求转发
API:
-
request对象获取转发器对象
- RequestDispatcher getRequestDispatcher(String path)//要跳转到的资源路径
-
转发器对象实现转发
- void forward(ServletRequest request, ServletResponse response)
特点:
- 浏览器:发出一次请求
- 地址栏:没有变化
- 转发只能是服务器内部资源
3.6 Request域对象
API:
-
设置数据
- void setAttribute(String naem)
-
获取数据
- Object getAttribute(String name)
-
删除数据
- void removeAttribute(String name)
生命周期:
- 创建:用户发送请求,创建request
- 销毁:服务器返回响应,销毁request
- 范围:一次请求,包含多次转发
3.7 Response对象
体系结构:
ServletResponse 接口
|
HttpServletResponse 接口
|
org.apache.catalina.connector.ResponseFacade 实现类(tomcat提供)
响应行:
API:
- 设置状态码
- void setStatus(int sc)
响应头:
API:
- 设置指定头名称和值
- void setHeader(String name,String value)
响应体:
API:
-
字符输出流
- PrintWriter getWriter()
-
字节输出流
- ServletOutputStream getOutputStream()
同一servlet种两种输出流不能同时存在
3.8 响应重定向
方式一:
-
设置状态吗
- response.setStatus(302);
-
设置响应头Location
- response.setHeader("Location","重定向的网络地址")
方式二:
response.sendRedirect("重定向的网络地址")
特点:
- 地址栏会发生改变
- 重定向是而此请求
- 客户端(浏览器行为),可跳转到服务器外部资源
- 不能用request域共享数据
中文乱码:服务器 ISO-8859-1 浏览器GBK
-
第一种方式:指定服务器响应编码方式,写在首行
- resp.setCharacterEncoding("GBK")
-
第二种方式:统一浏览器和服务器编码
- resp.setContentType("text/html;charset=utf-8")
3.9 ServletContext 对象
3.9.1 作用
- 域对象(共享数据)
- 获取资源在服务器的真实地址
- 获取全局的参数配置
- 获取问MIME类型
3.9.2 获取方式
-
request对象获取
- req.getServletContext();
-
基层HttpServlet后直接调用
- this.getServletContext();
3.9.3 域对象
API:
-
存储数据
- void setAttribute(String name, Object value)
-
获取数据
- Object getAttribute(String name)
-
删除数据
- void removeAttribue(String name)
范围:
当前项目范围,多个servlet可共享
3.9.4 获取资源在服务器真实地址
API:传入项目下的映射路径,获取真实路径
- String getRealPath(String path);
3.9.5 获取全局配置参数
<context-param>
<param-name>username</param-name>
<param-value>guanyu</param-value>
</context-param>
req.getServletContext().getInitParameter("username")
3.9.6 获取MIME类型
格式:大类型/小类型
- text/html image/jpeg
req.getServletContext().getMimeType(".jpg")

浙公网安备 33010602011771号