1. 请求对象概述
所谓请求本质就是通过网站获取资源,在B/S架构中,就是客户浏览器向服务器发出询问。
所谓请求对象,就是在JavaEE工程中,用于发送请求的对象。我们常用的对象ServletRequest和HttpServletRequest,它们的区别就是是否和HTTP协议有关。
ServletRequest和HttpServletRequest实际上是两个接口,但我们使用请求对象不需要去实现接口,有服务器去实现,我们直接使用请求对象就可以了
2. 请求对象常用方法-获取各种路径
/*
* 获取路径的方法
* */
@WebServlet("/servletDemo01")
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 获取虚拟路径名称(自己配置的名称)
String contextPath = req.getContextPath();
System.out.println(contextPath);// /request
//2. 获取servlet的映射路径(资源路径)
String servletPath = req.getServletPath();
System.out.println(servletPath);// /servletDemo01
//3. 获取访问者的ip地址
String remoteAddr = req.getRemoteAddr();
System.out.println(remoteAddr);// 127.0.0.1本机地址
//4. 获取请求消息的数据(username&password)
String queryString = req.getQueryString();
System.out.println(queryString);// null
//5. 获取统一资源标识符(虚拟路径+servlet映射路径)
String requestURI = req.getRequestURI();
System.out.println(requestURI); // /request/servletDemo01
//6. 获取统一资源定位符(全路径)
StringBuffer requestURL = req.getRequestURL();
System.out.println(requestURL); // http://localhost:8080/request/servletDemo01
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3. 请求对象常用方法-获取请求头信息
请求头:可以通过网页 检查---Network---Request Headers 查看
/*
* 获取请求头信息的相关方法
* */
@WebServlet("/servletDemo02")
public class ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.根据请求头名称获取其对应的一个值
String connection = req.getHeader("connection");
System.out.println(connection);
System.out.println("---------------------");
//2.根据请求头名称获取其对应的多个值
Enumeration<String> values = req.getHeaders("accept-encoding");
System.out.print("accept-encoding: ");
while (values.hasMoreElements()){
String value = values.nextElement();
System.out.print(value+ " ");
}
System.out.println("");
System.out.println("---------------------");
//3.获取所有请求头名称
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()){
String name = headerNames.nextElement();
String value = req.getHeader(name);
System.out.println(name + ":" + value);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
4. 请求对象常用方法-获取请求参数(非常重要)
注册页面用于提交参数:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
<form action="/request/servletDemo03" method="get" autocomplete="off">
姓名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
爱好:<input type="checkbox" name="hobby" value="game">游戏
<input type="checkbox" name="hobby" value="study">学习<br>
<button type="submit">注册</button>
</form>
</body>
</html>
常用方法:
/*获取请求参数相关方法*/
@WebServlet("/servletDemo03")
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.根据name属性获取对应的数据
String username = req.getParameter("username");
System.out.println(username);
String password = req.getParameter("password");
System.out.println(password);
System.out.println("-----------------------");
//2.根据那么属性获取所有数据
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
System.out.println("-----------------------");
//3.获取所有name属性
Enumeration<String> parameterNames = req.getParameterNames();
while(parameterNames.hasMoreElements()){
String name = parameterNames.nextElement();
System.out.println(name);
}
System.out.println("-----------------------");
//4.获取所有参数键值对
Map<String, String[]> parameterMap = req.getParameterMap();
Set<String> set = parameterMap.keySet();
for (String name : set) {
String[] values = parameterMap.get(name);
System.out.print(name + ":");
for (String value : values) {
System.out.print(value + " ");
}
System.out.println("");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
5. 封装请求参数到实体类中
- 方法一:直接封装,不适用于参数过多的情况;
- 方法二:使用反射方式封装参数,有点复杂;
- 方法三: 使用apache的commons-beanutils实现封装,使用第三方jar包,方便简单;
方法三:
/*将参数封装*/
@WebServlet("/servletDemo04")
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//若请求方式为post,需要解决中文乱码问题
req.setCharacterEncoding("utf-8");//和注册页面编码一致
Map<String, String[]> parameterMap = req.getParameterMap();
//使用BeanUtils工具类进行封装
Student stu = new Student();
try {
BeanUtils.populate(stu,parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(stu);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
6. 流对象获取数据
/*流对象获取数据*/
@WebServlet("/servletDemo05")
public class ServletDemo05 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//字符流--了解(注册页面必须使用post提交)
/*BufferedReader br = req.getReader();
String line;
while((line=br.readLine())!=null){
System.out.println(line);
}*///username=liulu&password=123&hobby=game&hobby=study
//br.close(); 不需要手动释放资源
//字节流--可以获取图片等二进制文件(提交方式为post)
ServletInputStream si = req.getInputStream();
byte[] arr = new byte[1024];
int len;
while((len=si.read(arr))!=-1){
System.out.println(new String(arr,0,len));
}//username=liulu&password=123&hobby=game&hobby=study
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
7. 请求域和请求转发
请求域:可以在一次请求范围类进行数据共享,一般用于请求转发的多个资源中共享数据
请求转发:客户端在发出一次请求到达ServletA后,ServletA不能实现其功能,需要借助ServletB来实现功能
请求转发特点:
- 浏览器地址栏不变
- 请求域对象中的数据不会丢失
- 负责转发的Servlet转发前后的响应正文会丢失
- 由转发的目的地来响应客户端
访问servletDemo06会直接执行servletDemo07:
/*请求转发*/
@WebServlet("/servletDemo06")
public class ServletDemo06 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置一个请求域共享数据
req.setAttribute("desc","gong xiang shu ju");
//获取请求调度对象
RequestDispatcher dispatcher = req.getRequestDispatcher("/servletDemo07");
//通过请求调度对象,将req,和resp都转发给servletDemo07
dispatcher.forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
/*请求转发*/
@WebServlet("/servletDemo07")
public class ServletDemo07 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取到共享数据
Object desc = req.getAttribute("desc");
System.out.println(desc);
System.out.println("servlet07执行了。。。。");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
如有错误欢迎留言评论,2021年7月7日 羽露风