java开发工程师入门第二阶段(08-web前端(VUE-02))

VUE
7.web资源
1. 概述

指的我们项目中常见的html, css,javascript,文本 ,图片,音频,视频等等,统称为资源.

实际生活中: 水资源, 天然气资源等等

1.1静态资源概述

指的资源数据不会随着时间的变化而变化,这些资源就是静态资源.

比如: html, css,javascript静态资源

比如: 2008年北京奥运会开模式的入场顺序介绍的网页 beijing.html

1.2 动态资源概述

指的资源数据会随着时间的变化而变化.

比如: servlet动态资源

1.3 静态资源和动态资源联系起来.

静态资源(前端人员开发的页面)–发送请求–>
动态资源(java开发的后台程序)
比如: login.html-发送登录请求->java程序,实现登录功能
实现方式有两种:
方式一: login.html—>发送同步请求—>java程序
方式二: login.html—>发送异步请求—>java程序

2.服务器

问题: 用户---->通过网络---->(静态资源—>动态资源)
访问方式:
第1步: 用户打开浏览器
第2步: 在浏览器地址栏: 输入访问的资源地址,点击enter
第3步: 资源数据会展示到浏览器给用户看.

3.web资源和服务器关系

浏览器—>访问地址—>服务器—>要访问的资源
服务器:
分类一:硬件服务器,指的配置较高的主机.
比如:IBM刀片式服务器,思科服务器,华为服务器等等
我们的电脑作为硬件服务器,性能会差点.
分类二: 软件服务器,指的我们的应用程序
比如: mysql数据库服务器,mysql就是一款数据库软件
DB2数据库服务器,它是IBM的数据库产品
结论: 通常所说的服务器,
指的应用软件安装在配置比较高的主机,称之为服务器

4.网络访问三要素

4.1 要素1: http(https)协议:
规范浏览器和服务器传输数据的格式
浏览器--------->服务器端资源
请求过程: 浏览器提交请求数据到服务器,需要遵循http协议
服务器端资源------>浏览器
响应过程: 服务器响应数据到浏览器,需要遵循http协议
实际开发场景: 登录功能
1.浏览器----提交请求数据:用户名和密码->服务器
用户名和密码的数据格式,必须需要遵循http协议
2.服务器----响应登录信息—>浏览器
响应的登录信息(login success,或者fail)
必须需要遵循http

4.2 要素2 : 域名(domain)(一串英文字母,还有中文域名)

什么是域名?
域名是服务器的唯一标识,因为域名的本质是IP地址
在网络中: IP地址是唯一的.

域名有什么作用?
浏览器访问服务器资源,
首先找到服务器,根据域名(IP地址)找服务器.
以管理员命令打开dos命令行: ipconfig/all

4.3 要素3: 端口(port)

1.什么是端口?
端口其实就是一个整数.
2.端口有什么作用?
端口是用来区分硬件服务器上面
相同的多个软件服务器.
实际场景
电脑上安装了mysql:
jdbc:mysql://localhot:3306/数据库名称
电脑上安装了两个mysql.
一个mysql端口3306:
jdbc:mysql://localhot:3306/数据库名称
另一个mysql端口3308:
jdbc:mysql://localhot:3308/数据库名称

4.4 总结

1.web资源(静态资源,动态资源)
2.访问web资源, 把web资源放到服务器上面
3.服务器: 硬件服务器,软件服务器,软件安装到硬件
4.访问服务器端资源:
http://域名(ip):port/资源
5.网络访问的三要素
http, domain, port

8.tomcat
1.Apache介绍

Apache官网地址: https://www.apache.org/ Apache是美国的一个非盈利性组织,主要开发开源的软件产品. 其中一个出名的软件产品:Tomcat Tomcat官网地址: https://tomcat.apache.org/

2.Tomcat安装和卸载

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

推荐下载那些版本: 8,9,10

tomcat和jdk版本的兼容性

tomcat下载完成了(windows操作,下载zip,rar压缩包)

学习过程中tomcat8版本(建议使用jdk8以上版本)

安装tomcat
1.先下载tomcat软件包,以apache-tomcat-8.5.72.rar为例
2.安装tomcat: 解压即可用
注意:解压好的tomcat不要放在中文路径里面.

