Java EE开发第十二章:2.Servlet之Request请求(请求行、头、体、转发,转发和重定向区别,中文乱码)

前言:上一篇讲述了Servlet之Response相应的相关方法,今天来看一下Request请求,请求行、请求头、请求体、请求转发、请求转发和重定向的区别,记忆中文乱码的解决

----作用------

简单的理解成获取浏览器发送过来的内容

----组成部分---

1.请求行 

2.请求头 

3.请求体

----操作请求行---

1.格式:请求方式、请求资源、协议/版本

2.常用方法:HttpServletRequest

3.掌握
String getMethod():获取请求方式
String getRemoteAddr():获取ip地址
String getContextPath() :在java中获取项目名称  (/day10) 

4.了解:
getRequestURI():获取的是 从项目名到参数之前的内容  /day10/regist
getRequestURL():获取的带协议的完整路径   http://localhost/day10/regist
String getQueryString():get请求的所有参数   username=tom&password=123
String getProtocol():获取协议和版本

5.Demo

浏览器网页:

<a href="/Day10/row?username=tom&password=123">请求行</a>
java代码(配置文件省略)
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 请求行操作
 */
public class RowServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取请求方式
		String m = request.getMethod();
		System.out.println("方式:" + m);

		// 获取请求资源
		String uri = request.getRequestURI();
		StringBuffer url = request.getRequestURL();
		System.out.println("uri" + uri);
		System.out.println("url" + url);

		// 获取请求参数的字符串
		String s = request.getQueryString();
		System.out.println("get请求的参数" + s);

		// 获取协议版本
		String protocol = request.getProtocol();
		System.out.println("协议:" + protocol);

		System.out.println("///////重要的////////");
		// 获取请求的ip
		String ip = request.getRemoteAddr();
		System.out.println("ip:" + ip);

		// 获取项目名字
		String path = request.getContextPath();
		System.out.println("项目路径:" + path);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}

}
----- 操作请求头----

1.格式:key/value(value可以是多个值)
2.常用方法:String getHeader(String key):通过key获取指定的value (一个)
3.了解:
Enumeration getHeaders(String name) :通过key获取指定的value(多个)
Enumeration getHeaderNames() :获取所有的请求头的名称
int getIntHeader(String key):获取整型的请求头
long getDateHeader(String key):获取时间的请求头
4.重要的请求头:
user-agent:浏览器内核 msie firefox chrome
referer:页面从那里来 防盗链

5.Demo:

java代码:

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

import com.sun.org.apache.xml.internal.serializer.ElemDesc;

/**
 * 操作请求头
 */
public class HeaderServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取浏览器内核
		String agent = request.getHeader("user-agent");
		System.out.println("浏览器内核:" + agent);

		// 获取referer
		String referer = request.getHeader("referer");
		if (referer == null) {
			System.out.println("直接在地址栏上输入的");
		} else if (referer.contains("localhost")) {
			System.out.println("我自己点的");
		} else if (referer.contains("192.168.")) {
			System.out.println("其他人点的");
		} 
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
---- 操作请求参数------

1.常用方法:
String getParameter(String key):获取一个值
String[] getParameterValues(String key):通过一个key获取多个值
Map<String,String[]> getParameterMap():获取所有的参数名称和值

2.demo:浏览器数据:

<a href="/Day10/param?username=tom&password=123&hobby=drink&hobby=sleep">请求参数</a>
java代码:
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;

import javax.print.DocFlavor.STRING;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 获取请求参数
 */
public class ParamServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取username
		String username = request.getParameter("username");
		System.out.println("username:" + username);
		String password = request.getParameter("password");
		System.out.println("password:" + password);

		// 获取爱好多个值
		String[] hobby = request.getParameterValues("hobby");
		System.out.println("hobby:" + Arrays.toString(hobby));

		// 获取所有
		System.out.println("--------------");
		Map<String, String[]> map = request.getParameterMap();
		for (String key : map.keySet()) {
			System.out.println(key + "::" + Arrays.toString(map.get(key)));
		}

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}

}
------ 请求转发----

Demo:

Hello1.java

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

/**
 * Servlet implementation class Hello1
 */
public class Hello2 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		System.out.println(request.getParameter("username"));
		String pwd = (String) request.getAttribute("pwd");
		System.out.println(pwd);
		response.getWriter().print(pwd);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

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

/**
 * Servlet implementation class Hello1
 */
public class Hello2 extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		System.out.println(request.getParameter("username"));
		String pwd = (String) request.getAttribute("pwd");
		System.out.println(pwd);
		response.getWriter().print(pwd);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
配置文件省略。

Html:

<!DOCTYPE html>
<html>

<head>
<meta charset="utf-8" />
<title>测试</title>
</head>

<body>
	<form action="http://localhost:8080/Day1012/hello1" method="post">
		<input type="text" id="username" placeholder="请输入用户名" name="username">
		<input type="submit" width="100" value="提交" name="submit"> <br>
	</form>
	<hr>
</body>

</html>
----- 请求转发和重定向区别-------

1.重定向发送两次请求,请求转发一次请求

2.重定向地址栏发生该表,请求转发不变

3.重定向是从浏览器发送,请求转发是服务器内部

4.重定向不存在request域对象,请求转发可以使用request域对象

5.重定向是response的方法,请求转发是request的方法

6.重定向可以请求站外资源,请求转发不可以

-----请求的中文乱码---

1.对于get请求:参数追加到地址栏,会使用utf-8编码,服务器(tomcat7)接受到请求之后,使用iso-8859-1解码,所以会出现乱码

2.对于post请求,参数是放在请求体中,服务器获取请求体的时候使用iso-8859-1解码,也会出现乱码

3.通用的方法:new String(参数.getBytes("iso-8859-1"),"utf-8");

4.针对于post请求来说:只需要将请求流的编码设置成utf-8即可:request.setCharacterEncoding("utf-8");

-------完-------

发布了105 篇原创文章 · 获赞 74 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qq_32306361/article/details/78149908