JavaWeb学习笔记

JavaWeb学习笔记

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GQv7Gekg-1614520009074)(C:\Users\32140\Desktop\MD\image-20210220203508551.png)]JavaWeb

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1P8EG5X2-1614520009077)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210223183755309.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OmKM6ta8-1614520053507)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210223183755309.png)]在这里插入图片描述

1、基本概念

1.1、前言

web开发:

  • web,网页的意思 , www.baidu.com
  • 静态web
    • html,css
    • 提供给所有人看的数据始终不会发生变化
  • 动态web
    • 淘宝,几乎是所有的网站;
    • 提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同!
    • 技术栈:Servlet/JSP,ASP,PHP

在Java中,动态web资源开发的技术统称为JavaWeb;

1.2、web应用程序

web应用程序:可以提供浏览器访问的程序;

  • a.html、b.html……多个web资源,这些web资源可以被外界访问,对外界提供服务;

  • 你们能访问到的任何一个页面或者资源,都存在于这个世界的某一个角落的计算机上。

  • URL

  • 这个统一的web资源会被放在同一个文件夹 webapps下,web应用程序—>Tomcat:服务器来启动

  • 一个

    web应用

    由多部分组成 (静态web,动态web)

    • html,css,js
    • jsp,servlet
    • Java程序
    • jar包
    • 配置文件 (Properties)

web应用程序编写完毕后,若想提供给外界访问:需要一个服务器来统一管理;

1.3、静态web

  • .htm, .html,这些都是网页的后缀,如果服务器上一直存在这些东西,我们就可以直接进行读取。通络;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZF7iOod8-1614520009080)(C:\Users\32140\Desktop\MD\kuangstudycdc88b5b-4914-4857-8e91-f056734306ac.png)]

  • 静态web存在的缺点
    • Web页面无法动态更新,所有用户看到都是同一个页面
      • 轮播图,点击特效:伪动态
      • JavaScript [实际开发中,它用的最多]
      • VBScript
    • 它无法和数据库交互(数据无法持久化,用户无法交互)

1.4、动态web

页面会动态展示: “Web的页面展示的效果因人而异”;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0usIeZrv-1614520009085)(C:\Users\32140\Desktop\MD\kuangstudybdb1dbd3-bf62-425a-97af-f04638e077b7.png)]

缺点:

  • 加入服务器的动态web资源出现了错误,我们需要重新编写我们的

    后台程序

    ,重新发布;

    • 停机维护

优点:

  • Web页面可以动态更新,所有用户看到都不是同一个页面
  • 它可以与数据库交互 (数据持久化:注册,商品信息,用户信息………)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1OpQItWE-1614520009087)(C:\Users\32140\Desktop\MD\kuangstudye9283260-3100-46a8-9fab-7a33d0cdcb2f.png)]

新手村:—魔鬼训练(分析原理,看源码)—> PK场

2、web服务器

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

IIS
微软的; AP…Windows中自带的
Tomcat
面向百度编程;
Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta 项目中的- -个核心项目由Apache、
Sun和其他一-些公司及个人共同开发而成。由于有了Sun的参与和支持,最新的Servlet和ISP规范总是能在
Tomcat中得到体现,Tomcat 5支持最新的Servlet 2.4和ISP 2.0规范。因为Tomcat 技术先进、性能稳定,而且
免费,因而深受ava爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。
Tomcat服务器是一-个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问
用户不是很多的场合下被普遍使用,是开发和调试ISP程序的首选。对于一个初学者来说,可以这样认为,当在一
台机器上配置好Apache服务器,可利用它响应HTML (标准通用标记语言下的-一个应用)页面的访问请求。实际
上Tomcat是Apache服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat时,它实际上作为一个与
Apache独立的进程单独运行的。
诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat实际上运行ISP页面和Servlet。另外,Tomcat和
IS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和ISP容器, 独立的Servlet容器是
Tomcat的默认模式。不过, Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0。

3、Tomcat

1.文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IpcieEJZ-1614520009088)(C:\Users\32140\Desktop\MD\image-20210221211548564.png)]

2.打开关闭

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8byMG2mW-1614520009089)(C:\Users\32140\Desktop\MD\image-20210221211706846.png)]

测试:http://localhost:8080/

3.端口

可以配置启动的端口号
●tomcat的默认端口号为: 8080
●mysql: 3306
●http: 80
●https: 443

4.发布一个web网站

不会就先模仿
●将自己写的网站,放到服务器(Tomcat)中指定的web应用的文件夹 (webapps) 下,就可以访问了
网站应该有的结构

--webapps : Tomcat服 务器的web目录
	-ROOT
	-kuangstudy :网站的目录名
		- WEB- INF
			-classes : java程序
			-1ib: web应用所依赖的jar包
			-web.xm1 :网站配置文件
		index. htm1默认的首页
		- static
		-CSS 
			-sty1e.css
		-js
		-img

