Servlet相关知识

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"

发布了55 篇原创文章 · 获赞 4 · 访问量 1056

猜你喜欢

转载自blog.csdn.net/weixin_45062761/article/details/104352700