javaweb

新手村

魔鬼训练(分析原理看源码)->pk场

  • 截图

  • Tomcat

    Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

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

    Tomcat 实际上运行jsp页面和Servlet. Tomcat最新版本9.0

    工作3~5年之后,可以尝试手写Tomcat服务器

3. Tomcat

3.1 安装 tomact

3.2 Tomcat 启动和配置

  • 文件夹作用

    截图

  • 启动、关闭Tomcat

    截图

  • 访问测试:http://localhost:8080

  • 要能遇到的问题

    • 1. java 环境变量没有配置

    • 2. 闪退问题,需要配置兼容性

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

3.3 配置

截图

可以配置启动的端口号

  • tomcat的默认端口号:8080

  • mysql:3306

  • http:80

  • https:443

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

可配置主机的名称

  • 默认的主机名为:localhost->127.0.0.1

  • 默认网站应用存放位置为:webapps

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

面试题

  • 如何访问一个网站

    • 1.输入一个域名: 回车

    • 2.检查本机的C:\Windows\System32\drivers\etc\hosts 配置文件下有没有这个映射

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

        127.0.0.1  www.joey.com
      • 2.没有:去DNS服务器找,找到的话就返回,找不到就返回找不到;

        截图

    • 3.可以配置一个环境变理

3.4 发布一个web网站

  • 不会就先模仿

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

      网站应该有的结构

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

4.Http

4.1 什么Http

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

  • 文本:html,字符串

  • 超文本:图片,音乐,视频,定位,地图...

  • 80

  • Https:安全的

    • 433

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 OK  状态码:200
      Remote(远程) Address: 14.215.177.38:443
      Accept: text/html
      Accept-Encoding: gzip, deflate, br
      Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
      Cache-Control: no-cache
      Connection: keep-alive

      1.请求行

      • 请求行中的请求方式:GET

      • 请求方式:GET,PSOT,HEAD,DELETE,PUT ,TRACT...

        • get: 请求能够携带的能数比较少,大小有限制,会在浏览咕咕的URL地址栏显示数据内容,不安全,但高效

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

      2.消息头

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

       

4.4 http响应

  • 服务器--响应--客户端

  • 百度


    Cache-Control: private //缓存控制
    Connection: keep-alive  连接(保持)
    Content-Encoding: gzip  编码
    Content-Type: text/html;charset=utf-8 类型
    • 1.响应体

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

      • 200:请求响应成功

      • 3xx:请求重定向

        • 重定向:你重新到我给你新位置去

      • 4xx:找不到资源 404

    • 资源不存在

      • 5xx:服务器代码错误 500 502:网关错误

  • 常见面试题

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

5、Maven

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

  • 1.在javaweb开发中, 需要使用大量的jar包,我们手动去导入;

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

  • 由此Maven 诞生了

5.1 Maven 项目架构管理工具

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

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

  • 有约束,不要去违反。

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

5.2 下载安装Maven

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

截图

下载完后,解压即可

小狂神友情建议:电脑上的所有环境都放在一个文件侠下,方便管理;

5.3 环境变量

在我们的系统 环境变量中

配置如下:

  • M2_HOME maven目录下的bin目录

  • MAVEN_HOME maven的目录

  • 在系统 的path中配置MAVEN_HOME %MAVEN_HOME%\bin

    截图

    测试是否安装成功保证必须配置完毕!

5.4啊里云镜像(修改一下配置文件)

  • 镜像:mirrors

    • 加速我们的下载

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

    <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>

5.5本地仓库

在本地的仓库,远程仓库;

建立一个本地仓库; localRepository

<localRepository>G:\javaDevloper\apache-maven-3.6.3-bin\apache-maven-3.6.3\maven-repo</localRepository>
G:\javaDevloper\apache-maven-3.5.3-bin\apache-maven-3.5.3\maven-repo

5.6 在IDEA中使用Maven

1.启动IDEA

2.创建一个Maven web项目

截图

截图

截图

截图

截图

截图

注意Maven3.5.3 对应 idea 2017

 

4.观察Maven仓库中多了什么东西

5.IDEA中的Maven设置

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

截图

6.到这里Maven 在IDEA中的配置和使用就ok了

5.7 创建一个普通的maven项目

截图

截图

这个只有在web应用下才会有!

截图

5.8 在Idea中标识文件夹目录

截图

截图

截图

截图

5.9 在idea配置Tomcat

截图

截图

解决警告问题

必要的配置:为什么会有这个问题:我们访问一个网站需要指定一个文件夹名字;

截图

截图

截图

截图

5.10 pom文件

