JavaWeb

JavaWeb

1、WEB服务器

服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息;

  • IIS

    微软的:ASP Windows中自带

  • Tomcat

    Tomcat是Apache软件基金中一个核心项目

    Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。

    Tomcat实际上运行JSP页面和Servlet。Tomcat最新版本为9.0

1.1安装Tomcat

官网:https://tomcat.apache.org/

Tomcat启动和配置

  • 启动、关闭文件

可能遇到问题:

1、java环境变量没有配置

2、闪退问题:需要配置兼容性

3、乱码问题:配置文件中设置

  • 配置

1、conf-----server.xml

2、可以配置启动端口号 可以配置主机的名称(默认主机名为:127.0.0.1,默认存放的位置webapps)

    <Connector port="8081" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

<Host name="www.summer.com"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

高难度面试题:

请你谈一谈网站是如何进行访问的?

1、输入一个域名;点击回车
2、检测本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名的映射:

​ 有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问

​ 没有:去DNS服务器,找得到的话就返回,找不到就返回找不到

发布一个web网站

  • 将自己写的网站,放到服务器(Tomcat)中指定的web应用的文件夹(webapps)下,就可以访问啦

    网站应该有的结构

    --webapps: Tomcat服务器的web目录
        -ROOT
        -summer:网站的目录名
        	-WEB-INF
        		-classes:java程序
        		-lib:web应用所以来的jar包
        		-web.xml:网站配置文件
        	-index.html:默认的首页
            -static
                -css
                	-style.css
                -js
                -img
            -...
    

2、HTTP

2.1 HTTP是什么

HTTP(超文本传输协议)是一个简单的请求,响应协议,它通常运行在TCP之上

  • 文本:html 字符串 ...
  • 超文本:图片、音乐、视频、定位、地图...

2.2 两个时代

http1.0

  • HTTP/1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开连接。

http2.0

  • HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。

2.3 HTTP请求

  • 客户端发请求(request)到服务器

百度:

Request URL: https://www.baidu.com/    请求地址
Request Method: Get                    get方法
Status Code: 200 OK						状态码200
Remote (远程) Address: 111.45.3.176:443
Referrer Policy: unsafe-url

request head

Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9  语言
Connection: keep-alive
Cookie: PSTM=1547270305; BIDUPSID=0F649B6C3115AAF66C7A7D78059C1978; BDUSS=5iVksxbG5GR0tyNDlXM3ZDWXhiVUVzV0dEWjJaNGR1VWN3eS1tTUxJMFBlY0pkSVFBQUFBJCQAAAAAAAAAAAEAAACLY4ONeGJyYnYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~sml0P7JpdcE; BAIDUID=E2829F0E38F8289AB5CDE7126EB422F9:FG=1; BDUSS_BFESS=5iVksxbG5GR0tyNDlXM3ZDWXhiVUVzV0dEWjJaNGR1VWN3eS1tTUxJMFBlY0pkSVFBQUFBJCQAAAAAAAAAAAEAAACLY4ONeGJyYnYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~sml0P7JpdcE; BD_UPN=1a314353; __yjs_duid=1_0a9bcab68bb952108d2095708b5994a61609256037979; BAIDUID_BFESS=E2829F0E38F8289AB5CDE7126EB422F9:FG=1; ispeed_lsm=0; Hm_lvt_aec699bb6442ba076c8981c6dc490771=1609257222,1611464264; COOKIE_SESSION=1170223_4_9_9_11_30_0_0_9_7_1026_0_1170117_0_1047_1012_1611464264_1605710838_1611463217%7C9%23132_8_1605709826%7C3; BDRCVFR[QbfwCazHmWT]=mk3SLVN4HKm; BD_HOME=1; H_PS_PSSID=33423_33516_33403_33344_33284_33395_26350_22160; sugstore=1; BA_HECTOR=a5008121aka4aga0to1g0tsvh0r
Host: www.baidu.com
Referer: https://www.baidu.com/
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400
X-Requested-With: XMLHttpRequest

请求行

  • 请求行中的请求方式GET
  • 请求方式:GET POST HEAD DELETE PUT TRACT...
    • GET :请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏中显示,不安全但是高效
    • POST:请求能够携带的参数没有限制,大小无限制,不会在浏览器的URL地址栏中显示,安全但不高效

消息头

Accept: 告诉浏览器,他所支持的数据类型
Accept-Encoding:告诉浏览器支持哪种编码格式(GBK UTF-8  GB2312  ISO8859-1 )
Accept-Language: 告诉浏览器的他的语言环境
Cache-Control:缓存控制
Connection: 告诉浏览器请求完成时断开还是保持连接
HOST:主机

2.4 HTTP响应

  • 服务器响应客户端

