0
点赞
收藏
分享

微信扫一扫

04.Tomcat,Servlet和Filter入门

菜菜捞捞 2022-04-29 阅读 45
tomcat前端
静态资源和动态资源联系起来

静态资源(前端人员开发的页面)—发送请求—>动态资源(java开发的后台程序)

比如:login.html—>发送登录请求—>java程序,实现登录功能

实现方式有两种:

方式一:login.html—>发送同步请求—>java程序

方式二:login.html—>发送同步请求—>java程序

服务器:

问题:用户—>通过网络—>(静态资源—>动态资源)

访问方式:

1.用户打开浏览器

2.在浏览器地址栏:输入访问资源地址

3.资源数据会展示到浏览器给用户看

web资源和服务器的关系

输入访问资源地址后,去哪里找资源,资源在哪里保存?

资源在服务器存放

上述的整个流程

浏览器—>访问地址—>服务器—>要访问的资源

服务器的分类:

1.硬件服务器,指配置较高的主机

​ 比如:IBM刀片式服务器,思科服务器,华为服务器等等~~

2.软件服务器:指的是我们的应用程序

​ 比如:mysql数据库服务器,mysql就是一款数据库软件

​ DB2数据库服务器,它是IBM的数据库产品

结论:通常所说的服务器,指的是应用软件安装在配置比较高的主机,称之为服务器,是硬件和软件的结合!

访问web资源

访问流程:浏览器—>输入访问地址—>服务器—>资源

比如:搭建脚手架,构建vue项目.启动项目,

访问地址:http://localhost:8080/index.html

网络访问三要素

1.http(https)协议:规范浏览器和服务器传输数据的格式

浏览器—>服务端资源 请求过程 : 浏览器提交请求数据,需要遵循http协议

服务器—>浏览器 响应过程 : 服务器响应数据到浏览器,需要遵循http协议

2.域名(domain)

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

浏览器访问服务器资源,首先要找到服务器,根据域名(IP地址)找到服务器

3.端口(port)

什么是端口? —>端口其实就是一个整数

端口有什么作用? —> 端口是用来区分硬件服务器上面相同的多个软件服务器

总结:

1.web资源(静态资源,动态资源)

2.访问web资源,把web资源放到服务器上面

3.服务器:硬件服务器,软件服务器,软件安装到硬件

4.访问服务器端资源:

​ http://域名(ip):port/资源

5.网络三要素:http(https)协议,域名(domain),端口(port)

Tomcat

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

web服务器产品

weblogic:大型商用服务器,Oracle

webSphere:大型商用服务器,IBM

Tomcat:开源,免费

推荐下载8,9,10版本

注意Tomcat和jdk版本的兼容性

安装tomcat

进tomcat的安装路径下的目录:

bin:binary,二进制目录,startup.bat,shutdown.bat

conf:configuration,配置目录,存放的配置文件,server.xml,web.xml

lib:library,存放jar包,tomcat是java语言开发软件

logs:日志目录,tomcat运行产生的日志文件,存放在这个目录里面

tem:临时目录,tomcat运行产生的临时文件,存放在这个目录

webapps:存放web资源:可以是静态资源,也可以是动态资源

步骤一:启动tomcat(tomcat目录bin目录下的startup.bat)

步骤二:浏览器输入:http://localhost:8080

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

步骤一:将静态资源项目放到tomcat/webapps目录下

步骤二:启动tomcat服务器

步骤三:访问tomcat服务器资源

方式一:只能自己访问自己的tomcat

http://localhost:8080/静态资源项目名称

访问二:dos命令ipconfig/all,找以太网ipv4

http://ip:8080/静态资源项目名称

一个主机可能安装多个tomcat,端口被 占用.

解决方案:

方式一:tomcat/conf/server.xml文件,修改端口

方式二:在idea里面修改tomcat端口

idea整合tomcat

idea–>Run—>Edit Configurations,把tomcat的安装路径加进去~

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

原因是idea的版本问题

idea社区版本community versiion:找不到tomcat

idea创建web动态资源项目(注意:web-INF目录下不能放任何css文件,html文件,js文件,图片等资源)

1.创建web动态资源项目

2.部署动态资源项目到tomcat

3.访问http://域名或者ip:port/项目名称/资源

常见问题:404,路径写错了~~

web-INF目录下不能放任何css文件,html文件,js文件,图片等资源,web-INF目录是安全目录,不能被浏览器访问~~

Servlet概述

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

servlet作用

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

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

Servlet入门

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

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

servlet入门程序

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

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

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

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

步骤五:测试

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

问题一:实现Servlet接口,并且Servlet接口报红色

不能导入包import javax.servlet包,是idea的版本问题,找到tomcat安装目录下lib目录,找到servlet-api.jar包