maven 仓库(https://mvnrepository.com/artifact/org.springframework/spring-webmvc/5.3.4

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

<?xml version="1.0" encoding="UTF-8"?>
<!--
maven 的脚本和头文件
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <!--
 这里就是我们刚才配置的GAV
 -->
 <groupId>come.joey</groupId>
 <artifactId>javaweb-01-maven</artifactId>
 <version>1.0-SNAPSHOT</version>
 <!--
 项目的打包方式
 jar: java 应用
 war:JavaWeb应用
 -->
 <packaging>war</packaging>
<!--配置-->
 <properties>
   <!--项目的默认构建编码-->
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   <maven.compiler.source>1.8</maven.compiler.source>
   <maven.compiler.target>1.8</maven.compiler.target>
 </properties>
 <!--项目依赖-->
 <dependencies>
   <dependency>
     <!-- 具体依赖的jar包配置文件-->
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
     <version>4.11</version>
     <scope>test</scope>
   </dependency>
 </dependencies>
 <!--项目构建东西-->
 <build>
   <finalName>javaweb-01-maven</finalName>
   <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
     <plugins>
       <plugin>
         <artifactId>maven-clean-plugin</artifactId>
         <version>3.1.0</version>
       </plugin>
       <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
       <plugin>
         <artifactId>maven-resources-plugin</artifactId>
         <version>3.0.2</version>
       </plugin>
       <plugin>
         <artifactId>maven-compiler-plugin</artifactId>
         <version>3.8.0</version>
       </plugin>
       <plugin>
         <artifactId>maven-surefire-plugin</artifactId>
         <version>2.22.1</version>
       </plugin>
       <plugin>
         <artifactId>maven-war-plugin</artifactId>
         <version>3.2.2</version>
       </plugin>
       <plugin>
         <artifactId>maven-install-plugin</artifactId>
         <version>2.5.2</version>
       </plugin>
       <plugin>
         <artifactId>maven-deploy-plugin</artifactId>
         <version>2.8.2</version>
       </plugin>
     </plugins>
   </pluginManagement>
 </build>
</project>

截图

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

 <!--在build中配置resources,来防止我们资源导出失败的问题-->
 <build>
   <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>

5.11 IDEA操作

截图

截图

5.13 解决遇到的问题

1.Maven 3.6.2

unable to import maven project seet logs fo details

2.0 tomcat闪退

3 .IDEA中每次都要重复配置Maven

截图

4.Maven项目中tomcat无法配置

5.Maven 默认web项目中的web.xml版本问题

截图

6.替换为webapp5.0版本和tomcat一致

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee
                     https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
        version="5.0"
        metadata-complete="true">
</web-app>

7.maven 仓库使用

地址:https://mvnrepository.com

截图

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

servlet源码:

 

import java.io.*;
import jakarta.servlet.*;
import jakarta.servlet.http.*;

public class HelloWorld extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException
    {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World!</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello World!</h1>");
        out.println("</body>");
        out.println("</html>");
    }
}

补充:jakarta.servlet --对 tomcat 10.0

截图

截图

6、Servlet

6.1 Servlet 简介

  • Servlet 就是sun公司开发动态web的一门技术

  • Sun 公司在这些API中提供了一个接口叫做:Servlet, 如果你想开发一个Servlet程序,只需要完成两上步骤

    • 编写一个类,实现Servlet接口

    • 把开发好的java类部署到web服务器中。

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

6.2 HelloServlet

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

注意:面向百度编程 maven servlet4.0.1 jsp的依赖

1.构建一个maven项目,删除里面的src目录,以后我们的学习就在这个里面建立model;这个空的工程就是maven的主工程 2.关于Maven父子工程的理解: 父项目中会有:

  <modules>
       <module>servelet-01</module>
   </modules>

子项目会有

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

son extends father

3.Maven环境优化

 1.修改web.xml 为最新的

2 .将maven 的结构搭建完整

4.编写一个servlet程序

 1.编写一个普通类

2.实现servlet接口,这里我们直接继承HttpServlet

截图

package com.joey.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.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 {
       //ServletOutputStream outputStream = resp.getOutputStream();/
       PrintWriter writer = resp.getWriter();//响应流
       writer.print("Hello ,Servlet");
  }

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

 

5.编写Servlet的映射

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

 <!--注册servlet-->
   <servlet>
       <servlet-name>hello</servlet-name>
      <servlet-class>com.joey.servlet.HelloServlet</servlet-class>
   </servlet>
   <!-- servlet 请求路径-->
   <servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>/hellos</url-pattern>
   </servlet-mapping>

6.配置tomcat

注意:配置项目发布的路径就可以了

7.启动测试,ok!

6.3 Servlet 原理

