动态网站开发学习笔记04:Servlet基础

一、Servlet开发入门

(一)实现第一个Servlet程序

目标:掌握如何使用IDEA工具开发Servlet程序

1、使用IDEA完成Servlet的开发

在实际开发中,通常都会使用IDEA(或Eclipse等)工具完成Servlet的开发,我们使用IDEA完成Servlet的开发,因为IDEA不仅会自动编译Servlet,还会自动创建web.xml文件信息,完成Servlet虚拟路径的映射。

(1)新建Web项目

选择IDEA主页的“Create New Project”选项,进入新建项目的界面。
请添加图片描述

在New Projec界面中,选择左侧栏的“Java”选项,然后勾选”Web Application”选项。选择完毕之后,单击”Next”按钮进入填写项目信息的界面。请添加图片描述
在New Projec界面中,”Project name”选项用于指项目的名称,”Project localtion”选项用于指定Web项目的根目录。项目的根目录设置为D:\web_work\chapter04,将WebDemo作为Web项目的名称。设置完成之后,单击“Finish”按钮,进入开发界面。
请添加图片描述
修改Artifact名称 - WebDemo请添加图片描述
编辑Tomcat服务器配置请添加图片描述
切换到【Server】选项卡请添加图片描述
启动服务器,查看效果请添加图片描述

(2)创建Servlet类

新建net.huawei.servlet包
请添加图片描述
在net.huawei.servlet包里创建ServletDemo01类请添加图片描述
请添加图片描述
此时IDEA工具会自动生成Servlet代码请添加图片描述
为了更好地演示Servlet的运行效果,接下来在ServletDemo01的doGet()和doPost()方法中添加一些代码。在@WebServlet注解里设置urlPatterns属性值:urlPatterns = “/demo01”请添加图片描述

package net.huawei.servlet;

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;

/**
 * 功能:Servlet演示类
 * 作者:华卫
 * 日期:2023年03月12日
 */
@WebServlet(name = "ServletDemo01", urlPatterns = "/demo01")
public class ServletDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取字符输出流
        PrintWriter out = response.getWriter();
        // 输出信息
        out.print("<h1>Hello Servlet World~</h1>");
    }

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

其实,Servlet本质上就是Java程序里嵌入了HTML页面

(3)启动Servlet

启动服务器,显示首页
请添加图片描述
在页面访问ServletDemo01类的url地址“localhost:8080/WebDemo/demo01”请添加图片描述
对应关系图请添加图片描述
希望显示红色消息,并且居中显示,那么就要用到样式请添加图片描述

2、课堂练习 - 创建Web项目,利用Servlet显示个人信息

创建Java Enterprise项目
请添加图片描述
设置项目名称与保存位置
请添加图片描述
单击【Finish】按钮请添加图片描述
看Artifacts的名称请添加图片描述
将名称改为ShowInfo请添加图片描述
配置tomcat服务器请添加图片描述
在Deployment里删除ShowInfo后重新添加请添加图片描述
切换到【Server】选项卡,查看URL请添加图片描述
启动tomcat服务器,查看效果请添加图片描述
修改首页文件,以表格形式显示个人信息

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>个人信息</title>
    </head>
    <body>
        <table style="text-align: center" border="1" align="center" cellpadding="5">
            <tr>
                <td>学号</td>
                <td>姓名</td>
                <td>性别</td>
                <td>年龄</td>
                <td>专业</td>
                <td>班级</td>
                <td>手机</td>
            </tr>
            <tr>
                <td>20210201</td>
                <td>陈燕文</td>
                <td></td>
                <td>18</td>
                <td>软件技术专业</td>
                <td>2021软件2班</td>
                <td>15890456780</td>
            </tr>
        </table>
    </body>
</html>

启动服务器,查看结果请添加图片描述
创建net.huawei.servlet包,在包里创建InfoServlet类请添加图片描述

package net.huawei.servlet;

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;

/**
 * 功能:显示个人信息
 * 作者:华卫
 * 日期:2023年03月31日
 */
@WebServlet(name = "InfoServlet", urlPatterns = "/info")
public class InfoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取字符输出流
        PrintWriter out = response.getWriter();
        // 往客户端输出信息
        out.print("<!DOCTYPE html>");
        out.print("<html>");
            out.print("<head>");
                out.print("<meta charset='UTF-8'");
                out.print("<title>个人信息</title>");
            out.print("</head>");
            out.print("<body style='text-align: center'>");
                out.print("<table border='1' align='center' cellpadding='5'>");
                    out.print("<tr>");
                        out.print("<td>学号</td>");
                        out.print("<td>姓名</td>");
                        out.print("<td>性别</td>");
                        out.print("<td>年龄</td>");
                        out.print("<td>专业</td>");
                        out.print("<td>班级</td>");
                        out.print("<td>手机</td>");
                    out.print("</tr>");
                    out.print("<tr>");
                        out.print("<td>20210201</td>");
                        out.print("<td>陈燕文</td>");
                        out.print("<td></td>");
                        out.print("<td>18</td>");
                        out.print("<td>软件技术专业</td>");
                        out.print("<td>2021软件2班</td>");
                        out.print("<td>15890456780</td>");
                        out.print("</tr>");
                out.print("</table>");
            out.print("</body>");
        out.print("</html>");
    }

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

启动tomcat服务器,访问http://localhost:8080/ShowInfo/info请添加图片描述
页面出现中文乱码,需要设置字符编码(要查看Chrome浏览器默认的字符编码)请添加图片描述
设置响应对象字符编码为UTF-8,与浏览器当前采用的字符编码保持一致请添加图片描述
重启tomcat服务器,访问http://localhost:8080/ShowInfo/info请添加图片描述
无论浏览器当前采用什么字符编码,通过设置响应对象内容类型来要求浏览器采用指定的字符编码请添加图片描述
重启tomcat服务器,访问http://localhost:8080/ShowInfo/info请添加图片描述
查看浏览器当前使用的字符编码,已经被改成GBK了请添加图片描述

