Java Web Servlet (Part C)- HttpServletRequest & HttpServletResponse(下)

简介: Java Web Servlet (Part C)- HttpServletRequest & HttpServletResponse

F12打开浏览器的检查页面,查看网络可以确定从请求AlphaServlet然后转发到BravoServlet只发了一次请求,也就是说请求AlphaServlet和AlphaServlet转发到BravoServlet是同一个请求,所以在两个Servlet中都可以获取到username参数的值并且浏览器的地址栏没有变化。

image.png

请求转发可以访问WEB-INF下的文件

在WEB-INF下新建success.html页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>SUCCESS</title>
</head>
<body>
<h1>成功转发到WEB-INF目录下</h1>
</body>
</html>
复制代码

修改AlphaServlet,使其转发到success.html页面

RequestDispatcher requestDispatcher = req.getRequestDispatcher("/WEB-INF/success.html");
复制代码

重新启动应用

image.png

浏览器输出了success页面的内容,转发可以访问WEB-INF下的文件

请求转发的特点

  • 浏览器地址栏没有变化
  • 是同一次请求
  • 共享Request域中的数据
  • 可以转发到WEB-INF目录下
  • 不可以访问工程以外的资源

Web中的相对路径和绝对路径

在JavaWeb中,路径分为相对路径和绝对路径 相对路径

Web中 “/” 的不同意义

在Web中 “/” 是一种绝对路径

二、HttpServletResponse

HttpServletResponse和HttpServletRequest类一样,每次请求进来Tomcat都会创建一个Response对象传递给Servlet程序使用,HttpServletRequest表示请求传过来的信息,HttpServletResponse表示所有响应的信息;如果需要返回给客户端消息,可以使用HttpServletResponse对象来进行设置

HttpServletResponse使用输出流来给客户端发送消息

  • 字节流,getOutputStream(); 常用于下载(传递二进制数据)
  • 字符流,getWriter();常用与回传字符串(常用) 另个流只能同时使用一个。

在controller包中创建一个SteamServlet类,同时使用字符流和字节流

public class StreamServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.getWriter();
        resp.getOutputStream();
    }
}
复制代码

在web.xml中配置Servlet的访问路径

<servlet>
    <servlet-name>SteamServlet</servlet-name>
    <servlet-class>com.lilith.servlet.StreamServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>SteamServlet</servlet-name>
    <url-pattern>/stream</url-pattern>
</servlet-mapping>
复制代码

重启Tomcat,浏览器输入 http://localhost:8080/stream

image.png

页面出现报错

修改StreamServlet,只使用字符流

public class StreamServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        // resp.getOutputStream();
        writer.write("Response Content");
    }
}
复制代码

重启Tomcat,浏览器输入 http://localhost:8080/stream

image.png

浏览器返回response信息

响应中文乱码问题解决方案一

设置StreamServlet中返回的内容是中文格式,并重启Tomcat,浏览器输入同一地址

image.png

页面输出的中文出现乱码现象

在代码中获取字符编码,重启Tomcat,访问同一地址

image.png

在代码中设置响应的编码格式

public class StreamServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置UTF-8编码
        resp.setCharacterEncoding("UTF-8");
        PrintWriter writer = resp.getWriter();
        // resp.getOutputStream();
        String characterEncoding = resp.getCharacterEncoding();
        System.out.println("字符编码给为:" + characterEncoding);
        writer.write("这是响应内容");
    }
}
复制代码

重启Tomcat,访问/stream

image.png

还是出现乱码现象

应为还需要通过请求头设置浏览器字符集

public class StreamServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置UTF-8编码
        resp.setCharacterEncoding("UTF-8");
        // 响应头设置UTF-8字符集
        resp.setHeader("Content-Type","text/html;charset=UTF-8");
        PrintWriter writer = resp.getWriter();
        // resp.getOutputStream();
        String characterEncoding = resp.getCharacterEncoding();
        System.out.println("字符编码给为:" + characterEncoding);
        writer.write("这是响应内容");
    }
}
复制代码

重启Tomcat,访问/stream

image.png

中文可以正常显示

响应中文乱码问题解决方案二

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 设置UTF-8编码
    // resp.setCharacterEncoding("UTF-8");
    // 响应头设置UTF-8字符集
    // resp.setHeader("Content-Type","text/html;charset=UTF-8");
    // 一句代码解决
    resp.setContentType("text/html;charset=UTF-8");
    PrintWriter writer = resp.getWriter();
    // resp.getOutputStream();
    String characterEncoding = resp.getCharacterEncoding();
    System.out.println("字符编码给为:" + characterEncoding);
    writer.write("这是响应内容");
}
复制代码

