JavaWeb核心

HTTP协议

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

HTTP协议特点:

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

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

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

      缺点:多次请求之间不能共享数据。Java中使用会话技术(Cookie、Session)来解决这个问题

      优点:速度快

HTTP-请求数据格式

请求数据分为三部分:

      1.请求行:请求数据的第一行。

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

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

常见的HTTP请求头:

 

 

HTTP-响应数据格式

响应数据分为三部分:

       1.响应行:响应数据的第一行。

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

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

常见的HTTP响应头:

 

状态码分类:

 

 

注: 状态码:https://cloud.tencent.com/developer/chapter/13553

 

 

 

Web服务器——Tomcat

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

Tomcat

概念:Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量javaEE规范。

基本使用:

 

 

 

 

部署项目:

 

 

 IDEA中创建Maven Web项目

 

 

 

 

 

 

 

 

 IDEA中使用Tomcat:

1.集成本地tomcat

 

 

 2.使用Maven-Tomcat插件

 

 

 

 

Servlet

简介:

1.Servlet是Java提供的一门动态web资源开发技术

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

Servlet 快速入门:

1.创建web项目,导入Servlet依赖坐标

<dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

 

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

public class ServletDemo1 implements Servlet{
    public void service(){}
}

 

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

@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {

 

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

http://localhost:8080/web-demo/demo1

 

 

Servlet执行流程:

1.Servlet由谁创建?Servlet方法由谁调用?

     Servlet由Web服务器创建,Servlet方法由服务器

2.服务器怎么知道Servlet中一定有service方法?

     因为我们自定义的Servlet,必须实现Servlet接口并复写其方法,而Servlet接口中有service方法

 

Servlet生命周期

对象的生命周期指一个对象从被创建到被销毁的整个过程

Servlet运行在Servlet容器(Web服务器)中,其生命周期由容器来管理,分为四个阶段:

    1.加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象

    2.初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件,创建连接等初始化的工作。该方法只调用一次

    3.请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理。

    4.服务终止:当需要释放内存或者容器关闭时,容器都会调用Servlet实例的destroy()方法完成资源的释放。在destory()方法调用之后,容器会释放这个Servlet

       实例,该实例随后会被Java的垃圾收集器所回收

 

Servlet方法介绍:

1.初始化方法,在Servlet被创建时执行,只执行一次

2.提供服务方法,每次Servlet被访问,都会调用该方法

3.销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet

4.获取ServletConfig对象

5.获取Servlet信息

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

    }

    /**
     * 提供服务
     * 1.调用时机:每次Servlet被访问时调用
     * 2.调用次数:多次
     *
     *
     * @param req
     * @param res
     * @throws ServletException
     * @throws IOException*/

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

    /**
     * 销毁方法
     * 1.调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁调用
     * 2.调用次数:一次
     * */

    public void destroy() {
        System.out.println("destroy...");
    }
    public String getServletInfo() {
        return null;
    }


    public ServletConfig getServletConfig() {
        return null;
    }

}

 Servlet体系结构

 

 HttpServlet

1.HttpServlet使用步骤

      1.继承HttpServlet

      2.重写doGet和doPost方法

2.HttpServlet原理

      获取请求方式,并根据不同的请求方式,调用不同的doXxx方法

 

 

Servlet urlPatten配置

 

 

 

 Request和Response

Request

概念:是服务器创建的请求对象,request对象是来获取请求消息

Resqest获取请求数据

   请求数据分为三部分:

   1.请求行:GET/request-demo/req1?username=zhangsan HTTP/1.1

            String getMethod():获取请求方式:GET

            String getContextPath():获取虚拟目标(项目访问路径):/request-demo

            StringBuffer getRequestURL():获取URL(统一资源定位符):http://localhost:8080/request-demo/req1

            String getRequestURL():获取URL(统一资源标识符):/request-demo/req1

            String getQuerString():获取请求参数(GET方式):username=zhangsan&password=123

   2.请求头:User-Agent:Mozilla/5.0 Chrome/91.0.4472.106

            String getHeade(String name):根据请求头名称,获取值

   3.请求体:username=superbaby&password=123

            ServletlnputStream getlnputStream():获取字节输入流

            BufferedReader getReader():获取字符输入流

Request通用方式获取请求参数

 

   Map<String,String[]> getParameterMap():获取所有参数Map集合

  String[ ] getParameterValues(String name) : 根据名称获取参数值(数组)

  String getParamete(String name) : 根据名称获取canshuz(单个值)

使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同,则代码可以定义为如下格式:

@WebServlet("/req3")
public class RequestDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

 

可以使用Servlet模板创建Servlet更高效

 

 Request请求参数中文乱码处理

解决方案:

  POST:设置输入流的编码

request.setCharacterEncoding("UTF-8");

 

  通用方式:(GET/POST):先编码,再解码

new String(username.getBytes(IOS-8859-1),"UTF-8);

 

Request请求转发

请求转发(forward):一种在服务器内部的资源跳转方式

实现方式:

req.getRequestDispatcher("资源B路径").forward(req,resp);

 

请求转发资源间共享数据:使用Request对象

void setAttribute(String name,Object o):存储数据到request域中
Object getAttribute(String name):根据key,获取值
void removeAttribute(String name):根据key,删除该键值对

 

 

Response

概念:服务器端发送给客户端的数据

Response设置响应数据功能介绍

    响应数据分为三部分:

        1.响应行:HTTP/1.1 200 OK

                void setStatus(int sc):设置响应状态码

        2.响应头:Content-Type:text/html

                void setHeader(String name,String value):设置响应头键值对

        3.响应体:<html><head></head><body></body></html>

                PrintWriter getWriter():获取字符输出流

                ServletOutputStream getOutputStream():获取字节输出流

Response完成重定向

    重定向(Redirect):一种资源跳转方式

    实现方式:

//1.设置响应状态码 302
response.setStatus(302);
//2.设置响应头Location
response.setHeader("Location","资源B的路径");

 

//简化方式完成重定向
        response.sendRedirect("资源B的路径");

 

    重定向特点:

           浏览器地址栏路径发生变化

           可以重定向到任意位置的资源(服务器内部,外部均可)

           两次请求,不能在多个资源使用request共享数据

Response响应字符数据

  使用:

      1.通过Response对象获取字符输出流

PrintWriter writer = resp.getWriter();

 

      2.写数据

writer.writer("aaa");

 

注:

 

 

 Response响应字节数据

  使用:

     1. 通过Response对象获取字符输出流

ServletOutputStream outputStream = resp.getOutputStream();

 

     2. 写数据

outputStream.write(字节数据);

 

  IOUtils工具类使用

     1. 导入坐标

 <dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.11.0</version>
 </dependency>

 

     2. 使用

IOUtils.copy(输入流,输出流);

 

posted on 2022-07-26 08:39  叶子1111  阅读(57)  评论(0编辑  收藏  举报

导航