(二)Servlet的配置

目标:掌握完成Servlet的配置的两种方式:通过Web应用的配置文件web.xml来,通过@WebServlet注解来完成Servlet的配置
若想让Servlet正确地运行在服务器中并处理请求信息,必须进行适当的配置,关于Servlet的配置主要有两种方式,分别是通过Web应用的配置文件web.xml来完成配置和使用@WebServlet注解的方式完成。

1、使用web.xml配置Servlet

在web.xml文件中,通过标签进行注册,在标签下包含若干个子元素。

把Servlet映射到URL地址,使用标签进行映射,使用子标签指定要映射的Servlet名称,名称要和之前在标签下注册的相同;使用子标签映射URL地址,地址前必须加“/”,否则访问不到。
请添加图片描述
在部署描述文件web.xml里注册了Servlet,那么就可以注释掉InfoServlet类上的注解请添加图片描述
重启tomcat服务器,访问http://localhost:8080/ShowInfo/info请添加图片描述

2、@WebServlet注解属性

@WebServlet 注解用于代替web.xml文件中的等标签,该注解将会在项目部署时被容器处理,容器将根据具体的属性配置将相应的类部署为Servlet。为此,@WebServlet注解提供了一些属性。

请添加图片描述
@WebServlet注解可以标注在任意一个继承了HttpServlet类的类之上,属于类级别的注解。下面使用@WebServlet注解标注InfoServlet类。

在web.xml文件里注释掉对InfoServlet的注册标签
请添加图片描述
重启tomcat服务器,访问http://localhost:8080/ShowInfo/info请添加图片描述
使用@WebServlet注解将InfoServlet类标注为一个Servlet。@WebServlet注解中的name属性值用于指定servlet的name属性,等价于,如果没有设置@WebServlet的name属性,其默认值是Servlet的类完整名称。urlPatterns属性值用于指定一组servlet的url的匹配模式,等价于标签。如果需要在@WebServlet注解中设置多个属性,属性之间用逗号隔开。通过@WebServlet注解能极大地简化了Servlet的配置步骤,降低了开发人员的开发难度。

3、给一个Servlet配置多个url

好比一个人有多个对外联系方式
请添加图片描述

启动服务器,访问http://localhost:8080/ShowInfo/info请添加图片描述
访问http://localhost:8080/ShowInfo/message请添加图片描述

请添加图片描述

(三)Servlet的生命周期

目标:掌握Servlet的三个生命周期,初始化阶段、运行阶段和销毁阶段

1、Servle生命周期 - 初始化阶段

当客户端向Servlet容器发出HTTP请求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Servlet对象,如果有,直接使用该Servlet对象;如果没有,就创建Servlet实例对象,然后通过调用init()方法完成Servlet的初始化。需要注意的是,在Servlet的整个生命周期内,它的init()方法只被调用一次。

2、Servlet生命周期 - 运行阶段

这是Servlet生命周期中最重要的阶段,在这个阶段,Servlet容器会为客户端请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将它们作为参数传递给Servlet的service()方法。service()方法从ServletRequest对象中获得客户端请求信息并处理该请求,通过ServletResponse对象生成响应结果。在Servlet的整个生命周期内,对于Servlet的每一次访问请求,Servlet容器都会调用一次Servlet的service()方法,并且创建新的ServletRequest和ServletResponse对象,也就是说,service()方法在Servlet的整个生命周期中会被调用多次。

3、Servlet生命周期 - 销毁阶段

当服务器关闭或web应用被移除出容器时,Servlet随着web应用的销毁而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占用的资源。在Servlet的整个生命周期中,destroy()方法也只被调用一次。需要注意的是,Servlet对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭,或web应用被移除出容器时Servlet对象才会销毁。

4、案例演示Servlet生命周期

在WebDemo项目中创建ServletDemo02类,在ServletDemo02类中编写init()方法和destroy()方法并重写service()方法,用来案例演示Servlet生命周期方法的执行效果。
请添加图片描述

package net.huawei.servlet;

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;

/**
 * 功能:演示Servlet生命周期
 * 作者:华卫
 * 日期:2023年03月12日
 */
@WebServlet(name = "ServletDemo02", value = "/demo02")
public class ServletDemo02 extends HttpServlet {
    @Override
    public void init() throws ServletException {
        System.out.println("init()方法被调用……");
    }

    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("service()方法被调用……");
        response.setContentType("text/html; charset=utf-8");
        PrintWriter out = response.getWriter();
        out.print("<h1>演示Servlet生命周期~</h1>");
    }

    @Override
    public void destroy() {
        System.out.println("destroy()方法被调用……");
    }
}

启动tomcat服务器,访问http://localhost:8080/WebDemo/demo02
请添加图片描述
刷新浏览器两次,两次访问ServletDemo02,查看tomcat控制台的打印结果请添加图片描述
init()方法只在第一次访问时执行,service()方法则在每次访问时都被执行。

如果想将ServletDemo02移除,可以在IDEA中停止WebDemo项目,此时,Servlet容器会调用ServletDemo02的destroy()方法,在IDEA控制台打印出“destroy()方法被调用……”信息。
请添加图片描述
打个比方:我们只能诞生一次(init()方法),死亡一次(destroy()方法),中间可以换很多次工作,给社会提供不同的服务(service()方法)。

三、ServletConfig和ServletContext

(一)ServletConfig接口

目标:掌握如何使用ServletConfig获取配置信息的方法

1、ServletConfig接口