servlet 是由web服务器调用,web服务器在收到浏览器请求之后,会:

截图

6.4 Servlet-Mapping 问题

1.一个servlet 可以指定一个映射路径

    <!-- servlet 请求路径-->
   <servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>/hellos</url-pattern>
   </servlet-mapping>

2.一个servlet 可以指定多个映射路径

 <!-- servlet 请求路径-->
   <servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>/hellos</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>/hellos1</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>/hellos2</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>/hellos3</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
       <servlet-name>hello</servlet-name>
       <url-pattern>/hellos4</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>*.joey</url-pattern>
    </servlet-mapping>

6.优先级问题,

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

 <servlet>
        <servlet-name>error</servlet-name>
        <servlet-class>com.joey.servlet.ErrorServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>error</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

6.5 ServletContext

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

截图

1.共享数据

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

package com.joey.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class HelloServlet 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);//将一个数据保存在了servletContext中,名字为:username,值为“刘凯程”

       System.out.println("hello");
  }
}

 

package com.joey.servlet;

import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;

public class GetServlet extends HttpServlet {
   @Override
   protected void doGet(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);

  }

   @Override
   protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req, resp);
  }
}
  <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.joey.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>getc</servlet-name>
        <servlet-class>com.joey.servlet.GetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getc</servlet-name>
        <url-pattern>/getc</url-pattern>
    </servlet-mapping>

测试访问结果:

2、获取初始化参数

  <!--配置一些web应用初始化参数-->
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    </context-param>
//使用
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       ServletContext context = this.getServletContext();
       String url = context.getInitParameter("url");
       resp.getWriter().print(url);
  }

3、请求转发

 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       System.out.println("进入了ServletDemo04");
       ServletContext context = this.getServletContext();
       context.getRequestDispatcher("/gp").forward(req,resp);//转发的请求路径,调用请求转发

  }

截图

请求转发与重写向

4、读取资源文件

  • 在java目录下新建properties

  • 在resources目录下新建properties

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

思路:需要一个文件流

username=root00999
password=1234569999

 

package com.joey.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class ServletDemo05 extends HttpServlet {
   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/joey/servlet/aa.properties");
       //InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
       Properties prop = new Properties();
       prop.load(is);
       String username = prop.getProperty("username");
       String password = prop.getProperty("password");
       resp.getWriter().print(username+":"+password);


  }

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

 

访问测试即可ok

6.6 HttpServletResponse

web 服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的 HttpRequest 对象,代表响应的一个 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);

