目标:掌握如何使用IDEA工具开发Servlet程序
在实际开发中,通常都会使用IDEA(或Eclipse等)工具完成Servlet的开发,我们使用IDEA完成Servlet的开发,因为IDEA不仅会自动编译Servlet,还会自动创建web.xml文件信息,完成Servlet虚拟路径的映射。
选择IDEA主页的“Create New Project”选项,进入新建项目的界面。
在New Projec界面中,选择左侧栏的“Java”选项,然后勾选”Web Application”选项。选择完毕之后,单击”Next”按钮进入填写项目信息的界面。
在New Projec界面中,”Project name”选项用于指项目的名称,”Project localtion”选项用于指定Web项目的根目录。项目的根目录设置为D:\web_work\chapter04,将WebDemo作为Web项目的名称。设置完成之后,单击“Finish”按钮,进入开发界面。
修改Artifact名称 - WebDemo
编辑Tomcat服务器配置
切换到【Server】选项卡
启动服务器,查看效果
新建net.huawei.servlet包
在net.huawei.servlet包里创建ServletDemo01类
此时IDEA工具会自动生成Servlet代码
为了更好地演示Servlet的运行效果,接下来在ServletDemo01的doGet()和doPost()方法中添加一些代码。在@WebServlet注解里设置urlPatterns属性值:urlPatterns = “/demo01”
package net.huawei.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 功能:Servlet演示类
* 作者:华卫
* 日期:2023年03月12日
*/
@WebServlet(name = "ServletDemo01", urlPatterns = "/demo01")
public class ServletDemo01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取字符输出流
PrintWriter out = response.getWriter();
// 输出信息
out.print("<h1>Hello Servlet World~h1>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
其实,Servlet本质上就是Java程序里嵌入了HTML页面
启动服务器,显示首页
在页面访问ServletDemo01类的url地址“localhost:8080/WebDemo/demo01”
对应关系图
希望显示红色消息,并且居中显示,那么就要用到样式
创建Java Enterprise项目
设置项目名称与保存位置
单击【Finish】按钮
看Artifacts的名称
将名称改为ShowInfo
配置tomcat服务器
在Deployment里删除ShowInfo后重新添加
切换到【Server】选项卡,查看URL
启动tomcat服务器,查看效果
修改首页文件,以表格形式显示个人信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>个人信息title>
head>
<body>
<table style="text-align: center" border="1" align="center" cellpadding="5">
<tr>
<td>学号td>
<td>姓名td>
<td>性别td>
<td>年龄td>
<td>专业td>
<td>班级td>
<td>手机td>
tr>
<tr>
<td>20210201td>
<td>陈燕文td>
<td>女td>
<td>18td>
<td>软件技术专业td>
<td>2021软件2班td>
<td>15890456780td>
tr>
table>
body>
html>
启动服务器,查看结果
创建net.huawei.servlet包,在包里创建InfoServlet类
package net.huawei.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 功能:显示个人信息
* 作者:华卫
* 日期:2023年03月31日
*/
@WebServlet(name = "InfoServlet", urlPatterns = "/info")
public class InfoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取字符输出流
PrintWriter out = response.getWriter();
// 往客户端输出信息
out.print("DOCTYPE html>");
out.print("<html>");
out.print("<head>");
out.print("<meta charset='UTF-8'");
out.print("> 个人信息title>");
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>20210201td>");
out.print("<td>陈燕文td>");
out.print("<td>女td>");
out.print("<td>18td>");
out.print("<td>软件技术专业td>");
out.print("<td>2021软件2班td>");
out.print("<td>15890456780td>");
out.print("tr>");
out.print("table>");
out.print("body>");
out.print("html>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
启动tomcat服务器,访问http://localhost:8080/ShowInfo/info
页面出现中文乱码,需要设置字符编码(要查看Chrome浏览器默认的字符编码)
设置响应对象字符编码为UTF-8,与浏览器当前采用的字符编码保持一致
重启tomcat服务器,访问http://localhost:8080/ShowInfo/info
无论浏览器当前采用什么字符编码,通过设置响应对象内容类型来要求浏览器采用指定的字符编码
重启tomcat服务器,访问http://localhost:8080/ShowInfo/info
查看浏览器当前使用的字符编码,已经被改成GBK了
目标:掌握完成Servlet的配置的两种方式:通过Web应用的配置文件web.xml来,通过@WebServlet注解来完成Servlet的配置
若想让Servlet正确地运行在服务器中并处理请求信息,必须进行适当的配置,关于Servlet的配置主要有两种方式,分别是通过Web应用的配置文件web.xml来完成配置和使用@WebServlet注解的方式完成。
在web.xml文件中,通过标签进行注册,在标签下包含若干个子元素。
把Servlet映射到URL地址,使用标签进行映射,使用子标签指定要映射的Servlet名称,名称要和之前在标签下注册的相同;使用子标签映射URL地址,地址前必须加“/”,否则访问不到。
在部署描述文件web.xml里注册了Servlet,那么就可以注释掉InfoServlet类上的注解
重启tomcat服务器,访问http://localhost:8080/ShowInfo/info
@WebServlet 注解用于代替web.xml文件中的等标签,该注解将会在项目部署时被容器处理,容器将根据具体的属性配置将相应的类部署为Servlet。为此,@WebServlet注解提供了一些属性。
@WebServlet注解可以标注在任意一个继承了HttpServlet类的类之上,属于类级别的注解。下面使用@WebServlet注解标注InfoServlet类。
在web.xml文件里注释掉对InfoServlet的注册标签
重启tomcat服务器,访问http://localhost:8080/ShowInfo/info
使用@WebServlet注解将InfoServlet类标注为一个Servlet。@WebServlet注解中的name属性值用于指定servlet的name属性,等价于,如果没有设置@WebServlet的name属性,其默认值是Servlet的类完整名称。urlPatterns属性值用于指定一组servlet的url的匹配模式,等价于标签。如果需要在@WebServlet注解中设置多个属性,属性之间用逗号隔开。通过@WebServlet注解能极大地简化了Servlet的配置步骤,降低了开发人员的开发难度。
启动服务器,访问http://localhost:8080/ShowInfo/info
访问http://localhost:8080/ShowInfo/message
目标:掌握Servlet的三个生命周期,初始化阶段、运行阶段和销毁阶段
当客户端向Servlet容器发出HTTP请求访问Servlet时,Servlet容器首先会解析请求,检查内存中是否已经有了该Servlet对象,如果有,直接使用该Servlet对象;如果没有,就创建Servlet实例对象,然后通过调用init()方法完成Servlet的初始化。需要注意的是,在Servlet的整个生命周期内,它的init()方法只被调用一次。
这是Servlet生命周期中最重要的阶段,在这个阶段,Servlet容器会为客户端请求创建代表HTTP请求的ServletRequest对象和代表HTTP响应的ServletResponse对象,然后将它们作为参数传递给Servlet的service()方法。service()方法从ServletRequest对象中获得客户端请求信息并处理该请求,通过ServletResponse对象生成响应结果。在Servlet的整个生命周期内,对于Servlet的每一次访问请求,Servlet容器都会调用一次Servlet的service()方法,并且创建新的ServletRequest和ServletResponse对象,也就是说,service()方法在Servlet的整个生命周期中会被调用多次。
当服务器关闭或web应用被移除出容器时,Servlet随着web应用的销毁而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destroy()方法,以便让Servlet对象释放它所占用的资源。在Servlet的整个生命周期中,destroy()方法也只被调用一次。需要注意的是,Servlet对象一旦创建就会驻留在内存中等待客户端的访问,直到服务器关闭,或web应用被移除出容器时Servlet对象才会销毁。
在WebDemo项目中创建ServletDemo02类,在ServletDemo02类中编写init()方法和destroy()方法并重写service()方法,用来案例演示Servlet生命周期方法的执行效果。
package net.huawei.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 功能:演示Servlet生命周期
* 作者:华卫
* 日期:2023年03月12日
*/
@WebServlet(name = "ServletDemo02", value = "/demo02")
public class ServletDemo02 extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("init()方法被调用……");
}
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("service()方法被调用……");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<h1>演示Servlet生命周期~h1>");
}
@Override
public void destroy() {
System.out.println("destroy()方法被调用……");
}
}
启动tomcat服务器,访问http://localhost:8080/WebDemo/demo02
刷新浏览器两次,两次访问ServletDemo02,查看tomcat控制台的打印结果
init()方法只在第一次访问时执行,service()方法则在每次访问时都被执行。
如果想将ServletDemo02移除,可以在IDEA中停止WebDemo项目,此时,Servlet容器会调用ServletDemo02的destroy()方法,在IDEA控制台打印出“destroy()方法被调用……”信息。
打个比方:我们只能诞生一次(init()方法),死亡一次(destroy()方法),中间可以换很多次工作,给社会提供不同的服务(service()方法)。
目标:掌握如何使用ServletConfig获取配置信息的方法
在Servlet运行期间,经常需要一些配置信息,例如,文件使用的编码等,这些信息都可以在@WebServlet注解的属性中配置。当Tomcat初始化一个Servlet时,会将该Servlet的配置信息封装到一个ServletConfig对象中,通过调用init(ServletConfig config)方法将ServletConfig对象传递给Servlet。ServletConfig定义了一系列获取配置信息的方法。
以getInitParameter()方法为例讲解ServletConfig方法的调用
在WebDemo项目的net.huawei.servlet包里创建ServletDemo03类
package net.huawei.servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
/**
* 功能:演示ServletConfig方法的调用
* 作者:华卫
* 日期:2023年03月31日
*/
@WebServlet(name = "ServletDemo03", urlPatterns = "/demo03",
initParams = {@WebInitParam(name="encoding", value = "utf-8"),
@WebInitParam(name="text-color", value = "red"),
@WebInitParam(name="font-size", value= "25")})
public class ServletDemo03 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应对象内容类型
response.setContentType("text/html; charset=utf-8");
// 获取打印输出流
PrintWriter out = response.getWriter();
// 获取Servlet配置对象
ServletConfig config = getServletConfig();
// 获取初始化参数名枚举对象
Enumeration<String> initParams = config.getInitParameterNames();
// 遍历初始化参数名枚举对象,输出参数名及其值
while (initParams.hasMoreElements()) {
String initParam = initParams.nextElement();
out.print(initParam + " : " + config.getInitParameter(initParam) + "<br />");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
启动tomcat服务器,访问http://localhost:8080/WebDemo/demo03
目标:掌握ServletContext接口的使用方法
当Servlet容器启动时,会为每个Web应用创建一个唯一的ServletContext对象代表当前Web应用。ServletContext对象不仅封装了当前Web应用的所有信息,而且实现了多个Servlet之间数据的共享。
在web.xml文件中,可以配置Servlet的初始化信息,还可以配置整个Web应用的初始化信息。Web应用初始化参数的配置方式具体如下所示。
<context-param>
<param-name>参数名param-name>
<param-value>参数值param-value>
context-param>
<context-param>
<param-name>参数名param-name>
<param-value>参数值param-value>
context-param>
元素位于根元素中,它的子元素和分别用来指定参数的名字和参数值。可以通过调用ServletContext接口中定义的getInitParameterNames()和getInitParameter(String name)方法,分别获取参数名和参数值。
在WebDemo项目的web.xml文件中,配置容器初始化参数信息和Servlet信息
<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>collegeparam-name>
<param-value>泸州职业技术学院param-value>
context-param>
<context-param>
<param-name>addressparam-name>
<param-value>泸州市龙马潭区长桥路2号param-value>
context-param>
<context-param>
<param-name>secretaryparam-name>
<param-value>何杰param-value>
context-param>
<context-param>
<param-name>presidentparam-name>
<param-value>谢鸿全param-value>
context-param>
web-app>
在net.huawei.servlet包里创建ServletDemo04类
package net.huawei.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
/**
* 功能:获取Web应用的容器初始化参数
* 作者:华卫
* 日期:2023年03月31日
*/
@WebServlet(name = "ServletDemo04", urlPatterns = "/demo04")
public class ServletDemo04 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应对象内容类型
response.setContentType("text/html; charset=utf-8");
// 获取打印输出流
PrintWriter out = response.getWriter();
// 获取Servlet容器对象
ServletContext context = getServletContext();
// 获取容器的初始化参数名枚举对象
Enumeration<String> paramNames = context.getInitParameterNames();
// 通过循环遍历显示全部参数名与参数值
while (paramNames.hasMoreElements()) {
// 获取参数名
String name = paramNames.nextElement();
// 按参数名获取参数值
String value = context.getInitParameter(name);
// 输出参数名和参数值
out.print(name + " : " + value + "<br />");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
启动tomcat服务器,访问http://localhost:8080/WebDemo/demo04
由于一个Web应用中的所有Servlet共享同一个ServletContext对象,所以ServletContext对象的域属性可以被该Web应用中的所有Servlet访问。ServletContext接口中定义了用于增加、删除、设置ServletContext域属性的四个方法。
在net.huawei.servlet包里创建ServletDemo05类
package net.huawei.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 功能:写入域属性
* 作者:华卫
* 日期:2023年03月31日
*/
@WebServlet(name = "ServletDemo05", urlPatterns = "/demo05")
public class ServletDemo05 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应对象内容类型
response.setContentType("text/html; charset=utf-8");
// 获取Servlet容器对象
ServletContext context = getServletContext();
// 写入域属性
context.setAttribute("id", "20210201");
context.setAttribute("name", "陈雅雯");
context.setAttribute("gender", "女");
context.setAttribute("age", "18");
context.setAttribute("major", "软件技术专业");
context.setAttribute("class", "2021软件2班");
context.setAttribute("telephone", "15890903456");
// 获取打印输出流
PrintWriter out = response.getWriter();
// 输出提示信息
out.print("<h3>成功地写入了域属性~h3>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
在net.huawei.servlet包里创建ServletDemo06类
package net.huawei.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
/**
* 功能:读取域属性
* 作者:华卫
* 日期:2023年03月31日
*/
@WebServlet(name = "ServletDemo06", urlPatterns = "/demo06")
public class ServletDemo06 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应对象内容类型
response.setContentType("text/html; charset=utf-8");
// 获取打印输出流
PrintWriter out = response.getWriter();
// 获取Servlet容器对象
ServletContext context = getServletContext();
// 获取全部域属性名枚举对象
Enumeration<String> attributeNames = context.getAttributeNames();
// 通过循环显示域属性名与域属性值
while (attributeNames.hasMoreElements()) {
// 获取域属性名
String name = attributeNames.nextElement();
// 获取域属性值
Object value = context.getAttribute(name);
// 输出域属性名与域属性值
out.print(name + " : " + value + "<br />");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
启动tomcat服务器,先访问http://localhost:8080/WebDemo/demo05
再访问http://localhost:8080/WebDemo/demo06
有很多域属性不是我们写入的,如果我们只想显示我们写入的域属性,那么我们就要修改一下ServletDemo06的代码
重启服务器,访问http://localhost:8080/WebDemo/demo05
再访问http://localhost:8080/WebDemo/demo06
ServletContext接口定义了一些读取Web资源的方法,这些方法是依靠Servlet容器来实现的。Servlet容器根据资源文件相对于Web应用的路径,返回关联资源文件的IO流、资源文件在文件系统的绝对路径等。
在net.huawei.servlet包里创建属性文件 - college.properties
name = 泸州职业技术学院
address = 泸州市龙马潭区长桥路2号
secretary = 何杰
president = 谢鸿全
在net.huawei.servlet包里创建ServletDemo07类
package net.huawei.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Properties;
/**
* 功能:读取资源文件
* 作者:华卫
* 日期:2023年03月13日
*/
@WebServlet(name = "ServletDemo07", urlPatterns = "/demo07")
public class ServletDemo07 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置内容类型
response.setContentType("text/html; charset=utf-8");
// 获取Servlet容器对象
ServletContext context = getServletContext();
// 获取打印输出流
PrintWriter out = response.getWriter();
// 读取资源文件,得到字节输入流
InputStream in = context.getResourceAsStream(
"/WEB-INF/classes/net/huawei/servlet/college.properties");
// 创建属性对象(Map接口的实现类)
Properties pros = new Properties();
// 属性对象加载资源文件的资源文件输入流
pros.load(in);
// 往客户端输出属性值
out.println("name = " + pros.getProperty("name") + "<br />");
out.println("address = " + pros.getProperty("address") + "<br />");
out.println("secretary = " + pros.getProperty("secretary") + "<br />");
out.println("president = " + pros.getProperty("president") + "<br />");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
启动tomcat服务器,访问http://localhost:8080/WebDemo/demo07
属性文件的路径问题
读取属性文件得到的字节流编码是ISO-8859-1,需要做一个转码处理
重启tomcat服务器,先访问http://localhost:8080/WebDemo/demo07
在Web项目开发中开发者可能需要获取资源的绝对路径。通过调用getRealPath(String path)方法获取资源文件的绝对路径。
在net.huawei.servlet包里创建ServletDemo08类
package net.huawei.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 功能:获取资源的绝对路径
* 作者:华卫
* 日期:2023年03月13日
*/
@WebServlet(name = "ServletDemo08", urlPatterns = "/demo08")
public class ServletDemo08 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取Servlet容器对象
ServletContext context = getServletContext();
// 获取打印输出流
PrintWriter out = response.getWriter();
// 创建资源路径字符串
String path = "/WEB-INF/classes/net/huawei/servlet/college.properties";
// 获取资源绝对路径
String realPath = context.getRealPath(path);
// 输出资源绝对路径
out.println("college.properties: " + realPath);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
重启tomcat服务器,访问http://localhost:8080/WebDemo/demo08
创建net.huawei.response包
在net.huawei.response包里创建PrintServlet01类
package net.huawei.response;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
/**
* 功能:演示响应体输出字节流
* 作者:华卫
* 日期:2023年04月07日
*/
@WebServlet(name = "PrintServlet01", urlPatterns = "/print01")
public class PrintServlet01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 定义字符串数据
String data = "欢迎访问泸州职业技术学院~";
// 获取字节输出流对象
OutputStream out = response.getOutputStream();
// 往客户端输出信息
out.write(data.getBytes());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
重启tomcat服务器,访问http://localhost:8080/WebDemo/print01
在net.huawei.response包里创建PrintServlet02类
package net.huawei.response;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 功能:演示响应体打印字符流
* 作者:华卫
* 日期:2023年04月07日
*/
@WebServlet(name = "PrintServlet02", urlPatterns = "/print02")
public class PrintServlet02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 定义字符串数据
String data = "欢迎访问泸州职业技术学院~";
// 获取打印字符流
PrintWriter out = response.getWriter();
// 往客户端输出信息
out.println(data);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
重启tomcat服务器,访问http://localhost:8080/WebDemo/print02
为了解决页面中文乱码问题,要修改代码
重启tomcat服务器,访问http://localhost:8080/WebDemo/print02
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>
DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录成功title>
head>
<body>
<h3 style="text-align: center">欢迎你,登录成功~h3>
body>
html>
在net.huawei.response包里创建LoginServlet类,处理用户登录请求
package net.huawei.response;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 功能:登录处理程序
* 作者:华卫
* 日期:2023年04月07日
*/
@WebServlet(name = "LoginServlet", urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取登录表单提交的用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
// 判断是否登录成功,决定重定向到不同页面
if ("howard".equals(username) && "903213".equals(password)) {
// 重定向到欢迎页面
response.sendRedirect("/WebDemo/welcome.html");
} else {
// 重定向到登录页面
response.sendRedirect("/WebDemo/login.html");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
重启tomcat服务器,访问http://localhost:8080/WebDemo/login.html
在login.html页面填写用户名“howard”,密码“903213”
单击登录按钮,跳转到欢迎页面
单击登录按钮,跳转到欢迎页面
2、案例演示解决乱码问题
在net.huawei.response包里创建ChineseServlet类
package net.huawei.response;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 功能:演示解决中文乱码问题
* 作者:华卫
* 日期:2023年03月13日
*/
@WebServlet(name = "ChineseServlet", urlPatterns = "/chinese")
public class ChineseServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 创建数据字符串
String data = "欢迎访问泸州职业技术学院~";
// 获取打印字符输出流
PrintWriter out = response.getWriter();
// 在页面输出信息
out.println(data);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
重启tomcat服务器,访问http://localhost:8080/WebDemo/chinese
浏览器显示的内容都是“???~”,说明发生了乱码问题。此处产生乱码的原因是response对象的字符输出流在编码时,采用的是ISO-8859-1的字符码表,该码表并不兼容中文,会将“欢迎访问泸州职业技术学院”编码为“63 63 63 63 63 63 63 63 63 63 63 63”(在ISO-8859-1的码表中查不到的字符就会显示63)。当浏览器对接收到的数据进行解码时,会采用默认的码表GB2312,将“63 ”解码为“?”,因此,浏览器将“欢迎访问泸州职业技术学院”十二个字符显示成了“???”。
解决页面乱码问题
HttpServletResponse接口提供了一个setCharacterEncoding()方法,该方法用于设置字符的编码方式,接下来对ChineseServlet类进行修改,在代码String data = “欢迎访问泸州职业技术学院~”;前增加一行代码,设置字符编码使用的码表为utf-8。
浏览器显示的内容都是“???~”,说明发生了乱码问题。此处产生乱码的原因是response对象的字符输出流在编码时,采用的是ISO-8859-1的字符码表,该码表并不兼容中文,会将“欢迎访问泸州职业技术学院”编码为“63 63 63 63 63 63 63 63 63 63 63 63”(在ISO-8859-1的码表中查不到的字符就会显示63)。当浏览器对接收到的数据进行解码时,会采用默认的码表GB2312,将“63 ”解码为“?”,因此,浏览器将“欢迎访问泸州职业技术学院”十二个字符显示成了“???”。
解决页面乱码问题
HttpServletResponse接口提供了一个setCharacterEncoding()方法,该方法用于设置字符的编码方式,接下来对ChineseServlet类进行修改,在代码String data = “欢迎访问泸州职业技术学院~”;前增加一行代码,设置字符编码使用的码表为utf-8。
重启tomcat服务器,访问http://localhost:8080/WebDemo/chinese
浏览器中显示的乱码虽然不是“???”,但也不是需要输出的“欢迎访问泸州职业技术学院”,这是由于浏览器解码错误导致的。response对象的字符输出流设置的编码方式为UTF-8,而浏览器使用的解码方式是GBK。
将response对象的字符输出流设置的编码方式改为GBK
将response对象的字符输出流设置的编码方式改为GBK
一种更好的方法来解决页面中文乱码问题,直接要求浏览器按照某种字符编码来显示中文
response.setContentType(“text/html;charset=utf-8”);让浏览器采用utf-8字符编码
重启tomcat服务器,访问http://localhost:8080/WebDemo/chinese
// 设置HttpServletResponse使用utf-8编码
response.setCharacterEncoding("utf-8");
// 通知浏览器使用utf-8解码
response.setHeader("Content-Type", "text/html;charset=utf-8");
目标:掌握使用HttpServletRequest接口中的方法获取请求行
方法声明 功能描述
String getMethod( ) 该方法用于获取HTTP请求消息中的请求方式(如GET、POST等)
String getRequestURI( ) 该方法用于获取请求行中资源名称部分,即位于URL的主机和端口之后、参数部分之前的数据
String getQueryString( ) 该方法用于获取请求行中的参数部分,也就是资源路径后面问号(?)以后的所有内容
String getProtocol( ) 该方法用于获取请求行中的协议名和版本,例如HTTP/1.0或HTTP/1.1
String getContextPath( ) 该方法用于获取请求URL中属于Web应用程序的路径,这个路径以“/”开头,表示相对于整个Web站点的根目录,路径结尾不含“/”。如果请求URL属于Web站点的根目录,那么返回结果为空字符串(“”)
String getServletPath( ) 该方法用于获取Servlet的名称或Servlet所映射的路径
String getRemoteAddr( ) 该方法用于获取请求客户端的IP地址,其格式类似于“192.168.0.3”
String getRemoteHost( ) 该方法用于获取请求客户端的完整主机名,其格式类似于“pc1.itcast.cn”。需要注意的是,如果无法解析出客户机的完整主机名,该方法将会返回客户端的IP地址
int getRemotePort() 该方法用于获取请求客户端网络连接的端口号
String getLocalAddr() 该方法用于获取Web服务器上接收当前请求网络连接的IP地址
String getLocalName() 该方法用于获取Web服务器上接收当前网络连接IP所对应的主机名
int getLocalPort() 该方法用于获取Web服务器上接收当前网络连接的端口号
String getServerName() 该方法用于获取当前请求所指向的主机名,即HTTP请求消息中Host头字段所对应的主机名部分
int getServerPort() 该方法用于获取当前请求所连接的服务器端口号,即如果HTTP请求消息中Host头字段所对应的端口号部分
String getScheme() 该方法用于获取请求的协议名,例如http、https或ftp
StringBuffer getRequestURL() 该方法用于获取客户端发出请求时的完整URL,包括协议、服务器名、端口号、资源路径等信息,但不包括后面的查询参数部分。注意,getRequestURL()方法返回的结果是StringBuffer类型,而不是String类型,这样更便于对结果进行修改
创建net.huawei.request包,在包里创建RequestLineServlet类
package net.huawei.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 功能:输出请求行的相关信息
* 作者:华卫
* 日期:2023年03月13日
*/
@WebServlet(name = "RequestLineServlet", urlPatterns = "/request")
public class RequestLineServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html;charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取并输出请求行的相关信息
out.println("getMethod: " + request.getMethod() + "<br />");
out.println("getRequestURI: " + request.getRequestURI() + "<br />");
out.println("getQueryString: " + request.getQueryString() + "<br />");
out.println("getProtocol: " + request.getProtocol() + "<br />");
out.println("getContextPath: " + request.getContextPath() + "<br />");
out.println("getPathInfo: " + request.getPathInfo() + "<br />");
out.println("getPathTranslated: " + request.getPathTranslated() + "<br />");
out.println("getServletPath: " + request.getServletPath() + "<br />");
out.println("getRemoteAddr: " + request.getRemoteAddr() + "<br />");
out.println("getRemoteHost: " + request.getRemoteHost() + "<br />");
out.println("getRemotePort: " + request.getRemotePort() + "<br />");
out.println("getLocalAddr: " + request.getLocalAddr() + "<br />");
out.println("getLocalName: " + request.getLocalName() + "<br />");
out.println("getLocalPort: " + request.getLocalPort() + "<br />");
out.println("getServerName: " + request.getServerName() + "<br />");
out.println("getServerPort: " + request.getServerPort() + "<br />");
out.println("getScheme: " + request.getScheme() + "<br />");
out.println("getRequestURL: " + request.getRequestURL() + "<br />");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
重启tomcat服务器,访问http://localhost:8080/WebDemo/request
getContextPath: /WebDemo + getServletPath: /request = getRequestURI: /WebDemo/request
getScheme: http + “:” + getServerName: localhost + “:” + getServerPort: 8080 + getRequestURI: /WebDemo/request = getRequestURL: http://localhost:8080/WebDemo/request
URI: Uniform Resource Identifier 统一资源标识符
URL: Uniform Resource Locator 统一资源定位器
演示请求字符串
课堂练习:在控制台输出查询字符串的信息
package net.huawei.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 功能:输出请求行的相关信息
* 作者:华卫
* 日期:2023年04月14日
*/
@WebServlet(name = "RequestLineServlet", urlPatterns = "/request")
public class RequestLineServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取并输出请求行的相关信息
out.println("getMethod: " + request.getMethod() + "<br />");
out.println("getRequestURI: " + request.getRequestURI() + "<br />");
out.println("getQueryString: " + request.getQueryString() + "<br />");
out.println("getProtocol: " + request.getProtocol() + "<br />");
out.println("getContextPath: " + request.getContextPath() + "<br />");
out.println("getPathInfo: " + request.getPathInfo() + "<br />");
out.println("getPathTranslated: " + request.getPathTranslated() + "<br />");
out.println("getServletPath: " + request.getServletPath() + "<br />");
out.println("getRemoteAddr: " + request.getRemoteAddr() + "<br />");
out.println("getRemoteHost: " + request.getRemoteHost() + "<br />");
out.println("getRemotePort: " + request.getRemotePort() + "<br />");
out.println("getLocalAddr: " + request.getLocalAddr() + "<br />");
out.println("getLocalName: " + request.getLocalName() + "<br />");
out.println("getLocalPort: " + request.getLocalPort() + "<br />");
out.println("getServerName: " + request.getServerName() + "<br />");
out.println("getServerPort: " + request.getServerPort() + "<br />");
out.println("getScheme: " + request.getScheme() + "<br />");
out.println("getRequestURL: " + request.getRequestURL() + "<br />");
// 在控制台输出请求字符串的信息
if (request.getQueryString() != null) {
String strQuery = request.getQueryString();
String[] queries = strQuery.split("&");
for (String query : queries) {
String[] fields = query.split("=");
System.out.println(fields[0] + " : " + fields[1]);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
重启tomcat服务器,访问http://localhost:8080/WebDemo/request?username=howard&password=903213
还可以将查询字符串继续按=进行拆分
2、案例演示
在net.huawei.request包里创建RequestHeadersServlet类
package net.huawei.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
/**
* 功能:演示获取请求头的信息
* 作者:华卫
* 日期:2023年04月14日
*/
@WebServlet(name = "RequestHeaderServlet", urlPatterns = "/header")
public class RequestHeaderServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取请求头名枚举对象
Enumeration<String> headerNames = request.getHeaderNames();
// 遍历所有请求头,并通过getHeader()方法获取一个指定名称的头字段
while (headerNames.hasMoreElements()) {
// 获取头字段名称
String headerName = headerNames.nextElement();
// 输出头字段名称及其值
out.println(headerName + " : " + request.getHeader(headerName) + "<br />");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
重启tomcat服务器,访问http://localhost:8080/WebDemo/header
按F12键,通过开发者工具查看请求头信息
在net.huawei.request包里创建RequestForwardServlet类,将数据保存在request对象里,然后转发给另一个Servlet来处理
package net.huawei.request;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 功能:演示请求转发
* 作者:华卫
* 日期:2023年03月13日
*/
@WebServlet(name = "RequestForwardServlet", urlPatterns = "/forward")
public class RequestForwardServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html;charset=utf-8");
// 设置请求对象属性
request.setAttribute("message", "欢迎访问泸州职业技术学院~");
// 获取请求派发器对象(参数是请求转发的Servlet的url)
RequestDispatcher dispatcher = request.getRequestDispatcher("/result");
// 请求转发给url为`/result`的Servlet
dispatcher.forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
在net.huawei.request包里创建ResultServlet类,用于获取RequestForwardServlet类中存储在request对象中的数据并输出
package net.huawei.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 功能:处理转发的请求
* 作者:华卫
* 日期:2023年03月13日
*/
@WebServlet(name = "ResultServlet", urlPatterns = "/result")
public class ResultServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html;charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取请求转发保存在request对象里的数据
String message = (String) request.getAttribute("message");
// 输出获取的信息
if (message != null) {
out.println("转发来的消息:" + message);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
对应关系图
重启tomcat服务器,访问http://localhost:8080/WebDemo/forward
注意:地址栏中显示的仍然是RequestForwardServlet的请求路径,但是浏览器却显示出了ResultServlet中要输出的内容。这是因为请求转发是发生在服务器内部的行为,从RequestForwardServlet到ResultServlet属于一次请求,在一次请求中可以使用request 属性进行数据共享(同一请求转发)。
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册title>
head>
<body>
<form action="register" method="post">
<fieldset>
<legend>新用户注册legend>
<table cellpadding="2" align="center">
<tr>
<td align="right">用户名:td>
<td>
<input type="text" name="username" />
td>
tr>
<tr>
<td align="right">密码:td>
<td>
<input type="password" name="password" />
td>
tr>
<tr>
<td align="right">性别:td>
<td>
<input type="radio" name="gender" value="男"/> 男
<input type="radio" name="gender" value="女"/> 女
td>
tr>
<tr>
<td align="right">兴趣:td>
<td>
<input type="checkbox" name="interest" value="看电影"/>看电影
<input type="checkbox" name="interest" value="敲代码"/>敲代码
<input type="checkbox" name="interest" value="玩游戏"/>玩游戏
td>
tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="注册"/>
<input type="reset" value="重填" />
td>
tr>
table>
fieldset>
form>
body>
html>
在net.huawei.request包里创建RquestParamsServlet类,用于获取注册表单提交的数据
package net.huawei.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 功能:获取请求参数
* 作者:华卫
* 日期:2023年04月14日
*/
@WebServlet(name = "RequestParamsServlet", urlPatterns = "/register")
public class RequestParamsServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取注册表单提交的数据
String username = request.getParameter("username");
String password = request.getParameter("password");
String gender = request.getParameter("gender");
String[] interests = request.getParameterValues("interest");
// 输出获取的表单数据
out.println("姓名:" + username + "<br />");
out.println("密码:" + password + "<br />");
out.println("性别:" + gender + "<br />");
out.print("兴趣:");
for (int i = 0; i < interests.length; i++) {
out.println(interests[i]);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
重启tomcat服务器,访问http://localhost:8080/WebDemo/register.html,填写表单数据
单击【注册】按钮
(五)解决请求参数中文乱码问题
目标:掌握如何解决请求参数的中文乱码
在HttpServletRequest接口中,提供了一个setCharacterEncoding()方法,该方法用于设置request对象的解码方式
修改ResquestParamsServlet类,添加一行代码,设置请求对象的字符编码
重启tomcat服务器,访问http://localhost:8080/WebDemo/register.html,填写表单数据
单击【注册】按钮,页面没有中文乱码
录屏演示注册操作
在net.huawei.request包里创建RquestServlet01类
package net.huawei.request;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* 功能:设置请求对象属性,请求转发
* 作者:华卫
* 日期:2023年04月14日
*/
@WebServlet(name = "RequestServlet01", urlPatterns = "/request01")
public class RequestServlet01 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 设置请求对象属性
request.setAttribute("id", "20210201");
request.setAttribute("name", "陈燕文");
request.setAttribute("gender", "女");
request.setAttribute("age", "18");
request.setAttribute("major", "软件技术专业");
request.setAttribute("class", "2021级软件2班");
request.setAttribute("phone", "15890903456");
// 获取请求派发器对象(参数是请求转发的Servlet的url)
RequestDispatcher dispatcher = request.getRequestDispatcher("/request02");
// 请求转发给url为`/request02`的Servlet
dispatcher.forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
在net.huawei.request包里创建RquestServlet02类
package net.huawei.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
/**
* 功能:获取请求转发的数据
* 作者:华卫
* 日期:2023年04月14日
*/
@WebServlet(name = "RequestServlet02", urlPatterns = "/request02")
public class RequestServlet02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取请求对象属性名枚举对象
Enumeration<String> attributes = request.getAttributeNames();
// 获取请求转发保存在request对象里的数据并输出
while (attributes.hasMoreElements()) {
// 获取属性名
String attribute = attributes.nextElement();
// 输出属性名及其值
out.println(attribute + " : " + request.getAttribute(attribute) + "<br />");
}
// 删除请求对象的属性
while (attributes.hasMoreElements()) {
// 获取属性名
String attribute = attributes.nextElement();
// 删除属性
request.removeAttribute(attribute);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}
启动服务器,访问http://localhost:8080/WebDemo/request01
修改RequestServlet02,只显示学生信息
package net.huawei.request;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* 功能:获取请求转发的数据
* 作者:华卫
* 日期:2023年04月14日
*/
@WebServlet(name = "RequestServlet02", urlPatterns = "/request02")
public class RequestServlet02 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应体内容类型
response.setContentType("text/html; charset=utf-8");
// 获取字符输出流
PrintWriter out = response.getWriter();
// 获取请求转发保存在request对象里的数据并输出
out.println("学号:" + request.getAttribute("id") + "<br />");
out.println("姓名:" + request.getAttribute("name") + "<br />");
out.println("性别:" + request.getAttribute("gender") + "<br />");
out.println("年龄:" + request.getAttribute("age") + "<br />");
out.println("专业:" + request.getAttribute("major") + "<br />");
out.println("班级:" + request.getAttribute("class") + "<br />");
out.println("手机:" + request.getAttribute("phone") + "<br />");
// 删除请求对象的属性
request.removeAttribute("id");
request.removeAttribute("name");
request.removeAttribute("gender");
request.removeAttribute("age");
request.removeAttribute("major");
request.removeAttribute("class");
request.removeAttribute("phone");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
}