在这里插入图片描述

启动tomcat(安装目录/bin目录/startup.bat)
步骤一: 启动tomcat
步骤二: 浏览器输入 http://localhost:8080
出现小猫页面,启动真的成功了。

在这里插入图片描述

3.tomcat安装过程中出现的问题

问题一: 在bin目录里面找不到startup.bat, 只看到startup
电脑里面没有显示文件的扩展名(后缀名)
问题二: tomcat正常启动,输入地址不能访问https://localhost:8080
没有配置https协议,所以写http
问题三: 启动tomcat时,出现类一闪而过
解决方案: 在环境变量里面配置JAVA_HOME环境变量.
tomcat是java语言编写的,运行tomcat需要jdk环境变量。
tomcat运行—》系统path: JAVA_HOME—>jdk路径
问题四: 启动了一个tomcat,同时又启动了另一个tomcat
端口被占用.
tomcat的默认端口是8080,启动两个tomcat,
出现端口被占用.
错误的代码:
java.net.BindException: Address already in use: bind
解决问题:
tomcat安装目录的conf/server.xml,修改以下端口
在这里插入图片描述

4.如何部署资源到tomcat服务器,然后进行访问

步骤一: 将静态资源项目放到tomcat/webapps 目录
步骤二: 启动tomcat服务器
步骤三: 访问tomcat服务器资源
方式一: 只能自己访问自己的tomcat
http://localhost:8080/静态资源项目名称/资源名称
比如:
http://localhost:8080/static/index.html
http://localhost:8080/static/img/a.png

方式二: 班级的其它同学都可以访问我的资源
dos命令 ipconfig/all,找到以太网ipv4
http://ip:8080/静态资源项目名称/资源名称
我的ip: 10.1.6.157
比如:
http://10.1.6.157:8080/static/index.html

5.IDEA整合tomcat

整合时,在idea里面找不到tomcat

原因是因为idea版本的问题.
idea社区版本Community version: 找不到tomcat菜单
不重新安装idea. 社区版本 解决tomcat没有的问题
File->settting->plugins–> tomcat插件: smart tomcat 点击 install就可以了

6.Idea创建动态资源项目, 发布到tomcat服务器.

步骤一: 创建一个动态web资源项目
步骤二: 把动态web资源项目发布到tomcat服务器
步骤三: 启动idea里面整合的tomcat服务器
步骤四: 通过浏览器访问web资源项目
方式一: http://localhost:port/项目名称/资源名称
缺点: localhost本地域名(127.0.0.1),
只能自己访问自己
方式二: http://ip:port/项目名称/资源名称
优点: ip教室的ip(局域网ip),
只能教室里面的同学相互访问
如果让教室外的同学或者朋友访问我的项目.
只能去申请公共域名(广域网ip,全世界).
比如: 去万网(被阿里收购了),去申请一个域名.

9.Servlet
1.概述和作用

servlet 是运行在 Web 服务器中的小型 Java 程序(动态资源)。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端(浏览器)的请求。

Servlet作用:

  1. Servlet接收浏览器发送的请求, 接收请求数据

比如: 小明----请求: 提交5元(data)—>超市

  1. Servlet对请求处理,然后响应数据给浏览器

比如: 小明<—响应: 一袋精细盐(data)------超市

在这里插入图片描述

2.Servlet入门

Servlet是SUN制定的动态资源程序标准,提供的是一个Servlet接口.

我们程序员开发Servlet,自定义一个类,去实现Servlet接口.重写里面方法

Servlet入门程序

步骤一: IDEA创建一个web项目 比如: web02

步骤二: 项目的src目录, 创建一个包(new packge) 比如: cn.tedu.web

步骤三: 在包下面, 自定义一个类, 比如 :Demo1Servlet 实现 Servlet接口,重写接口里面的方法

步骤四: 在自定义的类里面配置访问路径. 比如: “/demo1”

步骤五: 测试

浏览器地址栏: http://localhost:端口/项目名称/servlet访问路径

注意: 动态资源项目.web项目,目录的存放文件的区别
在这里插入图片描述

3.Servlet运行中出现的问题

问题一:

实现Servlet接口,并且Servlet接口报红色,不能导入包import javax.servlet.*