在Servlet运行期间,经常需要一些配置信息,例如,文件使用的编码等,这些信息都可以在@WebServlet注解的属性中配置。当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到一个ServletConfig对象中,通过调用init(ServletConfig config)方法将ServletConfig对象传递给Servlet。ServletConfig定义了一系列获取配置信息的方法。

2、案例演示ServletConfig方法调用

以getInitParameter()方法为例讲解ServletConfig方法的调用
在WebDemo项目的net.huawei.servlet包里创建ServletDemo03类
请添加图片描述

package net.huawei.servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
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;
import java.util.Enumeration;

/**
 * 功能:演示ServletConfig方法的调用
 * 作者:华卫
 * 日期:2023年03月31日
 */
@WebServlet(name = "ServletDemo03", urlPatterns = "/demo03",
    initParams = {@WebInitParam(name="encoding", value = "utf-8"),
                  @WebInitParam(name="text-color", value = "red"),
                  @WebInitParam(name="font-size", value= "25")})
public class ServletDemo03 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应对象内容类型
        response.setContentType("text/html; charset=utf-8");
        // 获取打印输出流
        PrintWriter out = response.getWriter();
        // 获取Servlet配置对象
        ServletConfig config = getServletConfig();
        // 获取初始化参数名枚举对象
        Enumeration<String> initParams = config.getInitParameterNames();
        // 遍历初始化参数名枚举对象,输出参数名及其值
        while (initParams.hasMoreElements()) {
            String initParam = initParams.nextElement();
            out.print(initParam + " : " + config.getInitParameter(initParam) + "<br />");
        }
    }

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


启动tomcat服务器,访问http://localhost:8080/WebDemo/demo03请添加图片描述

(二)ServletContext接口

目标:掌握ServletContext接口的使用方法

1、获取Web应用程序的初始化参数

当Servlet容器启动时,会为每个Web应用创建一个唯一的ServletContext对象代表当前Web应用。ServletContext对象不仅封装了当前Web应用的所有信息,而且实现了多个Servlet之间数据的共享。
在web.xml文件中,可以配置Servlet的初始化信息,还可以配置整个Web应用的初始化信息。Web应用初始化参数的配置方式具体如下所示。

<context-param>
      <param-name>参数名</param-name>
      <param-value>参数值</param-value>
</context-param>
<context-param>
      <param-name>参数名</param-name>
      <param-value>参数值</param-value>
</context-param>

元素位于根元素中,它的子元素和分别用来指定参数的名字和参数值。可以通过调用ServletContext接口中定义的getInitParameterNames()和getInitParameter(String name)方法,分别获取参数名和参数值。

2、案例演示获取Web应用的容器初始化参数

在WebDemo项目的web.xml文件中,配置容器初始化参数信息和Servlet信息
请添加图片描述

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <context-param>
        <param-name>college</param-name>
        <param-value>泸州职业技术学院</param-value>
    </context-param>
    <context-param>
        <param-name>address</param-name>
        <param-value>泸州市龙马潭区长桥路2号</param-value>
    </context-param>
    <context-param>
        <param-name>secretary</param-name>
        <param-value>何杰</param-value>
    </context-param>
    <context-param>
        <param-name>president</param-name>
        <param-value>谢鸿全</param-value>
    </context-param>
</web-app>

在net.huawei.servlet包里创建ServletDemo04类请添加图片描述

package net.huawei.servlet;

import javax.servlet.ServletContext;
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;
import java.util.Enumeration;

/**
 * 功能:获取Web应用的容器初始化参数
 * 作者:华卫
 * 日期:2023年03月31日
 */
@WebServlet(name = "ServletDemo04", urlPatterns = "/demo04")
public class ServletDemo04 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应对象内容类型
        response.setContentType("text/html; charset=utf-8");
        // 获取打印输出流
        PrintWriter out = response.getWriter();
        // 获取Servlet容器对象
        ServletContext context = getServletContext();
        // 获取容器的初始化参数名枚举对象
        Enumeration<String> paramNames = context.getInitParameterNames();
        // 通过循环遍历显示全部参数名与参数值
        while (paramNames.hasMoreElements()) {
            // 获取参数名
            String name = paramNames.nextElement();
            // 按参数名获取参数值
            String value = context.getInitParameter(name);
            // 输出参数名和参数值
            out.print(name + " : " + value + "<br />");
        }
    }

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

启动tomcat服务器,访问http://localhost:8080/WebDemo/demo04请添加图片描述

3、实现多个Servlet对象共享数据

由于一个Web应用中的所有Servlet共享同一个ServletContext对象,所以ServletContext对象的域属性可以被该Web应用中的所有Servlet访问。ServletContext接口中定义了用于增加、删除、设置ServletContext域属性的四个方法。

4、案例演示多个Servlet对象共享数据

在net.huawei.servlet包里创建ServletDemo05类
请添加图片描述

package net.huawei.servlet;

import javax.servlet.ServletContext;
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;

/**
 * 功能:写入域属性
 * 作者:华卫
 * 日期:2023年03月31日
 */
@WebServlet(name = "ServletDemo05", urlPatterns = "/demo05")
public class ServletDemo05 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应对象内容类型
        response.setContentType("text/html; charset=utf-8");
        // 获取Servlet容器对象
        ServletContext context = getServletContext();
        // 写入域属性
        context.setAttribute("id", "20210201");
        context.setAttribute("name", "陈雅雯");
        context.setAttribute("gender", "女");
        context.setAttribute("age", "18");
        context.setAttribute("major", "软件技术专业");
        context.setAttribute("class", "2021软件2班");
        context.setAttribute("telephone", "15890903456");
        // 获取打印输出流
        PrintWriter out = response.getWriter();
        // 输出提示信息
        out.print("<h3>成功地写入了域属性~</h3>");
    }

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