百度:

Cache-Control: private       缓存控制
Connection: keep-alive		 连接:活着 http/1.1
Content-Encoding: gzip		 编码
Content-Type: text/html;charset=utf-8  类型

响应体

Accept: 告诉浏览器,他所支持的数据类型
Accept-Encoding:告诉浏览器支持哪种编码格式(GBK UTF-8  GB2312  ISO8859-1 )
Accept-Language: 告诉浏览器的他的语言环境
Cache-Control:缓存控制
Connection: 告诉浏览器请求完成时断开还是保持连接
HOST:主机
Refresh: 告诉客户端多久刷新一次
location:让网页重新定位

响应状态码

  • 200 请求响应成功
  • 3XX 请求重定向
    • 重定向:你重新到我给你的新位置去
  • 4XX 找不到资源
    • 资源不存在
  • 5XX 服务器代码错误 502网关错误

常见面试题:

当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?

3、Maven

为什么要学Maven?

1、在javaWeb中需要使用大量的jar包,我们手动去导入

2、如何能够让一个东西自动帮我们导入和配置这个jar包

​ 由此,Maven诞生了

3.1 Maven 项目架构管理工具

我们目前用来就是方便导入jar包的!

Maven的核心思想:约定大于配置

  • 有约束,不要去违反

Maven会规定好你该如何去编写我们的java代码,必须按照这个规范来

3.2 下载安装Maven

官网:https://maven.apache.org/

3.3 环境变量

在我们的系统环境变量中:

  • M2_HOME:Maven目录下的bin目录
  • MAVEN_HOME:Maven的目录
  • 在系统的Path中配置 %MAVEN_HOME%\bin

cmd

mvn -version

3.4 阿里云镜像

  • 镜像 Morris

    • 作用:加速我们的下载

    ( 镜像:方便下载软件 Maven是国外的,国内有强,我们访问外网会非常慢)

  • 国内建议使用阿里云的镜像

   	<mirror>
		<id>nexus-aliyun</id>
		<mirrorOf>*,!jeecg.!jeecg-snapshots</mirrorOf>
		<name>Nexus aliyun</name>
		<url>http://maven.aliyun.com/nexus/content/groups/public</url>
	 </mirror>

3.5 本地仓库

在本地的仓库,远程仓库

建立一个本地仓库:localRepository

 <localRepository>D:\java-kuangshen\java-jar-all\apache-maven-3.6.3\maven-repo</localRepository>

3.6 在IDEA中使用Maven

1、创建一个Maven项目

2、等待项目初始化完毕

3、观察maven仓库中多了什么东西? 看下目录中导入了很多jar包

4、IDEA中的Maven设置

IDEA项目创建成功后,看一眼Maven的配置

【注意:】经常在IDEA中会出现一个问题,就是项目自动创建完成后,它这个MavenHome会使用IDEA默认,如果发现此问题,手动改为本地

可能遇到的问题:

maven由于他的约定大于配置,我们之后可能会遇到我们写的配置文件,无法被导或者生效的问题,解决方案:

在build中配置resource,来防止我们资源导出失败的问题

3.7 Idea中配置maven全局配置

打开IDEA有下角有configures ---settings--Build,----Build Tool ---maven

4、Servlet

4.1 Servlet简介

  • Servlet就是SUN公司开发动态web的一门技术
  • Sun在这些API中提供一个接口叫做:Servlet:如果你想开发一个Servlet程序,只需要完成两个小步步骤
    • 编写一个类,实现Servlet接口
    • 把开发好的java类部署到web服务器中

把实现了Servlet接口的java程序叫做,Servlet

4.2 HelloServlet

Servlet接口 sun公司有两个默认的实现类:HttpServlet

1、构建一个普通的Maven项目,删掉里面的src目录,以后我们的学习就在这个项目里面建module,这个空的工程就是maven的主工程

2、关于Maven父子工程的理解

​ 父项目中会有

   <modules>
        <module>servlet-01</module>
    </modules>

​ 子项目中会有

    <parent>
        <artifactId>javaweb-02-servlet</artifactId>
        <groupId>com.summer</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

父项目中jar包 子项目可以直接使用

son extends father

3、Maven环境优化

​ 1-修改web.xml为最新的

​ 2-将maven的结构搭建完整

4、编写一个servlet程序

​ 1-编写一个普通类

​ 2-实现Servlet接口【这里我们直接集成HttpServlet】

​ 3-编写类

package com.summer.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {
    //由于get或者post 只是请求实现的不同方式,可以相互调用,业务逻辑都一样
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();//响应流
        
        writer.println("Hello Servlet");
    }

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

5、编写Servlet的映射

为什么需要映射,我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径.

