一、什么是Servlet?
Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
二、Servlet有哪些创建方式?
1、实现Servlet接口
因为是实现 Servlet 接口,所以我们需要实现接口里的方法。
public class HelloServlet implements Servlet{
//继承Servlet类并实现该类当中的所有方法
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("xxxxxxxxx");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("xxxxxxxxx");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("xxxxxxxxx");
}
}
2、继承 GenericServlet 类
它实现了 Servlet 接口除了 service 的方法,不过这种方法我们极少用。
public class ServletDemo2 extends GenericServlet {
@Override
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
System.out.println("xxxxxxxxx");
}
}
3、继承 HttpServlet 方法(重点)
这种方法是我们经常要用的一种方法。
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("xxxxxxxxxxxx");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("xxxxxxxxxxxx");
doGet(req,resp);
}
}
三、Servlet 的生命周期
Servlet 的生命周期可以分为以下几个步骤:
- 首先,Servlet通过构造方法进行实例化,且构造方法必须使用无参构造(默认是在第一次被访问的时候构造对象。也可以在web.xml中通过N配置Servlet被创建的时机。(N为一个整数表示优先级,>=0表示在web服务器启动的时候创建,<0表示第一次访问时创建))
- Servlet进行初始化之后,会立即调用init()方法;若失败则会报ServletException异常
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 销毁前调用 destroy() 方法。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
@WebServlet("/HelloServlet") //通过@WebServlet注解,设置默认的请求路径为/HelloServlet
public class HelloServlet implements Servlet{
ServletConfig servletConfig;
//HelloServlet 实例化
public HelloServlet(){
System.out.println("Servlet 实例化。。。。。");
}
//调用init()方法进行初始化
@Override
public void init(ServletConfig servletConfig) throws ServletException {
this.servletConfig=servletConfig;
System.out.println("HelloServlet--->init");
String name = servletConfig.getInitParameter("name");
System.out.println(name);
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
//调用service()方法来处理客户端的请求,也是servlet中最主要的方法。
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello first servlet....");
}
@Override
public String getServletInfo() {
return "版权归张三所有";
}
//销毁前调用 destroy() 方法
@Override
public void destroy() {
System.out.println("HelloServlet---->destroy");
}
}
servlet是单实例多线程的
四、Servlet在xml文件中的配置
1.通过 xml文件创建请求路径
<?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>
<servlet-name>hello</servlet-name>
<servlet-class>com.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
</servlet-mapping>
</web-app>
servlet通过@WebServlet注解,设置默认的请求路径与通过 xml文件创建请求路径两者只能选其一用,不能共用。
五、Servlet接收表单数据与返回数据
接收表单数据
request.getParameter(“xxx”);
返回数据
response.getWriter().write(“xxx”);
六、转发与重定向
转发
request.getRequestDispatcher(“跳转页面”).forward(request,response);
重定向
res.sendRedirect(“跳转页面”);
问题:请求转发跟请求重定向的区别是什么?
1.请求转发:1次请求,地址栏不发生变化,返回200.
2.请求重定向:2次请求,地址栏发生改变,第一次返回302,第二次返回304或200.
七、get请求与post请求
HTTP请求报文
get请求与post的请求的区别是什么?
get:
1,参数拼接在url,不安全
2,只能是字符串类型
3,大小有限制2kb,速度快
post:
1,参数封装到请求体,安全
2,还可以是非字符串类型比如文件
3,理论上大小没限制,速度慢
八、客户端与服务器之间连接的建立和断开
建立连接(3次握手)
第一次握手:客户端发送第一个包,其中SYN标志位为1, ACK=0,发送顺序号sequence=X(随机int)。客户端进入SYN发送状态,等待服务器确认。
第二次握手:服务器收到这个包后发送第二个包,其中包SYN、ACK标志位为1,发送顺序号seq=Y(随机int),接收顺序号ACK=X+1,此时服务器进入SYN接收状态。
第三次握手:客户端收到服务器传来的包后,向服务器发送第三个包,SYN=0, ACK=1,接收顺序号ACK = Y+1,发送顺序号seq=X+1。此包发送完毕,客户端和服务器进入ESTABLISHED建立成功状态,完成三次握手。
断开连接(4次挥手)
第一次挥手:主动关闭方发送第一个包,其中FIN标志位为1,发送顺序号seq为X。
第二次挥手:被动关闭方收到FIN包后发送第二个包,其中发送顺序号seq为Z,接收顺序号ack为X+1。
第三次挥手:被动关闭方再发送第三个包,其中FIN标志位为1,发送顺序号seq为Y,接收顺序号ack为X。
第四次挥手:主动关闭方发送第四个包,其中发送顺序号为X,接收顺序号为Y。至此,完成四次挥手