在net.huawei.servlet包里创建ServletDemo06类请添加图片描述

package net.huawei.servlet;

import javax.servlet.ServletContext;
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;
import java.util.Enumeration;

/**
 * 功能:读取域属性
 * 作者:华卫
 * 日期:2023年03月31日
 */
@WebServlet(name = "ServletDemo06", urlPatterns = "/demo06")
public class ServletDemo06 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应对象内容类型
        response.setContentType("text/html; charset=utf-8");
        // 获取打印输出流
        PrintWriter out = response.getWriter();
        // 获取Servlet容器对象
        ServletContext context = getServletContext();
        // 获取全部域属性名枚举对象
        Enumeration<String> attributeNames = context.getAttributeNames();
        // 通过循环显示域属性名与域属性值
        while (attributeNames.hasMoreElements()) {
            // 获取域属性名
            String name = attributeNames.nextElement();
            // 获取域属性值
            Object value = context.getAttribute(name);
            // 输出域属性名与域属性值
            out.print(name + " : " + value + "<br />");
        }
    }

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

启动tomcat服务器,先访问http://localhost:8080/WebDemo/demo05请添加图片描述
再访问http://localhost:8080/WebDemo/demo06请添加图片描述
有很多域属性不是我们写入的,如果我们只想显示我们写入的域属性,那么我们就要修改一下ServletDemo06的代码请添加图片描述
重启服务器,访问http://localhost:8080/WebDemo/demo05请添加图片描述
再访问http://localhost:8080/WebDemo/demo06请添加图片描述

5、读取Web应用下的资源文件

ServletContext接口定义了一些读取Web资源的方法,这些方法是依靠Servlet容器来实现的。Servlet容器根据资源文件相对于Web应用的路径,返回关联资源文件的IO流、资源文件在文件系统的绝对路径等。

6、案例演示读取Web应用下的资源文件

在net.huawei.servlet包里创建属性文件 - college.properties
请添加图片描述

name = 泸州职业技术学院
address = 泸州市龙马潭区长桥路2号
secretary = 何杰
president = 谢鸿全

在net.huawei.servlet包里创建ServletDemo07类请添加图片描述

package net.huawei.servlet;

import javax.servlet.ServletContext;
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.InputStream;
import java.io.PrintWriter;
import java.util.Properties;

/**
 * 功能:读取资源文件
 * 作者:华卫
 * 日期:2023年03月13日
 */
@WebServlet(name = "ServletDemo07", urlPatterns = "/demo07")
public class ServletDemo07 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置内容类型
        response.setContentType("text/html; charset=utf-8");
        // 获取Servlet容器对象
        ServletContext context = getServletContext();
        // 获取打印输出流
        PrintWriter out = response.getWriter();
        // 读取资源文件,得到字节输入流
        InputStream in = context.getResourceAsStream(
                "/WEB-INF/classes/net/huawei/servlet/college.properties");
        // 创建属性对象(Map接口的实现类)
        Properties pros = new Properties();
        // 属性对象加载资源文件的资源文件输入流
        pros.load(in);
        // 往客户端输出属性值
        out.println("name = " + pros.getProperty("name") + "<br />");
        out.println("address = " + pros.getProperty("address") + "<br />");
        out.println("secretary = " + pros.getProperty("secretary") + "<br />");
        out.println("president = " + pros.getProperty("president") + "<br />");
    }

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

启动tomcat服务器,访问http://localhost:8080/WebDemo/demo07请添加图片描述
属性文件的路径问题请添加图片描述
读取属性文件得到的字节流编码是ISO-8859-1,需要做一个转码处理请添加图片描述
重启tomcat服务器,先访问http://localhost:8080/WebDemo/demo07请添加图片描述
在Web项目开发中开发者可能需要获取资源的绝对路径。通过调用getRealPath(String path)方法获取资源文件的绝对路径。

在net.huawei.servlet包里创建ServletDemo08类请添加图片描述

package net.huawei.servlet;

import javax.servlet.ServletContext;
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;

/**
 * 功能:获取资源的绝对路径
 * 作者:华卫
 * 日期:2023年03月13日
 */
@WebServlet(name = "ServletDemo08", urlPatterns = "/demo08")
public class ServletDemo08 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 获取Servlet容器对象
        ServletContext context = getServletContext();
        // 获取打印输出流
        PrintWriter out = response.getWriter();
        // 创建资源路径字符串
        String path = "/WEB-INF/classes/net/huawei/servlet/college.properties";
        // 获取资源绝对路径
        String realPath = context.getRealPath(path);
        // 输出资源绝对路径
        out.println("college.properties: " + realPath);
    }

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

重启tomcat服务器,访问http://localhost:8080/WebDemo/demo08
请添加图片描述

四、HttpServletResponse对象

3、案例演示发送响应消息体

创建net.huawei.response包
请添加图片描述
在net.huawei.response包里创建PrintServlet01类请添加图片描述

package net.huawei.response;

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.OutputStream;

/**
 * 功能:演示响应体输出字节流
 * 作者:华卫
 * 日期:2023年04月07日
 */
@WebServlet(name = "PrintServlet01", urlPatterns = "/print01")
public class PrintServlet01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 定义字符串数据
        String data = "欢迎访问泸州职业技术学院~";
        // 获取字节输出流对象
        OutputStream out = response.getOutputStream();
        // 往客户端输出信息
        out.write(data.getBytes());
    }

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

重启tomcat服务器,访问http://localhost:8080/WebDemo/print01请添加图片描述
在net.huawei.response包里创建PrintServlet02类请添加图片描述

package net.huawei.response;

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;

/**
 * 功能:演示响应体打印字符流
 * 作者:华卫
 * 日期:2023年04月07日
 */
