- 2.4.1 Request
- 2.4.1.1 请求对象
- 2.4.1.2 获取各种路径的方法
- 2.4.1.3 获取请求头信息
- 2.4.1.4 获取请求参数信息
- 2.4.1.5 获取参数手动封装对象
- 2.4.1.5 获取参数反射封装对象
- 2.4.1.5 获取参数工具类封装对象
- 2.4.1.6 通过流对象获取请求信息
- 2.4.1.7 中文乱码问题
- 2.4.1.8 请求域、请求转发、请求包含
- 2.4.2 Response
- 2.4.2.1 响应对象
- 2.4.2.2 常见状态码
- 2.4.2.3 字节流响应消息和解决乱码问题
- 2.4.2.4 字符流响应消息和解决乱码问题
- 2.4.2.5 响应图片
- 2.4.2.6 设置缓存
- 2.4.2.7 定时刷新
- 2.4.2.8 请求重定向
- 2.4.2.9 下载文件
请求,顾名思议,就是使用者希望从服务器端索取一些资源,向服务器发出询问。在B/S架构中,就是客户浏览器向服务器发出询问。在我们的JavaEE工程中,客户浏览器发出询问,要遵循HTTP协议所规定的。
请求对象,就是在JavaEE工程中,用于发送请求的对象。我们常用的对象就是ServletRequest和HttpServletRequest,它们的区别就是是否和HTTP协议有关。
2.4.1.2 获取各种路径的方法
实操演示,先创建一个项目,我这里起名request_demo,
创建一个继承HttpServlet 的类
package com.symc.servlet;
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("/requestDemo1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取虚拟目录的名称
String contextPath = req.getContextPath();
System.out.println(contextPath);
//获取servlet映射路径
String servletPath = req.getServletPath();
System.out.println(servletPath);
//获取访问者IP
String remoteAddr = req.getRemoteAddr();
System.out.println(remoteAddr);
//获取请求消息的数据
String queryString = req.getQueryString();
System.out.println(queryString);
//获取统一资源标识符
String requestURI = req.getRequestURI();
System.out.println(requestURI);
//获取统一资源定位符
StringBuffer requestURL = req.getRequestURL();
System.out.println(requestURL);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
配置
启动tomcat,浏览器访问,控制台显示如下
由输出可知,虚拟目录和映射路径是什么东西;
获取的访问者iP,这里是本机地址,采用的是IPv6;
而请求消息的数据,这里并没有,所以是空的;
对于URI和URL需要知道的是URI包含URL。
现在我们在地址栏加入请求内容
在观察控制台
这就是获取到的请求消息的数据。
还是使用刚才的例子,我们在网页按F12打开开发者工具
现在我们要在控制台获取请求头的这些信息。
package com.symc.servlet;
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.Enumeration;
@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//根据请求头名称获取一个值,比如这里获取的是Connection的信息,不区分大小写
String value = req.getHeader("connection");
System.out.println(value);
System.out.println("-----------------------------------");//分割线
//根据请求头名称获取多个值
Enumeration values = req.getHeaders("Accept-Encoding");
while (values.hasMoreElements()) {
String val = values.nextElement();
System.out.print(val + " ");
}
System.out.println("-----------------------------------");//分割线
//获取所有请求头名称
Enumeration names = req.getHeaderNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String s = req.getHeader(name);
System.out.println(s);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
观察控制台
首先写一个html,用于用户访问
注册页面
创建一个类来测试上面的这些方法
package com.symc.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sound.midi.Soundbank;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
@WebServlet("/requestDemo3")
public class RequestDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//根据名称获取数据
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username);
System.out.println(password);
System.out.println("---------------------------------------");
//根据名称获取所有数据
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
System.out.println("---------------------------------------");
//获取所有名称
Enumeration names = req.getParameterNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
System.out.println(name);
}
System.out.println("---------------------------------------");
//获取所有参数的键值对
Map map = req.getParameterMap();
for (String key : map.keySet()) {
String[] values = map.get(key);
System.out.print(key + ":");
for (String value : values) {
System.out.println(value);
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
开启服务器,访问并填写内容提交,观察控制台。
首先说一下为什么要封装对象,刚才的案例属性比较少,通过打印到控制台还是比较容易的,但是当数据非常多的时候,输出起来就非常复杂。那么我们将每一次用户访问的数据封装到一个对象中,我们只需要通过获取对象的信息就能获取到这些数据。
首先创建一个实体类,并且其中的成员变量一定要与我们要获得的信息一致。
package com.symc.bean;
import java.util.Arrays;
public class User {
private String username;
private String password;
private String[] hobbies;
public User() {
}
public User(String username, String password, String[] hobbies) {
this.username = username;
this.password = password;
this.hobbies = hobbies;
}
@Override
public String toString() {
return "User{" +
"username='" + username + ''' +
", password='" + password + ''' +
", hobbies=" + Arrays.toString(hobbies) +
'}';
}
}
这样我们在写servlet时只需要将获取的参数放到对象中即可。
package com.symc.servlet;
import com.symc.bean.User;
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("/requestDemo4")
public class RequestDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbies = req.getParameterValues("hobby");
User user1 = new User(username, password, hobbies);
System.out.println(user1);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
别忘记html的提交位置也要改变



