整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

《Servlet》第18节:HttpServletR

《Servlet》第18节:HttpServletResponse响应JSON和HTML内容

面已经介绍了HttpServletResponse响应对象中的一些常用方法,这一小节介绍如何使用HttpServletResponse响应对象,将结果返回给浏览器客户端。

1.1、返回HTML内容

使用Servlet返回HTML内容给客户端,是一个比较常见的功能,因为Servlet本来就是用于JavaWeb开发的,而HTML就是Web开发的三大核心语言之一。这里给出一个响应HTML内容给客户端的案例代码:

package com.gitcode.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @version 1.0.0
 * @Date: 2024/2/10 20:20
 * @Author ZhuYouBin
 * @Description:
 */
public class HtmlResponseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 响应HTML内容
        response.setContentType("text/html;charset=UTF-8");
        // 获取输出流
        PrintWriter writer=response.getWriter();

        // 输出HTML内容
        writer.println("<!DOCTYPE html>");
        writer.println("<html lang=\"en\">");
        writer.println("<head>");
        writer.println("    <meta charset=\"UTF-8\">");
        writer.println("    <title>响应HTML内容</title>");
        writer.println("</head>");
        writer.println("<body>");
        writer.println("    <h3>Hello World!你好,世界!</h3>");
        writer.println("</body>");
        writer.println("</html>");

        // 关闭流
        writer.close();
    }
}

运行结果如下所示:

1.2、返回JSON内容

JSON格式在实际的Web开发中,可以说是最常用的数据交互格式啦,在一些前后端分离的项目中,都是采用JSON来进行数据交互的,所以这里给出一个响应JSON内容的案例代码:

package com.gitcode.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * @version 1.0.0
 * @Date: 2024/2/10 20:20
 * @Author ZhuYouBin
 * @Description:
 */
public class JsonResponseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 响应JSON内容
        response.setContentType("application/json;charset=UTF-8");
        // 获取输出流
        PrintWriter writer=response.getWriter();

        // 输出JSON内容
        writer.println("{");
        writer.println(" \"username\":\"名字是Tom-2024\",");
        writer.println(" \"password\":\"123456\"");
        writer.println("}");

        // 关闭流
        writer.close();
    }
}

运行结果如下所示:

以上,就是使用HttpServletResponse对象返回HTML和JSON数据格式。

今天就到这里,未完待续~~

ervlet与HTTP的关系详解

Servlet是Java编写的服务器端程序,用于处理客户端发送的请求并生成响应。它基于Java的Servlet API,并在Java Web服务器上运行。HTTP(Hypertext Transfer Protocol)是一种用于在Web上进行数据通信的协议,是一种无状态的、基于请求/响应模型的协议,用于在客户端和服务器之间传输超文本(HTML、XML等)和其他资源(图像、音频等)。

云服务器,高防服务器就选蓝易云,头条搜索:蓝易云

云服务器,高防服务器就选蓝易云,头条搜索:蓝易云

什么是Servlet

Servlet是一种在服务器端执行的Java类,通过HTTP协议与客户端进行通信。它用于处理客户端请求,并生成相应的响应返回给客户端。Servlet通常用于Web应用程序的开发,提供动态Web内容生成和处理功能。

Servlet的核心功能

  • 处理HTTP请求:接收和解析客户端发送的HTTP请求。
  • 生成HTTP响应:根据处理结果生成并发送HTTP响应给客户端。
  • 会话管理:通过会话跟踪用户状态,维护跨请求的状态信息。
  • 过滤请求和响应:可以在请求到达Servlet之前或响应返回客户端之前,对其进行处理和修改。

什么是HTTP

HTTP是Web上的基础通信协议,它规定了客户端和服务器之间如何交换信息。HTTP协议定义了请求和响应的格式,通信的方式,以及传输数据的规则。

