3、Servlet
Servlet就是Sun公司推出的一款开发动态Web的一个开源技术。Servlet运行在服务器中,由服务器调用。他是运行在服务器中的Java程序,其作用是接收客户端的请求,并响应数据给客户端
,是浏览器的请求和服务器上的数据库之间的中间层。
sun公司提供了一个Servlet接口,实现了这个接口的程序,就是Servlet。
Servlet、Filter过滤器、Listener监听器是JavaWeb的三大组件。
- 客户端发送请求至服务器
- 服务器启动并调用Servlet,Servlet根据客户端请求生成响应内容并将其传给服务器
- 服务器将响应返回客户端
Servlet项目命名规范:
1、包名规范:com.***.servlet
2、类名规范:****Servlet
3、web.xml文件中的servlet-name等配置和类名保持一致
<!-- pom依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
3.1 实现方法
3.1.1 Servlet接口
Javax.servlet.Servlet接口,内有service方法,Tomcat服务器会调用此方法
public class DemoServlet implements Servlet {
//servlet的初始化方法
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
//Tomcat会找到service方法进行操作,主要进行请求和响应
@Override
public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException {
//设置编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取请求的数据
//响应数据
PrintWriter out = response.getWriter(); //获取输出的流
out.print("");
}
@Override
public String getServletInfo() {
return null;
}
//销毁方法
@Override
public void destroy() {
}
}
3.1.2 抽象类
GenericServlet抽象类实现了Servlet接口的4个方法,所以继承了GenericServlet后只需要重写service方法就可以了。其他操作和直接实现serlvet接口类似
package com.cy.demo.servlet
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class Demo2Servlet extends GenericServlet {
//其他四个方法抽象类GenericServlet已实现,只需要重写service即可
@Override
public void service(ServletRequest request,ServletResponse response) throws ServletException,IOException {
}
}
3.1.3 HttpServlet
正常使用的时候最多的数通过继承 javax.servlet.http.HttpServlet来实现Servlet程序。这种方式重写了Servlet的五个方法,并且添加了doGet和doPost方法,内部没有抽象方法。HttpServlet内部分析了Http的传输协议,提供了更多的使用方法。
自动创建Servlet类:
继承关系:创建的类继承→HttpServlet继承→GenericServlet实现→Servlet接口
由Servlet的接口定义好访问的规范,GenericServlet实现Servlet接口,对其中的方法空实现,并对ServletConfig类做一些使用方法,HttpServlet继承了GenericServlet了,实现了service方法,并对请求进行分发处理增加了post和get方法。我们只需要跟需求重新doGet和doPost即可。
//继承HttpServlet类
public class Demo3Servlet extends HttpServlet {
//重写doGet,doPost方法
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf=8");
//获得响应的流
PrintWriter out = response.getWriter();
out.print("Hello Servlet");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response); //調用doPost,可以不用區分post和get隨便使用兩個該方法
}
}
3.2 映射路径
Java需要配置映射路径才能查找到相应的Servlet,在java中有两个配置可以获取到映射路径,分别是通过XML文件和注解的方式。
3.2.1 XML文件
Java需要在XML文件中配置映射的路径才能够找到相应servlet并调用。
<?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_4_0.xsd"
version="4.0">
<!-- 两个servlet-name必须一样才能找到,每一个servlet类就会生成一个 -->
<!-- servlet会根据配置找到相应的servlet类 -->
<servlet>
<servlet-name>和类名保持一致</servlet-name> <!--3、根据相同的servlet-name找到这里-->
<servlet-class>com.****.类名</servlet-class> <!--4、根据路径找到相应的类-->
</servlet>
<servlet-mapping>
<servlet-name>和类名保持一致</servlet-name> <!--2、根据url-pattern找到这里-->
<url-pattern>/和类名一致</url-pattern> <!--1、根据浏览器输入的路径,服务器找到这里-->
</servlet-mapping>
<!--映射路径,每个servlet可以指定多个映射路径,
/*是一个通配符表示所有的路径都访问这个
*.yu:自定义后缀,*代表任意字符,前不能加其他东西
-->
</web-app>
mapping映射优先级:指定的映射路径>默认的通配符
3.2.2 注解
通过在Servlet类上直接添加@WebServlet的注解一样可以找到相应的Servlet
通过请求路径查找urlPatterns,就能找到相应的name,从而找到和name符合的servlet类
@WebServlet(name = "Demo2Servlet",urlPatterns = "/Demo2Servlet")
public class Demo2Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf=8");
//获得相应流
PrintWriter out = response.getWriter();
out.print("Hello Servlet2");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
3.3 原理
3.4 生命周期
当浏览器访问时,servlet的执行顺序如下,1和2会在浏览器第一次访问的时候执行,后续再访问不会执行,3每次页面访问都会执行一次,4关闭服务器时执行销毁对象。
1、执行构造方法创建对象:服务器启动后的第一次访问时执行,后续不会执行
2、执行init方法,进行初始化:服务器启动后的第一次访问时执行,后续不会执行
3、执行service方法操作数据:每次访问都会执行
4、调用destroy方法销毁对象:服务器关闭时执行