Notas de estudo de desenvolvimento de site dinâmico 04: Noções básicas de servlet

Diretório de artigos

1. Introdução ao desenvolvimento de servlets

(1) Implementar o primeiro programa Servlet

Objetivo: Dominar como usar as ferramentas IDEA para desenvolver programas Servlet

1. Use IDEA para concluir o desenvolvimento do Servlet

No desenvolvimento real, as ferramentas IDEA (ou Eclipse, etc.) são geralmente usadas para completar o desenvolvimento de Servlets. Usamos IDEA para completar o desenvolvimento de Servlets, porque IDEA não apenas compila automaticamente Servlets, mas também cria automaticamente informações do arquivo web.xml e completa o caminho virtual do Servlet de mapeamento.

(1) Crie um novo projeto Web

Selecione a opção "Criar Novo Projeto" na página inicial do IDEA para entrar na nova interface do projeto.
Adicione a descrição da imagem

Na interface Novo Projeto, selecione a opção “Java” na coluna da esquerda e marque a opção “Aplicativo Web”. Após selecionar, clique no botão “Avançar” para entrar na interface de preenchimento das informações do projeto. Adicione a descrição da imagem
Na interface Novo Projeto, a opção "Nome do projeto" é usada para se referir ao nome do projeto, e a opção "Localização do projeto" é usada para especificar o diretório raiz do projeto Web. Defina o diretório raiz do projeto como D:\web_work\chapter04 e use WebDemo como o nome do projeto da Web. Após a conclusão das configurações, clique no botão "Concluir" para entrar na interface de desenvolvimento.
Adicione a descrição da imagem
Modifique o nome do artefato - Adicione a descrição da imagem
Edite a configuração do servidor Tomcat com WebDemo Adicione a descrição da imagem
. Mude para a guia [Servidor] Adicione a descrição da imagem
. Inicie o servidor e veja o efeito.Adicione a descrição da imagem

(2) Criar classe Servlet

Crie um novo pacote net.huawei.servlet.
Adicione a descrição da imagem
Crie a classe ServletDemo01 no pacote net.huawei.servlet. Adicione a descrição da imagem
Adicione a descrição da imagem
Neste momento, a ferramenta IDEA gerará automaticamente o código Servlet. Adicione a descrição da imagem
Para demonstrar melhor o efeito de execução do Servlet, a seguir, adicione os métodos doGet() e doPost() de ServletDemo01. Adicione algum código. Defina o valor do atributo urlPatterns na anotação @WebServlet: urlPatterns = "/demo01"Adicione a descrição da imagem

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);
    }
}

Na verdade, Servlet é essencialmente uma página HTML incorporada em um programa Java.

(3) Iniciar servlet

Inicie o servidor e exiba a página inicial. Acesse o diagrama de relacionamento correspondente
Adicione a descrição da imagem
do endereço url "localhost:8080/WebDemo/demo01" da classe ServletDemo01 na página. Se você deseja exibir uma mensagem vermelha e exibi-la no centro, você deve usar o estilo.Adicione a descrição da imagem
Adicione a descrição da imagem
Adicione a descrição da imagem

2. Exercício de aula - Crie um projeto Web e use Servlet para exibir informações pessoais

Crie um projeto Java Enterprise.
Adicione a descrição da imagem
Defina o nome do projeto e salve o local.
Adicione a descrição da imagem
Clique no botão [Concluir]. Adicione a descrição da imagem
Observe o nome dos artefatos. Adicione a descrição da imagem
Altere o nome para ShowInfo Adicione a descrição da imagem
para configurar o servidor Tomcat. Adicione a descrição da imagem
Exclua ShowInfo na implantação e adicione-o novamente . Mude Adicione a descrição da imagem
para a guia [Servidor] e visualize a URL Adicione a descrição da imagem
para iniciar o servidor Tomcat. Veja o efeito Adicione a descrição da imagem
Modifique o arquivo da página inicial para exibir informações pessoais em forma de tabela

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

Inicie o servidor e verifique os resultados. Adicione a descrição da imagem
Crie o pacote net.huawei.servlet e crie a classe InfoServlet no pacote.Adicione a descrição da imagem

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);
    }
}