@WebServlet(name = "PrintServlet02", urlPatterns = "/print02")
public class PrintServlet02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 定义字符串数据
        String data = "欢迎访问泸州职业技术学院~";
        // 获取打印字符流
        PrintWriter out = response.getWriter();
        // 往客户端输出信息
        out.println(data);
    }

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

重启tomcat服务器,访问http://localhost:8080/WebDemo/print02请添加图片描述
为了解决页面中文乱码问题,要修改代码请添加图片描述
重启tomcat服务器,访问http://localhost:8080/WebDemo/print02请添加图片描述

五、HttpServletResponse应用

2、案例演示实现请求重定向

创建登录页面 - login.html
请添加图片描述

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>用户登录</title>
    </head>
    <body>
        <form action="login" method="post">
            <fieldset>
                <legend>用户登录</legend>
                <table cellpadding="2" align="center">
                    <tr>
                        <td align="right">用户名:</td>
                        <td>
                            <input type="text" name="username"/>
                        </td>
                    </tr>
                    <tr>
                        <td align="right">密码:</td>
                        <td>
                            <input type="password" name="password"/>
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2" align="center">
                            <input type="submit" value="登录"/>
                            <input type="reset" value="重置"/>
                        </td>
                    </tr>
                </table>
            </fieldset>
        </form>
    </body>
</html>

创建欢迎页面 - welcome.html请添加图片描述

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>登录成功</title>
    </head>
    <body>
        <h3 style="text-align: center">欢迎你,登录成功~</h3>
    </body>
</html>

在net.huawei.response包里创建LoginServlet类,处理用户登录请求请添加图片描述

package net.huawei.response;

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;

/**
 * 功能:登录处理程序
 * 作者:华卫
 * 日期:2023年04月07日
 */
@WebServlet(name = "LoginServlet", urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // 设置响应体内容类型
        response.setContentType("text/html; charset=utf-8");
        // 获取登录表单提交的用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        // 判断是否登录成功,决定重定向到不同页面
        if ("howard".equals(username) && "903213".equals(password)) {
            // 重定向到欢迎页面
            response.sendRedirect("/WebDemo/welcome.html");
        } else {
            // 重定向到登录页面
            response.sendRedirect("/WebDemo/login.html");
        }
    }

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

重启tomcat服务器,访问http://localhost:8080/WebDemo/login.html请添加图片描述
在login.html页面填写用户名“howard”,密码“903213”请添加图片描述
单击登录按钮,跳转到欢迎页面请添加图片描述
单击登录按钮,跳转到欢迎页面请添加图片描述

请添加图片描述

2、案例演示解决乱码问题
在net.huawei.response包里创建ChineseServlet类

package net.huawei.response;

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;

/**
 * 功能:演示解决中文乱码问题
 * 作者:华卫
 * 日期:2023年03月13日
 */
@WebServlet(name = "ChineseServlet", urlPatterns = "/chinese")
public class ChineseServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {        
        // 创建数据字符串
        String data = "欢迎访问泸州职业技术学院~";
        // 获取打印字符输出流
        PrintWriter out = response.getWriter();
        // 在页面输出信息
        out.println(data);        
    }

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

重启tomcat服务器,访问http://localhost:8080/WebDemo/chinese请添加图片描述

浏览器显示的内容都是“???~”,说明发生了乱码问题。此处产生乱码的原因是response对象的字符输出流在编码时,采用的是ISO-8859-1的字符码表,该码表并不兼容中文,会将“欢迎访问泸州职业技术学院”编码为“63 63 63 63 63 63 63 63 63 63 63 63”(在ISO-8859-1的码表中查不到的字符就会显示63)。当浏览器对接收到的数据进行解码时,会采用默认的码表GB2312,将“63 ”解码为“?”,因此,浏览器将“欢迎访问泸州职业技术学院”十二个字符显示成了“???”。

解决页面乱码问题

HttpServletResponse接口提供了一个setCharacterEncoding()方法,该方法用于设置字符的编码方式,接下来对ChineseServlet类进行修改,在代码String data = “欢迎访问泸州职业技术学院~”;前增加一行代码,设置字符编码使用的码表为utf-8。
请添加图片描述
浏览器显示的内容都是“???~”,说明发生了乱码问题。此处产生乱码的原因是response对象的字符输出流在编码时,采用的是ISO-8859-1的字符码表,该码表并不兼容中文,会将“欢迎访问泸州职业技术学院”编码为“63 63 63 63 63 63 63 63 63 63 63 63”(在ISO-8859-1的码表中查不到的字符就会显示63)。当浏览器对接收到的数据进行解码时,会采用默认的码表GB2312,将“63 ”解码为“?”,因此,浏览器将“欢迎访问泸州职业技术学院”十二个字符显示成了“???”。

解决页面乱码问题

HttpServletResponse接口提供了一个setCharacterEncoding()方法,该方法用于设置字符的编码方式,接下来对ChineseServlet类进行修改,在代码String data = “欢迎访问泸州职业技术学院~”;前增加一行代码,设置字符编码使用的码表为utf-8。
请添加图片描述
重启tomcat服务器,访问http://localhost:8080/WebDemo/chinese
请添加图片描述
浏览器中显示的乱码虽然不是“???”,但也不是需要输出的“欢迎访问泸州职业技术学院”,这是由于浏览器解码错误导致的。response对象的字符输出流设置的编码方式为UTF-8,而浏览器使用的解码方式是GBK。请添加图片描述
将response对象的字符输出流设置的编码方式改为GBK请添加图片描述
将response对象的字符输出流设置的编码方式改为GBK请添加图片描述
一种更好的方法来解决页面中文乱码问题,直接要求浏览器按照某种字符编码来显示中文请添加图片描述
response.setContentType(“text/html;charset=utf-8”);让浏览器采用utf-8字符编码

