Web部分
web相关概念回顾
软件架构
- C/S:客户端/服务器端
- B/S:浏览器/服务器端
资源分类
- 静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源
- 如:html,css,JavaScript
- 动态资源:每个用户访问相同资源后,得到的结果可能不一样。称为动态资源,动态资源被访问后,需要先转换为静态资源,在返回给浏览器.
- 如 : servlet/jsp,php,asp....
网络通信三要素
- IP:电子设备(计算机)在网络中的唯一标识。
- 端口:应用程序在计算机中的唯一标识。 0~65536(不建议1024之内的。可能被操作系统占用)
- 传输协议:规定了数据传输的规则
- 基础协议
- tcp:安全协议,三次握手。 速度稍慢
- udp : 不安全协议。 速度快
- 基础协议
web服务器软件:
服务器:
安装了服务器软件的计算机
服务器软件:
接收用户的请求,处理请求做出响应
web服务器软件
接收用户的请求,处理请求,做出响应。
- 在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目
- web容器
常见的java相关的web服务器软件 :
- webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
- websphere: IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
- JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
- Tomcat : Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源的,免费的。
JavaEE:
Java语言在企业级开发中使用的技术规范的总和,一共规定了13项大的规范
Tomcat:web服务器软件
markdown
1. 下载:官网https://tomcat.apache.org/
2. 安装:解压压缩包
- 注意:安装目录建议不要有中文和空格
3. 卸载:删除目录
4. 启动:
- bin/startup.bat,运行该文件
- 访问:浏览器输人 :http://localhost:8080 回车访问
- 可能遇到的问题 :
1. 黑窗口一闪而过 :
- 原因: 没有正确配置JAVA HOME环境变量
- 解决方案:正确配置JAVA HOME环境变量
2. 启动报错 :
- 暴力:找到占用的端口号并目找到对应的进程,杀死该进程
- netstat -ano
- 找到pid,结束进程
- 温柔:修改自身的端口号
- conf/server.xml
- <Connector port="8080"……>
- 修改为其他
5. 关闭
1. 正常关闭
- bin/shutdown.bat
- ctrl+c
2. 强制关闭
- 关闭窗口
6. 配置
1. 部署项目的方式
1. 直接将项目放到webapps目录下即可
1. /hello:项目的访问路径-->虚拟目录,/helloworld资源文件
2. 简化部署:将项目打包成war包,再将war包放在webapps目录下
1. war包会自动解压缩,删除也会自动删除
2. 配置conf/server.xml文件
1. 在`<Host>`标签体中配置
2. `<Contxt docBase="D:\hello" path="/hehe"/>`
3. docBace: 项目存放的路径
4. path:虚拟目录
3. 在conf/catalina/localhost创建任意名称的xml文件,在文件中编写
`<Contxt docBase="D:\hello">`
虚拟目录: xm1文件的名称
2. 静态项目和动态项目
1. 目录结构:
1. 项目的根目录
1. WEB-INF目录
1. web.xml : web项目的核心配置文件
2. classes目录:放置字节码文件的目录
3. lib目录:放置依赖的jar包
3. 将Tomcat集成到IDEA中,并且创建JavaEE的项目,部署项目
Servlet入门学习
概念:
运行在服务端的小程序
- Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
- 将来我们自定义一个类,:实现servlet接口,复写方法。
快速入门:
创建JavaEE项目
定义一个类,实现servlet接口
实现接口中的抽象方法
配置servlet
在web.xml里
- xml
<servlet> <servlet-name>demo1</servlet-name> <servlet-class>myservlet.demo</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo1</servlet-name> <url-pattern>/demo1</url-pattern> </servlet-mapping>
执行原理:
- 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源
- 路径查找web.xm1文件,是否有对应的
<url-pattern>
标签体内容。 - 如果有,则在找到对应的
<servlet-class>
全类名 - tomcat会将字节码文件加载进内存,并且创建其对象
- 调用其方法
Servlet:
Servlet中生命周期:
- 被创建:执行init方法,只执行一次
- servlet什么时候被创建 ?
- 默认情况下,第一次被访问时,servlet被创建*可以配置执行servlet的创建时机。
- 可以配置执行servlet的创建时机。
- 在
<servlet>
标签下配置。- 第一次被访问时,创建
<load-on-startup>
的值为负数 - 在服务器启动时,创建
<load-on-startup>
的值为0或正整数
- 第一次被访问时,创建
- 在
- servlet的init方法,只执行一次,说明一个servlet在内存中只存在一个对象,Servlet是单例的
- 多个用户同时访问时,可能存在线程安全问题。
- 解决:尽量不要在servlet中定义成员变量。即使定义了成员变量,也不要对修改值
- servlet什么时候被创建 ?
- 提供服务:执行service方法,执行多次
- 每次访问servlet时,service方法都会被调用一次
- 被销毁:执行destory方法,只能执行一次
- servlet被销毁时执行。服务器关闭时,servlet被销毁
- 只有服务器正常关闭时,才会执行destroy方法。
- destroy方法在servlet被销毁之前执行,一般用于释放资源
Servlet3.0 的注解配置:
好处:支持注解配置,可以不需要web.xml
- 步骤:创建JavaEE项目,选择servlet的版本3.o以上,可以不创建web.xml
- 定义一个类,实现servlet接口
- 复写方法
- 在类上使用
@WebServlet
注解@WebServlet("/资源路径")
相关配置:
Servlet结构体系:
servlet --接口 | GenericServlet --抽象类 | Httpservlet --抽象类
Genericservlet:将servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
- 将来定义servlet类时,可以继承GetdericServlet,实现service()方法即可
Httpservlet :对http协议的一种封装,简化操作
- 定义类继承Httpservlet
- 复写doGet/doPost方法
servlet相关配置
servlet相关配置
- urlpartten:servlet访问路径
- 一个servlet可以定义多个访问路径 @webservlet(["/d4","/dd4", "/ddd4"})
- 路径定义规则
- /xxx
- /xxx/xxx 目录结构
/xxx/*
/*
优先级最低,如果是随便输入, 其他访问完没有才访问/*
- *.do :访问时为demo.do
HTTP
概念:
Hyper Text Transfer Protocol 超文本传输协议
- 传输协议:定义了,客户端和服务器端通信时,发送数据的格式
- 特点:
- 基于TCP/IP的高级协议
- 默认端口:80
- 基于请求/响应模型的:一次请求对应一次响应
- 无状态的 :每次请求之间相互独立,不能交互数据
- 历史版本:
- 1.0每一次请求响应都会建立新的连接
- 1.1复用连接
请求消息数据格式
- 请求行
- 请求方式 请求url 请求协议版本
- GET /login.html HTTP/1.1
- 请求方式
- HTTP协议有7种请求方式,常用的有2种
- GET:
- 请求参数在请求行中,在url后
- 请求的url长度有限制
- 不太安全
- POST:
- 请求参数在请求体中
- 请求的url长度没有限制
- 相对安全
- GET:
- HTTP协议有7种请求方式,常用的有2种
- 请求头
- 请求头名称: 请求头值
- 常见的请求头:
- USER-Agent:浏览器告诉服务器,我访问你使用的浏览器版本
- 可以在服务器端获取该头的信息,解决浏览器的兼容性问题
- Accept:可以接收的某某格式的信息响应
- Accept-Language:支持的语言环境
- Accept-Encoding:支持的压缩格式
- Referer :
http://localhost/login.html
- 告诉服务器,我(当前请求)从哪里来 ?
- 作用
- 防盗链
- 统计工作
- 作用
- 告诉服务器,我(当前请求)从哪里来 ?
- Connection:连接是否可以被复用
- USER-Agent:浏览器告诉服务器,我访问你使用的浏览器版本
- 请求空行
- 空行,就是用于分割POST请求的请求头,和请求体的
- 请求体(正文)
- 封装POST请求消息的请求体的
响应消息数据格式
Request
request对象和response对象的原理
- request和response对象是由服务器创建的。我们来使用它们
- request对象是来获取请求消息,response对象是来设置响应消息
request对象继承体系结构
- ServletRequest -- 接口 | 继承
- HttpServletRequest --接口 | 实现
- org.apache.catalina.connector.RequestFacade 类(tomcat)
request: 获取请求消息
获取请求消息数据
- 获取请求行数据
- GET /day14/demo1?name=zhangsan HTTP/1.1
- 方法:
- 获取请求方式:GET
- string getMethod()
- 获取虚拟目录:/day14
- string getContextPath()
- 获取Servlet路径: /demo1
- string getservletPath()
- 获取get方式请求参数:name=zhangsan
- string getQueryString()
- 获取请求URI:/day14/demo1
- string getRequestURI(): /day14/demo1
- stringBuffer getRequestURL():
http://localhost/day14/demo1
- URL:统一资源定位符:
http://localhost/day14/demo1
- URI:统一资源标识行 : /day14/demo1(范围更大)
- URL:统一资源定位符:
- 获取协议及版本:HTTP/1.1
- string getProtocol()
- 获取客户机的IP地址 :
- string getRemoteAddr()
- 获取请求方式:GET
- 获取请求头数据
- 方法
String getHeader(String name)
:通过请求头的名称获取请求头的值(多用)Enumeration<string> getHeaderNames()
:获取所有的请求头名称
- 方法
- 获取请求体数据
- 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
- 步骤
- 获取流对象
- 再从流对象中获取数据
- 获取请求行数据
其他功能
获取请求参数通用方式:不论是get还是post请求方式,都可以用下列方法来获取请求参数
String getParameter(String name)
:根据参数名称获取参数值String getParameterValues(String name)
:根据参数名称获取参数值的数组 hobby=xx&hobby=gameEnumeration<string> getParameterNames()
:获取所有请求的参数名称Map<String,String[]> getParameterMap()
:获取所有参数的map集合- 中文乱码问题
- get方式:在tomcat 8已经将get方式乱码问题解决了
- post方法:在获取参数前,设置request的编码
request,setCharacterEncoding("utf-8”);
- 中文乱码问题
请求转发:一种在服务器内部的资源跳转方式
- 步骤:
- 通过request对象获取请求转发器对象: RequestDispatcher getRequestDispatcher(string path)
- 使用RequestDispatcher对象来进行转发: forward(ServletRequest request,ServletResponse response)
- 特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中。
- 步骤:
共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据removeAttribute(String name): 通过键移除键值对
获取servletContext
ServletContext getservletContext()
pip install jupyter_contrib_nbextensions
jupyter contrib nbextension install --user
pip install --user jupyter_nbextensions_configurator
jupyter nbextensions_configurator enable --user