分析问题原因: 创建web项目中,出问题,没有绑定tomcat环境

没有绑定tomcat环境,不能导入包,是因为tomcat环境提供了 servlet-api.jar

问题一解决方案 :

方案一: 在web项目中,导入servlet-api.jar

​ 在WEB-INF目录下面,创建一个lib目录(如果有,就不用),把servlet-api.jar放到lib目录里面,同时把servlet-api.jar加载到项目中
在这里插入图片描述

方案二: 在web项目中, 引入tomcat环境(自带servlet-api.jar),相当于项目中引入了servlet-api.jar

在这里插入图片描述

4.入门代码
package cn.tedu.web; 
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;
/*
   alt+enter 放在接口后面, 点击implements methods
 */
@WebServlet(urlPatterns ="/demo1" )
public class Demo1Servlet implements Servlet {
    /**
     * 服务方法: 作用接收请求,然后响应数据
     * @param servletRequest:请求对象,处理请求数据
     * @param response:响应对象,处理响应数据的
     * @throws ServletException
     * @throws IOException
     */
    public void service(ServletRequest servletRequest, ServletResponse response) throws ServletException, IOException {
         //1.打印模拟:接收到请求了
        System.out.println("hello request");
        //2.响应数据到浏览器: 英文,先不要写中文
        PrintWriter writer = response.getWriter();
        writer.write("hello response");
    }
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
    }
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    @Override
    public String getServletInfo() {
        return null;
    }
    @Override
    public void destroy() {
    }
}
5.Servlet访问流程

要求: 需要创建一个web项目, 把部署到服务器.通过浏览器去访问servlet资源

在浏览器地址栏输入的servlet访问路径:

http://域名:端口/项目名称/servlet访问路径.

地址一: 输入: http://域名:端口

作用: 访问到主机安装的tomcat服务器

地址二: /项目名称

作用: 访问的tomcat服务器部署的项目

地址三: /servlet访问路径.

作用: 访问tomcat服务器部署的项目里面的servlet资源
如下图:

在这里插入图片描述

6.Servlet生命周期

生命周期: 指的对象从创建到销毁的完整过程,这个过程就是生命周期

在完整的过程中,涉及到方法的执行,那么这些方法,我们称之为生命周期方法

代码如下:

package cn.tedu.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
 * 生命周期相关的方法,一共三个
 *  init(参数): 当servlet对象创建以后,执行该方法
 *  service(参数):当浏览器发送请求时,执行该方法
 *  destroy():当销毁servlet对象以后,执行该方法
 *  问题一: servlet对象创建好以后,在那里保存?
 *        servlet是运行在tomcat服务器上面,
 *       保存在tomcat服务器的内存中
 *  问题二: servlet对象会创建几次呢?
 *    servlet只创建一次,与创建对象相关的init()方法,执行一次.
 *  问题三: 生命周期方法什么时候执行,执行几次?
 *   init(参数): 只执行一次,当第一次访问时才执行.
 *   service(参数):执行多次,每次访问都会执行.
 *   destroy(): 只执行一次. 当服务器正常关闭时才会执行.
 */
@WebServlet(urlPatterns ="/demo2" )//配置访问路径
public class Demo2Servlet implements Servlet {

    /**
     * 生命周期方法: 作用接收浏览器请求,响应数据给浏览器
     * @param servletRequest: 请求对象,处理请求数据
     * @param servletResponse: 响应对象, 处理响应数据
     * @throws ServletException: 异常信息对象
     * @throws IOException
     */
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("service method ----");
    }
    /**
     * 生命周期方法: 创建servlet对象,执行init()方法
     * @param servletConfig
     * @throws ServletException
     */
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init servlet object--1");
    }
    /**
     * 生命周期方法: 在servlet对象销毁以后,执行该方法
     */
    public void destroy() {
        System.out.println("destroy method--------");
    }
	/**
		获取servletConfig配置类对象,了解
	*/
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    /**
		获取servlet的信息,了解
		比如: servlet的访问路径,servlet的名称
	*/
    public String getServletInfo() {
        return null;
    }
}
7.Servlet的体系结构
  • 顶层接口

    Servlet 里面都是抽象方法

  • 抽象子类,实现Servlet接口

    GenericServlet 里面有抽象方法,也有普通方法

  • 抽象子类,继承了 GenericServlet

    HttpServlet 里面有抽象方法,也有普通方法