重启tomcat服务器,访问http://localhost:8080/WebDemo/chinese请添加图片描述

// 设置HttpServletResponse使用utf-8编码
response.setCharacterEncoding("utf-8"); 
// 通知浏览器使用utf-8解码
response.setHeader("Content-Type", "text/html;charset=utf-8"); 

六、HttpServletRequest对象

(一)获取请求行信息的相关方法

目标:掌握使用HttpServletRequest接口中的方法获取请求行

1、相关方法

方法声明 功能描述
String getMethod( ) 该方法用于获取HTTP请求消息中的请求方式(如GET、POST等)
String getRequestURI( ) 该方法用于获取请求行中资源名称部分,即位于URL的主机和端口之后、参数部分之前的数据
String getQueryString( ) 该方法用于获取请求行中的参数部分,也就是资源路径后面问号(?)以后的所有内容
String getProtocol( ) 该方法用于获取请求行中的协议名和版本,例如HTTP/1.0或HTTP/1.1
String getContextPath( ) 该方法用于获取请求URL中属于Web应用程序的路径,这个路径以“/”开头,表示相对于整个Web站点的根目录,路径结尾不含“/”。如果请求URL属于Web站点的根目录,那么返回结果为空字符串(“”)
String getServletPath( ) 该方法用于获取Servlet的名称或Servlet所映射的路径
String getRemoteAddr( ) 该方法用于获取请求客户端的IP地址,其格式类似于“192.168.0.3”
String getRemoteHost( ) 该方法用于获取请求客户端的完整主机名,其格式类似于“pc1.itcast.cn”。需要注意的是,如果无法解析出客户机的完整主机名,该方法将会返回客户端的IP地址
int getRemotePort() 该方法用于获取请求客户端网络连接的端口号
String getLocalAddr() 该方法用于获取Web服务器上接收当前请求网络连接的IP地址
String getLocalName() 该方法用于获取Web服务器上接收当前网络连接IP所对应的主机名
int getLocalPort() 该方法用于获取Web服务器上接收当前网络连接的端口号
String getServerName() 该方法用于获取当前请求所指向的主机名,即HTTP请求消息中Host头字段所对应的主机名部分
int getServerPort() 该方法用于获取当前请求所连接的服务器端口号,即如果HTTP请求消息中Host头字段所对应的端口号部分
String getScheme() 该方法用于获取请求的协议名,例如http、https或ftp
StringBuffer getRequestURL() 该方法用于获取客户端发出请求时的完整URL,包括协议、服务器名、端口号、资源路径等信息,但不包括后面的查询参数部分。注意,getRequestURL()方法返回的结果是StringBuffer类型,而不是String类型,这样更便于对结果进行修改

2、案例演示

创建net.huawei.request包,在包里创建RequestLineServlet类
请添加图片描述

package net.huawei.request;

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;

/**
 * 功能:输出请求行的相关信息
 * 作者:华卫
 * 日期:2023年03月13日
 */
@WebServlet(name = "RequestLineServlet", urlPatterns = "/request")
public class RequestLineServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应体内容类型
        response.setContentType("text/html;charset=utf-8");
        // 获取字符输出流
        PrintWriter out = response.getWriter();
        // 获取并输出请求行的相关信息
        out.println("getMethod: " + request.getMethod() + "<br />");
        out.println("getRequestURI: " + request.getRequestURI() + "<br />");
        out.println("getQueryString: " + request.getQueryString() + "<br />");
        out.println("getProtocol: " + request.getProtocol() + "<br />");
        out.println("getContextPath: " + request.getContextPath() + "<br />");
        out.println("getPathInfo: " + request.getPathInfo() + "<br />");
        out.println("getPathTranslated: " + request.getPathTranslated() + "<br />");
        out.println("getServletPath: " + request.getServletPath() + "<br />");
        out.println("getRemoteAddr: " + request.getRemoteAddr() + "<br />");
        out.println("getRemoteHost: " + request.getRemoteHost() + "<br />");
        out.println("getRemotePort: " + request.getRemotePort() + "<br />");
        out.println("getLocalAddr: " + request.getLocalAddr() + "<br />");
        out.println("getLocalName: " + request.getLocalName() + "<br />");
        out.println("getLocalPort: " + request.getLocalPort() + "<br />");
        out.println("getServerName: " + request.getServerName() + "<br />");
        out.println("getServerPort: " + request.getServerPort() + "<br />");
        out.println("getScheme: " + request.getScheme() + "<br />");
        out.println("getRequestURL: " + request.getRequestURL() + "<br />");
    }

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

重启tomcat服务器,访问http://localhost:8080/WebDemo/request
请添加图片描述
getContextPath: /WebDemo + getServletPath: /request = getRequestURI: /WebDemo/request
getScheme: http + “:” + getServerName: localhost + “:” + getServerPort: 8080 + getRequestURI: /WebDemo/request = getRequestURL: http://localhost:8080/WebDemo/request
URI: Uniform Resource Identifier 统一资源标识符
URL: Uniform Resource Locator 统一资源定位器
演示请求字符串
请添加图片描述
课堂练习:在控制台输出查询字符串的信息请添加图片描述

package net.huawei.request;

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;

/**
 * 功能:输出请求行的相关信息
 * 作者:华卫
 * 日期:2023年04月14日
 */
