JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)
JavaEE学习日志(五十三)
Request对象
- Request对象用于获取客户端的请求数据
- 接口ServletRequset,子接口HttpServletRequset继承ServletRequse接口
- HttpServletRequset接口的实现类是Tomcat引擎提供
Request对象获取请求行
前端
方法:
String getMethod()
获取提交的方式(GET,POST)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求方式
String method = request.getMethod();
System.out.println(method);
}
String getRequestURI()
获取请求的参数,请求服务器路径
StringBuffer getRequestURL()
获取请求的参数,请求服务器路径
URI和URL区别:
URI
:统一资源标识符,是互联网中的唯一性资源,一般指某种资源的地址(如下载地址,邮件地址),不是网址
URL
:统一资源定位符,是互联网中的唯一性资源,一般指网址
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求服务器的路径
String URI = request.getRequestURI();
StringBuffer URL = request.getRequestURL();
System.out.println("URI=="+URI);// /Web04/line
System.out.println("URL=="+URL);// http://localhost:8080/Web04/line
}
String getQueryString()
获取请求行问号后面的参数(GET)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求行问号后面的所有参数
String query = request.getQueryString();
System.out.println(query);//username=123&password=123&hobby=on&hobby=on
}
String getContextPath()
获取WEB应用名称,用于重定向时,把WEB应用名称写活
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取WEB应用名称
String path = request.getContextPath();
System.out.println(path);// /Web04
//response.sendRedirect(request.getContextPath()+"/ddd");
}
Request对象获取请求头
请求头数据格式键值对:k:v
,包含了指导服务器的信息。
方法:
String getHeader(String key)
返回键对应的值
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
request获取请求头
*/
//获取值
String key = request.getHeader("User-Agent");
System.out.println(key);//Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
//获得前一个页面来源
String key2 = request.getHeader("Referer");
System.out.println(key2);//http://localhost:8080/Web04/form.html
}
防盗链应用:判断页面的上一个页面是否为xxx,不是则不让访问
Enumeration getHeaderNames()
获取所有的请求头的键
返回值Enumeration
(向量枚举)是一个接口,迭代器的前身
获取所有请求头的键和值
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Enumeration<String> enums = request.getHeaderNames();
while (enums.hasMoreElements()){
String key = enums.nextElement();
String value = request.getHeader(key);
System.out.println(key+"="+value);
}
Request对象获取请求参数(重点)
方法:
String getParameter("表单中的name值")
获取指定的请求参数String[] getParameterValues("表单中的name值")
获取参数值的一键多值Map<String,String[]> getParameterMap()
获取提交的所有参数
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
request获取客户端提交的数据
*/
//getParameter
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username+"=="+password);
//getParameterValues
String[] hobby = request.getParameterValues("hobby");
System.out.println(Arrays.toString(hobby));
//getParameterMap
Map<String, String[]> map = request.getParameterMap();
for (String key : map.keySet()) {
String[] values = map.get(key);
System.out.println(key+"="+Arrays.toString(values));
}
}
Request域对象
作用域:比较小,范围是一次请求有效,再一次请求无效。
方法:
- 域对象存储数据:
setAttribute(String key,Object value)
- 取出域对象数据:
Object getAttribute(String key)
- 移除域对象数据:
removeAttribute(String key)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//向域对象存储数据
request.setAttribute("heima","java");
//取出域对象数据
Object value = request.getAttribute("heima");
System.out.println("servlet1="+value);
}
Request处理中文乱码
原因:解码和编码不一致
主要代码
request.setCharacterEncoding("utf-8");
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
System.out.println(username);
}
补充:如果是Tomcat8.5之前的版本,setCharacterEncoding只对POST请求有效,对GET请求无效,所以需要手动进行解码和编码。
步骤:
- 将username字符串转成ISO8859-1编码的字节
byte[] bytes = username.getBytes("ISO8859-1");
- 将字节转成字符串,并使用UTF-8
new String(bytes,"utf-8");
转发
转发概念
注意:浏览器只发送了一次请求!!!
转发的实现步骤
- 用request对象方法获取一个转发器
Dispatcher getRequestDispatcher("要转发的地址")
返回值就是转发器 - 使用转发器对象的方法
forward
servlet1:实现转发到servlet2
public class Servlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//向域对象存储数据
request.setAttribute("heima","java");
//取出域对象数据
Object value = request.getAttribute("heima");
//转发器
RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet2");
//转发
dispatcher.forward(request,response);
System.out.println("servlet1="+value);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
servlet2
public class Servlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("servlet2="+request.getAttribute("heima"));
response.getWriter().write("servlet2");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
控制台结果:证明浏览器只发送了一次请求
浏览器:地址显示的是servlet1,内容却显示servlet2的内容
转发和重定向的区别
重定向:
- 浏览器发出了两次请求
- 浏览器地址栏变化
- 重定向可以到外网去
- 重定向的地址必须写WEB应用名,因为重定向出了一次服务器,如
WEB04/servlet2
- (相同)浏览器看到的结果是servlet2
转发:
- 浏览器只有一次请求
- 浏览器地址栏不变
- 转发是服务器内部行为,浏览器不知道,所以转发不能去外网
- 转发不用写WEB应用名
- (相同)浏览器看到的结果是servlet2