HTTP的核心功能

  • 请求/响应模型:客户端通过HTTP请求获取资源,服务器通过HTTP响应返回资源。
  • 无状态性:每个请求都是独立的,与之前的请求没有直接关联。
  • 灵活性:可以传输多种类型的数据,包括HTML、XML、JSON、图像、视频等。
  • 扩展性:通过扩展HTTP头字段,可以增加新的功能和信息。

Servlet与HTTP的关系

Servlet基于HTTP协议

Servlet通过HTTP协议与客户端进行通信。客户端发送HTTP请求到服务器,Servlet接收请求并生成HTTP响应返回给客户端。Servlet的生命周期管理和请求处理都基于HTTP协议。

Servlet处理HTTP请求

Servlet负责处理客户端发送的HTTP请求。它可以从请求中获取参数、读取请求头、访问请求的主体内容等。通过Servlet的 doGet和 doPost方法,可以分别处理GET和POST请求。

处理GET请求

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 获取请求参数
    String param=request.getParameter("param");
    // 生成响应
    response.setContentType("text/html");
    PrintWriter out=response.getWriter();
    out.println("<html><body>");
    out.println("<h1>处理GET请求</h1>");
    out.println("<p>参数:" + param + "</p>");
    out.println("</body></html>");
}

处理POST请求

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 读取请求主体内容
    BufferedReader reader=request.getReader();
    StringBuilder requestBody=new StringBuilder();
    String line;
    while ((line=reader.readLine()) !=null) {
        requestBody.append(line);
    }
    // 生成响应
    response.setContentType("application/json");
    PrintWriter out=response.getWriter();
    out.println("{\"message\": \"处理POST请求\", \"body\": \"" + requestBody.toString() + "\"}");
}

Servlet生成HTTP响应

Servlet根据接收到的HTTP请求生成HTTP响应。它可以设置响应状态码、添加响应头、写入响应主体等。Servlet通过 HttpServletResponse对象来构建和发送响应。

设置响应状态码和头信息

response.setStatus(HttpServletResponse.SC_OK); // 设置状态码200
response.setContentType("application/json");  // 设置响应内容类型
response.setHeader("Custom-Header", "Value"); // 添加自定义头信息

写入响应主体

PrintWriter out=response.getWriter();
out.println("{\"status\": \"success\", \"message\": \"响应内容\"}");

Servlet与HTTP会话管理

Servlet可以使用HTTP会话来跟踪客户端的状态。它可以创建、获取和管理会话对象,以便在多个请求之间保持状态信息。会话对象通过 HttpSession接口进行管理。

创建和获取会话

HttpSession session=request.getSession(); // 获取当前会话,如果没有则创建新的会话
session.setAttribute("username", "JohnDoe"); // 设置会话属性

获取会话属性

String username=(String) session.getAttribute("username"); // 获取会话属性

使会话失效

session.invalidate(); // 使当前会话失效

总结

Servlet是用Java编写的服务器端程序,用于处理客户端发送的HTTP请求并生成HTTP响应。HTTP是一种用于在Web上进行数据通信的协议,它定义了客户端和服务器之间的通信规则。Servlet基于HTTP协议工作,处理HTTP请求、生成HTTP响应,并可以使用HTTP会话管理客户端状态。这种组合使得Servlet成为开发Web应用程序的重要工具。

分析说明表

功能

详细描述

处理HTTP请求

Servlet接收并解析HTTP请求,获取请求参数和内容

生成HTTP响应

Servlet生成并发送HTTP响应,设置状态码、响应头和主体内容

会话管理

Servlet使用HTTP会话管理客户端状态,创建、获取和管理会话对象

请求/响应模型

HTTP使用请求/响应模型进行通信,Servlet通过该模型处理请求和响应

无状态通信

HTTP无状态性,每个请求独立,Servlet通过会话管理状态信息

数据传输

HTTP传输多种类型的数据,Servlet通过HTTP与客户端交换数据