@WebServlet(name = "RequestLineServlet", urlPatterns = "/request")
public class RequestLineServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应体内容类型
        response.setContentType("text/html; charset=utf-8");
        // 获取字符输出流
        PrintWriter out = response.getWriter();
        // 获取并输出请求行的相关信息
        out.println("getMethod: " + request.getMethod() + "<br />");
        out.println("getRequestURI: " + request.getRequestURI() + "<br />");
        out.println("getQueryString: " + request.getQueryString() + "<br />");
        out.println("getProtocol: " + request.getProtocol() + "<br />");
        out.println("getContextPath: " + request.getContextPath() + "<br />");
        out.println("getPathInfo: " + request.getPathInfo() + "<br />");
        out.println("getPathTranslated: " + request.getPathTranslated() + "<br />");
        out.println("getServletPath: " + request.getServletPath() + "<br />");
        out.println("getRemoteAddr: " + request.getRemoteAddr() + "<br />");
        out.println("getRemoteHost: " + request.getRemoteHost() + "<br />");
        out.println("getRemotePort: " + request.getRemotePort() + "<br />");
        out.println("getLocalAddr: " + request.getLocalAddr() + "<br />");
        out.println("getLocalName: " + request.getLocalName() + "<br />");
        out.println("getLocalPort: " + request.getLocalPort() + "<br />");
        out.println("getServerName: " + request.getServerName() + "<br />");
        out.println("getServerPort: " + request.getServerPort() + "<br />");
        out.println("getScheme: " + request.getScheme() + "<br />");
        out.println("getRequestURL: " + request.getRequestURL() + "<br />");

        // 在控制台输出请求字符串的信息
        if (request.getQueryString() != null) {
            String strQuery = request.getQueryString();
            String[] queries = strQuery.split("&");
            for (String query : queries) {
                String[] fields = query.split("=");
                System.out.println(fields[0] + " : " + fields[1]);
            }
        }
    }

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

重启tomcat服务器,访问http://localhost:8080/WebDemo/request?username=howard&password=903213请添加图片描述
还可以将查询字符串继续按=进行拆分请添加图片描述

请添加图片描述

2、案例演示
在net.huawei.request包里创建RequestHeadersServlet类

package net.huawei.request;

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

/**
 * 功能:演示获取请求头的信息
 * 作者:华卫
 * 日期:2023年04月14日
 */
@WebServlet(name = "RequestHeaderServlet", urlPatterns = "/header")
public class RequestHeaderServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应体内容类型
        response.setContentType("text/html; charset=utf-8");
        // 获取字符输出流
        PrintWriter out = response.getWriter();
        // 获取请求头名枚举对象
        Enumeration<String> headerNames = request.getHeaderNames();
        // 遍历所有请求头,并通过getHeader()方法获取一个指定名称的头字段
        while (headerNames.hasMoreElements()) {
            // 获取头字段名称
            String headerName = headerNames.nextElement();
            // 输出头字段名称及其值
            out.println(headerName + " : " + request.getHeader(headerName) + "<br />");
        }
    }

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

重启tomcat服务器,访问http://localhost:8080/WebDemo/header请添加图片描述
按F12键,通过开发者工具查看请求头信息请添加图片描述

3、案例演示请求转发

在net.huawei.request包里创建RequestForwardServlet类,将数据保存在request对象里,然后转发给另一个Servlet来处理请添加图片描述

package net.huawei.request;

import javax.servlet.RequestDispatcher;
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;

/**
 * 功能:演示请求转发
 * 作者:华卫
 * 日期:2023年03月13日
 */
@WebServlet(name = "RequestForwardServlet", urlPatterns = "/forward")
public class RequestForwardServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应体内容类型
        response.setContentType("text/html;charset=utf-8");
        // 设置请求对象属性
        request.setAttribute("message", "欢迎访问泸州职业技术学院~");
        // 获取请求派发器对象(参数是请求转发的Servlet的url)
        RequestDispatcher dispatcher = request.getRequestDispatcher("/result");
        // 请求转发给url为`/result`的Servlet
        dispatcher.forward(request, response);
    }

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

在net.huawei.request包里创建ResultServlet类,用于获取RequestForwardServlet类中存储在request对象中的数据并输出请添加图片描述

package net.huawei.request;

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;

/**
 * 功能:处理转发的请求
 * 作者:华卫
 * 日期:2023年03月13日
 */
@WebServlet(name = "ResultServlet", urlPatterns = "/result")
public class ResultServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应体内容类型
        response.setContentType("text/html;charset=utf-8");
        // 获取字符输出流
        PrintWriter out = response.getWriter();
        // 获取请求转发保存在request对象里的数据
        String message = (String) request.getAttribute("message");
        // 输出获取的信息
        if (message != null) {
            out.println("转发来的消息:" + message);
        }
    }

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

对应关系图请添加图片描述
重启tomcat服务器,访问http://localhost:8080/WebDemo/forward请添加图片描述
注意:地址栏中显示的仍然是RequestForwardServlet的请求路径,但是浏览器却显示出了ResultServlet中要输出的内容。这是因为请求转发是发生在服务器内部的行为,从RequestForwardServlet到ResultServlet属于一次请求,在一次请求中可以使用request 属性进行数据共享(同一请求转发)。

2、案例演示

创建注册页面 - register.html请添加图片描述

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>用户注册</title>
    </head>
    <body>
        <form action="register" method="post">
            <fieldset>
                <legend>新用户注册</legend>
                <table cellpadding="2" align="center">
                    <tr>
                        <td align="right">用户名:</td>
                        <td>
                            <input type="text" name="username" />
                        </td>
                    </tr>
                    <tr>
                        <td align="right">密码:</td>
                        <td>
                            <input type="password" name="password" />
                        </td>
                    </tr>
                    <tr>
                        <td align="right">性别:</td>
                        <td>
                            <input type="radio" name="gender" value=""/><input type="radio" name="gender" value=""/></td>
                    </tr>
                    <tr>
                        <td align="right">兴趣:</td>
                        <td>
                            <input type="checkbox" name="interest" value="看电影"/>看电影
                            <input type="checkbox" name="interest" value="敲代码"/>敲代码
                            <input type="checkbox" name="interest" value="玩游戏"/>玩游戏
                        </td>
                    </tr>
                    <tr>
                        <td colspan="2" align="center">
                            <input type="submit" value="注册"/>
                            <input type="reset" value="重填" />
                        </td>
                    </tr>
                </table>
            </fieldset>
        </form>
    </body>
