一、Servlet基础
1.什么是Servlet
①javaEE的规范(接口)之一;
②Java Web的三大组件(Servlet程序、Filter过滤器、Listener监听器)之一;
③运行在服务器上的一个java小程序,可以接收客户端发来的请求,并相应数据给客户端;
2.手动实现Servlet接口
①编写一个类实现Servlet接口;
②实现service方法,处理请求,并响应数据;
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("Hello Servlet 被访问了");
}
③到WEB_INF-----web.xml中配置servlet程序的访问地址,其配置如下:
<servlet>
<!--给Servlet程序起别名,一般是类名-->
<servlet-name>HelloServlet</servlet-name>
<!--Servlet程序的全类名-->
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet-mapping标签给servlet程序配置访问地址-->
<servlet-mapping>
<!--告诉服务器当前配置的地址给哪个Servlet程序使用,故传入Servlet的别名即可-->
<servlet-name>HelloServlet</servlet-name>
<!--
1.斜杠/表示地址为:http://ip:port/工程路径
2./hello表示地址为:http://ip:port/工程路径/hello
3.设为hello的原因是要与类名有个简单的对应关系
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3.Servlet的生命周期
①执行Servlet构造器方法
②执行init初始化方法
③执行service方法
④执行destroy销毁方法
注:①和②会执行1次,③每次访问都会执行,④只有在web工程停止时才会调用。
4.Servlet请求的分发处理
将service方法中的ServletRequest对象强制转换为其子类对象HttpServletRequest,调用子类的getMethod()方法,然后判断是get请求还是post请求,分别执行对应的doGet或doPost方法;
5.通过继承HttpServlet实现Servlet程序(常用)
①编写一个类继承HttpServlet类
②根据业务需要重写doGet或doPost方法
③到web.xml中配置Servlet程序的访问地址
6.使用idea创建Servlet程序
点击ok后①生成类名为HelloServlet2的java程序,它继承了HttpServlet,且有doPost()和doGet()方法,②web.xml中添加了相关的配置信息,但需手动给出访问地址;
7.整个Servlet类的继承体系
8.ServletConfig类
- 初始化参数配置
<servlet>
<!--给Servlet程序起别名,一般是类名-->
<servlet-name>HelloServlet</servlet-name>
<!--Servlet程序的全类名-->
<servlet-class>servlet.HelloServlet</servlet-class>
<!-- init-param是初始化参数,可以配置多个 -->
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
</servlet>
- ServletConfig类的作用(用于Servlet程序的初始化)
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//1.可以获取Servlet程序的别名servlet-name的值,这个别名就是在web.xml中定义的名字
System.out.println("HelloServlet程序的别名是:" + servletConfig.getServletName());
//2.可以获取初始化参数init-param,获取这个参数需要在web.xml配置信息
System.out.println("初始化参数username的值是:" + servletConfig.getInitParameter("username"));
//3.可以获取ServletContext对象
System.out.println(servletConfig.getServletContext());
}
- 注意事项
①每个ServletConfig对象对应一个Servlet程序,也就是说HelloServlet2中的config对象不能访问HelloServlet中config对象的信息;
②当在Servlet程序中重写了init方法时,必须调用super.init(config),因为子类重写父类的方法会导致父类的方法不可用,我们需要用父类的init方法来保存config对象;
9.ServletContext类
- 基本知识
①ServletContext是一个接口,表示Servlet上下文对象;
② 一个web工程,只有一个ServletContext对象实例;
③ServletContext对象是一个域对象,类似于Map,其作用范围是整个web工程;
- ServletContext类的作用
①获取 web.xml 中配置的上下文参数 context-param,这个上下文参数是属于整个工程的,和ServletConfig对象中的init-parap不一样;
②获取当前的工程路径,格式:/工程路径
③获取工程部署后在服务器硬盘上的绝对路径
④像 Map 一样存取数据
二、http协议
1.什么是http协议
协议是指双方,或多方,相互约定好,大家都需要遵守的规则。所谓http协议是指客户端和服务器之间通信时,发送数据需要遵守的规则,http协议中的数据又叫做报文。
2.请求的http协议格式
- Get请求格式
1.请求行:①请求的方式(GET);②请求的资源路径(+?+请求参数);③请求的协议版本号(HTTP/1.1);
2.请求头:(key:value),其中不同的键值对表示不同的含义;
- Post请求格式
1.请求行:①请求的方式(POST);②请求的资源路径(+?+请求参数);③请求的协议版本号(HTTP/1.1);
2.请求头:(key:value),其中不同的键值对表示不同的含义;
(请求头与请求体之间有一空行)
3.请求体:就是发送给服务器的数据;
3.响应的http协议格式
1.响应行:①响应的协议和版本号(HTTP/1.1);②响应状态码(200);③响应状态描述符(OK)
2.响应头:(key:value),其中不同的键值对表示不同的含义;
(响应头与响应体之间有一空行)
3.响应体:回传给客户端的数据;
4.常用的响应码
①200:表示请求成功;
②302:表示请求重定向;
③404:表示请求服务器已经收到,但是你要的数据不存在(请求地址错误或服务器中不存在数据);
④500:表示请求服务器已经收到,但是服务器内部错误(代码错误);