长生的梦呓


  • 归档
  • 算法
  • 基础
  • 关于

  • 分类
  • 日志
  • Servlet
  • Archive
  • 数据结构
  • IO 流

  • 标签
  • 友链
  • MyBatis
  • About
  • Spring 5
  • Java SE
  • Java EE
  • Algorithms
  • 新特性
  • 位运算技巧

  • 搜索
内网穿透 项目实战 数据库 MySQL 安卓踩坑 开发工具 设计模式 Enum 枚举 Linux MyBatis-plus JSON IDEA Transactions AOP IO 流 DP IoC 与 DI 位运算技巧 工具类 学习技巧 Git JDK 排序 Spring Boot Spring MVC Spring Framework MyBatis Log4J Regex Jsoup JDBC 数据结构 递推 递归 算法 Servlet与JSP 小难 中等 简单

(9)Servlet的请求处理

发表于 2020-03-31 | 1 | 阅读次数 282

前言

  通过前面几篇文章,我们能够创建并且成功运行一个简单的Servlet程序,完成浏览器和服务器的简单交互。

  但是呢,我们写的Servlet代码时没有对浏览器的请求进行任何处理的。这篇我们会了解导如何使用Sevlet进行浏览器的请求处理。同时我们还会学习到两个对象Request和Response。

  注意:Request 和 Response 对象的更多常用方法,和其他类的常用方法,请下载tomcat的中文文档进行查看学习。英文还不错的可以查看tomcat官网的文档。

tomcat文档下载请点击:Tomcat离线文档下载

一、Servlet请求处理

  • 问:
      浏览器发送请求到服务器,会遵循HTTP协议将请求数据发送给服务器。
      那么问题来了,服务接受到的请求数据该怎么处理呢?
  • 解决:
      服务器接收到浏览器的请求后,就会创建一个Request对象专门的存储这一次请求的请求数据(来一个请求创一个Request对象)。
      服务器在调用Servlet时,会将请求来时创建且存储请求数据的Request对象作为实参传递给Servlet的方法,比如:service 方法、doGet()方法。
      上面一段解释:服务器在调用指定的 Servlet 进行请求处理的时候,会给 Servlet 的方法传递两个实参 request 和 response(类型分别是HttpServletRequest、HttpServletResponse)。
      其中 Request对象 中封存了请求相关的请求数据,而 Response 则是用来进行响应的一个对象。

1.Request请求对象

Request对象获取客户端请求的信息:

我的Servlet访问地址:http://localhost:8080/TestServlet?username=张三

示例代码:

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8"); // 设置请求时的字符编码
		// 1.获取请求头数据
		String scheme = req.getScheme(); // 获取请求协议
		String method = req.getMethod(); // 获取请求方式
		StringBuffer requestURL = req.getRequestURL(); // 获取请求URL
		String requestURI = req.getRequestURI(); // 获取请求URI
		System.out.println("请求协议:" + scheme + "\n请求方式:" + method + "\n请求URL:" + requestURL + "\n请求URI:" + requestURI + "\n");

		// 2.获取请求行数据
		Enumeration<String> headerNames = req.getHeaderNames(); // 返回所有的本请求消息包含的头名字的集合。
		while (headerNames.hasMoreElements()) {
			String name = headerNames.nextElement(); // 获取headerNames中元素
			String header = req.getHeader(name); // 返回指定的作为字符串请求消息头的值
			System.out.println(name + ":" + header);
		}

		// 3.获取用户请求数据
		String username = req.getParameter("username"); // 获取用户请求数据
		username = new String(username.getBytes("iso8859-1"), "utf-8"); // 请求参数乱码了需要编码一下
		System.out.println("\n" + username);
	}
}

2.Response响应对象

在使用 Request 对象获取了请求数据并进行处理后,处理的结果如何显示到浏览器中呢?

此时就用到了Response响应对象,响应给浏览器

我的Servlet访问地址还是这个:http://localhost:8080/TestServlet?username=张三

示例代码:

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 设置响应编码格式,返回html
		resp.setHeader("content-type", "text/html;charset=utf-8"); 
		resp.setHeader("my-key", "my-value"); // 设置一个自定义的键和值
		
		// 设置响应状态
		// resp.sendError(404, "这是我自己设置的一个响应错误404,页面找不到");
		
		// 设置响应实体
		resp.getWriter().write("<p>我返回了一个html文本,并在<strong>p标签<strong>中写了一段话一段文字<p>"); // 获取输出流,并在输出流中写入HTML代码
	}
}

示例代码2:响应一个登录页面(等我们后面学习了JSP后就不会这样写html代码了)

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 设置响应编码格式,返回html
		resp.setHeader("content-type", "text/html;charset=utf-8"); 
		
		// 下面是即将响应的html代码(等后面学JSP后就不会这样写了)
		StringBuilder html = new StringBuilder();
		html.append("<html>")
		.append("<body>")
		.append("<h1>登录页面</h1>")
		.append("<form method=\"get\" action=\"/TestServlet\">") // 引号需要使用 \ 转换
		.append("用户名:<input type=\"text\" name=\"username\"><br>")
		.append("密码:<input type=\"text\" name=\"password\"><br>")
		.append("<input type=\"submit\" value=\"登录\">")
		.append("</form>")
		.append("</body>")
		.append("</html>");
		
		// 设置响应实体
		resp.getWriter().write(html.toString());; // 获取输出流,并在输出流中写入HTML代码
	}
}

上面示例代码2返回的页面长这样:
在这里插入图片描述

二、请求处理流程

  • 设置请求编码格式
  • 设置响应编码格式
  • 获取请求信息
  • 处理请求信息
  • 响应处理结果

示例代码:

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 设置请求编码格式
		req.setCharacterEncoding("utf-8");
		// 设置响应编码格式 
		resp.setHeader("content-type", "text/html;charset=utf-8"); 
		// 获取请求信息
		String username = req.getParameter("username"); // 获取用户请求数据
		// 处理请求信息
		username = new String(username.getBytes("iso8859-1"), "utf-8"); // 字符编码转换成utf-8,默认中文是iso8859-1格式
		username = username + ",你好!"; // 给获取到的用户请求添加个你好
		// 响应处理结果
		resp.getWriter().write(username);
	}
}

页面:
在这里插入图片描述

  • 本文作者: 长生的梦呓
  • 本文链接: https://shengjava.com/archives/9servlet的请求处理
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# 内网穿透 # 项目实战 # 数据库 # MySQL # 安卓踩坑 # 开发工具 # 设计模式 # Enum # 枚举 # Linux # MyBatis-plus # JSON # IDEA # Transactions # AOP # IO 流 # DP # IoC 与 DI # 位运算技巧 # 工具类 # 学习技巧 # Git # JDK # 排序 # Spring Boot # Spring MVC # Spring Framework # MyBatis # Log4J # Regex # Jsoup # JDBC # 数据结构 # 递推 # 递归 # 算法 # Servlet与JSP # 小难 # 中等 # 简单
(8)第二个web项目
(10)第三个Web项目(Servlet登录案例 - 附源码)
  • 文章目录
  • 站点概览
长生的梦呓

长生的梦呓

110 日志
39 分类
40 标签
RSS
E-mail CSDN
Creative Commons
Links
  • CSDN 地址
  • waltz26
  • Ryan Wang's Blog
  • JohnNiang's Blog
  • 廖雪峰
  • 菜鸟教程
© 2021 长生的梦呓
浙ICP备20005262号-1