问题一解决方案:

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

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

方案二:在web项目中,引入tomcat开发环境(tomcat自带servlet-api.jar),右击项目Project Structure—>Dependencies—> + —>library,添加Tomcat.

package cn.tedu.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.io.PrintWriter;
/**入门案例*/

@WebServlet(urlPatterns = "/demo1")
public class Demo1Servlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    /**
     * @param servletRequest
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse response) throws ServletException, IOException {
        System.out.println("hello request!");
        //1.打印模拟:接收请求了
        System.out.println("接收浏览器的请求");
        //2.响应数据到浏览器,先英文,不要写中文,中文会乱码
        PrintWriter writer = response.getWriter();
        writer.write("hello response!!!");

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

servlet访问流程

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

在浏览器地址栏输入的servlet访问路径(http://localhost:端口号/项目名称/servlet访问路径)

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

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

地址二: /项目名称

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

地址三: /servlet访问路径

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

servlet生命周期

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

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

package cn.tedu.web;

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

        /**
         *生命周相关的方法,一共三个
         * init(参数):当servlet对象创建以后,执行该方法
         * service(参数):当浏览器发送请求时,执行该方法
         * destroy():当销毁servlet对象以后,执行该方法
         * 问题一:servlet对象创建好以后,在哪里保存?
         * servlet是运行在tomcat服务器上面,
         * 保存在tomcat服务器的内存中
         * 问题二:servlet对象会创建几次呢?
         * servlet只创建一次,与创建对象相关的init()方法,执行一次
         * 问题三:生命周期方法什么时候执行,执行几次?
         * init(参数):只执行一次,当第一次访问时才会执行
         * service(参数):执行多次,每次访问都会执行
         * destroy():只执行一次,当服务器正常关闭时才会执行
         */
public class Demo2Servlet implements Servlet {
    /**
     * 生命周期方法:创建servlet对象,执行init()方法
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
          /*
        获取servletConfig配置类对象,了解即可
         */
        return null;
    }

    /**
     * 生命周期方法:作用接收浏览器请求,响应数据给浏览器
     * @param servletRequest:请求对象,处理请求数据
     * @param servletResponse:响应对象,处理响应数据
     * @throws ServletException:异常信息对象
     * @throws IOException:异常信息对象
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
      /*
      获取servlet的信息, 了解即可,实际开发中基本用不上
      比如:servlet的访问路径,servlet的名称
       */
        return null;
    }

    /**
     * 生命周期方法:在servlet对象销毁以后,执行该方法
     */
    @Override
    public void destroy() {

    }
}
Servlet的体系结构

顶层接口

servlet里面都是抽象方法

抽象子类,实现servlet接口

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

抽象子类,继承了GenericServlet

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

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

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

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

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

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

缺点:不能明确指定浏览器发送的是什么请求,以及不能处理请求的数据

方式3.如果开发者定义一个类,继承HttpServlet,这种方式好

解决了上面1,2中存在的问题,明确指定浏览器发送的是http请求,处理请求数据

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

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

实际开发中,Servlet推荐的书写方式

自定义一个类,继承HttpServlet,重写下面两个方法(重点以及难点)

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

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

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

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

package cn.tedu.web;
import javax.jws.WebService;
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;

/**
 * 方式一:重写service方法
 * 快捷方式:如何重写service方法
 *
 * 总结:
 * service方法:get请求能接收,post也能接收,存在很多问题?
 * get请求提交中文时,处理方式是一种方式
 * post请求提交中文时,处理方式是另一种方式
 * get请求和post请求提交中文时,处理方式是不一样的
 * 在service方法内部怎么判断?
 * 不好判断浏览器发送的是get请求还是post请求
 * 那么不好处理get请求和post请求的代码
 * 结论:
 * 在实际开发中,继承HttpServlet,不重写service方法,而是重写doGet和doPost
 * 浏览器发送get请求-------->doGet方法内部:处理get请求的中文问题
 * 浏览器发送post请求------->doPost方法内部:处理post请求中文的问题
 */
//@WebServlet(urlPatterns = {"/demo4","/demo3"})
@WebServlet(urlPatterns = "/demo4")
public class Demo4Servlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("browser 请求 ");
        resp.getWriter().write("hello service~~");
    }
}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!-- 只有form的method=post才能发送post请求,其它的都是get请求  -->
<a href="demo4">get请法就的方式访问</a>
<hr/>
<form action="demo4" method="get">
    <input type="submit" value="get方式提交"/>

</form>
<hr/>
<form action="demo4" method="post">
    <input type="submit" value="post方式提交"/>
</form>
</body>
</html>
为什么不重写service方法,而重写doGet和doPost方法(重点以及难点)