为什么设计Servlet体系结构,这样设计?

  1. 如果开发者定义一个类,实现Servlet接口,这种方式不好.

缺点: 自定义类重写接口的所有方法,即使方法不需要,也要全部全写.

  1. 如果开发者定义一个类,继承 GenericServlet,这种方式不好

优点: 解决了(实现Servlet接口全部重写方法)的缺点.

缺点: 不能明确指定浏览器发送的是什么请求,

不能很好的处理请求和响应数据

  1. 如果开发者定义一个类, 继承HttpServlet, 这种方式好,推荐使用

解决上述1, 2中存在的问题了,

明确指定浏览器发送的是http请求,能够很好处理请求数据以及响应数据

http协议: 作用规范请求和响应过程的数据交互格式.

结论: 企业开发中,通过继承HttpServlet来定义我们的类,处理请求和响应数据

8.实际开发中,Servlet推荐的书写方式
  1. 自定义一个类, 继承HttpServlet,重写下面两个方法(重点以及难点)
  2. doGet(请求对象request, 响应对象response):

作用: 接收浏览器发送的get请求

  1. doPost(请求对象request, 响应对象response):

作用: 接收浏览器发送的post请求

代码如下:

@WebServlet("/demo5")
public class Demo5Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//处理post数据,不能处理get请求的数据
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//处理get数据,不能处理post请求的数据
    }
}

4.为什么不重写service方法, 而重写doGet和doPost方法(重点以及难点)

结论就是: service方法内部,不知道浏览器发送的是get请求还是post请求,都会接收, 最终在处理get请求的数据时和处理post请求的数据时,处理方式不一样. 所以不重写service方法

HttpServlet中的service方法和doGet方法和doPost方法有关系吗?

答案肯定有.

什么关系,查询HttpServlet的源代码

快捷方式有两种:

方式一: 在代码中,找到HttpServlet, 安装ctrl键, 鼠标点击HttpServlet

方式二: 在当前项目中, ctrl+n快捷键,在它的输入框: HttpServlet

源码分析:

debug源码调试:
浏览器发送的get请求—>HttpServlet中的service方法:

1.获取浏览器的提交请求方式: method

2.if判断(method.equals(“Get”)){
//this指代的就是当前HttpServlet

this.doGet(req,response);

}else if(method.equals(“Post”)){
this.doPost(req,response);}

结论1:(请求方式一共7种,常见的有两种)

结论2:浏览器发送请求时---->service方法: 根据请求方式的不同---->去调用doGet或者doPost方法

结论3:

浏览器发送get请求---------------->doGet方法

浏览器发送post请求---------------->doPost方法

protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        long lastModified;
        if (method.equals("GET")) {
            lastModified = this.getLastModified(req);
            if (lastModified == -1L) {
                this.doGet(req, resp);
            } else {
                long ifModifiedSince;
                try {
                    ifModifiedSince = req.getDateHeader("If-Modified-Since");
                } catch (IllegalArgumentException var9) {
                    ifModifiedSince = -1L;
                }

                if (ifModifiedSince < lastModified / 1000L * 1000L) {
                    this.maybeSetLastModified(resp, lastModified);
                    this.doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            lastModified = this.getLastModified(req);
            this.maybeSetLastModified(resp, lastModified);
            this.doHead(req, resp);
        } else if (method.equals("POST")) {
            this.doPost(req, resp);
        } else if (method.equals("PUT")) {
            this.doPut(req, resp);
        } else if (method.equals("DELETE")) {
            this.doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            this.doOptions(req, resp);
        } else if (method.equals("TRACE")) {
            this.doTrace(req, resp);
        } else {
            String errMsg = lStrings.getString("http.method_not_implemented");
            Object[] errArgs = new Object[]{method};
            errMsg = MessageFormat.format(errMsg, errArgs);
            resp.sendError(501, errMsg);
        }

    }
9.总结
  1. Servlet概述

它是运行在web服务器的一个java程序(动态资源)

作用: 接收浏览器的请求,响应数据给浏览器

  1. 自定义servlet类.

方式一: 实现接口Servlet

自定义一个类 实现Servlet接口, 不推荐,重写很多没有用的方法

方式二: 继承GenericServlet

自定义一个类 继承GenericServlet, 不推荐,因为不清楚浏览器发送的http请求

方式三: 继承HttpServlet,重写doGet和doPost方法 推荐使用.

  1. 源码分析HttpServlet

结论1:(请求方式一共7种,常见的有两种)

结论2:浏览器发送请求时---->service方法: 根据请求方式的不同---->去调用doGet或者doPost方法

结论3:

浏览器发送get请求---------------->doGet方法

浏览器发送post请求---------------->doPost方法

  1. 常见的问题

404 问题: 表示请求路径找不到, 因为路径写错了.

500问题: 表示代码出异常了,找代码的问题.

405问题: 表示请求方式不支持

浏览器发送get请求------------>只有一个doPost方法

浏览器发送post请求------------>只有一个doGet方法

10.请求对象
1.请求对象概述以及作用
  • 请求过程: 从浏览器到服务器的过程,称之请求过程

    浏览器-------请求过程: 提交请求数据------------------->服务器端

  • 请求数据: 使用请求对象request来处理

  • 请求对象的类型:

    HttpServletRequest(引用类型) request

2.请求对象常用的方法

第一类: 获取请求数据

在这里插入图片描述

Map<String,String[]> map = request.getParameterMap()

map的key: name的属性值,比如: username, psw, love

map的value: 用户输入的数据(用户名和密码)以及用户选择的数据(单选按钮,复选框)

前台代码 :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>request parameter page</title>
</head>
<body>
        <!--
            form表单的方式提交数据
            http协议提交数据时: key=value的形式.
            所以form中的输入项必须得有name属性
            输入项没有name属性, 就不能提交数据到后台,所以后台获取的是null
        -->
        <form action="paramMapServlet" method="get">
            用户名: <input type="text" name="username"/>
            <br/>&nbsp;&nbsp;&nbsp;码: <input type="password" name="psw"/>
            <br/>&nbsp;&nbsp;&nbsp;好:
            <input type="checkbox" name="love" value="comment">爱评论
            <input type="checkbox" name="love" value="study">爱学习
            <input type="checkbox" name="love" value="16k"/>拿高薪
            <input type="submit" value="提交数据"/>
        </form>
</body>
</html>

后台代码 :

package com.tedu.web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;

/**
 * 1. 定义类ParamServlet 继承HttpServlet的方式
 *    作用: 获取浏览器提交的数据,以及响应数据给浏览器
 * 2. doGet方法: request,response
 *    request请求对象: 在服务器端,获取浏览器提交的请求数据的
 *    response响应数据: 响应数据到浏览器的
 *3. doPost方法: request,response
 *     request请求对象: 在服务器端,获取浏览器提交的请求数据的
 *     response响应数据: 响应数据到浏览器的
 */
@WebServlet("/paramServlet")//注意 : 路径必须加/, 不加/ tomcat启动就报错了
public class ParamServlet extends HttpServlet {
    /**
     * 作用: 接收浏览器发送的get
     * @param request: 获取请求数据,浏览器----->服务器
     * @param response: 响应数据,   浏览器<-----服务器
     * @throws ServletException
     * @throws IOException
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.根name的属性获取用户输入的用户名: username=jack
        // 因为name="username" 是写死的,但是用户名可以随意输入的值
        String userValue = request.getParameter("username");
        System.out.println("请求的用户名:"+userValue);
        //2.根据psw=1111
        String pswValue = request.getParameter("psw");
        System.out.println("请求的密码:"+pswValue);
        //3.love  多个值
        String[] loves = request.getParameterValues("love");
        System.out.println("请求的爱好:"+ Arrays.toString(loves));
        //1.获取表单提交的所有数据
        Map<String, String[]> map = request.getParameterMap();
        //2.遍历map
        //2.1 获取所有key
        Set<String> keys = map.keySet();
        //2.2遍历 set:  快捷键iter
        for (String key : keys) {
             //2.3 获取map的值
            String[] strings = map.get(key);
            System.out.println(key+":"+ Arrays.toString(strings));
        }
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
}

第二类: 处理请求中文的乱码问题

分析会出现请求中文的乱码问题?
浏览器提交的中文数据的编码格式------>tomcat服务器的编码格式不一样

比如: 小伙伴(意见)------不同-------->老师(方式)

常见的编码格式, 推荐使用UTF-8

  1. 支持中文的编码格式: GBK

特点: 支持中文.不支持日文,韩文等等

  1. 万能的编码格式: utf-8 (UTF-8)

特点: 支持所有字符,比如中文,韩文,日文,等等

  1. 西欧编码: ISO8859-1

特点: 只支持欧美国家的字符,肯定不支持中文,韩文,日文等等

解决乱码:

  1. 请求方式不一样,提交的请求数据的形式就不一样,所以根据不同的请求方式来处理乱码.

get请求的中文:

tomcat8版本以上: 自动处理了get请求的中文乱码问题.

tomcat8版本以下: 代码处理get请求的中文乱码问题

String vule = new String(

“用户数据”.getBytes(“iso8859-1”),

“utf-8”);

  1. post请求的中文:

request.setCharacterEncoding(“utf-8”);

注意: 上面的代码 必须放在方法的第一行.

3.案例: 常用的方法

获取请求参数的值的方法

  1. 获取一个输入框的用户数据
    String value = request.getParameter(“name属性值”);
  2. 获取复选框用户选择的数据

String[] values = request.getParameterValues(“name属性值”);

  1. 获取form表单提交的所有数据

Map<String,String[]> map = getParameterMap();

  1. 处理post请求的中文乱码问题(tomcat8以上不用处理get请求中文)

request.setCharacterEncoding(“支持中文的编码格式,utf-8”);

package cn.tedu.web;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/paramServlet4")
public class ParamServlet4 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        String parameter = request.getParameter("username");
        System.out.println("请求的用户名:"+parameter);
    }
}
package cn.tedu.web;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Arrays;

@WebServlet("/paramServlet")
public class ParamServlet extends HttpServlet {
    /**
     * 
     * */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //根据name属性获取用户输入的用户名username=jack
        //因为name="username" 是写死的,但是用户名可以随意输入的值
        String userValue = request.getParameter("username");
        System.out.println("请求的用户名:"+userValue);
        String pswValue=request.getParameter("psw");
        System.out.println("请求的密码:"+pswValue);
        String[] loves = request.getParameterValues("love");
        System.out.println("请求的爱好:"+ Arrays.toString(loves));
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
}
11.响应对象
1.概述
  • 响应过程: 从服务器到浏览器响应数据的过程,就是响应过程

    web服务器------响应: 响应数据------>浏览器

  • 作用:

    主要处理响应数据以及重定向(稍后讲)

  • 类型

    HttpServletResponse(类型) response(对象)

2.常用方法

字符流和字节流回顾

字符流把c盘的图片文件拷贝到D盘?

答案: 不行, 字符流只能进行字符串的读写操作.

字节流把c盘的图片文件拷贝到D盘?

答案: 可以的.

将c盘的 文本文件,比如 a.txt 拷贝 到D盘

推荐使用字符流, 字节流也可以

结论:

字符流只能进行字符串的读写操作, 字节流可以操作任意类型的文件

第一类方法:

响应数据方法(服务器—响应数据:与浏览器绑定的输出流–>浏览器)

字符输出流的方式

PrintWriter out = response.getWriter();

out.writer(“字符串数据”); //out.println(“字符串数据”);

字节输出流的方式

ServletOutputStream out = response.getOutputStream();

out.write(字节数据); //out.println(字节数据);

/**
 *  注解中:
 *  value特权属性: 当注解中,有且仅有一个value属性时,
 *                 value可以省略不写.
 */
@WebServlet(urlPatterns = "/demo2")
public class Demo2Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //字节输出流响应数据
        //1. 获取字节输出流对象
        //OutputStream        out1 = response.getOutputStream();//多态写法
        ServletOutputStream out2 = response.getOutputStream();
        //2. 写方法, 响应数据
        String str = "hello 11111";//字符串
        byte[] bytes = str.getBytes();//字节数据
        out2.write(bytes);//字节数据
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

第二类方法: 处理响应中文数据的乱码问题

处理字符流响应数据的乱码问题

比如: response.setContentType(“text/html;charset=utf-8”);

服务器向浏览器响应文本数据, 文本的编码格式是utf-8

比如: response.setContentType(“application/json;charset=utf-8”);

服务器向浏览器响应的json数据, json数据编码格式是utf-8

text/html(固定写法,不唯一):

字符输出流向浏览器响应的文本或者html网页数据

application/json(固定写法,不唯一):

字符输出流向浏览器响应的json数据

charset = utf-8 (utf-8编码格式,不固定的, 推荐使用)

注意: 放在方法的第一行

/**
 * 名为 [com.tedu.web.Demo2Servlet]和 [com.tedu.web.Demo2ServletEncode] 的servlet
 * 不能映射为一个url模式(url-pattern) [/demo2]
 *  原因:  一个访问路径 对应两个不同的servlet
 */
@WebServlet(urlPatterns = "/code1")
public class Demo1ServletEncode extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.处理响应中文的乱码问题
        // 字符输出流
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().write("<a href='http://www.tedu.cn'>hello 字符流</a>");

    }
}

