HTTP&Tomcat&Servlet

HTTP&Tomcat&Servlet,第1张

ServletDemo5 一、Web概述 1.1 Web和JavaWeb的概念
  • Web:全球广域网,也称为万维网(www),能够通过浏览器访问的网站。
    在我们日常的生活中,经常会使用浏览器去访问`百度`、`京东`、`传智官网`等这些网站,这些网站统称为Web网站。
  • JavaWeb:用Java技术来解决相关web互联网领域的技术栈

1.2 JavaWeb技术栈
  • B/S 架构:Browser/Server,浏览器/服务器 架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可。

好处:易于维护升级:服务器端升级后,客户端无需任何部署就可以使用到新的版本。

  • 静态资源主要包含HTML、CSS、JavaScript、图片等,主要负责页面的展示。
  • 动态资源主要包含Servlet、JSP等,主要用来负责逻辑处理。
  • 数据库主要负责存储数据。
  • Web服务器:负责解析 HTTP 协议,解析请求数据,并发送响应数据

1.3Web核心课程安排

* 第一天:HTTP、Tomcat、Servlet
* 第二天:Request(请求)、Response(响应)
* 第三天:JSP、会话技术(Cookie、Session)
* 第四天:Filter(过滤器)、Listener(监听器)
* 第五天:Ajax、Vue、ElementUI
* 第六天:综合案例

(1)Request是从客户端向服务端发出的请求对象,

(2)Response是从服务端响应给客户端的结果对象,

(3)JSP是动态网页技术,

(4)会话技术是用来存储客户端和服务端交互所产生的数据,

(5)过滤器是用来拦截客户端的请求,

(6)监听器是用来监听特定事件,

(7)Ajax、Vue、ElementUI都是属于前端技术

这些技术都该如何来使用,我们后面会一个个进行详细的讲解。接下来我们来学习下HTTP、Tomcat和Servlet。 

二、HTTP 2.1简介 1.HTTP概念

HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。

2.HTTP协议特点

1.基于TCP协议: 面向连接,安全

  TCP是一种面向连接的(建立连接之前是需要经过三次握手)、可靠的、基于字节流的传输层通信协议,在数据传输方面更安全。

2. 基于请求-响应模型的:一次请求对应一次响应

  请求和响应是一一对应关系