web.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"
         metadata-complete="true">
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.summer.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

</web-app>

4.3 Servlet原理

4.4 Mapping问题

1、一个Servlet可以指定一个映射路径

  <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.summer.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

2、一个Servlet可以指定多个映射路径

    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello3</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello4</url-pattern>
    </servlet-mapping> 
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello5</url-pattern>
    </servlet-mapping>

3、一个Servlet可以指定通用映射路径

   <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>

4、指定一些后缀或者前缀

<!--    注意点 *前面不能加项目映射路径-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.summer</url-pattern>
    </servlet-mapping>

5、优先级问题

​ 指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求

package com.summer.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class ErrorServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.setContentType("text/html");
       resp.setCharacterEncoding("utf-8");
        PrintWriter writer = resp.getWriter();
        writer.print("<h1>404</h1>");
    }

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

<!--    404-->
    <servlet>
        <servlet-name>error</servlet-name>
        <servlet-class>com.summer.servlet.ErrorServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>error</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

4.5 ServletContext

web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用。

应用

4.5.1.共享数据

(我在这个Servlet中保存的数据,可以在另一个Servlet中拿到)

放数据

package com.summer.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class HelloServlet  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("Hello");

//        this.getInitParameter(); 初始化参数
//        ServletConfig servletConfig = this.getServletConfig(); Servlet配置  配置在webapp/WEB-INF/web.xml
//        ServletContext servletContext = this.getServletContext(); Servlet 上下文
        ServletContext servletContext = this.getServletContext();
        servletContext.setAttribute("username","summer");

    }
}

拿数据

package com.summer.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String   username = (String) servletContext.getAttribute("username");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("UTF-8");
        resp.getWriter().print("名字:"+username);
    }

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

servlet配置

<?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"
         metadata-complete="true">
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.summer.servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>getContext</servlet-name>
    <servlet-class>com.summer.servlet.GetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>getContext</servlet-name>
    <url-pattern>/getContext</url-pattern>
  </servlet-mapping>

</web-app>

先请求放数据 然后才能拿到数据哦~

4.5.2 获取初始化参数--几乎不用

  <context-param>
      <param-name>url</param-name>
      <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
  </context-param>
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        String url = servletContext.getInitParameter("url");
        resp.getWriter().print(url);//jdbc:mysql://localhost:3306/mybatis
    }

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

4.5.3请求转发--request

        ServletContext servletContext = this.getServletContext();
        RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/gp");//转发的请求路径
        requestDispatcher.forward(req,resp);//调用forward实现请求转发  [访问这个路径实际 回去/gp 但是请求的url是不变的]
        
        //合并
        servletContext.getRequestDispatcher("/gp").forward(req,resp);

转发:

A B C [A要拿C的东西 但是A只能找到B B可以访问C]

a访问b b访问c c返回给b b返回给a 【类似代理----A不知道有C的存在】

重定向:

A B C

a访问b b告诉a你去访问c a再去访问c 【A是知道C的存在的】

4.5.4读取资源文件--类加载/反射

Properties

  • 在java目录下新建properties
  • 在resources目录下新建properties

发现:都会被打包在同一个路径下:classes,我们俗称这个路径为类路径classpath;

    <build>
        <resources>
            --!resources默认打包会生成对应的文件 --
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

读取资源

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties prop = new Properties();
        prop.load(resourceAsStream);
        String username = prop.getProperty("username");
        String password = prop.getProperty("password");
        resp.getWriter().print("用户名:"+username+"   密码:"+password);
    }
username=summer
password=123456

访问这个get的url 就能在页面显示对应的文件内容

4.6 HttpServletResponse

web服务器接收到客户端的http请求,会针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;

  • 如果我们获取客户端请求过来的参数:找HttpServletRequest
  • 如果要给客户端响应一些信息:找HttpServletResponse

1、简单分类

负责向浏览器发送数据的方法

    ServletOutputStream getOutputStream() throws IOException;

    PrintWriter getWriter() throws IOException;

负责向浏览器发送响应头的方法

    void setCharacterEncoding(String var1);

    void setContentLength(int var1);

    void setContentLengthLong(long var1);

    void setContentType(String var1);

    void setDateHeader(String var1, long var2);

    void addDateHeader(String var1, long var2);

    void setHeader(String var1, String var2);

    void addHeader(String var1, String var2);