Inicie o servidor Tomcat e acesse a página http://localhost:8080/ShowInfo/info Adicione a descrição da imagem
. Caracteres chineses ilegíveis aparecem. Você precisa definir a codificação de caracteres (para visualizar a codificação de caracteres padrão do navegador Chrome) Adicione a descrição da imagem
e definir o caractere do objeto de resposta codificação para UTF-8, que é consistente com o navegador atual A codificação de caracteres usada permanece a mesma. Adicione a descrição da imagem
Reinicie o servidor Tomcat e visite http://localhost:8080/ShowInfo/info. Adicione a descrição da imagem
Não importa qual codificação de caracteres o navegador usa atualmente, defina o tipo de conteúdo do objeto de resposta para exigir que o navegador Adicione a descrição da imagem
reinicie o servidor Tomcat usando a codificação de caracteres especificada. Visite http://localhost:8080/ShowInfo/info Adicione a descrição da imagem
para verificar a codificação de caracteres usada atualmente pelo navegador. Ela foi alterada para GBK.Adicione a descrição da imagem

(2) Configuração do Servlet

Objetivo: Dominar as duas formas de completar a configuração do Servlet: através do arquivo de configuração da aplicação web web
. Existem duas formas principais de configurar o Servlet, uma é completar a configuração através do arquivo de configuração da aplicação web web.xml e a outra é use a anotação @WebServlet.

1. Configure o Servlet usando web.xml

No arquivo web.xml, o registro é feito por meio de tags, e vários subelementos são incluídos nas tags.

Mapeie o Servlet para o endereço URL, use tags para mapeamento, use sub-tags para especificar o nome do Servlet a ser mapeado, o nome deve ser igual ao registrado anteriormente na tag; use sub-tags para mapear URL endereços, você deve adicionar "/" antes do endereço, caso contrário acesse Menor que.
Adicione a descrição da imagem
Após registrar o Servlet no arquivo de descrição de implantação web.xml, você pode comentar as anotações na classe InfoServlet. Adicione a descrição da imagem
Reinicie o servidor Tomcat e visite http://localhost:8080/ShowInfo/info.Adicione a descrição da imagem

2. Atributos de anotação @WebServlet

A anotação @WebServlet é usada para substituir outras tags no arquivo web.xml. Essa anotação será processada pelo contêiner durante a implantação do projeto, e o contêiner implantará a classe correspondente como um Servlet com base na configuração do atributo específico. Para isso, a anotação @WebServlet fornece algumas propriedades.

Adicione a descrição da imagem
A anotação @WebServlet pode ser anotada em qualquer classe que herda a classe HttpServlet e é uma anotação em nível de classe. A seguir, use a anotação @WebServlet para anotar a classe InfoServlet.

Comente a tag de registro do InfoServlet no arquivo web.xml.
Adicione a descrição da imagem
Reinicie o servidor Tomcat, visite http://localhost:8080/ShowInfo/info Adicione a descrição da imagem
e use a anotação @WebServlet para marcar a classe InfoServlet como um Servlet. O valor do atributo name na anotação @WebServlet é usado para especificar o atributo name do servlet.Equivalentemente, se o atributo name de @WebServlet não estiver definido, seu valor padrão será o nome completo da classe do servlet. O valor do atributo urlPatterns é usado para especificar um conjunto de padrões de correspondência de URL de servlet, que é equivalente a um rótulo. Se você precisar definir diversas propriedades na anotação @WebServlet, separe-as com vírgulas. A anotação @WebServlet pode simplificar bastante as etapas de configuração do Servlet e reduzir a dificuldade de desenvolvimento para os desenvolvedores.

3. Configure vários URLs para um Servlet

É como se uma pessoa tivesse vários métodos de contato externo
Adicione a descrição da imagem

Inicie o servidor, visite http://localhost:8080/ShowInfo/info Adicione a descrição da imagem
e visite http://localhost:8080/ShowInfo/messageAdicione a descrição da imagem

Adicione a descrição da imagem

(3) Ciclo de vida do servlet

Objetivo: Dominar os três ciclos de vida do Servlet, fase de inicialização, fase de execução e fase de destruição

1. Ciclo de vida do servle - fase de inicialização

Quando o cliente envia uma solicitação HTTP ao contêiner Servlet para acessar o Servlet, o contêiner Servlet primeiro analisará a solicitação e verificará se o objeto Servlet já existe na memória. Em caso afirmativo, use o objeto Servlet diretamente; caso contrário, crie um Objeto de instância do servlet e, em seguida, conclua a inicialização do servlet chamando o método init(). Deve-se observar que durante todo o ciclo de vida do Servlet, seu método init() é chamado apenas uma vez.