思维导图

graph TD;
    Servlet-->HTTP协议;
    HTTP协议-->请求/响应模型;
    请求/响应模型-->处理HTTP请求;
    请求/响应模型-->生成HTTP响应;
    请求/响应模型-->会话管理;
    处理HTTP请求-->获取参数;
    处理HTTP请求-->读取请求头;
    处理HTTP请求-->访问请求主体;
    生成HTTP响应-->设置状态码;
    生成HTTP响应-->添加响应头;
    生成HTTP响应-->写入响应主体;
    会话管理-->创建会话;
    会话管理-->获取会话;
    会话管理-->管理会话对象;

通过上述内容,您已经了解了Servlet与HTTP的关系,以及如何在实际开发中使用Servlet处理HTTP请求、生成响应并管理会话。这种组合在Web应用程序开发中发挥着重要作用。

文乱码问题是比较常见和烦人的问题,本文通过一个小程序介绍了如何通过Servlet从上一个页面获取参数,

方法很简单:调用request.getParameter(String s)方法。

解决中文乱码问题的方法是:

首先要设置response响应的格式:response.setContextType("text/html;charSet=GBK");

然后在加上request.setCharacterEncoding("GBK")

需要注意的是这是解决post方式提交的内容的中文乱码问题。

解决get方式提交内容的中文乱码问题的方法:

在Tomcat->conf文件夹->server.xml-->connecter标签里加上:

URIEncoding="GBK"(注意:在xml里面“=”两边不要有空格)

关于Post和Get之间的区别可以看我转载的另一篇博文:

HTTP POST GET 本质区别详解

例子:

1.threeparams.html


  1. <html>
  2. <body>
  3. <form method="post" action="Threeparams">
  4. <table>
  5. <tr>
  6. <td>
  7. param1
  8. </td>
  9. <td>
  10. <input name="p1" type="text"/>
  11. </td>
  12. </tr>
  13. <tr>
  14. <td>
  15. param2
  16. </td>
  17. <td><input name="p2" type="text"/>
  18. </td>
  19. </tr>
  20. <tr>
  21. <td>
  22. param3
  23. </td>
  24. <td><input name="p3" type="text"/>
  25. </td>
  26. </tr>
  27. <td><input type="submit" value="submit">
  28. </td>
  29. </tr>
  30. </table>
  31. </form>
  32. </body>
  33. </html>

2.ThreeParams.java


  1. import java.io.*;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.http.*;
  4. public class ThreeParams extends HttpServlet{
  5. @Override
  6. protected void doGet(HttpServletRequest req, HttpServletResponse resp)
  7. throws ServletException, IOException {
  8. doPost(req,resp);
  9. }
  10. @Override
  11. protected void doPost(HttpServletRequest req, HttpServletResponse resp)
  12. throws ServletException, IOException {
  13. resp.setContentType("text/html;charset=GBK");
  14. //解决post方式提交内容的中文乱码
  15. //一定要卸载存取第一个参数之前
  16. //不要调用resp.setCharacterEncoding("GBK");
  17. req.setCharacterEncoding("GBK");
  18. //解决get方式乱码问题:修改server.xml中的connector标签-->URIEncoding="GBK"
  19. PrintWriter out=resp.getWriter();
  20. out.println(req.getParameter("p1"));
  21. out.println("</br>");
  22. out.println(req.getParameter("p2"));
  23. out.println("</br>");
  24. out.println(req.getParameter("p3"));
  25. out.println("</br>");
  26. }
  27. }

补充:

上面的这个例子.html中每个name都不一样,如果有多个一样的name时,可以按如下的方法来获取:

1)Enumeration paramNames=request.getParameterNames()

调用此方法获得所有参数的名字,返回一个Enumeration

2) while(paramNames.hasMoreElements()){

String paramName=(String)paramNames.nextElement();

String[] paramValues=request.getParameterValues(paramName);

...