响应的状态码

    int SC_CONTINUE = 100;
    int SC_SWITCHING_PROTOCOLS = 101;
    int SC_OK = 200;
    int SC_CREATED = 201;
    int SC_ACCEPTED = 202;
    int SC_NON_AUTHORITATIVE_INFORMATION = 203;
    int SC_NO_CONTENT = 204;
    int SC_RESET_CONTENT = 205;
    int SC_PARTIAL_CONTENT = 206;
    int SC_MULTIPLE_CHOICES = 300;
    int SC_MOVED_PERMANENTLY = 301;
    int SC_MOVED_TEMPORARILY = 302;
    int SC_FOUND = 302;
    int SC_SEE_OTHER = 303;
    int SC_NOT_MODIFIED = 304;
    int SC_USE_PROXY = 305;
    int SC_TEMPORARY_REDIRECT = 307;
    int SC_BAD_REQUEST = 400;
    int SC_UNAUTHORIZED = 401;
    int SC_PAYMENT_REQUIRED = 402;
    int SC_FORBIDDEN = 403;
    int SC_NOT_FOUND = 404;
    int SC_METHOD_NOT_ALLOWED = 405;
    int SC_NOT_ACCEPTABLE = 406;
    int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
    int SC_REQUEST_TIMEOUT = 408;
    int SC_CONFLICT = 409;
    int SC_GONE = 410;
    int SC_LENGTH_REQUIRED = 411;
    int SC_PRECONDITION_FAILED = 412;
    int SC_REQUEST_ENTITY_TOO_LARGE = 413;
    int SC_REQUEST_URI_TOO_LONG = 414;
    int SC_UNSUPPORTED_MEDIA_TYPE = 415;
    int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
    int SC_EXPECTATION_FAILED = 417;
    int SC_INTERNAL_SERVER_ERROR = 500;
    int SC_NOT_IMPLEMENTED = 501;
    int SC_BAD_GATEWAY = 502;
    int SC_SERVICE_UNAVAILABLE = 503;
    int SC_GATEWAY_TIMEOUT = 504;
    int SC_HTTP_VERSION_NOT_SUPPORTED = 505;

2、常见应用

1、向浏览器输出消息(前面一直再讲 getWrite getOutput等)

2、下载文件

【自己看一下~~12】

​ 1.要获取下载文件的路径url

​ 2.下载的文件名是啥?

​ 3.设置想办法让浏览器能够支持下载我们需要的东西

​ 4.获取下载文件的输入流

​ 5.创建缓存区

​ 6.获取OutputStream对象

​ 7.将FileOutputStream流写到buffer缓存区

​ 8.使用OutputStream将缓冲区中的数据输出到客户端!

3、验证码功能

验证码怎么来的?

  • 前端实现
  • 后端实现,需要用到java的图片类,生成一个图片
package com.summer.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

public class  ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如何让浏览器5秒自动刷新一次
        resp.setHeader("refresh","5");
        //在内存中创建一个图片
        BufferedImage bufferedImage = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
        //得到图片
        Graphics2D graphics = (Graphics2D) bufferedImage.getGraphics();//笔
        //设置图片的背景颜色
        graphics.setColor(Color.BLUE);
        graphics.fillRect(0,0,80,20);
        //给图片些数据
        graphics.setColor(Color.BLACK);
        graphics.setFont(new Font(null,Font.BOLD,20));
        graphics.drawString(makeNum(),0,20);

        //告诉浏览器,这个请求用图片的方式打开
//        resp.setContentType("text/html");//想一个html页面
        resp.setContentType("image/jpeg");
        //网站存在缓存,不让浏览器缓存
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");
        
        //把图片写给浏览器
        ImageIO.write(bufferedImage,"jpg", resp.getOutputStream());
    }

    //生成随机数
    private String makeNum(){
        Random random = new Random();
         String num = random.nextInt(9999999)+"";
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < 7-num.length(); i++) {
            stringBuffer.append("0");
        }
        return stringBuffer.toString()+num;
    }

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

2.4、重定向【重要】

一个web资源收到客户端请求后,它会通知客户端去访问另一个web资源,这个过程叫重定向。

常见场景:

  • 用户登录

重定向主要用这个方法!!

HttpServletResponse.class 
void sendRedirect(String var1) throws IOException;

重定向demo:

package com.summer.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RedirectServlet extends HelloServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.sendRedirect("/index.jsp");
        resp.sendRedirect("https://www.baidu.com");//重定向请求的url【变了哦】
        /**
         * 重定项剖析   设置了location 然后状态码返回302
         *  resp.setHeader("location","https://www.baidu.com");
         *  resp.setStatus(HttpServletResponse.SC_FOUND);
         */
       
    }

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

面试题:

?重定向和转发的区别?

相同点:

  • 页面都会实现跳转

不同点:

  • 请求转发的时候,url不会产生变化
  • 重定向,地址栏url发生变化

4.7 HttpServletRequest

posted @ 2021-01-25 00:05  学点东西真不容易  阅读(407)  评论(0编辑  收藏  举报