结论就是:service方法内部,不知道浏览器发送的是get请求还是post请求,都会接收,最终在处理get请求

的数据时和处理post请求的数据时,处理方式不一样,所以不重写service方法

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

答案肯定有.

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

快捷方式有两种:

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

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

源码分析:

浏览器发送的get请求—>HttpServlet中的service方法:

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

​ 2.if判断(method.equals(“Get”)){

​ //this指代的就是当前HttpServlet

​ this.doGet(req,response);

​ }else if(method.q)

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

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

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

结论3:

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

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

常见的问题:

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

2.500问题:表示代码出异常了,检查代码问题

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

浏览器发送get请求-------->后台java代码只有一个doPost方法

浏览器发送post请求-------->后台java代码只有一个doGet方法

Servlet回顾

1.servlet是一个java程序(动态资源),运行在web服务器端

2.接收浏览器请求,获取浏览器提交的请求数据

浏览器-------------->服务器端

3.响应数据给浏览器(servlet里面的response)

浏览器----------->服务器端

servlet体系结构

顶层接口:Servlet

抽象类:GenericServlet

抽象类:HttpServlet

关系:HttpServlet—>GenericServlet—>Servlet

结论:

1.在开发时,自定义servlet有三种方式

2.浏览器发送的是http请求,推荐使用HttpServlet

HttpServlet

源码分析:HttpServlet的service方法内部的思路

1.获取浏览器的请求方式

2.根据请求方式的不同,去执行对应的doGet(req,resp)和doPost(req,resp)

//1.获邓请求方式:request请求对象,当然获取请求数据
String method=request.getMethod();
//2.if判断:请求方式=="get"
if(method.equals("Get")){
    this.doGet(request,response)
}else if(method.equals("Post")){
    this.doPost(request,response)
}

结论:

继承HttpServlet以后,重写doGet和doPost方法

请求对象

请求过程:从浏览器到服务器的过程,称之为请求过程

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

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

请求对象的类型(引用类型):HttpServletRequest

请求对象常用方法:

第一类:获取请求数据

方法名称作用
getParameter(“name属性”)获取单个输入框的值
getParameterValues(“name属性的值”)获取复选框的值
getParameterMap()获取的表单里面的所有数据

单个获取输入框的值:

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(urlPatterns = "/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的属性获取用户输入的用户名
        //因为name="username"是写死的,但是用户名可以随意输入
        String userValue = request.getParameter("username");
        System.out.println("请求的用户名是:"+userValue);
        //2.获取密码
        String psw = request.getParameter("psw");
        System.out.println("请求的密码是:"+psw);
        //3.love多个值
        String[] loves = request.getParameterValues("love");
        System.out.println("爱好:"+ Arrays.toString(loves));
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }


}

html页面:

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

一次性获取所有的输入框的值存入Map集合:

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;
import java.util.Map;
import java.util.Set;

@WebServlet(urlPatterns = "/ParamMapServlet")
public class ParamMapServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.获取表单提交的所有数据
        Map<String, String[]> map = req.getParameterMap();
        //2.遍历map
        //2.1获取所有的key
        Set<String> keys = map.keySet();
        //2.2遍历set:快捷键iter:增强for循环~
        for (String key : keys) {
            String[] value = map.get(key);
            System.out.println(key + ":" + Arrays.toString(value));
        }
    }
}

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

为什么会出现请求中文的乱码问题?

浏览器提交的中文数据的编码格式------->tomcat服务器的编码格式不一样

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

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

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

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

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

3.西欧编码:ISO8859-1

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

解决乱码:请求方式不一样,提交的请求数据的形式不一样,所以根据不同的请求方式来处理乱码

1.get请求的中文乱码问题:

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

tomcat8版本以下,自行写代码处理get请求的中文乱码问题

//tomcat8以下版本处理中文乱码问题
String vule = new String("用户数据".getBytes("iso8859-1"),"utf-8");

2.post请求的中文乱码问题:

//注意:上面的代码必须放在方法的第一行
request.setCharacterEncoding("utf-8");

=================================================

响应对象HttpServletResponse

响应过程:从服务器到浏览器响应数据的过程,就是响应过程

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

作用:主要处理响应数据以及重定向

类型(引用类型):HttpServletResponse

  • 第一类方法:响应数据方法(服务器-----响应数据:与浏览器绑定的输出流—>浏览器)

字符输出流的方式:

PrintWriter out = response.getWriter();

out.write(“字符串数据”);

package cn.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.io.PrintWriter;