HTTP协议: 面试
Maven:构建工具
● Maven安装包
Servlet入门
● HelloWorld !
● Servlet配置
● 原理

高难度面试题:

请你谈谈网站是如何进行访问的!
1.输入-一个域名;回车
2.检查本机的C:Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射;

	1.  有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问
	2.  没有:去DNS服务器找,找到的话就返回,找不到就返回找不到;

4、Http

4.1、什么是HTTP

HTTP (超文本传输协议)是一一个简单的请求响应协议,它通常运行在TCP之上。
● 文本: html, 字符串,~ …
● 超文本:图片,音乐,视频,定位,地图…
●80
Https:安全的
●443

4.2、两个时代

​ ●http1.0

  • HTTP/1.0:

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

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

4.3、Http请求

●客户端–发请求(Request) --服务器
百度:

	Request URL:https : //www. baidu. com/请求地址
	Request Method :GET  get方法/post方法
    Status Code:200 0K 状态码: 200
	Remote (远程) Address:14. 215.177.39:443
Accept : text/htm 1
Accept - Encoding:gzip,deflate, br
Accept -Language:zh-CN,zh;q=0.9  语言
Cache -Contro1 : max-age=0
connection:keep-alive

1、请求行

​ ● 请求行中的请求方式: GET
​ ● 请求方式: Get, Post, HEAD,DELETE,PUT,TRACT…
​ 。get: 请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高

​ 。post: 请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,
但不高效。

2、消息头

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

4.4、Http响应

  • 服务—响----客户端

百度

Cache -Contro1 :private
缓存控制
Connection :Keep-Alive
连接
Content- Encoding:gzip
编码
content- Type : text/htm1
类型

1.响应器

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

2.响应状态码

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

**常见面试题: **

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

5、Maven

我为什么要学习这个技术?

  1. 在Javaweb开发中,需要使用大量的jar包,我们手动去导入;
  2. 如何能够让一个东西自动帮我导入和配置这个jar包。由此,Maven诞生了!

1.Maven项目架构管理工具

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

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

  • 有约束,不要去违反。

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

2.配置环境

在我们的系统环境变量中
配置如下配置:
●M2_ HOME maven目录下的bin目录
●MAVEN_ HOME maven的目录
●在系统的path中配置 %MAVEN_ HOME%\bin

3.阿里云镜像

镜像: mirrors
作用:加速我们的下载
国内建议使用阿里云的镜像

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

4.本地仓库

在本地的仓库,远程仓库;
建立一个本地仓库: localRepository

<localRepository>C:\HuanJing\apache-maven-3.6.3\maven-repo</localRepository>

5.idea使用maven

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HGHEAEsC-1614520009090)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210223164141967.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6FXJsRDQ-1614520009091)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210223164622812.png)]

这个只有在web应用才会有

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HoWCQHNC-1614520009092)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210223164712596.png)]

标记文件夹

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vERRB7E2-1614520009093)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210223165019990.png)]

maven命令行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KGwvQAwA-1614520009094)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210223165204461.png)]

pom.xml是Maven的核心配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dJ5g76Bl-1614520009095)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210223165329914.png)]

Maven的高级之处在于,他会帮你导入这个JAR包所依赖的其他jar

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-14RLFE3l-1614520009095)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210223165514505.png)]

6、Servlet

个人配置Servlt

① 搭建 Java Web 项目

  1. 创建 一个 Java 项目,并命名为 HelloServlet; (注意:这是普通的 Java 项目而不是动态 Web 项目)

  2. 在项目的根目录下创建一个文件夹 webapp,表示 Web 项目的根;

  3. 在 webapp 中创建 WEB-INF 文件夹;

  4. 在 WEB-INF 文件夹中创建文件夹:classes,lib;

  5. 在 WEB-INF 文件中添加 Tomcat 根目录下 conf 文件夹中的 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_3_1.xsd"
             version="3.1">
    </web-app>
    
  6. 把当前项目的 classpath 路径改成 webapp/WEB-INF 下的 classes 中[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5A9B4jgh-1614520009096)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210226220712741.png)]

② 编写 Servlet

  1. 为该项目增加Servlet的支持.

    1.1. 把Tomcat根/lib中servlet-api.jar文件拷贝到项目下WEB-INF下的lib中
    1.2. 在项目中选择servlet-api.jar,鼠标右键,build path–>add to build path

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g8cvjSpp-1614520009097)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210226220802318.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-izOHHeM5-1614520009098)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210226221113745.png)]

  1. 开发Servlet程序:
    2.1:定义一个类HelloServlet,并让该类去实现javax.servlet.Servlet接口;
    2.2:实现Servlet接口中的init,service,destory等方法.