void addIntHeader(String var1, int 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、向浏览器输出消息

 2、下载文件

      1、要获取下载文件的路径

      2、下载文件名是啥?

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

      4、获取下载文件的的输入流

        5、创建缓冲区

        6、获取OutputStream 对象

        7、将FileOutPutStream流写入到buffer缓冲区

        8、使用OutPutStream将缓冲区中的数据输出到客户端!
 @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、要获取下载文件的路径
       //String realPath = this.getServletContext().getRealPath("/1.png");
       String realPath = "F:\\code\\javaweb\\javaweb-02-servlet\\response\\src\\main\\resources\\01.png";

       System.out.println("要获取下载文件的路径:"+realPath);
//2、下载文件名是啥?
       String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//3、设置想办法,让浏览器能够支持下载(content-disposition)我们需要的东西 中文件名URLEncoder,encode 编码,否则可能会出现乱码 。
       resp.setHeader("Content-Disposition","attachment;filename"+ URLEncoder.encode(fileName,"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();
  }

3、验证码功能

验证码怎么来的?

  • 前端实现的

  • 后端实现,要用到java的图片类,生成一个图片

package com.joey.servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import javax.imageio.ImageIO;
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 {
       //如保让浏览器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,80);
       //给图片写数据
       g.setColor(Color.blue);
       g.setFont(new Font(null,Font.BOLD,20));
       g.drawString(makeNum(),0,20);
       //告诉浏览器,这个请求用图片的方式打开
       resp.setContentType("image/png");
       //网站存在缓存,不让浏览器缓存
       resp.setDateHeader("expires",-1);
       resp.setHeader("Cache-Control","no-cache");
       resp.setHeader("Pragma","no-cache");
       //把图片写给浏览器
       ImageIO.write(image,"jpg",resp.getOutputStream());
  }
   //生成随机数
   private  String makeNum(){
       Random random = new Random();
       String num = random.nextInt(9999999) + "";
       StringBuffer buffer = new StringBuffer();
       for (int i = 0; i <7-num.length() ; i++) {
             buffer.append("0");
      }
       String s = buffer.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;

    测试:

        /*
           resp.setHeader("location","/s3/img");
           resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
           */
           resp.sendRedirect("/s3/img");//重定向

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

相同点:

  • 页面都会实现跳转

不同点:

  • 请求转发的时候,url不会产生变化 307

  • 重定向的时候,url地址栏会产生变化。302

     

6.7 HttpServletRequest

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

截图

截图

1、获取前端传递的参数

截图

2、请求转发

 

@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 pwd = req.getParameter("pwd");
       String[] hobbys = req.getParameterValues("hobbys");
       System.out.println("================================================");
       System.out.println(username);
       System.out.println(pwd);
       System.out.println(Arrays.toString(hobbys));
       System.out.println("================================================");
      //通过请求转发
       System.out.println(req.getContextPath());
       //这里/人七有当前的   web应用
       req.getRequestDispatcher("/Success.jsp").forward(req,resp);

  }

7、cookie、session

7.1 、会话

会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。

有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾经来过,称之为有状态会话

你能怎么证明你是清华的学生?

你 清华

1、发票 清华给你发票

2、学校登记 清华标记你来过了

一个网站,怎么证明你来过?

客户端 服务端

1、服务端给客户端一个信件,客户端下次访问服务端,带上信件就可以了:cookie

2、服务器登记你来过了,下次你来的时候我来匹配你;session

7.2、保存会话状态的两种技术

cookie

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

     

session

  • 这是一个服务器技术,利用这个技术可以保存用户的会话信息,我们可以把信息或者数据放到session中。!

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

7.3 cookie

截图

1、从请求中拿到cookie信息

2、服务器响应给客户端cookie
 Cookie[] cookies = req.getCookies();//获取cookie
cookie.getName()//获得cookie中的key
cookie.getValue()// 获得cookie中的值
Cookie cookie = 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");

7.4 、Session(重点)

截图

什么session: 会话:

  • 服务器会给每一个用户(浏览器)创建一个session对象;

  • 一个Session独占一个浏览器,只要浏览没有关闭,这个session就存在。

  • 用户登录之后,整个网站都可以访问 保存用户的信息,保存购物车的信息.

    截图

session与cookie区别

  • cookie是把用户的数据写给用户的浏览器,浏览器保存

  • Session把用户数据写到用户独占Session 中,服务器端保存,(保存重要的信息,减少服务资源的浪费)

  • Session对象由服务器创建。

使用场景:

  • 保上辈子一个登录用户的信息

  • 购物车信息:

  • 在整个网站中经常会例用的数据,我们将它保存在session中

使用session:

package com.joey.servlet;

import com.joey.pojo.Person;
import com.sun.deploy.util.SessionState;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.*;

import java.io.IOException;

public class SessionDemo01 extends HttpServlet {


   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //解决乱码问题
       req.setCharacterEncoding("utf-8");
       resp.setCharacterEncoding("utf-8");
       resp.setContentType("text/html charset=utf-8");
       //得到session
       HttpSession session = req.getSession();
       //给session中存入东西
       session.setAttribute("name",new Person("刘凯程",11));
       //获取session的ID
       String sessionId = session.getId();
       //判断session是不是新创建的
      if( session.isNew()){
          resp.getWriter().write("session 创建成功 ID:"+sessionId);
      }else{
          resp.getWriter().write("session 已经在服务器中存在了 ID:"+sessionId);
      }
     //session 创建的时候做了些什么事情
//       Cookie cookie = new Cookie("JSESSIONID",sessionId);
//       resp.addCookie(cookie);

  }

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

 //得到session
       HttpSession session = req.getSession();
       //给session中存入东西
       Person person = (Person) session.getAttribute("name");
       System.out.println(person.toString());
       HttpSession session = req.getSession();
       session.removeAttribute("name");
       //手动注销session
       session.invalidate();

 

会话自动过期 web.xml中配置

    <!--设置session默认注销时间-->
   <session-config>
       <!--15分钟后session自动失效 以分钟为单位-->
       <session-timeout>15</session-timeout>
   </session-config>

截图

8、JSP

8.1、什么是JSP

Java Sever Pages:Java服务端页面,也和servlet一样用于开发动态web技术!

最大的特点:

  • 写JSP就像在写HTML

  • 区别:

    • HTML只给用户提供静态数据

    • JSP页面中可以嵌入java代码,为用户提供动态数据

8.2 JSP 原理

思路:JSP到底怎么执行的!

  • 代码层面没有任何问题

  • 服务器内部工作

    tomcat中有一个work目录

    IDEA中使用tomcat的话会在IDEA的tomcat中生成一个work目录。

  •  

 

 

 

 

 

posted @ 2021-02-25 22:56  五忌  阅读(35)  评论(0)    收藏  举报