@WebServlet(urlPatterns = "/Demo1")
public class Demo1Servlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.字符输出流的方式,响应数据到浏览器
        //1.1获取字符输出流
        PrintWriter out = resp.getWriter();
        //1.2写方法或者打印方法,响应数据
        out.write("hello response!!!");
        //1.3关闭流:原则 倒关
        out.close();
    }
}

字节输出流的方式

package cn.tedu.web;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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.io.OutputStream;
/**
 * 注解中:
 * 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 1111";//字符串
        byte[] bytes = str.getBytes();//把字符串转换为字节符
        out2.write(bytes);//字节符作为参数传进字节输出流的write方法作为参数
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

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

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

//必须放在方法的第一行才能解决中文乱码问题
//服务器向浏览器响应文本数据,文本的编码格式是utf-8
response.setContentType("text/html;charset=utf-8");

//服务器向浏览器响应的json数据,json数据编码格式是utf-8
response.setContentType("application/json;charset=utf-8");

    /*text/html(固定写法):字符输出流向浏览器响应的文本或者html网页数据
      application/json(固定写法,不唯一):字符输出流向浏览器响应的json数据
      
      charset=utf-8*/

字符流的处理乱码示例(一步完成):

package cn.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 = "/Demo1ServletEncoding")
public class Demo1ServletEncoding extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         /*
        字符流响应处理乱码问题一步完成
        设置响应对象的编码问题: resp.setContentType("text/html;charset=utf-8");
         */
        //response.setContentType("text/html;charset=utf-8");
        response.setContentType("application/json;charset=utf-8");
        //1.处理响应中文的乱码问题
        //字符输出流
        response.getWriter().write("hello 字符流");
    }
}

字节流的处理乱码示例(两步完成):

package cn.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 = "/Demo2ServletEncode")
public class Demo2ServletEncode extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        /*
        字节流响应处理乱码问题两步
        1.设置响应对象的编码问题: resp.setContentType("text/html;charset=utf-8");
        2.设置字节流的编码格式:byte[] bytes = str.getBytes("utf-8");
         */
        //1.处理字节流的中文乱码问题
        resp.setContentType("text/html;charset=utf-8");
        //2.获取字节输出流,响应中文数据
        String str = "hello 字节流中言语";
        byte[] bytes = str.getBytes("utf-8");//设置字节流的编码格式
        //响应到浏览器
        resp.getOutputStream().write(bytes);

    }
}

  • 第三类方法:重定向

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

  • 方法

response.sendRedirect(“路径”);

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

综合案例

案例:企业级项目用户管理平台,实现登录功能

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

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

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

登录页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div style="text-align: center">
    <form action="LoginServlet" method="post">
        用户名:<input type="text" name="username"/><br/>
        密 码:<input type="password" name="psw"/><br/>
        <input type="submit" value="登录"/>
    </form>
</div>
</body>
</html>

登录成功:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>欢迎您:访问我的网页</h1>
</body>
</html>

Servlet业务处理页面:

package cn.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 username = request.getParameter("username");//获取用户名
        String password = request.getParameter("psw");//获取密码
        //4.进行判断
        //4.1 如果用户名=admin,密码=111,表示登录成功
        if(username.equalsIgnoreCase("admin")&&password.equals("111")){
            //成功以后,跳转到主页面,使用重定向
            String url = "http://localhost:8888/UserSystem/main.html";
            response.sendRedirect(url);
        }else{
            //4.2 不正确,表示登录失败,让用户重新登录,显示登录链接
            String url = "http://localhost:8888/UserSystem/login.html";
            String info = "用户名密码有误!请重新输入!!!";
            info+="<br/>";//第一层拼接
            info+="<a href='"+url+"'>去登录</a>";
            response.getWriter().println(info);
            //response.getWriter().println("用户名密码有误!请重新输入!!!");
//            response.getWriter().println(info+"<br/>"+"<a href='"+url+"' >去登录</a>");
        }
    }

}

总结:

login.html------------->

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

Filter过滤器(理解即可)
  • Filter概述

过滤器是web开发的三大组件之一,它的主要作用是对浏览器访问资源进行拦截和放行

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

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

实际开发中:

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

1.浏览器访问服务器的资源时,经过多个过滤器

2.浏览器向服务器发送请求,请求过程,过滤器拦截

3.服务器向浏览器响应数据,响应过程,过滤器拦截

  • 企业级开发,过滤器的场景

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

    2.进行敏感词汇过滤(案滤):浏览器-------Filter:评论内容过滤---------->服务器保存

    3.进行权根校验:浏览器------Filter:判断用户有没有权限------服务器资源

  • Filter的拦截路径配置

1.直接配置拦截资源名称

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

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

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

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

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

  • 过滤器链

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

过滤器的执行顺序

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

  • 注意

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

举报

相关推荐

0 条评论