使用resp.setContentType("text/html;charset=UTF-8") 可以同时设置服务器和客户端都是用UTF-8编码,同时设置了响应头,并且该方法一定要在获取流对象之前调用才会生效

重启Tomcat,再次访问/stream

image.png

请求重定向

请求重定向,指的是客户端发送给服务器请求后,服务端返回一个新的地址,客户端重新访问这个新的地址,称为请求的重定向。

在controller包中新建两个Servlet,用于实现请求的重定向

public class DeltaServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(this.getClass().getName());
        resp.setStatus(302);
        resp.setHeader("Location","http://localhost:8080/echo");
    }
}
复制代码
public class EchoServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(this.getClass().getName());
        resp.getWriter().write(this.getClass().getName());
    }
}
复制代码

在web.xml配置两个Servlet的访问路径

<servlet>
    <servlet-name>DeltaServlet</servlet-name>
    <servlet-class>com.lilith.servlet.DeltaServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DeltaServlet</servlet-name>
    <url-pattern>/delta</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>EchoServlet</servlet-name>
    <servlet-class>com.lilith.servlet.EchoServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>EchoServlet</servlet-name>
    <url-pattern>/echo</url-pattern>
</servlet-mapping>
复制代码

重启Tomcat,并在浏览器中输入http://localhost:8080/delta

image.png

根据浏览器的显示的内容可以确定请求重定向的一些特点

  • 请求重定向发生后浏览器地址栏会发生变化
  • 请求重定向实际发生了两次请求
  • 请求重定向不共享Request域中的数据

测试重定向是否能够跳转到WEB-INF下面的页面中

resp.setHeader("Location","http://localhost:8080/WEB-INF/success.html");
复制代码

重新启动应用

image.png

访问失败,重定向不可以访问WEB-INF下的资源,但是重定向可以反问工程外的资源

请求重定向第二种实现方式(推荐使用)

resp.sendRedirect("http://localhost:8080/echo");
复制代码

代替设置响应码和header

public class DeltaServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println(this.getClass().getName());
        // resp.setStatus(302);
        // // resp.setHeader("Location","http://localhost:8080/echo");
        // resp.setHeader("Location","http://localhost:8080/WEB-INF/success.html");
        resp.sendRedirect("http://localhost:8080/echo");
    }
}
复制代码

重启应用,仍然可以实现重定向,推荐使用第二种方法


相关文章
|
12天前
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
|
15天前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
40 4
|
15天前
|
Java 持续交付 项目管理
使用Maven进行项目管理:提高Java Web开发的效率
Maven 是一款强大的项目管理和构建自动化工具,广泛应用于Java社区。它通过依赖管理、构建生命周期管理、插件机制和多模块项目支持等功能,简化了项目的构建过程,提高了开发效率。本文将介绍Maven的核心功能及其在Java Web开发中的应用。
33 0
WK
|
20天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
36 0
|
1月前
|
前端开发 Java API
JAVA Web 服务及底层框架原理
【10月更文挑战第1天】Java Web 服务是基于 Java 编程语言用于开发分布式网络应用程序的一种技术。它通常运行在 Web 服务器上,并通过 HTTP 协议与客户端进行通信。
25 1
|
1月前
|
Java 应用服务中间件 Spring
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
26 0
|
2月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
2月前
|
关系型数据库 Java MySQL
"解锁Java Web传奇之旅:从JDK1.8到Tomcat,再到MariaDB,一场跨越数据库的冒险安装盛宴,挑战你的技术极限!"
【9月更文挑战第6天】在Linux环境下安装JDK 1.8、Tomcat和MariaDB是搭建Java Web应用的关键步骤。本文详细介绍了使用apt-get安装OpenJDK 1.8、下载并配置Tomcat,以及安装和安全设置MariaDB(MySQL的开源分支)的方法。通过这些步骤,您可以快速构建一个稳定、高效的开发和部署环境,并验证各组件是否正确安装和运行。这为您的Java Web应用提供了一个坚实的基础。
54 0
|
3月前
|
C# 数据可视化 开发者
WPF开发者福音:深度解析OxyPlot与LiveCharts图表库,轻松实现数据可视化不再是难题!
【8月更文挑战第31天】在WPF应用中,数据可视化对提升用户体验至关重要。本文介绍并演示了两种流行图表库OxyPlot和LiveCharts的集成与使用方法。OxyPlot是一款适用于.NET应用的开源图表库,提供多种图表类型,易于集成。LiveCharts则以其丰富的图表类型和动画效果,特别适合实时数据展示。通过具体代码示例,本文展示了如何利用这两种图表库创建折线图和柱状图,并详细说明了安装和配置步骤。希望本文能帮助开发者在WPF应用中轻松实现高效、美观的数据可视化。
200 0
|
3月前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
46 0

热门文章

最新文章

下一篇
无影云桌面