JavaWeb

HTTP&Tomcat&Servlet

2022-11-17  本文已影响0人  h2coder

什么是Web

Web是全球广域网,也称为万维网(www),能够通过浏览器访问的网站。例如百度、京东、淘宝等

20210717183958532.png

什么是JavaWeb

JavaWeb,就是使用Java技术来解决web互联网领域的技术栈。

静态资源

使用HTML\CSS\JavaScript技术,构建前端网页,如果每个用户看到的内容都是一模一样的,就是静态资源

动态资源

HTTP协议

1627043194238.png

HTTP协议的特点

HTTP协议无状态

请求格式

GET / HTTP/1.1 
Host: www.baidu.cn
Connection: keep-alive
Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1
User-Agent: Moilla/5.0 Chrome/91.0.4472.106

HTTP的请求数据,分为三部分,分别为请求行请求头请求体

Host: 表示请求的主机名
User-Agent: 浏览器版本,例如Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko;
Accept:表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有;
Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;
Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip, deflate等。
POST / HTTP/1.1
Host: www.baidu.cn
Connection: keep-alive
Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 Chrome/91.0.4472.106

username=superbaby&password=123456

响应格式

HTTP/1.1 200 OK
Server: Tengine
Content-Type: text/html
Transfer- Encoding: chunked...

<html>
<head>
<title></title>
</head>
<body></body>
</html>

响应数据中,包含三个部分,分别是响应行,响应头和响应体

Content-Type:表示该响应内容的类型,例如text/html,image/jpeg;
Content-Length:表示该响应内容的长度(字节数);
Content-Encoding:表示该响应压缩算法,例如gzip;
Cache-Control:指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒
<html>
<head>
<title></title>
</head>
<body></body>
</html>

什么是Web服务器

1627058356051.png 1627060368806.png

Web服务器的功能

Tomcat

1627176045795.png

Tomcat的下载、安装、配置、部署

下载和安装Tomcat

1627178001030.png 1627178815892.png

卸载Tomcat

删除Tomcat目录即可

启动Tomcat

1627179006011.png 1627199957728.png
# 默认
java.util.logging.ConsoleHandler.encoding = UTF-8
# 修改为GBK
java.util.logging.ConsoleHandler.encoding = GBK

关闭Tomcat

关闭有3种方式

配置Tomcat

1627200780590.png
<Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="8443" />
1627201248802.png

部署Tomcat

部署可以分为2种方式

Servlet

1627236923139.png

Servlet入门

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <!--
      此处为什么需要添加该标签?
      provided指的是在编译和测试过程中有效,最后生成的war包时不会加入
      因为Tomcat的lib目录中已经有servlet-api这个jar包,如果在生成war包的时候生效就会和Tomcat中的jar包冲突,导致报错
    -->
    <scope>provided</scope>
</dependency>
@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("servlet hello world~");
    }

    public void init(ServletConfig servletConfig) throws ServletException {

    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {
    }
}
http://localhost:8080/web-demo/demo1

Servlet生命周期

@WebServlet(value = "/demo1", loadOnStartup = 1)
public class Demo1Servlet implements Servlet {
    /**
     * 初始化方法,每一次Servlet对象创建时,调用一次
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("你好 demo1 servlet 初始化方法");
    }

    /**
     * 服务调用方法,每次访问Servlet都会被调用
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("你好 demo1 servlet");
    }

    /**
     * 销毁方法,服务器重启或关闭时,调用一次
     */
    @Override
    public void destroy() {
        System.out.println("你好 demo1 servlet 销毁方法");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public String getServletInfo() {
        return null;
    }
}

Servlet体系结构

针对HTTP协议,Servlet有提供专门的子类HttpServlet,让我们只关注服务调用方法,提供了doGetdoPost方法,分别对应访问Servlet时,对应的GET请求和POST请求

1627240593506.png
@WebServlet(value = "/demo3")
public class Demo3Servlet extends HttpServlet {
    private static final long serialVersionUID = 3652460378925257829L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo3 doGet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo3 doPost");
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/web-demo/demo3" method="post">
        <input name="username"/><input type="submit"/>
    </form>
</body>
</html>

为什么HttpServlet要区分doGet和doPost

Servlet访问路径匹配

除了精确匹配路径外,Servlet还支持目录匹配、任意匹配、多路径匹配等

//精确匹配
//@WebServlet(value = "/user/demo3")

//目录匹配,访问/user/下的路径,都是找到该Servlet
//@WebServlet(value = "/user/*")
//扩展名匹配(后缀匹配),访问/user/1.demo、/555/abc.do,就是访问后缀为.do的路径
//@WebServlet(value = "*.do")

//任意匹配,访问任何路径都可以访问到该
//@WebServlet(value = "/*")

//实际开发中,一般一个Servlet只配置一个访问路径
//@WebServlet(value = {"/demo3", "/demo4"})
@WebServlet(value = "/demo3")

XML配置Servlet

注解配置Servlet,是在Servlet 3.0开始支持的,在3.0之前,都是使用xml配置,xml配置太繁琐,所以才有了后来的注解配置,这里简单了解以下XML的配置方式

public class Demo4Servlet extends HttpServlet {
    private static final long serialVersionUID = -1768906787754655105L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo4 doGet...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo4 doPost...");
    }
}
<?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">

    <!-- 使用xml方式配置Servlet -->
    <!-- 1、 给Servlet配置一个名字-->
    <servlet>
        <servlet-name>demo4_servlet</servlet-name>
        <servlet-class>com.itheima.servlet.Demo4Servlet</servlet-class>
    </servlet>
    <!-- 2、配置Servlet和访问路径的映射,路径也是必须以/开头 -->
    <servlet-mapping>
        <servlet-name>demo4_servlet</servlet-name>
        <url-pattern>/demo4</url-pattern>
    </servlet-mapping>
</web-app>
上一篇 下一篇

猜你喜欢

热点阅读