Servlet-Request

Source

Servlet-Request


<1> 简介

request 和 respons 对象是服务器生成的, 在本机上可以使用
request 对象是来获取请求消息, response 对象是来设置响应消息

<2> 功能

(0) 准备

首先在 servlet 中 src 目录下任意路径下创建 Servlet 对象
在这里插入图片描述
若新建菜单中无此项目, 请参考 Intellij IDEA 2021.1 创建Servlet 详细步骤:
https://blog.csdn.net/weixin_45518468/article/details/116902257

(1) 获取数据

1.获取请求行

@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
      
		//1. 获取请求方式 :GET / POST
		String method = request.getMethod();
		System.out.println(method);
		//2. 获取虚拟目录:
		String contextPath = request.getContextPath();
		System.out.println(contextPath);
		//3. 获取Servlet路径: 
		String servletPath = request.getServletPath();
		System.out.println(servletPath);
		//4. 获取get方式请求参数:(用"&"分隔每一对请求参数(提交的表单))
		String queryString = request.getQueryString();
		System.out.println(queryString);
		//5. 获取请求URI/URL (URL是完整地址,包含http和localhost;URI不包含http和localhost,是URL的一部分)
		String requestURI = request.getRequestURI();
		StringBuffer requestURL = request.getRequestURL();
		System.out.println(requestURI);
		System.out.println(requestURL);
		//6. 获取协议及版本: HTTP/1.1
		String protocol = request.getProtocol();
		System.out.println(protocol);
		//7. 获取客户机的IP地址:
		String remoteAddr = request.getRemoteAddr();
		System.out.println(remoteAddr);
	}

2. 获取请求头

<1> 判断当前使用的浏览器:
String agent=request.getHeader("user-agent");
System.out.println(agent);
if (agent.contains("Chrome")) System.out.println("谷歌");
<2> 防盗链

注: 手动访问页面获取到的 referer 是 null.

String referer=request.getHeader("referer");
System.out.println(referer);
if(referer.contains("www.youku.com")) System.out.println("播放电影");

3. 获取请求体

注: 只有 POST 请求方式才有请求体, 即将请求参数分装成为的整体 (需要将代码写于 doPost 下).

虚拟目录为 /Request05 的类下的内容:

BufferedReader br = request.getReader();
String line = null;
while((line = br.readLine()) != null){
    
      
System.out.println(line);

HTML 文档中的内容:

<form action="/Request05" method="post">
	<input type="text" placeholder="请输入用户名" name="username"><br>
	<input type="text" placeholder="请输入密码" name="password"><br>
	<input type="radio" name="sex" value="male"><input type="radio" name="sex" value="female"><input type="radio" name="sex" value="else">非二元性别<br>
	<input type="submit" value="注册">
</form>
注:
form 中 action 的路径要写: 虚拟目录+Servlet资源路径

在网页中输入并提交:
在这里插入图片描述
控制台输出的结果:
在这里插入图片描述

4. 获取请求参数

① 根据参数名称获取参数 (括号内的是参数名称, 即表单中的 name)

String username = request.getParameter("username");

注: 若相同的参数名称对应多个参数, 则返回值为应数组 String[ ]
② 获取所有参数的 map 集合

Map<String, String[]> parameterMap = request.getParameterMap();

③ 获取所有请求的参数名称

 Enumeration<String> parameterNames = request.getParameterNames();

例: 打包获取参数:

Enumeration<String> parameterNames = request.getParameterNames();
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> keyset = parameterMap.keySet();
for(String name:keyset){
    
      
	String[] values = parameterMap.get(name);
	for (String value:values){
    
      
		System.out.println(name+":"+value);
	}
	System.out.println("===========俺是分割线===========");
}

5. 简便写法

当 doGet 和 doPost 内方法相同时, 可用一下方法省略
当 doPost 方法写完之后在 doGet 方法中写入
this.doPost(request,response);

6. 解决中文乱码问题

在 doPost 下首行添加一下代码, 可以解决获取的参数乱码问题:
request.setCharacterEncoding("utf-8");

(2) 资源跳转

1. 请求转发

RequestDispatcher requestDispatcher =request.getRequestDispatcher("/Request08"); //←-此处是跳转页面的虚拟目录
requestDispatcher.forward(request,response);

特点:
① 浏览器地址栏路径不发生变化
② 只能转发到当前服务器的内部资源中
③ 转发是一次请求

2. 数据共享

一次请求访问多个资源

Object msg=request.getAttribute("msg");
System.out.println(msg);

(3) 获取 ServletContext 对象

ServletContext sc=request.getServletContext();
System.out.println(sc);