Diretório de artigos
- 1. Introdução ao desenvolvimento de servlets
- 3. ServletConfig e ServletContext
-
- (1) Interface ServletConfig
- (2) Interface ServletContext
-
- 1. Obtenha os parâmetros de inicialização do aplicativo web
- 2. Demonstração de caso de obtenção dos parâmetros de inicialização do contêiner de uma aplicação web
- 3. Implemente vários objetos Servlet para compartilhar dados
- 4. Caso demonstra vários objetos Servlet compartilhando dados
- 5. Leia os arquivos de recursos no aplicativo da web
- 6. Demonstração de caso de leitura de arquivos de recursos em aplicativos da Web
- 4. Objeto HttpServletResponse
- 5. Aplicativo HttpServletResponse
- 6. Objeto HttpServletRequest
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.
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.
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.
Modifique o nome do artefato -
Edite a configuração do servidor Tomcat com WebDemo
. Mude para a guia [Servidor]
. Inicie o servidor e veja o efeito.
(2) Criar classe Servlet
Crie um novo pacote net.huawei.servlet.
Crie a classe ServletDemo01 no pacote net.huawei.servlet.
Neste momento, a ferramenta IDEA gerará automaticamente o código Servlet.
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"
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
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.
2. Exercício de aula - Crie um projeto Web e use Servlet para exibir informações pessoais
Crie um projeto Java Enterprise.
Defina o nome do projeto e salve o local.
Clique no botão [Concluir].
Observe o nome dos artefatos.
Altere o nome para ShowInfo
para configurar o servidor Tomcat.
Exclua ShowInfo na implantação e adicione-o novamente . Mude
para a guia [Servidor] e visualize a URL
para iniciar o servidor Tomcat. Veja o efeito
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.
Crie o pacote net.huawei.servlet e crie a classe InfoServlet no pacote.
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
. 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)
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.
Reinicie o servidor Tomcat e visite http://localhost:8080/ShowInfo/info.
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
reinicie o servidor Tomcat usando a codificação de caracteres especificada. Visite http://localhost:8080/ShowInfo/info
para verificar a codificação de caracteres usada atualmente pelo navegador. Ela foi alterada para GBK.
(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.
Após registrar o Servlet no arquivo de descrição de implantação web.xml, você pode comentar as anotações na classe InfoServlet.
Reinicie o servidor Tomcat e visite http://localhost:8080/ShowInfo/info.
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.
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.
Reinicie o servidor Tomcat, visite http://localhost:8080/ShowInfo/info
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
Inicie o servidor, visite http://localhost:8080/ShowInfo/info
e visite http://localhost:8080/ShowInfo/message
(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.
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,
atualize o navegador duas vezes, visite ServletDemo02 duas vezes e visualize os resultados de impressão do console Tomcat.
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.
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.
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/demo03
(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
<?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.servlet
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/demo04
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
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.servlet
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
e depois visite http://localhost:8080/WebDemo/demo06.
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
, reiniciar o servidor, visitar http://localhost:8080/WebDemo/demo05
e depois visitar http://localhost:8080/WebDemo/demo06
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
name = 泸州职业技术学院
address = 泸州市龙马潭区长桥路2号
secretary = 何杰
president = 谢鸿全
Crie a classe ServletDemo07 no pacote net.huawei.servlet
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.
Há um problema com o caminho do arquivo de atributos.
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
reiniciar o servidor Tomcat. Primeiro acesso http://localhost:8080/WebDemo/demo07
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.servlet
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
4. Objeto HttpServletResponse
3. Demonstração de caso enviando corpo de mensagem de resposta
Crie o pacote net.huawei.response.
Crie a classe PrintServlet01 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.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
e crie a classe PrintServlet02 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年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.
Para resolver o problema dos caracteres chineses ilegíveis na página, você precisa modificar o código.
Reinicie o servidor Tomcat e visite http://localhost :8080/WebDemo/print02.
5. Aplicativo HttpServletResponse
2. Demonstração de caso para implementar redirecionamento de solicitação
Criar página de login - 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>
Crie uma página de boas-vindas - 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>
Crie a classe LoginServlet no pacote net.huawei.response para lidar com solicitações de login do usuário
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,
preencha o nome de usuário "howard" e a senha "903213" na página login.html,
clique no botão login, vá para a página de boas-vindas ,
clique no botão de login e vá para a página de boas-vindas
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/chinese
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.
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.
Reinicie o servidor Tomcat e acesse http://localhost:8080/WebDemo/chinese.
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.
Altere o modo de codificação da configuração do fluxo de saída de caracteres do objeto de resposta para GBK.
Altere o modo de codificação da configuração do fluxo de saída de caracteres do objeto de resposta para GBK
. 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
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/chinese
// 设置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
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
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
Exercício em Sala de Aula: No Console Saída de informações de string de consulta
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ê
também pode continuar dividindo a string de consulta por =.
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
e pressione F12 para visualizar as informações do cabeçalho da solicitação por meio das ferramentas do desenvolvedor.
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.
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.
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
Reinicie o servidor Tomcat e visite http://localhost:8080/WebDemo/forward
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.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>
Crie a classe RquestParamsServlet no pacote net.huawei.request para obter os dados enviados pelo formulário de registro.
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);
}
}
Reinicie o servidor tomcat, visite http://localhost:8080/WebDemo/register.html, preencha os dados do formulário
e clique no botão [Registrar]
(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.
Reinicie o servidor tomcat, visite http://localhost:8080/WebDemo/register.html, preencha os dados do formulário,
clique no botão [Registrar], a página não possui caracteres chineses ilegíveis,
grave a tela para demonstrar a operação de registro
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.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 = "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
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/request01