第三类方法: 重定向方法

重定向: 从一个资源跳转到另一个资源(比如:点击超链接跳转)

方法:

response.sendRedirect(“路径”);

路径书写:绝对路径的书写方式

需求一: 站外跳转

从我们自己的网站重定向到达内官网

需求二: 站内跳转

从我们自己的网站重定向到自己网站的资源

package com.tedu.redirect;

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

/**
* 需求一: 站外跳转
* 从我们自己的网站重定向到达内官网
* 1. 访问自己网站资源:http://localhost:8080/case2_response/outer
* 2. 代码内部: 重定向, 跳转到 "http://www.tedu.cn"
*/
@WebServlet("/outer")
public class ServletRedirectOuter extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //1.处理响应中文的乱码问题
       response.setContentType("text/html;charset=utf-8");
       //2.重定向: 绝对路径
       String outerUrl = "http://www.tedu.cn";
       response.sendRedirect(outerUrl);
   }

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       doPost(request, response);
   }
}
3.案例( 企业级项目用户管理平台,实现登录功能. )

步骤一: 创建一个web项目: UserSystem(usermanagerment)

步骤二: 在web目录下面, 创建一个登录页面login.html

步骤三: 创建一个LoginServlet,处理登录请求

总结:

login.html------->

LoginServlet判断: 用户名和密码正确,重定向到main.html