package com.luo.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 HelloWorld extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入了doGet方法");
        PrintWriter writer = resp.getWriter(); //响应流
        writer.print("hello");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}  
  1. 部署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_3_1.xsd"
             version="3.1">
        <servlet>
            <servlet-name>HelloWorld</servlet-name>
            <servlet-class>com.luo.servlet.HelloWorld</servlet-class>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>HelloWorld</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
    </web-app>
    

1.Servlet简介

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

2.HelloServlet

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

  2. 关于Maven父子工程的理解:
    父项目中会有

    <modules>
            <module>javaweb-servlet</module>
        </modules>
    

    子项目会有

    <parent>
            <artifactId>Servlet</artifactId>
            <groupId>org.example</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    

    父项目中的java子项目可以直接使用

    son extends father
    
  3. Maven环境优化
    1.修改web.xml为最新的
    2.将maven的结构搭建完整

  4. 编写一个Servlet程序
    1.编写-一个普通类
    2.实现Servlet接口

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入了doGet方法");
        PrintWriter writer = resp.getWriter(); //响应流
        writer.print("hello");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
  1. 编写Servlet的映射
    为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需
    要再web服务中注册我们写的Servlet,还需给他一-个浏览器能够访问的路径;

    <servlet>
            <servlet-name>hello</servlet-name>
            <servlet-class>com.luo.serlvt</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>hello</url-pattern>
        </servlet-mapping>
    
  2. 配置Tomcat
    注意:配置项目发布的路径就可以了

  3. 启动测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y7MOr9Bj-1614520009099)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210224134818917.png)]

3.Mapping问题

  1. 一个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>hello1</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>/*</url-pattern>
        </servlet-mapping>
    
  5. 指定一些后缀或者前缀等等…

    <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>*.do</url-pattern>
        </servlet-mapping>
    
  6. 优先级问题

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

4.ServletContext

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

1、共享数据

我在这个Servlet中保存的数据,可以在另外- -个servlet中拿到;

public class HelloWorld extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //this.getInitParameter(); 初始化参数
        //this.getServletConfig(); Servlet配置
        //this.getServLetContext(); Servlet上下
        ServletContext context = this.getServletContext();

        String username = "依尘";
        context.setAttribute("username",username);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}  
public class GetServlrt extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();

        String username = (String) context.getAttribute("username");

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("名字"+username);
    }
}

<servlet>
        <servlet-name>getc</servlet-name>
        <servlet-class>com.luo.servlet.GetServlrt</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getc</servlet-name>
        <url-pattern>/getc</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>com.luo.servlet.HelloWorld</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

2、初始化参数

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

        String url = context.getInitParameter("url");
        resp.getWriter().print(url);
    }

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

3、请求转发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m8nwjyh7-1614520009100)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210227163712576.png)]

public class Servlet04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //转发的请求路径
        requestDispatcher.forward(req,resp); //调用]forward实现请求转发;
    }

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

4、读取资源文件

​ Properties
​ ● 在java目录下新建properties

​ ● 在resources目录下新建properties

发现:都被打包到了同一一个路径下: classes, 我们俗称这个路径为classpath:

思路:需要一个文件流;

public class Servlrt05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");

        Properties prop = new Properties();
        prop.load(is);
        String user= prop.getProperty("username");
        String pwd = prop.getProperty("password");

        resp.getWriter().print(user+":"+pwd);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
username=root12312
password=Zxczxczxc

5.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);

    void setIntHeader(String var1, int var2);

响应状态码

    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. 向浏览器输出消息(- -直在讲,就不说了)
  2. 下载文件
    1. 1.要获取下载文件的路径
    2. 2.下载的文件名是啥?
    3. 3.设置想办法让浏览器能够支持下载我们需要的东西
    4. 4.获取下载文件的输入流
    5. 5.创建缓冲区
    6. 6.获取OutputStream对象
    7. 7.将FileOutputStream流写入到buffer缓冲区
    8. 8.使用OutputStream将缓冲区中的数据输出到客户端!
public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        1.要获取下载文件的路径
        String realPath = "C:\\CodeStudy\\JavaWbe\\one\\target\\one\\WEB-INF\\classes\\1.png";
        System.out.println("下载文件的路径:"+realPath);
//        2.下载的文件名是啥?
        String flieName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//        3.设置想办法让浏览器能够支持下载我们需要的东西,中文文件名URLEncoder.encode编码,否则有可能乱码
        resp.setHeader("Content-disposition","attachment;filename"+ URLEncoder.encode(flieName,"UTF-8"));
//        4.获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
//        5.创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
//        6.获取OutputStream对象
        ServletOutputStream out = resp.getOutputStream();
//        7.将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端!
        while ((len=in.read(buffer))>0){
            out.write(buffer,0,len);
        }
        in.close();
        out.close();
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

3.验证码功能

public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        如何让浏览器3秒刷新一次
        resp.setHeader("refresh","3");

//        在内存中创建一个图片
        BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
//        得到图片
        Graphics2D g = (Graphics2D) image.getGraphics();
//        设置图片背景颜色
        g.setColor(Color.white);
        g.fillRect(0,0,80,20);
//        给图片写数据
        g.setColor(Color.blue);
        g.setFont(new Font(null,Font.BOLD,20));
        g.drawString(makeNum(),0,20);
//        告诉浏览器,这个请求用图片的方式打开
        resp.setContentType("image/jpeg");
        //网站存在缓存,不让浏览器缓存
        resp. setDateHeader( "expires",  -1);
        resp. setHeader( "Cache-Control",  "no-cache");
        resp. setHeader( "Pragma",  "no-cache");
//      把图片写给浏览器
        boolean write = ImageIO.write(image,"jpg", resp.getOutputStream());
    }
    private String makeNum(){
        Random random = new Random();
        String num = random.nextInt(9999999)+"";
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 7-num.length(); i++) {
            sb.append("0");
        }
        num = sb.toString()+num;
        return num;
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}

4.实现重定向

B一个web资源收到客户端A请求后,B他会通知A客户端去访问另外一个web资源C,这个过程叫重定向
常见场景:

  • 用户登录
void sendRedirect(String var1) throws IOException;

测试:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    /*
    resp.setHeader("location","/one_war/img");
    resp.setStatus(302);
     */
    resp.sendRedirect("/one_war/img");
}