3.HTTP协议是无状态协议:对于事物处理没有记忆能力。每次请求-响应都是独立的

  无状态指的是客户端发送HTTP请求给服务端之后,服务端根据请求响应数据,响应完后,不会记录任何信息。这种特性有优点也有缺点,

  •   缺点:多次请求间不能共享数据。java使用会话技术(Cookie、Session)`来解决这个问题
  • 优点:速度快

  请求之间无法共享数据会引发的问题,如:

  * 京东购物,`加入购物车`和`去购物车结算`是两次请求,
  * HTTP协议的无状态特性,加入购物车请求响应结束后,并未记录加入购物车是何商品
  * 发起去购物车结算的请求后,因为无法获取哪些商品加入了购物车,会导致此次请求无法正确展示数据

  具体使用的时候,我们发现京东是可以正常展示数据的,原因是Java早已考虑到这个问题,并提出了使用`会话技术(Cookie、Session)`来解决这个问题。具体如何来做,我们后面会详细讲到。刚才提到HTTP协议是规定了请求和响应数据的格式,那具体的格式是什么呢?

2.2请求数据格式 1.格式介绍
  • 请求数据总共分为三部分内容,分别是请求行、请求头、请求体

1.请求行: HTTP请求中的第一行数据,请求行包含三块内容,分别是 GET[请求方式] /[请求URL路径] HTTP/1.1[HTTP协议及版本]

请求方式有七种,最常用的是GET和POST

2.请求头: 第二行开始,格式为key: value形式

3.请求体: POST请求的最后一部分,存储请求参数

  • 请求头中会包含若干个属性,常见的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等

2.实例演示 3.小结

1. 请求数据中包含三部分内容,分别是请求行、请求头和请求体

2. POST请求数据在请求体中,GET请求数据在请求行上

2.3响应数据格式 1.格式介绍

响应数据总共分为三部分内容

1.响应行:响应数据的第一行,响应行包含三块内容,分别是 HTTP/1.1[HTTP协议及版本] 200[响应状态码] ok[状态码的描述]

2.响应头:第二行开始,格式为key:value形式

3.响应体: 最后一部分。存放响应数据

2.响应状态码

 重定向是指重定到其他地方。在response对象中中重点讲解。4XX和5XX是错误情况,4XX是客户单错误,5XX是服务器端错误。

关于响应状态码,我们先主要认识三个状态码,其余的等后期用到了再去掌握:

* 200  ok 客户端请求成功

* 404  Not Found 请求资源不存在。就是改你的路径,你要访问资源把路径改一下,看一下你服务器端是如何定义的,你的浏览器端写的对不对。

* 500 Internal Server Error 服务端发生不可预期的错误。就是看你的java代码,哪里出现了异常,把异常解决就好了。

3.实例演示

a.html



序号 品牌名称 企业名称
010 三只松鼠 三只松鼠
009 优衣库 优衣库
008 小米 小米科技有限公司

Server.java

/*
    自定义服务器
 */
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(8080); // 监听指定端口
        System.out.println("server is running...");
        while (true){
            Socket sock = ss.accept();
            System.out.println("connected from " + sock.getRemoteSocketAddress());
            Thread t = new Handler(sock);
            t.start();
        }
    }
}

class Handler extends Thread {
    Socket sock;

    public Handler(Socket sock) {
        this.sock = sock;
    }

    public void run() {
        try (InputStream input = this.sock.getInputStream()) {
            try (OutputStream output = this.sock.getOutputStream()) {
                handle(input, output);
            }
        } catch (Exception e) {
            try {
                this.sock.close();
            } catch (IOException ioe) {
            }
            System.out.println("client disconnected.");
        }
    }

    private void handle(InputStream input, OutputStream output) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
        // 读取HTTP请求:
        boolean requestOk = false;
        String first = reader.readLine();
        if (first.startsWith("GET / HTTP/1.")) {
            requestOk = true;
        }
        for (;;) {
            String header = reader.readLine();
            if (header.isEmpty()) { // 读取到空行时, HTTP Header读取完毕
                break;
            }
            System.out.println(header);
        }
        System.out.println(requestOk ? "Response OK" : "Response Error");
        if (!requestOk) {
            // 发送错误响应:
            writer.write("HTTP/1.0 404 Not Found\r\n");
            writer.write("Content-Length: 0\r\n");
            writer.write("\r\n");
            writer.flush();
        } else {
            // 发送成功响应:

            //读取html文件,转换为字符串
            BufferedReader br = new BufferedReader(new FileReader("http/html/a.html"));
            StringBuilder data = new StringBuilder();
            String line = null;
            while ((line = br.readLine()) != null){
                data.append(line);
            }
            br.close();
            int length = data.toString().getBytes(StandardCharsets.UTF_8).length;

            writer.write("HTTP/1.1 200 OK\r\n");
            writer.write("Connection: keep-alive\r\n");
            writer.write("Content-Type: text/html\r\n");
            writer.write("Content-Length: " + length + "\r\n");
            writer.write("\r\n"); // 空行标识Header和Body的分隔
            writer.write(data.toString());
            writer.flush();
        }
    }
}

4.小结

1. 响应数据中包含三部分内容,分别是响应行、响应头和响应体

2. 掌握200,404,500这三个响应状态码所代表含义,分布是成功、所访问资源不存在和服务的错误

三、Tomcat 3.1什么是Web服务器

Web服务器是一个应用程序(软件),对HTTP协议的 *** 作进行封装,使得程序员不必直接对协议进行 *** 作,让Web开发更加便捷。主要功能是"提供网上信息浏览服务"。

Tomcat就是一款软件,我们主要是以学习如何去使用为主。具体我们会从以下这些方向去学习:

1. 简介: 初步认识下Tomcat

2. 基本使用: 安装、卸载、启动、关闭、配置和项目部署,这些都是对Tomcat的基本 *** 作

3. IDEA中如何创建Maven Web项目

4. IDEA中如何使用Tomcat,后面这两个都是我们以后开发经常会用到的方式

首选我们来认识下Tomcat。

3.2Tomcat
  • 概念:Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范
  • JavaEE: Java Enterprise Edition,Java企业版。指Java企业级开发的技术规范总和。包含13项技术规范:JDBC、JNDI、EJB、RMI、JSP、Servlet、XML、JMS、Java IDL、JTS、JTA、JavaMail、JAF。
  • Tomcat也被称为Web容器、Servlet容器。Servlet需要依赖Tomcat才能运行

  • Tomcat的官网: Apache Tomcat® - Welcome!

3.3总结 

1. Web服务器的作用

  • 封装HTTP协议 *** 作,简化开发
  • 可以将Web项目部署到服务器中,对外提供网上浏览服务

2. Tomcat是一个轻量级的Web服务器,支持Servlet/JSP少量JavaEE规范,也称为Web容器,Servlet容器。

3.4 Tomcat基本使用

1.下载

  Apache Tomcat® - Welcome!

2.安装

绿色版的,直接解压即可。

将`apache-tomcat-8.5.68-windows-x64.zip`进行解压缩,会得到一个`apache-tomcat-8.5.68`的目录,Tomcat就已经安装成功

 bin:目录下有两类文件,一种是以`.bat`结尾的,是Windows系统的可执行文件,一种是以`.sh`结尾的,是Linux系统的可执行文件。

  webapps:就是以后项目部署的目录,  到此,Tomcat的安装就已经完成。

3.卸载

卸载比较简单,可以直接删除目录即可.

4.启动

双击: bin\startup.bat.

控制台乱码就是吧conf文件下的logg.properties中的编码格式utf-8改为gbk格式的。

5.关闭---有3种方式

关闭有三种方式

1.直接x掉运行窗口:强制关闭[不建议]

2.bin\shutdown.bat:正常关闭

3. ctrl+c: 正常关闭

6.配置

1.Tomcat默认的端口是8080,要想修改Tomcat启动的端口号,需要修改 conf/server.xml。

Tomcat的端口号取值范围是0-65535之间。

注: HTTP协议默认端口号为80,如果将Tomcat端口号改为80,则将来访问Tomcat时,将不用输入端口号。

2.启动时可能出现的错误:

1.端口冲突:找到对应程序,将其关闭掉。

2.Tomcat启动的时候,启动窗口一闪而过: 需要检查JAVA_HOME环境变量是否正确配置

7.部署项目

Tomcat部署项目: 将项目放置到webapps目录下,即部署完成。

一般JavaWeb项目会被打包成war包,然后将war包放到Webapps目录下,Tomcat会自动解压缩war文件。

3.5idea中创建Maven Web项目 1.Web项目结构

Web项目的结构分为:开发中的项目和开发完可以部署的Web项目,这两种项目的结构是不一样的,我们一个个来介绍下:

  • 开发项目通过执行Maven打包命令package,可以获取到部署的Web项目目录
  •  编译后的Java字节码文件和resources的资源文件,会被放到WEB-INF下的classes目录下
  •  pom.xml中依赖坐标对应的jar包,会被放入WEB-INF下的lib目录下

2.创建Maven Web项目---2种方式 方式一:使用骨架:骨架就是项目模板

 

  具体的步骤包含:


1.创建Maven项目
 2.选择使用Web项目骨架

结尾是webapp结尾的,前面是maven开头的。


 3.输入Maven项目坐标创建项目

4.确认Maven相关的配置信息后,完成项目创建


 5.删除pom.xml中多余内容


 6.补齐Maven Web项目缺失的目录结构--就是缺失2个目录,java目录和resource目录。

 

方式二: 不使用骨架

具体的步骤包含:


1.创建Maven项目
2.选择不使用Web项目骨架


3.输入Maven项目坐标创建项目


4.在pom.xml设置打包方式为war

默认的打包方式是jar,我们要改为打包方式为war的。


5.补齐Maven Web项目缺失webapp的目录结构

缺少的webapp的目录,我们可以手动补全,但是我们推荐自动创建。


6.补齐Maven Web项目缺失WEB-INF/web.xml的目录结构

 

 

3.6IDEA使用Tomcat--2种方式 1.集成本地Tomcat

1.点击add configuration配置项,配置tomcat就可以了。tomcat有2种,local是本地的,remove是远程的,我们选择local本地的

 

 

需要注意的事项:

2.Tomcat Maven插件--2步

在IDEA中使用本地Tomcat进行项目部署,相对来说步骤比较繁琐,所以我们需要一种更简便的方式来替换它,那就是直接使用Maven中的Tomcat插件来部署项目,具体的实现步骤,只需要两步,分别是:

1. 在pom.xml中添加Tomcat插件

alt+insert快捷键,选择插件模板。

  
       
       	
           
               org.apache.tomcat.maven
               tomcat7-maven-plugin
               2.2
           
       
   

 2. 使用Maven Helper插件快速启动项目,选中项目,右键-->Run Maven --> tomcat7:run

注意:

如果选中项目并右键点击后,看不到Run Maven和Debug Maven,这个时候就需要在IDEA中下载Maven Helper插件,具体的 *** 作方式为: File --> Settings --> Plugins --> Maven Helper ---> Install,安装完后按照提示重启IDEA,就可以看到了。

* Maven Tomcat插件目前只有Tomcat7版本,没有更高的版本可以使用

* 使用Maven Tomcat插件,要想修改Tomcat的端口和访问路径,可以直接修改pom.xml


    
    	
        
            org.apache.tomcat.maven
            tomcat7-maven-plugin
            2.2
            
            	80
                
                /
            
        
    

3.小结

通过这一节的学习,大家要掌握在IDEA中使用Tomcat的两种方式,集成本地Tomcat和使用Maven的Tomcat插件。后者更简单,推荐大家使用,但是如果对于Tomcat的版本有比较高的要求,要在Tomcat7以上,这个时候就只能用前者了。

四、Servlet 4.1简介
  •  Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。

  • Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet

4.2快速入门

1. 创建Web项目`web-demo`,导入Servlet依赖坐标


    javax.servlet
    javax.servlet-api
    3.1.0
    
    provided

 2. 创建:定义一个类,实现Servlet接口,并重写接口中所有方法,并在service方法中输入一句话

/**
 * Servlet 快速入门
 */
@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {


    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("servlet hello world~");
    }

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

    @Override
    public void destroy() {

    }

    @Override
    public void init(ServletConfig config) throws ServletException {

    }

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

3. 配置:在类上使用@WebServlet注解,配置该Servlet的访问路径

4. 访问:启动Tomcat,浏览器中输入URL地址访问该Servlet

5. 器访问后,在控制台会打印`servlet hello world~` 说明servlet程序已经成功运行。

4.3执行流程&生命周期

/**
 * Servlet 生命周期方法
 */
@WebServlet(urlPatterns="/demo2",loadOnStartup = 1)
public class ServletDemo2 implements Servlet {

    /**
     * 初始化方法
     * 1. 调用时机:默认情况下,Servlet被第一次访问时,调用
     *      * loadOnStartup:
     * 2. 调用次数:1次
     * @param config
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init...");
    }


    /**
     * 提供服务
     * 1. 调用时机:每一次Servlet被访问时,调用
     * 2. 调用次数:多次
     *
     *
     * @param req
     * @param res
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("servlet hello world~");
    }


    /**
     * 销毁方法
     * 1. 调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用
     * 2. 调用次数:1次
     */
    @Override
    public void destroy() {
        System.out.println("destroy...");
    }

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

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

4.4方法介绍&体系结构

/**
 * Servlet 方法介绍
 */
@WebServlet(urlPatterns="/demo3",loadOnStartup = 1)
public class ServletDemo3 implements Servlet {
    private ServletConfig config;
    /**
     * 初始化方法
     * 1. 调用时机:默认情况下,Servlet被第一次访问时,调用
     *      * loadOnStartup:
     * 2. 调用次数:1次
     * @param config
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        System.out.println("init...");
    }
    @Override
    public ServletConfig getServletConfig() {
        return config;
    }

    /**
     * 提供服务
     * 1. 调用时机:每一次Servlet被访问时,调用
     * 2. 调用次数:多次
     *
     *
     * @param req
     * @param res
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("servlet hello world~");
    }


    /**
     * 销毁方法
     * 1. 调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用
     * 2. 调用次数:1次
     */
    @Override
    public void destroy() {
        System.out.println("destroy...");
    }

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


}
@WebServlet("/demo4")
public class ServletDemo4 extends HttpServlet {

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

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

a.html



    
    Title




MyHttpServlet.java

public class MyHttpServlet implements Servlet {
    @Override
    public void init(ServletConfig config) throws ServletException {

    }

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

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        // 根据请求方式的不同,进行分别的处理

        HttpServletRequest request = (HttpServletRequest) req;

        //1. 获取请求方式
        String method = request.getMethod();
        //2. 判断
        if("GET".equals(method)){
            // get方式的处理逻辑

            doGet(req,res);
        }else if("POST".equals(method)){
            // post方式的处理逻辑

            doPost(req,res);
        }
    }

    protected void doPost(ServletRequest req, ServletResponse res) {
    }

    protected void doGet(ServletRequest req, ServletResponse res) {
    }

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

    @Override
    public void destroy() {

    }
}
@WebServlet("/demo5")
public class ServletDemo5 extends MyHttpServlet {

    @Override
    protected void doGet(ServletRequest req, ServletResponse res) {
        System.out.println("get。。。。");
    }

    @Override
    protected void doPost(ServletRequest req, ServletResponse res) {
        System.out.println("post。。。。");
    }
}
ServletDemo5 
@WebServlet("/demo5")
public class ServletDemo5 extends MyHttpServlet {

    @Override
    protected void doGet(ServletRequest req, ServletResponse res) {
        System.out.println("get。。。。");
    }

    @Override
    protected void doPost(ServletRequest req, ServletResponse res) {
        System.out.println("post。。。。");
    }
}
4.5urlPattern配置

WebServlet注解有urlPatterns属性,它是一个数组格式,在数组里面可以配置多个访问路径。通过多个访问路径都可以访问到servlet。

/**
 * urlPattern:
 *  * 精确匹配
 */

@WebServlet(urlPatterns = "/user/select")
public class ServletDemo8 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("demo8 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


    }
}

/**
 * urlPattern:
 *  * 扩展名匹配: *.do
 */

@WebServlet(urlPatterns = "*.do")
public class ServletDemo10 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("demo10 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


    }
}
/**
 * urlPattern:
 *  * 任意匹配:/
 */

//@WebServlet(urlPatterns = "/")
public class ServletDemo11 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("demo11 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


    }
}
/**
 * urlPattern:
 *  * 任意匹配:/*
 */

//@WebServlet(urlPatterns = "/*")
public class ServletDemo12 extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("demo12 get...");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


    }
}
4.6xml配置servlet

public class ServletDemo13 extends HttpServlet {

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

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    }
}

web.xml





    
    
    
    
        demo13
        com.itheima.web.ServletDemo13
    
    
    
    
    
    
        demo13
        /demo13
    

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/920521.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存