用户名或者密码错误,提示用户错了,重新登录

前端代码

main.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
            <!--http://localhost:8080/usersystem/index.html-->
           <h1>欢迎您: 访问我的网站</h1>
</body>
</html>
============================
login.html登录页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login page</title>
</head>
<body>
 <div style="margin:auto;text-align: center;border: 1px solid blue;width: 500px;">
    <form action="LoginServlet"   method="post">
        用户名:<input type="text" name="username"/>
        <br/>&nbsp;&nbsp;&nbsp;<input type="password" name="psw"/>
        <br/>
        <input type="submit" value="登录" />
    </form>
 </div>
</body>
</html>

后端代码

package com.tedu.web;

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

/**
 * 实现登录功能: 获取用户输入的用户名和密码, 判断是否正确
 */
@WebServlet(urlPatterns = "/LoginServlet")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.处理请求中文的乱码问题
        request.setCharacterEncoding("utf-8");
        //2.处理响应中文的乱码问题
        response.setContentType("text/html;charset=utf-8");
        //3.获取用户输入的数据: 用户名和密码
        String user = request.getParameter("username");//用户名
        String password = request.getParameter("psw");//密码
        //4.进行判断,
        //4.1 如果用户名= admin , 密码= 111, 表示登录成功
        if(user.equalsIgnoreCase("admin") && password.equals("111")){
            //成功以后,跳转到主页面, 使用重定向
            String indexUrl = "http://localhost:8080/usersystem/main.html";//url
            response.sendRedirect(indexUrl);//重定向跳转
        }else{
            //4.3 不正确, 表示登录失败,让用户重新登录,显示登录连接
            String  info = "用户名或者密码错误,请重新登录!";
            String  loginUrl = "http://localhost:8080/usersystem/login.html";
            info+="<br/>";//第一层: 拼接换行
            info+="<a href='"+loginUrl+"'>点击,重新登录</a>";//第二层: 拼接超链接
            response.getWriter().println(info);
        }
    }
}
12.Filter(理解)
1.Filter概述

