JavaWeb1

JavaWeb

1、基本概念

1.1前言

web开发

  • web,网页的意思 例: www.baidu.com

  • 静态web

    • html,css
    • 提供给所有人看的数据始终不会发生变化
  • 动态web

    • 几乎所有的网站都是动态的;
    • 提供给所有人看的数据始终会发生变化,(不同的人在不同的事件,不同的地点看到的信息不相同)
    • 技术栈:Servlet/JSP,ASP,PHP

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

1.2web应用程序

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

  • a.html、b.html……多个web资源,这些web资源可以被外界访问,对外界提供服务;
  • 能访问到的任何一个页面和资源,都存在于页面的某一个角落的计算机上
  • URL:
  • 这些统一的外部资源都放在同一个文件夹下, 这些就是一个web应用程序 他们必须依赖一个服务器 Tomcat:服务器
  • 一个web应用由多个部分组成(静态web,动态web)
    • html.css,js
    • jsp,servlet
    • java程序
    • jar包
    • 配置文件(Properties)

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

1.3静态web

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9LQNb3en-1616469489589)(Day23JavaWeb.assets/image-20210304183347032.png)]

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

1.4动态web

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iNMK6M7q-1616469489593)(Day23JavaWeb.assets/image-20210304184124520.png)]

缺点

  • 假如服务器的动态web资源出现错误,我们需要重新编写我们的后台程序,重新发布
    • 停机维护

优点

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j6j7QJH5-1616469489595)(Day23JavaWeb.assets/image-20210304184533427.png)]

2、web服务器

2.1技术讲解

ASP

  • 微软:国内最早流行的就时ASP
  • 在HTML中嵌入了VB的脚本,ASP+COM;
  • 在ASP开发中,基本一个页面 都有几千行业务代码,页面极其混乱,
  • 维护成本高
  • C#

PHP

  • PHP开发速度很快,功能很强大,可跨平台,代码简单(70%的网站都是PHP)
  • 无法承载大访问量的情况(局限性)

JSP/Servlet

B/S:浏览器和服务器

C/S:客服端和服务器

  • SUN公司主推的B/S架构
  • 基于Java语言的(所有的大公司,或者一些开源的组件们都是用java写的)
  • 可以承载三高问题带来的影响;(高并发,高可用,高性能)
  • 语法像ASP

2.2、web服务器

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

IIS

微软的;ASP…Windows中自带的

Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,因为Tomcat 技术先进性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

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

omcat 实际上运行JSP 页面和Servlet。目前Tomcat最新版本为9.0.41**。**

3、Tomcat

文件夹的作用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z3SqMfjn-1616469489598)(Day23JavaWeb.assets/image-20210304193125190.png)]

3.1启动和关闭tomcat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OjVYFUco-1616469489600)(Day23JavaWeb.assets/image-20210304193532917.png)]

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

3.2服务器核心配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MSj8DMlP-1616469489601)(Day23JavaWeb.assets/image-20210304193942194.png)]

可以配置启动的端口号

  • 默认端口号:8080
  • mysql:3306
  • http:80
  • https:443
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

可以配置主机的名称 localhost

  • 默认的主机名为:localhost->127.0.0.1
  • 默认的网站应用存放位置为:webapps
 <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

面试题:

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

  1. 输入域名;点击回车
  2. 然会就会自动检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名的映射
    1. 有:直接返回对应的ip地址 127.0.0.1 localhost 这个地址中有我们要访问的web程序,就可以直接访问
    2. 没有:去DNS找,找到就返回,找不到就返回找不到

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ca0ZVTh0-1616469489602)(Day23JavaWeb.assets/image-20210304202951954.png)]

3.发布一个网站

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

网站应该有的结构

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

4、HTTP

4.1、什么是HTTP

超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,

  • 文本: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 OK             状态码:  200
Remote(远程) Address: 180.101.49.11:443         
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9  语言
Cache-Control: 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 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:主机....
Refresh:告诉客户端,多久刷新一次
Location:让网页重新定位;
2.响应状态码

200:请求响应成功

3xx:请求重定向

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

4xx:找不到资源 404

  • 资源不存在

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

常见面试题:

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

1、先是在windows/system32/drivers/etc/hosts 查找有没有相关的地址映射

2、然后再用dns服务解析地址,解析到相应地址之后

3、完成三次握手,四次挥手,来确保客户端与服务器之间可以完成响应

4、最后由浏览器来完成最后的页面渲染部分

作为客户端,浏览器接收到地址之后,首先会到windows系统文件hosts中查找是否有需要劫持的ip地址,若没有则需要询问DNS域名解析服务器该域名对应的ip地址。(DNS缓存)
浏览器缓存,系统缓存,路由器缓存,IPS服务器缓存,根域名服务器缓存,顶级域名服务器缓存,主域名服务器缓存