面试题:请你聊聊重定向和转发的区别?
相同点

  • 页面都会实现跳转

不同点

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

提交表单并且转跳

public class Requesttest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        处理请求
        String username = req.getParameter("username");
        String passsword = req.getParameter("passsword");
        System.out.println(username+":"+passsword);
//        重定向时一点要注意,路径问题,否则404;
        resp.sendRedirect("/one_war/Success.jsp");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<html>
<body>
<h2>dd</h2>
<%--这里提交的路径,需要寻找到项目的路径--%>
<%--${pageContext.request.contextPath}代表当前项目--%>
<%@ page contentType="text/html; charset=UTF-8"  %> //防止乱码
<form action="${pageContext.request.contextPath}/login"method="get">
    用户名:<input type="text"name="username"><br>
    密码:<input type="text"name="passsword"><br>
    <input type="submit">
</form>
</body>
</html>

记得要先写入jsp的包

<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
      <scope>provided</scope>
    </dependency>

6.HttpServletRequest

HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tW68qqao-1614520009101)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210228112856362.png)]

获取前端传递的参数,请求转发

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iCVJ2eMZ-1614520009102)(JavaWeb%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.assets/image-20210228113120728.png)]

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//      解决乱码问题
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");

        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbys = req.getParameterValues("hobbys");
        System.out.println("=====================");
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbys));
        System.out.println("=====================");

//       通过请求妆发
//       这里的/代表当前的web应用
        req.getRequestDispatcher("/Success.jsp").forward(req,resp);
    }

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

面试题:请你聊聊重定向和转发的区别?
相同点

  • 页面都会实现跳转

不同点

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

7、Cookie、Session

1.会话

**会话:**用户打开一一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话;
**有状态会话:**一个同学来过教室,下次再来教室, 我们会知道这个同学,曾经来过,称之为有状态会话;

你能怎么证明你是西开的学生?
你 西开
1.发票西开给你发票
2.学校登记西开标记你来过了
一个网站,怎么证明你来过?
客户端 服务端
1.服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了; cookie
2.服务器登记你来过了,下次你来的时候我来匹配你; session

2.保存会话的两种技术

cookie

  • 客户端技术(响应,请求)

session

  • 服务器技术,利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在Session中!

常见常见:网站登录之后,你下次不用再登录了,第二次访问直接就上去了!

3.Cookie

1.从请求中拿到cookie信息

2.服务器响应给客户端cookie

	Cookie[] cookies = req.getCookies();//获得cookie
	cookie.getName() //获得cookie的key
	cookie.getValue() //获得cookie中的vlaue
	new Cookie("lastLoginTime",System.currentTimeMillis()+"") //新建一个cookie
    cookie.setMaxAge(24*60*60); //设置cookie的有效期
	resp.addCookie(cookie); //响应给客户端一个cookie

cookie: 一般会保存在本地的用户目录下appdata;

一个网站cookie是否存在上限!聊聊细节问题
● 一个Cookie只能保存一 一个信息;
● 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
● Cookie大小有限制4kb;
● 300个cookie浏览器上限

删除Cookie;
● 不设置有效期,关闭浏览器,自动失效;
● 设置有效期时间为0 ;
编码解码:

URLEncoder.encode("秦疆""utf-8")
URLDecoder.decode (cookie.getValue()"UTF-8")
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页