前言:上一篇讲述了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");
-------完-------