2. Ciclo de vida do servlet - fase de execução

Este é o estágio mais importante do ciclo de vida do Servlet. Neste estágio, o contêiner do Servlet criará um objeto ServletRequest representando a solicitação HTTP e um objeto ServletResponse representando a resposta HTTP para a solicitação do cliente e, em seguida, os passará como parâmetros para o Servlet. Método serviço(). . O método service() obtém as informações da solicitação do cliente do objeto ServletRequest e processa a solicitação e gera o resultado da resposta por meio do objeto ServletResponse. Durante todo o ciclo de vida do Servlet, para cada solicitação de acesso do Servlet, o contêiner do Servlet chamará o método service() do Servlet uma vez e criará novos objetos ServletRequest e ServletResponse. Em outras palavras, o método service() será usado durante toda a vida do Servlet.Ele será chamado várias vezes durante o ciclo.

3. Ciclo de vida do servlet - fase de destruição

Quando o servidor é desligado ou a aplicação web é removida do contêiner, o Servlet é destruído junto com a aplicação web. Antes de destruir o Servlet, o contêiner do Servlet chamará o método destroy() do Servlet para permitir que o objeto Servlet libere os recursos que ocupa. Em todo o ciclo de vida do Servlet, o método destroy() é chamado apenas uma vez. Deve-se observar que uma vez criado o objeto Servlet, ele residirá na memória e aguardará o acesso do cliente.O objeto Servlet não será destruído até que o servidor seja desligado ou a aplicação web seja removida do contêiner.

4. Ciclo de vida do servlet de demonstração de caso

Crie a classe ServletDemo02 no projeto WebDemo, escreva o método init() e o método destroy() na classe ServletDemo02 e substitua o método service() para usar um caso para demonstrar o efeito de execução do método de ciclo de vida do Servlet.
Adicione a descrição da imagem

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()方法被调用……");
    }
}

Inicie o servidor Tomcat, visite http://localhost:8080/WebDemo/demo02,
Adicione a descrição da imagem
atualize o navegador duas vezes, visite ServletDemo02 duas vezes e visualize os resultados de impressão do console Tomcat. Adicione a descrição da imagem
O método init() só é executado na primeira visita, service() O método é executado toda vez que é acessado.

Se você deseja remover o ServletDemo02, você pode parar o projeto WebDemo no IDEA. Neste momento, o contêiner do Servlet chamará o método destroy() do ServletDemo02 e imprimirá a mensagem "o método destroy() foi chamado..." no Consola IDÉIA.
Adicione a descrição da imagem
Por exemplo: só podemos nascer uma vez (método init()) e morrer uma vez (método destroy()), e podemos mudar de emprego muitas vezes no meio para fornecer diferentes serviços à sociedade (método service()).

3. ServletConfig e ServletContext

(1) Interface ServletConfig

Objetivo: Dominar como usar o ServletConfig para obter informações de configuração

1. Interface ServletConfig

Durante a execução do Servlet, muitas vezes são necessárias algumas informações de configuração, como a codificação utilizada pelo arquivo, etc. Essas informações podem ser configuradas nas propriedades da anotação @WebServlet. Quando o Tomcat inicializa um Servlet, ele encapsula as informações de configuração do Servlet em um objeto ServletConfig e passa o objeto ServletConfig para o Servlet chamando o método init(ServletConfig config). ServletConfig define uma série de métodos para obter informações de configuração.

2. Demonstração de caso de chamada do método ServletConfig

Tomemos o método getInitParameter() como exemplo para explicar a chamada do método ServletConfig.
Crie a classe ServletDemo03 no pacote net.huawei.servlet do projeto WebDemo.
Adicione a descrição da imagem

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);
    }
}


Inicie o servidor Tomcat e visite http://localhost:8080/WebDemo/demo03Adicione a descrição da imagem

(2) Interface ServletContext

Objetivo: Dominar o uso da interface ServletContext

1. Obtenha os parâmetros de inicialização do aplicativo web

Quando o contêiner Servlet é iniciado, um objeto ServletContext exclusivo é criado para cada aplicativo Web para representar o aplicativo Web atual. O objeto ServletContext não apenas encapsula todas as informações do aplicativo Web atual, mas também realiza o compartilhamento de dados entre vários Servlets.
No arquivo web.xml, você pode configurar as informações de inicialização do Servlet e as informações de inicialização de todo o aplicativo Web. O método de configuração dos parâmetros de inicialização do aplicativo web é o seguinte.

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

