文章目录
WEB 相关概念回顾
软件架构
- C/S 客户端/服务器端
- B/S 浏览器/服务器端
资源分类
-
静态资源 所有用户访问到的内容是一样的
- html
- css
- js
可以被浏览器直接解析
-
动态资源 每个用户访问到相同的资源,可能有不同的结果
- servlet
- jsp
- php
- asp
动态资源先要转化成静态资源才能被解析访问
网络通信三要素
- IP 计算机在网络中的唯一标识
- 端口 应用程序在计算机中的唯一标识 0~65536 其中0~1024是被特定应用程序占用的
- 传输协议
- tcp 安全协议
- udp 不安全的协议
服务器
服务器是安装了服务器软件的计算机
常见的java相关的web服务器软件
- webLogic
- webSphere
- JBoss
- Tomcat 来自Apache基金组织(慈善机构),中小型的JavaEE服务器,支持少量的JavaEE规范 ,开源免费
JAVA EE 中有13种规范,我们学 Servlet 和 JSP
Tomcat
- bin 可执行文件,存放工具/命令(开启、关闭服务器)
- conf 配置文件
- web.xml - 服务器中应用相关
- server.xml - 服务器本身相关
- lib 依赖jar包
- logs 日志文件
- temp 临时文件
- webapps 存放web项目 (字节码文件)
- work
开启Tomcat
-
cd /Users/mac/Library/Tomcat/bin
-
sudo chmod 755 *.sh
赋予权限 -
sudo sh ./startup.sh
-
访问
localhost:8080
HTTP协议的默认端口号是 80 Tomcat的默认端口是8080
-
使用
shutdown
关闭
macOS 下使用 IDEA 配置 Tomcat
-
访问项目路径,在Tomcat/webapp下 http://localhost:8080/examples/index.html
examples目录 称作虚拟目录,index.html 称作资源
也可以将项目打包成
.war
格式,把它放到webapps/
下 ,这个war包会自动解压缩 -
通过更改配置文件,配置一个虚拟路径
配置 conf/server.xml文件 docBase是项目存放的路径 path是虚拟目录
<Context docBase=“项目存放目录” path=“虚拟目录”>
访问的时候使用path路径!
-
使用Catalina/localhost目录 (推荐此方法)
创建任意名字的xml文件,在文件中编写
<Context docBase=“项目存放目录” />
虚拟目录是xml文件的名称
动态项目
- 项目名称
- WEB-INF
- web.xml 该项目的核心配置文件 (在创建项目时可勾选)
- classes 放置字节码文件
- lib 放置项目依赖的jar包
- WEB-INF
常见错误
解决方法 :在终端中执行命令 sudo sh ./shutdown.sh
在IDEA启动时会自动开启Tomcat,所以手动开启Tomcat可能会冲突,先把Tomcat手动关闭即可。
Servlet (最重要)
是server applet的缩写,意为在服务器运行的小程序
Servlet 是一个接口,定义了Java类被访问器访问到的规则
快速入门
- 创建JAVA EE项目 基于Tomcat
- 定义一个类,实现Servlet接口
- 实现接口中的抽象方法
- 配置Servlet
配置Servlet
在web.xml文件中配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 配置servlet-->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>web.servlet.ServletDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>
执行原理
-
服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet资源路径
-
查找web.xml文件,遍历至
<url-pattern>/demo1</url-pattern>
-
找到
<servlet-class>web.servlet.ServletDemo01</servlet-class>
-
tomcat会将字节码加载进内存,并创建其对象
-
调用其方法
生命周期
这里有五个方法,逐一解析
-
init 被创建的时候 (只会被创建一次)
说明init是单例的,多个用户同时访问会存在安全问题
-
getServletConfig
-
service 提供服务时,可执行多次
-
getServletInfo
-
destory 被销毁时
服务器被关闭的时候被销毁,交代临终遗言,在Servlet被销毁之前执行
web.xml 中的配置
<servlet>
<servlet-name>demo2</servlet-name>
<servlet-class>web.servlet.ServletDemo02</servlet-class>
<load-on-startup>5</load-on-startup> 可选在启动时执行/在访问时执行
</servlet>
Servlet 注解
在Servlet 3.0 以上的版本中,支持注解配置(从JAVA EE6 开始支持Servlet3.0)
步骤
-
创建一个JAVA EE 项目 ,不勾选创建 web.xml
-
定义一个类,实现Servlet接口
-
复写方法
-
在类上使用@WebServlet 注解进行配置
@WebServlet(“资源路径”) 特别注意,虚拟路径是在run-config里边修改的,最好改成module名
推荐使用该方法,比在web.xml中修改要更加方便
IDEA 和 Tomcat相关的配置
- IDEA会为每一个Tomcat部署的项目单独建立一份配置文件 (可用IDEA可视化配置界面)
- WEB-INF目录下的资源不能被访问
- 断点调试使用小虫子按钮
体系结构
Servlet (接口) 接口需要实现 public class ServletDemo02 implements Servlet
GenericServlet (抽象类) 抽象类可以继承 public class ServletDemo02 extends GenericServlet
HTTPServlet (抽象类)
复习一下接口和抽象类的区别。
接口是对行为的抽象,继承是对根源的抽象
抽象类 接口 1.抽象类中可以定义构造器 1.接口中不能定义构造器 2.可以有抽象方法和具体方法,抽象类中可以没有抽象方法,有抽象方法的一定是抽象类 2.方法全部都是抽象方法 3.接口中的成员全都是 public 的 3.抽象类中的成员可以是 private、默认、protected、public 4.抽象类中可以定义成员变量 4.接口中定义的成员变量实际上都是常量 5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法 5.接口中不能有静态方法 6.抽象类中可以包含静态方法 6.一个类可以实现多个接口
GenericServlet
@WebServlet("/demo3")
public class ServletDemo03 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("this is demo3");
}
}
将Servlet中的其他方法做了默认空实现,只将Service()方法作为抽象
但是这个在实际中并不常用,常用的是HTTPServlet
HTTPServlet
这个是对HTTP协议的一个封装,HTTP有七种请求方式,针对各种情况,这边都已经封装好。
最常用的是 GET/POST
@WebServlet("/demo3")
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("do get!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("do post!");
}
}
对应的POST请求,写一个login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/demo3" method="post"> 请求方式为post
<input name="username">
<input type="submit" value="提交">
</form>
</body>
</html>
Servlet 相关配置
-
URLpattern 访问路径 以注解的方式
@WebServlet({"/demo3","/demo","thisDemo"})
可以有多个访问路径 {“路径1”,“路径2”,“路径…”}
-
路径定义规则
/xxx
/xxx/xxx
目录结构*.do
HTTP协议
Hyper Text Transfer Protocol 超文本传输协议 ,定义了客户端和服务器端通行时发送数据的方式
HTTP是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)
概念
-
基于 TCP/IP 协议
-
默认端口 80
-
基于请求/相应模型,一次请求对应一次相应
-
无状态:每次请求之间相互独立,不能交互数据
请求消息
客户端发送给服务器端的数据
1.0版本 每一次请求相应都会建立一个连接
1.1版本 复用连接
HTTP请求报文由3部分组成(请求行+请求头+请求体)
请求消息数据格式
在Chrome中查看请求的方式 - 右键 - 检查
-
请求行
- GET 请求参数在请求行中,在url后
- 请求的长度有限制
- 不太安全
- POST 请求参数在请求体中
- 请求的长度无限制
- 比较安全
- GET 请求参数在请求行中,在url后
-
请求头
-
Host
-
User-Agent 重要,告诉服务器我用的是什么浏览器,解决浏览器的兼容性问题
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求头数据中的 user-agent String agent = request.getHeader("user-agent"); System.out.println(agent); //可以判断浏览器版本 if(agent.contains("Chrome")){ System.out.println("chrome is coming"); }else if(agent.contains("Firefox")){ System.out.println("ff is coming"); }
-
Accept 响应格式
-
Referer 告诉服务器,我从哪里来
- 防盗链
- 统计工作
-
-
请求空行
- 用于分割POST请求的请求头和请求体
-
请求体
- 封装POST请求消息的请求参数
响应消息
服务器端发送给客户端的数据
数据格式
请求消息 | 响应消息 |
---|---|
请求行 | 响应行 |
请求头 | 响应头 |
请求空行 | 响应空行 |
请求体 | 响应体 |
![屏幕快照 2019-06-25 下午12.35.19](/Users/mac/Desktop/屏幕快照 2019-06-25 下午12.35.19.png)
响应体就是对应的HTML页面代码
-
响应行
-
组成: 协议/版本 响应状态吗 状态码描述
-
响应状态码:服务器告诉浏览器本次请求和响应的一个状态
状态码 情况 1xx 服务器接收客户端消息,但未完成,等待一段时间后发送1xx 2xx 成功 3xx 302重定向 (甩锅) 304 缓存 (访问本地缓存) 4xx 客户端错误 404 请求路径没有对应的资源 405 请求方式没有对应的doXXX方法 5xx 服务器错误 500 服务器内部异常 -
响应头
- Content - Type 告知浏览器本次响应的数据格式和编码格式
- Content - disposition 告知浏览器以什么格式打开响应体数据
- in-line 在页面中直接打开
- attachment; filename = xxx 以附件形式打开,其实就是下载
-
响应体 就是发送传输的数据
-