获取到正确的ip地址后,客户端会与服务器建立TCP连接(三次握手),(网络层、数据链路层、物理层)

客户端向服务端发送请求,包含请求行、请求头、请求正文。多种请求方式(GET,POST、PUT等)

服务端处理请求,并返回响应,包含状态码、响应头、响应体

浏览器收到响应,解析渲染页面,展示出来

断开连接(http1.0短连接,http1.1长连接)

5、Maven

为什么要学习这个技术

  1. 在学习javaweb过程中要导入大量的jar包,手动导入特麻烦
  2. Maven就可以实现自动导入jar包
5.1、Maven项目架构管理工具

目前用来方便导入jar包

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

  • 有约束,不要去违反

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

5.2、下载安装Maven

官网下载解压

5.3、配置环境变量

  • M2_HOME maven目录下的bin目录
  • MAVEN_HOME maven的目录
  • 在系统的path中配置 %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>D:\MarkDown\apache-maven-3.6.3-bin\apache-maven-3.6.3\maven-repo</localRepository>

5.6、在IDEA中使用Maven

  1. 启动IDEA
  2. 创建一个MavenWeb项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AGf1fPTe-1616469489603)(Day23JavaWeb.assets/image-20210304222345997.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lDK1g0rz-1616469489603)(Day23JavaWeb.assets/image-20210304222820057.png)]

等待初始化

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWfMJsir-1616469489604)(Day23JavaWeb.assets/image-20210304223223713.png)]

IDEA项目创建成功看一下设置中的maven防止自动配置到自带的maven

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVwKlk3m-1616469489605)(Day23JavaWeb.assets/image-20210304224710847.png)]

5.7、在IDEA中配置Tomcat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-opH2SM71-1616469489605)(Day23JavaWeb.assets/image-20210304230608685.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SBoHzPKM-1616469489606)(Day23JavaWeb.assets/image-20210304234342988.png)]

6、Servlet

package com.lv.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.print("HelloServlet");
    }

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

编写Servlet的映射

写的java程序,需要通过浏览器访问,而浏览器需要通过连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,海域要给浏览器一个能访问的路径

<!--注册servlet-->
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.lv.servlet.HelloServlet</servlet-class>
    </servlet>
<!--    servlet的请求路径  映射路径-->
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

配置tomcat

