Servlet
servlet:server applet 运行在服务器上的客户端小程序,其本质就是一个接口,定义了能被服务器软件识别的一定的规则,通过创建java类实现这个接口,重写接口方法。
简单入门
1.创建Javaee项目
2.创建一个类实现Servlet这个接口
3.实现这个接口的抽象方法
4.配置servlet(这步最重要,即提供访问和返回资源的映射)
在web.xml文件的根标签<web-app>中进行配置
配置如下:
<?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-name>demo1</servlet-name>
<servlet-class>cn.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
</web-app>
添加两个标签:<servlet>和<servlet-mapping>
package cn.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* @author 承夕
* @date 2020/2/17 0017 - 9:32
* @contact:https://github.com/chengxi0
*/
public class ServletDemo1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
通过tomcat的默认访问目录然后接着访问"/demo1"每次访问自动调用service方法,并在控制台输出对应信息。
执行原理
1.当服务端接受客户端的请求,会解析请求URL路径,获取访问的servlet的资源路径
2.查找web.xml文件,是否有对应的<url-pattern>标签内容
3.如果有,就找到对应的的<servlet-class>全类名
4.tomcat会将字节码文件加载进内存,并且创建其对象
5.调用其方法
servlet的生命周期
被创建:执行init方法,只执行一次
什么时候被创建:默认情况下,第一次被访问时,servlet被创建
但是也可以修改创建的时机 :可以在web.xml的<servlet>标签下配置
- 第一次访问创建:<load-on-startup>值为负数(默认值-1)
- 服务器启动时创建:<load-on-startup>值为非负数
注意:因为servlet的init方法只执行一次,说明其是单例的,因此会存在多线程下的线程安全问题。解决办法:尽量不要在类中修改成员变量的值。
提供服务:执行service方法,执行多次
被消毁:执行destroy方法,执行一次(只有服务器正常关闭的时候才会执行,而且是在servlet销毁之前一般用于释放资源)
servlet注解配置(3.0版本以上)
这个可以省去web.xml文件进行资源路径和对应的全类名进行映射,直接在类中使用@WebServlet()
servlet注解相关配置
urlpattern:servlet访问路径
一个servlet可以定义多个路径 @WebServlet("/d4","/dd4","/ddd4")
路径定义规则:
- /xxx 路径匹配
- /xxx/xxx 多层路径结构,目录结构
- .*do 拓展名结构
HTTP:Hyper text transfer protocol(超文本传输协议)
传输协议:定义了客户端和服务器直接数据发送的格式
特点
- 基于TCP/IP的高级安全协议
- 默认端口80
- 基于请求响应模型:一次请求对应一次响应
- 无状态:每次请求之间相互独立,不能交互数据
历史版本:先前的1.0版本的每次请求响应都会断开连接,而现在的1.1版本会在一次请求响应后保持连接如果不需要数据发送再断开连接。
请求消息数据格式:
1.请求行
格式: 请求方式 请求url 请求协议/版本
GET /hello.html HTTP/1.1
请求方式 :主要掌握POST和GET这两种
GET:
- 请求参数在请求行中,即url后
- 请求的url长度有限制
- 不太安全
POST:
- 请求参数在请求体中
- 请求的url长度没有限制
- 比较安全
2.请求头
格式:请求头名称 :请求头值
常见的请求头:
Host:请求的主机
User-Agent:浏览器告诉服务器,我访问你使用的浏览器的版本信息,因此可以在服务器端获取该头的信息,解决浏览器的兼容性问题
Referer:如:http://locahost/hello.html 告诉浏览器我从哪里来,主要有可以做统计工作和防止盗链。
3.请求空行
一个空行
4.请求体
请求参数的信息:
如 username=zhangsan
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post" action="/Tomcat_war_exploded/demo1">
<input type="text" name="username">
<input type="submit" value="提交">
</form>
</body>
</html>
package com.servlet;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* @author 承夕
* @date 2020/2/17 0017 - 19:46
* @contact:https://github.com/chengxi0
*/
@WebServlet(value = "/demo1")
public class ServletDemo1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello servlet");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
注意:
在表单的action属性填写的是提交到的页面,以及在ServletDemo1的注解配置那里,千万别忘记用斜杆"/demo1"