O elemento está localizado no elemento raiz e seus elementos filhos são usados ​​para especificar o nome e o valor do parâmetro. Você pode obter o nome e o valor do parâmetro respectivamente chamando os métodos getInitParameterNames() e getInitParameter(String name) definidos na interface ServletContext.

2. Demonstração de caso de obtenção dos parâmetros de inicialização do contêiner de uma aplicação web

No arquivo web.xml do projeto WebDemo, configure as informações do parâmetro de inicialização do contêiner e as informações do Servlet
Adicione a descrição da imagem

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

Crie a classe ServletDemo04 no pacote net.huawei.servletAdicione a descrição da imagem

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);
    }
}

Inicie o servidor Tomcat e visite http://localhost:8080/WebDemo/demo04Adicione a descrição da imagem

3. Implemente vários objetos Servlet para compartilhar dados

Como todos os Servlets em uma aplicação Web compartilham o mesmo objeto ServletContext, os atributos de domínio do objeto ServletContext podem ser acessados ​​por todos os Servlets na aplicação Web. A interface ServletContext define quatro métodos para adicionar, excluir e configurar atributos de domínio ServletContext.

4. Caso demonstra vários objetos Servlet compartilhando dados

Crie a classe ServletDemo05 no pacote net.huawei.servlet
Adicione a descrição da imagem

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);
    }
}

Crie a classe ServletDemo06 no pacote net.huawei.servletAdicione a descrição da imagem

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);
    }
}

Inicie o servidor Tomcat, primeiro visite http://localhost:8080/WebDemo/demo05 Adicione a descrição da imagem
e depois visite http://localhost:8080/WebDemo/demo06. Adicione a descrição da imagem
Existem muitos atributos de domínio que não foram escritos por nós. Se quisermos apenas exibir o atributo de domínio que escrevemos, então precisamos modificar o código de ServletDemo06 Adicione a descrição da imagem
, reiniciar o servidor, visitar http://localhost:8080/WebDemo/demo05 Adicione a descrição da imagem
e depois visitar http://localhost:8080/WebDemo/demo06Adicione a descrição da imagem

5. Leia os arquivos de recursos no aplicativo da web

A interface ServletContext define alguns métodos para leitura de recursos da Web, que são implementados pelo contêiner Servlet. O contêiner Servlet retorna o fluxo IO do arquivo de recursos associado, o caminho absoluto do arquivo de recursos no sistema de arquivos, etc. com base no caminho do arquivo de recursos relativo ao aplicativo da web.

6. Demonstração de caso de leitura de arquivos de recursos em aplicativos da Web

Crie um arquivo de propriedades - college.properties no pacote net.huawei.servlet
Adicione a descrição da imagem

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

Crie a classe ServletDemo07 no pacote net.huawei.servletAdicione a descrição da imagem

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);
    }
}

Inicie o servidor Tomcat e acesse http://localhost:8080/WebDemo/demo07. Adicione a descrição da imagem
Há um problema com o caminho do arquivo de atributos. Adicione a descrição da imagem
A codificação do fluxo de bytes obtida pela leitura do arquivo de atributos é ISO-8859-1. Um processo de transcodificação precisa ser feito para Adicione a descrição da imagem
reiniciar o servidor Tomcat. Primeiro acesso http://localhost:8080/WebDemo/demo07 Adicione a descrição da imagem
No desenvolvimento de projetos Web, os desenvolvedores podem precisar obter o caminho absoluto dos recursos. Obtenha o caminho absoluto do arquivo de recursos chamando o método getRealPath(String path).

Crie a classe ServletDemo08 no pacote net.huawei.servletAdicione a descrição da imagem

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);
    }
}

Reinicie o servidor Tomcat e visite http://localhost:8080/WebDemo/demo08
Adicione a descrição da imagem

4. Objeto HttpServletResponse

3. Demonstração de caso enviando corpo de mensagem de resposta

Crie o pacote net.huawei.response.
Adicione a descrição da imagem
Crie a classe PrintServlet01 no pacote net.huawei.response.Adicione a descrição da imagem

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);
    }
}

