一、相关概念
软件架构
- C/S:客户端/服务端
- B/S:浏览器/服务端
资源分类
- 静态资源:所有用户访问后,得到的结果都是一样的,可以直接被浏览器解析
- 动态资源:每个用户访问相同资源后得到的结果不一样,被访问后需要先转换为静态资源,后返回给浏览器
网络通信三要素
- IP:电子设备在网络中的唯一标识
- 端口:应用程序在计算机中的唯一标识。0-65535
- 传输协议:规定了数据传输的规则
tcp:安全协议,三次握手
udp:不安全协议
二、Web服务器软件:Tomcat
几款软件
- webLogic:oracle公司,大型JavaEE服务器
- webSphere:IBM公司,大型JavaEE服务器
- JBOSS:JBOSS公司,大型JavaEE服务器
- Tomcat:Apache基金组织,中小型JavaEE服务器
java
- JavaEE:Java语言在企业级开发中使用的技术规范总和,共规定了13项大的规范。
Tomcat
- 下载
- 安装
- 卸载
- 启动
sudo ./startup.sh
http://localhost:8080
- 关闭
sudo ./shutdown.sh
- 配置
部署项目的方式:将项目放到webapps目录下,war包会自动解压缩
配置conf/server.xml文件,在表情中配置:
在conf/Catalina/localhost文件夹下创建xml文件,编写:,文件名称就是虚拟路径
静态项目和动态项目
目录结构
Java动态项目的目录结构
项目目录
- WEB-INF目录
|- web.xml:web项目的核心配置文件
|- classes目录:放置字节码文件的目录
- lib目录:放置依赖的jar包
三、Servlet
核心知识
概念: server applet,运行在服务器端的小程序。servlet就是一个接口,定义了Java类被浏览器访问识别。
代码实现
创建JavaEE项目
实现类,实现Servlet接口
实现所有接口
- init
- ServletConfig
- service
- getServletInfo
- destroy
配置Servler,需要在web.xml文件中
在web.xml文件中添加<servlet>
和<servlet-mapping>
标签:即servlet的类路径(反射)和url的资源路径来进行匹配。<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.yang.web.servlet.Demo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
执行原理
- 1.当服务器接收到客户端浏览器的请求后,会解析请求URL路径,来获取访问的Servlet的资源路径
- 2.查找web.xml文件,是否有对于的
<url-pattern>
标签内容 - 3.如果有,则会找到对应的
<servlet-class>
全类名 - 4.tomcat会将字节码文件加载进内存,并创建其对象
- 5.调用方法
Servlet的生命周期
- init:初始化,只会在调用服务时才会检测是否已经初始化,懒加载。如果需要创建服务自动初始化需要在
<servlet>
标签中添加<load-on-startup>
设置大于等于0即可。 - ServletConfig:设置config,config内容可以在
init
函数中获取到,获取的内容需要在web.xml
文件中的<Servlet>
标签中添加<init-param>
标签以Key-Value添加即可 - service:每次调用服务就会运行
- getServletInfo:获取基本信息
- destroy:销毁。只有服务器正常关闭才会运行。
Servlet3.0
支持注解配置,不需要web.xml文件。
直接使用@WebServlet("路径")
即可
Servlet的体系
|
- GenericServlet:将Servlet接口中其他方法做了默认空实现,只将servlet()方法作为抽象。
- HttpServlet:对http协议的一种封装,简化操作。
Servlet相关配置
1.urlpartten:Servlet访问路径
一个Servlet可以定义多个访问路径{"/路径1","/路径2","路径3"}
/路径1
/路径1/路径1.1
*.后缀名
四、Http
概念
Hyper Text Transfer Protocol 超文本传输协议
* 传输协议:定义了客户端与服务端通信的数据格式
* 特点
* 基于TCP/IP协议
* 默认端口号80
* 基于请求/相应模型,一次请求响应一次响应
* 无状态:每次请求之间相互独立
* 历史版本
* 1.0:每次响应都会建立新的连接
* 1.1:复用响应
请求消息数据格式
请求行
请求方式 请求url 请求协议/版本
Get /login.html HTTP/1.1
- 请求方式(7中)
- GET
请求参数在url中
url长度是有限制的
不太安全 - POST
请求参数在请求体中
相对安全
- GET
请求头
请求头名称: 请求头值(多个则用,分割)
常见请求头
- User-Agent:浏览器告诉服务器,使用的浏览器版本信息,这样服务器会根据这些信息完成兼容性
- Accept:能解析的格式
- Accept-Language:语言
- Accept-Encoding:压缩方式
- Referer:告诉服务器,当前请求从哪里来,用于防盗链和统计工作
- Connection:是否保持连接
- Upgrade-Insecure-Requests:升级信息
请求空行
空行用于分割请求头与请求体
请求体(请求正文)
五、Request
request对象与response对象的原理
- 1.tomcat服务器会根据请求url中的资源路径,创建对应的Servlet对象
- 2.tomcat服务器,会创建request和response对象,request对象中封装请求消息数据
- 3.tomcat将request和response对象传递给service方法,并调用该方法
- 4.我们通过request对象获取我们想要的内容,然后通过response对象响应出去
- 5.服务器在给浏览器作出响应之前,会从response对象中拿出设置的响应数据
最重要为下面两点
request和response对象是由服务器创建的
request对象是来获取请求消息,response对象是来设置响应消息
request功能
获取请求数据
获取请求行数据
GET /day/demo?name=zhangsan HTTP/1.1- 获取请求方式:GET
String getMethod()
- 获取虚拟目录:/day
String getContextPath()
- 获取Servlet路径:/demo
String getServletPath()
- 获取get方式请求参数:name=zhangsan
String getQueryString()
- 获取请求uri:/day/demo
String getRequestURI():/day/demo
String getRequestURL():http://localhost/day/demo
- 获取协议及版本:HTTP/1.1
String getProtocol()
- 获取客户机IP地址
String getRemoteAddr()
- 获取请求方式:GET
获取请求头数据
- 通过请求头名称获取请求头值
String getHeader(String name)
- 获取所有的请求头名称
Enumeration<String> getHeaderNames()
- 通过请求头名称获取请求头值
获取请求体数据
- 1.获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
- 2.再从流对象中拿数据
- 1.获取流对象
其他功能
1.获取请求参数通用方式
- 根据参数名称获取参数值
String getParameter(String name)
- 根据请求参数名称获取参数的数组
String[] getParameterValues(String name)
- 获取所有请求参数的参数名称
Enumeration<String> getParameterNames()
- 获取所有参数的map集合
Map<String, String[]> getParameterMap()
- 中文乱码问题
tomcat8以上get请求完成中文乱码,而post请求依旧乱码
request.setCharacterEncoding("utf-8");
- 根据参数名称获取参数值
2.请求转发:一种在服务器内部的资源跳转方式
- 通过request对象获取请求转发器对象
RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发
forward(ServletRequest request, ServletResponse reponse)
- 特点
1.浏览器地址路径不发生编号
2.只能转发到当前服务器内部资源
3.转发是一次请求
- 通过request对象获取请求转发器对象
3.共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法
setAttribute(String name, Object obj) 存储数据
Object getAttribute(String name) 获取值
removeAttribute(String name) 移除值
4.获取ServletContext
ServletContext getServletContext()
六、Response
HTTP协议的响应消息
响应消息
数据格式
- 响应行
HTTP/1.1 200 OK
1.组成:协议/版本 响应状态码 状态码描述
2.响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。分为五类:服务器接收客户端消息,但没有接收完成,等待一段时间后发送1XX、成功2XX、重定向3XX(30重定向,304访问资源)、客户端错误4XX(404请求路径没有对应资源,405请求方式没有对应的功能函数doXXX)、服务器端错误5XX。 - 响应头
头名称: 头值
Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
Content-disposition:服务器告诉客户端以什么格式打开响应数据> in-line:默认值,在当前页面内打开 > attachment;filenamt=xxx:以附件形式打开响应体。文件下载
- 响应空行
- 响应体:传输的数据
- 响应行
响应字符串格式
Response对象
功能:
- 1.设置响应行
- 格式 HTTP/1.1 200 ok
- 2.设置状态码 setStatus(int sc)
- 2.设置响应头:setHeader(String name, String value)
- 3.设置响应体
- 1.获取输出流
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream() - 2.使用输出流,将数据输出到客户端浏览器上
- 1.获取输出流
重定向
重定向与转发的区别
1.重定向地址栏发生变化
2.重定向可以访问其他站点资源
3.重定向是两次请求路径写法
1.相对路径
找到当前资源与目标资源关系,./文件夹路径
2.绝对路径
以/开头,去除URL三个基本后剩下的部分,需要确定是客户端发出还是服务端发出:客户端需要加虚拟目录,服务器端不需要加虚拟目录。
服务器输出字符数据
首先需要注意乱码问题:response.setContentType("text/html;charset=utf-8");
通过response.getWriter()
获取流。
服务器输出字节数据
通过response.getOutputStream()
获取流。
验证码
ServletContext对象
概念:代表整个Web应用,可以和程序的容易来通信。
功能:
- 1.获取MIME类型
- MIME类型:在互联网通信过程中的一种文件类型标准。大类型/小类型。
- String getMIMEType(String type)
- 2.域对象:共享数据
- 3.获取文件的真实路径