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");
    }
}
复制代码

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


相关文章
|
6天前
|
Java 数据库连接 数据库
spring--为web(1),富士康java面试题整理
spring--为web(1),富士康java面试题整理
|
8天前
|
前端开发 Java 测试技术
Java一分钟之Spring MVC:构建Web应用
【5月更文挑战第15天】Spring MVC是Spring框架的Web应用模块,基于MVC模式实现业务、数据和UI解耦。常见问题包括:配置DispatcherServlet、Controller映射错误、视图解析未设置、Model数据传递遗漏、异常处理未配置、依赖注入缺失和忽视单元测试。解决这些问题可提升代码质量和应用性能。注意配置`web.xml`、`@RequestMapping`、`ViewResolver`、`Model`、`@ExceptionHandler`、`@Autowired`,并编写测试用例。
298 3
|
8天前
|
Java
排课系统【JSP+Servlet+JavaBean】(Java课设)
排课系统【JSP+Servlet+JavaBean】(Java课设)
21 5
|
8天前
|
Java
仓库管理系统【JSP+Servlet+JavaBean】(Java课设)
仓库管理系统【JSP+Servlet+JavaBean】(Java课设)
18 1
|
2天前
|
Java API 数据库
利用Java构建高性能的RESTful Web服务
在现代软件开发中,RESTful Web服务已成为一种流行的架构模式,用于构建可扩展、可维护的网络应用。本文将探讨如何使用Java编程语言及其相关框架(如Spring Boot)来构建高性能的RESTful Web服务。我们将不仅仅关注基本的RESTful API设计,还将深入讨论性能优化、安全性、以及服务扩展性等方面的技术细节。通过本文,读者将能够掌握构建高效RESTful Web服务的核心技术和实践。
|
5天前
|
移动开发 前端开发 JavaScript
Java和web前端,IT新人该如何选择?,2024年最新Web前端内存优化面试
Java和web前端,IT新人该如何选择?,2024年最新Web前端内存优化面试
|
6天前
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(四十六)-java+ selenium自动化测试-web页面定位toast-下篇(详解教程)
【5月更文挑战第10天】本文介绍了使用Java和Selenium进行Web自动化测试的实践,以安居客网站为例。最后,提到了在浏览器开发者工具中调试和观察页面元素的方法。
19 2
|
7天前
|
Web App开发 JavaScript 测试技术
《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)
【5月更文挑战第9天】本文介绍了在Appium中处理App自动化测试中遇到的Toast元素定位的方法。Toast在Web UI测试中也常见,通常作为轻量级反馈短暂显示。文章提供了两种定位Toast元素的技巧.
13 0
|
8天前
|
前端开发 Java Spring
Java Web ——MVC基础框架讲解及代码演示(下)
Java Web ——MVC基础框架讲解及代码演示
15 1
|
8天前
|
设计模式 前端开发 网络协议
Java Web ——MVC基础框架讲解及代码演示(上)
Java Web ——MVC基础框架讲解及代码演示
9 0