Reinicie o servidor Tomcat, visite http://localhost:8080/WebDemo/print01 Adicione a descrição da imagem
e crie a classe PrintServlet02 no pacote net.huawei.response.Adicione a descrição da imagem

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);
    }
}

Reinicie o servidor Tomcat e visite http://localhost:8080/WebDemo/print02. Adicione a descrição da imagem
Para resolver o problema dos caracteres chineses ilegíveis na página, você precisa modificar o código. Adicione a descrição da imagem
Reinicie o servidor Tomcat e visite http://localhost :8080/WebDemo/print02.Adicione a descrição da imagem

5. Aplicativo HttpServletResponse

2. Demonstração de caso para implementar redirecionamento de solicitação

Criar página de login - login.html
Adicione a descrição da imagem

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

Crie uma página de boas-vindas - Welcome.htmlAdicione a descrição da imagem

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

Crie a classe LoginServlet no pacote net.huawei.response para lidar com solicitações de login do usuárioAdicione a descrição da imagem

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);
    }
}

Reinicie o servidor Tomcat, visite http://localhost:8080/WebDemo/login.html, Adicione a descrição da imagem
preencha o nome de usuário "howard" e a senha "903213" na página login.html, Adicione a descrição da imagem
clique no botão login, vá para a página de boas-vindas , Adicione a descrição da imagem
clique no botão de login e vá para a página de boas-vindasAdicione a descrição da imagem

Adicione a descrição da imagem

2. Demonstração de caso para resolver o problema de caracteres ilegíveis.
Crie a classe ChineseServlet no pacote net.huawei.response.

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);
    }
}

Reinicie o servidor Tomcat e visite http://localhost:8080/WebDemo/chineseAdicione a descrição da imagem

O conteúdo exibido pelo navegador é todo "???~", indicando que ocorreram caracteres ilegíveis. A razão para os caracteres ilegíveis aqui é que o fluxo de saída de caracteres do objeto de resposta é codificado usando a tabela de códigos de caracteres ISO-8859-1. Esta tabela de códigos não é compatível com o chinês e codificará "Bem-vindo ao Luzhou Vocational and Technical College" como "63 63 63 63 63 63 63 63 63 63 63 63" (caracteres que não podem ser encontrados na tabela de códigos ISO-8859-1 exibirão 63). Quando o navegador decodifica os dados recebidos, ele usa a tabela de códigos padrão GB2312 e decodifica "63" em "?". Portanto, o navegador exibirá os doze caracteres de "Bem-vindo ao Luzhou Vocational and Technical College" como "??? ".

Resolva o problema de páginas ilegíveis

A interface HttpServletResponse fornece um método setCharacterEncoding(), que é usado para definir o método de codificação de caracteres. Em seguida, modifique a classe ChineseServlet e adicione uma linha de código antes do código String data = "Bem-vindo ao Luzhou Vocational and Technical College ~"; para definir os caracteres. A tabela de códigos usada para codificação é utf-8.
Adicione a descrição da imagem
O conteúdo exibido pelo navegador é todo "???~", indicando que ocorreram caracteres ilegíveis. A razão para os caracteres ilegíveis aqui é que o fluxo de saída de caracteres do objeto de resposta é codificado usando a tabela de códigos de caracteres ISO-8859-1. Esta tabela de códigos não é compatível com o chinês e codificará "Bem-vindo ao Luzhou Vocational and Technical College" como "63 63 63 63 63 63 63 63 63 63 63 63" (caracteres que não podem ser encontrados na tabela de códigos ISO-8859-1 exibirão 63). Quando o navegador decodifica os dados recebidos, ele usa a tabela de códigos padrão GB2312 e decodifica "63" em "?". Portanto, o navegador exibirá os doze caracteres de "Bem-vindo ao Luzhou Vocational and Technical College" como "??? ".

Resolva o problema de páginas ilegíveis