实际生活过滤和拦截场景

场景: 渔网去捕鱼.

渔网的作用: 过滤水, 拦截鱼儿

场景: 高速公路的收费站

收费站的作用: 先拦截,交钱,放行

一般情况下: 北京—香港高速路, 很多个收费站

北京高速<------------>收费站1<--------------收费站2<------------>香港高速

经过收费站时: 北京—>香港

交钱了合理请求,放行

2.经过收费站: 香港---->北京

交钱了合理请求,放行

场景: 交警晚上查酒驾

交警的作用: 拦截小汽车,喝酒了,去局子做做,没有喝酒,放行

过滤器介绍

它是web开发的三大组件之一,

它的主要作用: 对浏览器访问的资源进行拦截和放行

拦截: 浏览器访问资源时-------->Filter: 拦截----->服务器的资源

拦截: 静态资源和动态资源.

放行:

在过滤器里面进行判断,如果合理请求,就放行,如果非法请求,就不放行

实际开发中:

浏览器<--------->Filter1<------------>Filter2<----------->服务器

浏览器访问服务器的资源时,经过多个过滤器
浏览器向服务器发送请求; 请求过程,过滤器拦截
服务器向浏览器响应数据; 响应过程,过滤器拦截
企业级开发,过滤器的场景

全局的post请求的中文乱码处理(案例)

进行敏感词汇过滤(案例) :

浏览器—Filter:评论内容过滤---->服务器保存

进行权限校验

浏览器—Filter:判断用户有没有权限---->服务器资源

等等
在这里插入图片描述

2.Filter入门
  • 步骤一: 在创建的web项目,自定义一个类, 实现Filter接口
  • 步骤二: 在自定义类里面配置拦截路径
  • 步骤三: 在浏览器访问资源,进行测试
package com.tedu;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

/**
 * 1.   implements Filter 自定义一个过滤器
 * 2.   拦截和放行
 *     配置拦截路径: @WebFilter()
 */
@WebFilter(urlPatterns = "/home.html")
public class DemoFilter1 implements Filter {
   /**
     * 拦截和放行方法
     * @param servletRequest: 请求对象
     * @param servletResponse: 响应对象
     * @param filterChain: 过滤器链, 可以实现放行
     * @throws IOException
     * @throws ServletException
     */
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("拦截home.html");
        //2.测试放行
        filterChain.doFilter(req,resp);
    }

    @Override
    public void destroy() {
        //执行一次,在服务器正常关闭执行
    }
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //执行一次,在首次访问时执行
    }
}
3. Filter的拦截路径配置

直接配置拦截资源名称:

比如: /home.html, 只拦截home.html

扩展名拦截资源配置: *.html

比如: *.html, 拦截所有后缀名为html的资源

注意: 前面一定不要加 /

通配符拦截资源配置: /*

比如: /* , 拦截所有资源 , * 匹配所有资源

4. 过滤器链
  • 过滤器链介绍

    指的在开发中,配置了多个过滤器,多个过滤器构成链.

    实际场景: 哈喽单车链条,是不是一个一个的链子构成

  • 过滤器的执行顺序

    浏览器—>filter1--------->filter2—>服务器端资源

  • 注意:

    每个过滤器配置的拦截路径一定一样,才会形成过滤器链

5.案例
  • 需求: 处理全局的post请求的中文乱码问题
  • 思路:
    1. 定义一个过滤器,在里面: 处理post请求的中文乱码问题
    2. 拦截所有的servlet, 配置的拦截路径 /*
  • 代码如下
package com.tedu.global;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter("/*")
public class FilterGlobal implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //1.处理post请求中文乱码问题
        HttpServletRequest request = (HttpServletRequest)req;//类型转换
        //2.获取浏览器提交方式
        String method = request.getMethod();//获取请求方式: get, post
        if(method.equalsIgnoreCase("post")){
            request.setCharacterEncoding("utf-8");
        }
        //3.处理中文乱码
        chain.doFilter(request, resp);
    }

    public void init(FilterConfig config) throws ServletException {
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值