servlet和http基础
概念
-
运行在服务器的小程序
-
servlet就是一个接口,定义了java类被浏览器访问到的规则。
-
在java中,我们自己定义的类,实现servlet接口,复写方法。
-
入门程序
-
定义一个JavaEE项目
-
定义一个类,实现servlet接口,实现接口的抽象方法
-
配置web.xml配置文件
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
执行原理
-
当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
-
查找web.xml文件,是否有对应的<url-pattern>标签体内容。
-
如果有,则在找到对应的<servlet-class>全类名
-
tomcat会将字节码文件加载进内存,并且创建其对象
-
调用其方法
Sevlet的生命周期方法
-
被创建,执行init方法,只执行一次
-
默认情况下servlet,第一次访问时,servlet被创建
-
可以修改的创建时机
<load-on-startup>-1</load-on-startup> //设置为负数,第一次访问时被执行
<load-on-startup>0</load-on-startup> //设置为0或整数,服务器启动时执行-
init方法只执行一次,说明内存中 只存在一个对象,servlet是单例的
-
多个用户访问时,可能存在线程安全问题
-
尽量不要在servlet中定义成员变量,定义了,也不要对其修改值
-
-
-
提供服务,执行service方法执行多次(方法参数为servletRequest和servletResponse)
-
被销毁,执行destory方法,只执行一次
-
只有服务器正常关闭后,才会执行destory方法
-
destory方法在servlet被销毁之前执行,一般用于释放资源
-
Sevlet3.0
-
支持注解配置,可以不需要web.xml了
-
使用步骤
-
创建javaEEx项目,选择Servlet的版本3.0以上;
-
定义一个类,实现sevlet接口
-
复写方法
-
在类上使用@WebServlet注解,进行配置
-
@WebServlet("资源路径")
-
loadOnStartup也可以配置
-
-
IDEA与tomcat的相关的配置
IDEA会为每一个tomcat部署的项目单独建立一份配置文件
查看控制台的log:Using CATALINA_BASE: "C:\Users\fqy.IntelliJIdea2018.1\system\tomcat_itcast"
工作空间项目 和 tomcat部署的web项目
tomcat真正访问的是“tomcat部署的web项目”,"tomcat部署的web项目"对应着"工作空间项目" 的web目录下的所有资源
WEB-INF目录下的资源不能被浏览器直接访问。
可以通过转发,重定向访问
Servlet体系结构
Servlet -- 接口 | GenericServlet -- 抽象类 | HttpServlet -- 抽象类
-
GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
-
将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
-
-
HttpServlet:对http协议的一种封装,简化操作
-
定义类继承HttpServlet
-
复写doGet/doPost方法
-
(建议使用HttpServlet)
Servlet路径配置
-
一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
-
路径定义规则:
-
/xxx:路径匹配
-
/xxx/xxx:多层路径,目录结构
-
*.do:扩展名匹配 *此处不要加/
Http
概念:超文本传输协议
-
超文本:图片,链接,视频等文件
-
传输协议:定义了客户端和服务端通信时,发送数据的格式;
特点
-
基于TCP/IP的高级协议
-
默认端口号:80
-
基于请求/响应模型,一次请求对应一次请求
-
请求头
GET/sample.jspHTTP/1.1
Host: wx.qq.com 主机名
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0 请求的浏览器类型
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 可以接收的响应格式内容
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 语言环境
Accept-Encoding: gzip, deflate, br 可以接收的压缩格式
Referer: https://www.baidu.com/link?url=6VPeFjZ2yOmar2e25U_VPLPpRypyQzDF1Ik4Wp_e7v_&wd=&eqid=d572c23a00000583000000065ee384e7
Connection: keep-alive 连接
Cookie: mm_lang=zh_CN; MM_WX_NOTIFY_STATE=1; MM_WX_SOUND_STATE=1
Upgrade-Insecure-Requests: 1 升级的信息
Cache-Control: max-age=0
请求体: name=zhangsan
客户端浏览器告诉服务器一些信息
-
请求行 请求方式 请求url 请求协议/版本 GET /login.html HTTP/1.1
* 请求方式:
* HTTP协议有7中请求方式,常用的有2种
* GET:
1. 请求参数在请求行中,在url后。
2. 请求的url长度有限制的
3. 不太安全
* POST:
1. 请求参数在请求体中
2. 请求的url长度没有限制的
3. 相对安全
-
请求头名称: 请求头值,常见的请求头:
-
User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
-
可以在服务器端获取该头的信息,解决浏览器的兼容性问题
-
-
Referer: https://www.baidu.com/link?
-
告诉服务器,我(当前请求)从哪里来?
-
作用:
-
防盗链
-
统计工作:
-
-
-
-
请求空行 空行,就是用于分割POST请求的请求头,和请求体的。
-
请求体(正文):
-
封装POST请求消息的请求参数的
-