Servlet原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xJ7vQlwR-1616469489607)(Day23JavaWeb.assets/image-20210305195500245.png)]

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>
        <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>
        /hello/这里可以天任何字符,都会访问到最后的地址
    
    
    <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>/*</url-pattern>
        </servlet-mapping>默认请求路径会直接打开这个跳过首页
    
  4. 指定一些后缀或者前缀

<servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.lv</url-pattern>
    </servlet-mapping>
只要以.lv结尾就可以访问
  1. 优先级问题

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MRvemZmW-1616469489608)(Day23JavaWeb.assets/image-20210305202359874.png)]

ServletContext

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

共享数据

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5181yCI6-1616469489608)(Day23JavaWeb.assets/image-20210305211420932.png)]

  • 存放
package com.lv.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 HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("hello");
//        this.getInitParameter(); 初始化参数
//        this.getServletConfig();  servlet配置
//        this.getServletContext();  servlet上下文
        ServletContext context = this.getServletContext();
        String name="你好呀";
        context.setAttribute("name",name);
    }

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

  • 读取
package com.lv.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 GetContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String name = (String)context.getAttribute("name");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print(name);
    }

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

  • 配置文件
<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.lv.servlet.HelloServlet</servlet-class>
        </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
  </servlet-mapping>

    <servlet>
        <servlet-name>good</servlet-name>
        <servlet-class>com.lv.servlet.GetContext</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>good</servlet-name>
        <url-pattern>/good</url-pattern>
    </servlet-mapping>

</web-app>

需要先存放,才可以拿到这个数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UDES5AYo-1616469489609)(Day23JavaWeb.assets/image-20210305211835275.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KEbP7HlM-1616469489609)(Day23JavaWeb.assets/image-20210305211817801.png)]

获取初始化参数
package com.lv.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 ServletDemo01 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 {
        doGet(req, resp);
    }
}

<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">
    <context-param>
        <param-name>url</param-name>//设置一些初始参数
        <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    </context-param>
        
    <servlet>
        <servlet-name>yg</servlet-name>
        <servlet-class>com.lv.servlet.ServletDemo01</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>yg</servlet-name>
        <url-pattern>/yg</url-pattern>
    </servlet-mapping>

</web-app>

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJkSQNnT-1616469489610)(Day23JavaWeb.assets/image-20210305215712767.png)]

转发地址不变 重定向地址会发生改变

读取资源文件

Properties

  • 在Java目录下新建一个properties
  • 在resourcess目录下新建一个properties

发现都会打包到路径下的;classes。我们俗称这个路径为classpath

思路: 需要一个文件流

public class ServletDemo03  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/nb.properties");
        Properties properties = new Properties();
        properties.load(resourceAsStream);
        String user=properties.getProperty("username");
        String pwd=properties.getProperty("password");
        resp.getWriter().print(user);
        resp.getWriter().print(pwd);
    }

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

HttpServletResbonse

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

  • 如果要获取客户端请求过来的参数:找HttpServletResbonse
  • 如果要给客户端返回一些信息:就找HttpServletResbonse
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);
常见应用
  1. 向浏览器输出消息
  2. 下载文件
    1. 要获取下载文件路径
    2. 下载的文件名
    3. 想办法让浏览器支持我们需要的东西
    4. 获取下载文件的输入流
    5. 创建缓冲区
    6. 获取OutputStream对象
    7. 将FileOutStream流写入到buffer缓冲区
    8. 使用OutputStream将缓冲区中的数据输出到客户端!
package com.lv.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 1. 要获取下载文件路径
//        String realPath = "D:\\MarkDown\\javaweb-01-servlet\\response\\src\\main\\resources\\1.png";
        String realPath = "D:\\MarkDown\\javaweb-01-servlet\\response\\src\\main\\resources\\机密文件.txt";
    // 2. 下载的文件名
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);//获取最后一个\字符串的下一个字符,这个字符一定是文件名,substring  截取字符串
    // 3. 想办法让浏览器支持我们需要下载的东西
        resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"utf-8"));//URLEncoder让中文文件名能够显示
    // 4. 获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
    // 5. 创建缓冲区
        int len=0;
        byte[] buffer = new byte[1024];
    // 6. 获取OutputStream对象
        ServletOutputStream outputStream = resp.getOutputStream();
    // 7. 将FileOutStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端!
        while((len=in.read(buffer))!=-1){
            outputStream.write(buffer,0,len);
        }
    // 8. 关闭流
        outputStream.close();
        in.close();
    }

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

  1. 验证码实现

  2. 实现重定向(重要)

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

void sendRedirect(String var1) throws IOException;
@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.setHeader("Location","/response_war/oo");
//        resp.setStatus(302);
        resp.sendRedirect("/response_war/oo");// 重定向
    }

面试题:重定向转发区别?

相同点:

  • 页面都会跳转

不同点:请求转发的时候url不会发生变化 307,重定向的时候,url地址栏会发生变化302

package com.lv.servlet;
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 RequestTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("通过表单提交进入了");
        resp.getWriter().print("nihao");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if (username.equals("root")&&password.equals("123456")){
            resp.sendRedirect("/response_war/success.jsp");
        }
    }

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

<html>
<body>
<h2>Hello World!</h2>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%--${pageContext.request.contextPath}  代表当前的项目--%>
<%-- 当提交后就会转到 ${pageContext.request.contextPath}/request的项目路径下--%>
<form action="${pageContext.request.contextPath}/request" method="get">
    <p>账户:<input type="text" name="username"></p>
    <p>密码:<input type="password" name="password"></p>
    <p>提交<input type="submit"></p>
</form>
</body>
</html>

<%--
  Created by IntelliJ IDEA.
  User: lcj
  Date: 2021/3/6
  Time: 12:44
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>login is success</h1>

</body>
</html>

HttpServletRequest

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

  1. 获取前端传递的参数
    package com.lv.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.util.Arrays;
    
    public class RequestText01 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
    //        resp.getWriter().print("你输入的账号或者密码错误请再试一次");
    //        System.out.println("你输入的账号或者密码错误请再试一次");
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            String[] likes = req.getParameterValues("like");//多个内容用这个
            String s = Arrays.toString(likes);
            System.out.println("==============================");
            System.out.println("username:"+username);
            System.out.println("password:"+password);
            System.out.println("likes:"+s);
            System.out.println("==============================");
    
    
            if (username.equals("root")&&password.equals("123456")){
                resp.sendRedirect("/r/login.jsp");
    
    
            }
            else {
                req.getRequestDispatcher("/login.jsp").forward(req,resp);//转发  这里只用填一个  /    应为/在这里代表的是当前的webapp木留
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    
    <%--
      Created by IntelliJ IDEA.
      User: lcj
      Date: 2021/3/6
      Time: 14:23
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>登录</title>
    </head>
    <body>
    <h2>请登录</h2>
    <div>
        <form action="${pageContext.request.contextPath}/login" method="post">
            <div>账号: <input type="text" name="username"></div>
            <div>密码: <input type="password" name="password"></div>
            爱好:
            <input type="checkbox" name="like" value="唱歌">唱歌
            <input type="checkbox" name="like" value="跳舞">跳舞
            <input type="checkbox" name="like" value="学习">学习
            <input type="checkbox" name="like" value="打游戏">打游戏
            <div><input type="submit">提交</div>
        </form>
    </div>
    
    </body>
    </html>
    
    
  2. 请求转发
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值