系列文章目录
JavaWeb之Request的使用
前言
一、Request继承体系
二、Request获取请求数据
1.获取请求数据
package org.example.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// String getMethod() 获取请求方式
String method = req.getMethod();
System.out.println(method);//GET
// String getContextPath 获取虚拟目录(项目访问路径)
String path = req.getContextPath();
System.out.println(path);
// StringBuffer getRequestURL 获取URL(统一资源定位符)
StringBuffer url = req.getRequestURL();
System.out.println(url.toString());
//获取URI(统一资源标识)
String uri = req.getRequestURI();
System.out.println(uri);
//获取请求参数(GET方式)
String queryString = req.getQueryString();
System.out.println(queryString);
System.out.println("=====================");
//获取请求头:user-agent:浏览器的版本信息
String header = req.getHeader("user-agent");
System.out.println(header);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取post 请求体:请求参数
//1.获取字符输入流
BufferedReader reader = req.getReader();
//2.读取数据
String s = reader.readLine();
System.out.println(s);
}
}
2.Request通用方式获取请求参数
package org.example.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//System.out.println("get......");
//1.获取所有参数的Map集合
Map<String, String[]> map = req.getParameterMap();
for (String key : map.keySet()) {
System.out.print(key+":");
//获取所有值
String[] values = map.get(key);
for (String value : values) {
System.out.print(value+"\t");
}
System.out.println();
}
//2.根据key获取参数值,数组
System.out.println("=================");
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println("hobby:"+hobby);
}
//3.根据key获取单个的参数值
String username = req.getParameter("username");
System.out.println(username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
3.请求参数中文乱码处理
package org.example.web;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class URLDemo {
public static void main(String[] args) throws Exception {
String username="张三";
//1.URL编码
String encode = URLEncoder.encode(username, "utf-8");
System.out.println(encode);
//2.URL解码
//String decode = URLDecoder.decode(username, "utf-8");
String decode = URLDecoder.decode(username, "ISO-8859-1");
//3.转化为字节数据,编码
byte[] bytes = decode.getBytes();
/*for (byte bt : bytes) {
System.out.println(bt+" ");
}*/
//4.将字节数组转化为字符串,解码
String s = new String(bytes, "utf-8");
System.out.println(s);
}
}
package org.example.web;
import sun.nio.cs.StandardCharsets;
import javax.net.ssl.StandardConstants;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.POST:getReader()获取请求参数
request.setCharacterEncoding("UTF-8");//设置字符输入流的编码
//2.
String username = request.getParameter("username");
System.out.println("解决乱码前:"+username);
//GET:getQueryString()方式获取参数
//乱码原因:Tomcat进行URL解码时默认使用字符集ISO-8859-1
/* //3.1:先对乱码数据进行编码:转为字符数组
byte[] bytes = username.getBytes("ISO-8859-1");
//3.2:字节数组解码
username = new String(bytes, "utf-8");*/
username=new String(username.getBytes("ISO-8859-1"),"utf-8");
System.out.println("解决乱码后:"+username);
}
}
三、Request请求转发
package org.example.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/req5")
public class RequestDemo5 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo5....");
//设置参数
request.setAttribute("msg","hello");
//请求转发
request.getRequestDispatcher("/req6").forward(request,response);
}
}
package org.example.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/req6")
public class RequestDemo6 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo6....");
//设置参数
Object msg = request.getAttribute("msg");
System.out.println(msg);
}
}
总结
request是对Tomcat是对请求数据封装的对象,经过前人的改进,如HTTPrequest,HttpServletRequest 使得request对象更加强大,它对post和get方式的请求能做同样的处理,获取请求参数的方法变得一致,除了要掌握request的一些获取请求参数方法外,也应掌握HTTP协议底层request的使用方法。