A interface HttpServletResponse fornece um método setCharacterEncoding(), que é usado para definir o método de codificação de caracteres. Em seguida, modifique a classe ChineseServlet e adicione uma linha de código antes do código String data = "Bem-vindo ao Luzhou Vocational and Technical College ~"; para definir os caracteres. A tabela de códigos usada para codificação é utf-8.
Adicione a descrição da imagem
Reinicie o servidor Tomcat e acesse http://localhost:8080/WebDemo/chinese.
Adicione a descrição da imagem
Embora o código ilegível exibido no navegador não seja "??? ", não é o "Bem-vindo ao Luzhou Vocational and Technical College " que precisa ser ser gerado.Isso ocorre devido ao navegador ser causado por erros de decodificação. O método de codificação definido para o fluxo de saída de caracteres do objeto de resposta é UTF-8 e o método de decodificação usado pelo navegador é GBK. Adicione a descrição da imagem
Altere o modo de codificação da configuração do fluxo de saída de caracteres do objeto de resposta para GBK. Adicione a descrição da imagem
Altere o modo de codificação da configuração do fluxo de saída de caracteres do objeto de resposta para GBK Adicione a descrição da imagem
. A melhor maneira de resolver o problema de caracteres chineses ilegíveis na página é solicitar diretamente o navegador para seguir uma determinada codificação de caracteres. Para exibir o chinês Adicione a descrição da imagem
response.setContentType("text/html;charset=utf-8"); deixe o navegador usar a codificação de caracteres utf-8

Reinicie o servidor Tomcat e visite http://localhost:8080/WebDemo/chineseAdicione a descrição da imagem

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

6. Objeto HttpServletRequest

(1) Métodos relacionados para obter informações da linha de solicitação

Objetivo: Dominar o uso de métodos na interface HttpServletRequest para obter a linha de solicitação

1. Métodos relacionados

Declaração do método Descrição da função
String getMethod() Este método é usado para obter o método de solicitação na mensagem de solicitação HTTP (como GET, POST, etc.)
String getRequestURI() Este método é usado para obter a parte do nome do recurso na linha de solicitação , ou seja, o host e a porta localizados na URL Os dados antes e depois da parte do parâmetro
String getQueryString() Este método é usado para obter a parte do parâmetro na linha de solicitação, ou seja, tudo depois do ponto de interrogação (?) depois o caminho do recurso
String getProtocol( ) Este método é usado para obter o protocolo na linha de solicitação Nome e versão, como HTTP/1.0 ou HTTP/1.1
String getContextPath() Este método é usado para obter o caminho pertencente ao aplicativo Web em o URL da solicitação. Esse caminho começa com "/", indicando que é relativo ao diretório raiz de todo o site e termina com o caminho. Não contém "/". Se a URL da solicitação pertencer ao diretório raiz do site, o resultado de retorno será uma string vazia ("").
String getServletPath() Este método é usado para obter o nome do Servlet ou o caminho mapeado pelo Servlet.
String getRemoteAddr() Este método é usado para obter o cliente solicitante. O endereço IP do cliente, seu formato é semelhante a "192.168.0.3"
String getRemoteHost() Este método é usado para obter o nome completo do host do cliente solicitante, seu o formato é semelhante a "pc1.itcast.cn". Deve-se observar que se o nome completo do host do cliente não puder ser resolvido, este método retornará o endereço IP do cliente
int getRemotePort() Este método é usado para obter o número da porta da conexão de rede do cliente solicitante
String getLocalAddr() Este método é usado Obtenha o endereço IP no servidor web que recebe a conexão de rede solicitada atualmente
String getLocalName() Este método é usado para obter o nome do host correspondente ao IP da conexão de rede atual no servidor Web. int
getLocalPort() Este método é usado para obter o número da porta do servidor Web que recebe a conexão de rede atual
. getServerName() Este método é usado para obter o nome do host apontado pela solicitação atual, ou seja, a parte do nome do host correspondente ao campo do cabeçalho Host na mensagem de solicitação HTTP int getServerPort() Este método é usado para obter a porta do
servidor número ao qual a solicitação atual está conectada, ou seja, se o campo do cabeçalho Host na mensagem de solicitação HTTP for Parte do número da porta correspondente
String getScheme() Este método é usado para obter o nome do protocolo da solicitação, como http, https ou ftp
StringBuffer getRequestURL() Este método é usado para obter a URL completa quando o cliente faz uma solicitação, incluindo protocolo, nome do servidor, número da porta, caminho do recurso e outras informações, mas não inclui os parâmetros de consulta a seguir. Observe que o resultado retornado pelo método getRequestURL() é do tipo StringBuffer, não do tipo String, o que facilita a modificação do resultado.

2. Demonstração de caso

Crie o pacote net.huawei.request e crie a classe RequestLineServlet no pacote
Adicione a descrição da imagem

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);
    }
}