</html>

在net.huawei.request包里创建RquestParamsServlet类,用于获取注册表单提交的数据请添加图片描述

package net.huawei.request;

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;

/**
 * 功能:获取请求参数
 * 作者:华卫
 * 日期:2023年04月14日
 */
@WebServlet(name = "RequestParamsServlet", urlPatterns = "/register")
public class RequestParamsServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {       
        // 设置响应体内容类型
        response.setContentType("text/html; charset=utf-8");
        // 获取字符输出流
        PrintWriter out = response.getWriter();
        // 获取注册表单提交的数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String gender = request.getParameter("gender");
        String[] interests = request.getParameterValues("interest");
        // 输出获取的表单数据
        out.println("姓名:" + username + "<br />");
        out.println("密码:" + password + "<br />");
        out.println("性别:" + gender + "<br />");
        out.print("兴趣:");
        for (int i = 0; i < interests.length; i++) {
            out.println(interests[i]);
        }
    }

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

请添加图片描述
重启tomcat服务器,访问http://localhost:8080/WebDemo/register.html,填写表单数据请添加图片描述
单击【注册】按钮请添加图片描述

请添加图片描述

(五)解决请求参数中文乱码问题
目标:掌握如何解决请求参数的中文乱码

在HttpServletRequest接口中,提供了一个setCharacterEncoding()方法,该方法用于设置request对象的解码方式

修改ResquestParamsServlet类,添加一行代码,设置请求对象的字符编码
请添加图片描述

重启tomcat服务器,访问http://localhost:8080/WebDemo/register.html,填写表单数据请添加图片描述
单击【注册】按钮,页面没有中文乱码请添加图片描述
录屏演示注册操作请添加图片描述

2、案例演示通过Request对象传递数据

在net.huawei.request包里创建RquestServlet01类

package net.huawei.request;

import javax.servlet.RequestDispatcher;
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;

/**
 * 功能:设置请求对象属性,请求转发
 * 作者:华卫
 * 日期:2023年04月14日
 */
@WebServlet(name = "RequestServlet01", urlPatterns = "/request01")
public class RequestServlet01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // 设置响应体内容类型
        response.setContentType("text/html; charset=utf-8");
        // 设置请求对象属性
        request.setAttribute("id", "20210201");
        request.setAttribute("name", "陈燕文");
        request.setAttribute("gender", "女");
        request.setAttribute("age", "18");
        request.setAttribute("major", "软件技术专业");
        request.setAttribute("class", "2021级软件2班");
        request.setAttribute("phone", "15890903456");
        // 获取请求派发器对象(参数是请求转发的Servlet的url)
        RequestDispatcher dispatcher = request.getRequestDispatcher("/request02");
        // 请求转发给url为`/request02`的Servlet
        dispatcher.forward(request, response);
    }

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

在net.huawei.request包里创建RquestServlet02类请添加图片描述

package net.huawei.request;

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

/**
 * 功能:获取请求转发的数据
 * 作者:华卫
 * 日期:2023年04月14日
 */
@WebServlet(name = "RequestServlet02", urlPatterns = "/request02")
public class RequestServlet02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应体内容类型
        response.setContentType("text/html; charset=utf-8");
        // 获取字符输出流
        PrintWriter out = response.getWriter();
        // 获取请求对象属性名枚举对象
        Enumeration<String> attributes = request.getAttributeNames();
        // 获取请求转发保存在request对象里的数据并输出
        while (attributes.hasMoreElements()) {
            // 获取属性名
            String attribute = attributes.nextElement();
            // 输出属性名及其值
            out.println(attribute + " : " + request.getAttribute(attribute) + "<br />");
        }
        // 删除请求对象的属性
        while (attributes.hasMoreElements()) {
            // 获取属性名
            String attribute = attributes.nextElement();
            // 删除属性
            request.removeAttribute(attribute);
        }
    }

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

启动服务器,访问http://localhost:8080/WebDemo/request01请添加图片描述
修改RequestServlet02,只显示学生信息

package net.huawei.request;

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;

/**
 * 功能:获取请求转发的数据
 * 作者:华卫
 * 日期:2023年04月14日
 */
@WebServlet(name = "RequestServlet02", urlPatterns = "/request02")
public class RequestServlet02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 设置响应体内容类型
        response.setContentType("text/html; charset=utf-8");
        // 获取字符输出流
        PrintWriter out = response.getWriter();
        // 获取请求转发保存在request对象里的数据并输出
        out.println("学号:" + request.getAttribute("id") + "<br />");
        out.println("姓名:" + request.getAttribute("name") + "<br />");
        out.println("性别:" + request.getAttribute("gender") + "<br />");
        out.println("年龄:" + request.getAttribute("age") + "<br />");
        out.println("专业:" + request.getAttribute("major") + "<br />");
        out.println("班级:" + request.getAttribute("class") + "<br />");
        out.println("手机:" + request.getAttribute("phone") + "<br />");
        // 删除请求对象的属性
        request.removeAttribute("id");
        request.removeAttribute("name");
        request.removeAttribute("gender");
        request.removeAttribute("age");
        request.removeAttribute("major");
        request.removeAttribute("class");
        request.removeAttribute("phone");
    }

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

启动服务器,访问http://localhost:8080/WebDemo/request01请添加图片描述

Guess you like

Origin blog.csdn.net/qq_41301333/article/details/131202305