Reinicie o servidor Tomcat e visite http://localhost:8080/WebDemo/request
Adicione a descrição da imagem
getContextPath: /WebDemo + getServletPath: /request = getRequestURI: /WebDemo/request
getScheme: http + ":" + getServerName: localhost + ":" + getServerPort : 8080 + getRequestURI: /WebDemo/request = getRequestURL: http://localhost:8080/WebDemo/request
URI: Identificador Uniforme de Recursos
URL do Identificador Uniforme de Recursos: String
de Solicitação de Demonstração do Localizador Uniforme de Recursos
Adicione a descrição da imagem
Exercício em Sala de Aula: No Console Saída de informações de string de consultaAdicione a descrição da imagem

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);
    }
}

Reinicie o servidor Tomcat e visite http://localhost:8080/WebDemo/request?username=howard&password=903213. Você Adicione a descrição da imagem
também pode continuar dividindo a string de consulta por =.Adicione a descrição da imagem

Adicione a descrição da imagem

2. Demonstração de caso
Crie a classe RequestHeadersServlet no pacote net.huawei.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;
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);
    }
}

Reinicie o servidor Tomcat, visite http://localhost:8080/WebDemo/header Adicione a descrição da imagem
e pressione F12 para visualizar as informações do cabeçalho da solicitação por meio das ferramentas do desenvolvedor.Adicione a descrição da imagem

3. Encaminhamento de solicitação de demonstração de caso

Crie a classe RequestForwardServlet no pacote net.huawei.request, salve os dados no objeto de solicitação e encaminhe-os para outro Servlet para processamento.Adicione a descrição da imagem

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);
    }
}

Crie a classe ResultServlet no pacote net.huawei.request para obter e gerar os dados armazenados no objeto de solicitação na classe RequestForwardServlet.Adicione a descrição da imagem

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);
    }
}

Diagrama de correspondência Adicione a descrição da imagem
Reinicie o servidor Tomcat e visite http://localhost:8080/WebDemo/forward Adicione a descrição da imagem
Nota: O caminho da solicitação do RequestForwardServlet ainda é exibido na barra de endereço, mas o navegador exibe o conteúdo a ser gerado no ResultServlet. Isso ocorre porque o encaminhamento de solicitação é um comportamento que ocorre dentro do servidor. Do RequestForwardServlet ao ResultServlet, é uma solicitação. Em uma solicitação, o atributo request pode ser usado para compartilhamento de dados (mesmo encaminhamento de solicitação).

2. Demonstração de caso

Criar página de registro - Register.htmlAdicione a descrição da imagem

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

Crie a classe RquestParamsServlet no pacote net.huawei.request para obter os dados enviados pelo formulário de registro.Adicione a descrição da imagem

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);
    }
}

Adicione a descrição da imagem
Reinicie o servidor tomcat, visite http://localhost:8080/WebDemo/register.html, preencha os dados do formulário Adicione a descrição da imagem
e clique no botão [Registrar]Adicione a descrição da imagem

Adicione a descrição da imagem

(5) Resolver o problema dos parâmetros de solicitação ilegíveis chineses.Objetivo
: Dominar como resolver o problema dos parâmetros de solicitação ilegíveis chineses.

Na interface HttpServletRequest, é fornecido um método setCharacterEncoding(), que é usado para definir o método de decodificação do objeto de solicitação.

Modifique a classe ResquestParamsServlet, adicione uma linha de código e defina a codificação de caracteres do objeto de solicitação.
Adicione a descrição da imagem

Reinicie o servidor tomcat, visite http://localhost:8080/WebDemo/register.html, preencha os dados do formulário, Adicione a descrição da imagem
clique no botão [Registrar], a página não possui caracteres chineses ilegíveis, Adicione a descrição da imagem
grave a tela para demonstrar a operação de registroAdicione a descrição da imagem

2. Demonstração de caso de transferência de dados através do objeto Request

Crie a classe RquestServlet01 no pacote net.huawei.request

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);
    }
}

Crie a classe RquestServlet02 no pacote net.huawei.requestAdicione a descrição da imagem

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);
    }
}

Inicie o servidor e visite http://localhost:8080/WebDemo/request01 Adicione a descrição da imagem
para modificar RequestServlet02 para exibir apenas informações do aluno.

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);
    }
}

Inicie o servidor e visite http://localhost:8080/WebDemo/request01Adicione a descrição da imagem

おすすめ

転載: blog.csdn.net/qq_41301333/article/details/131202305