「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」
前言
路遥说,在一个平凡的世界里,人要承受一定的痛苦和不安。但只要相信个体奋斗的力量,坚定地与生存搏斗,就能过上想要的生活。
很喜欢《平凡的世界》的一句话,一直不断的鼓励我努力向前,也送个各位看到这个写的很烂的文章的人,共勉~
五、HttpServletRequest类
HttpServletRequest 类有什么作用
每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。 然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的信息。
HttpServletRequest 类的常用方法
getRequestURI() 获取请求的资源路径
getRequestURL() 获取请求的统一资源定位符(绝对路径)
注意区分两者
getRemoteHost() 获取客户端的ip 地址
getHeader() 获取请求头
getParameter() 获取请求的参数
getParameterValues() 获取请求的参数(多个值的时候使用)
getMethod() 获取请求的方式GET 或POST
setAttribute(key, value) ; 设置域数据
getAttribute( key); 获取域数据
getRequestDispatcher() 获取请求转发对象
实例
package com.caq.study;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class RequestAPIServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的资源路径
System.out.println("URI=>"+req.getRequestURI());
//获取请求的统一资源定位符(绝对路径)
System.out.println("URI=>"+req.getRequestURL());
System.out.println("客户端地址==>"+req.getRemoteHost());
System.out.println("请求投User-Agent==》"+req.getHeader("User-Agent"));
System.out.println("请求的方式==》"+req.getMethod());
}
}
如何获取请求参数
实例
package com.caq.study;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
public class ParameterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
// String hobby = req.getParameter("hobby");
String[] hobbies = req.getParameterValues("hobby");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("兴趣爱好:"+ Arrays.asList(hobbies));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
// String hobby = req.getParameter("hobby");
String[] hobbies = req.getParameterValues("hobby");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("兴趣爱好:"+ Arrays.asList(hobbies));
}
}
请求的转发
实例
package com.caq.study;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
System.out.println("在Servlet1中查看参数"+username);
//域数据(盖章并传递给s2)
req.setAttribute("key1","s1的章");
//问路:S2怎么走?
/**
* 请求转发必须以斜杠打头,斜杠表示地址http:ip:port/工程名,映射到web目录
*/
RequestDispatcher requestDispatcher = req.getRequestDispatcher("/servlet2");
//走向servlet2
requestDispatcher.forward(req,resp);//向前走
}
}
package com.caq.study;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的参数
String username = req.getParameter("username");
System.out.println("查看材料"+username);
Object key1 = req.getAttribute("key1");
System.out.println("s2是否有章"+key1);
//处理自己的业务
System.out.println("s2处理自己的业务");
}
}
base标签的作用
base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转.
Web 中的相对路径和绝对路径
在 javaWeb 中,路径分为相对路径和绝对路径两种:
相对路径是:
. 表示当前目录
.. 表示上一级目录
资源名 表示当前目录/资源名
绝对路径: http://ip:port/工程路径/资源路径
在实际开发中,路径都使用绝对路径,而不简单的使用相对路径。
1、绝对路径
2、base+相对
web 中 / 斜杠的不同意
在web 中/斜杠是一种绝对路径。
/斜杠如果被浏览器解析,得到的地址是:http://ip:port/
/斜杠如果被服务器解析,得到的地址是:http://ip:port/工程路径
六、HttpServletResponse类
HttpServletResponse类和 HttpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。==HttpServletRequest 表示请求过来的信息,HttpServletResponse表示所有响应的信息==
我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse对象来进行设置
两个输出流的说明
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个。
使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。
如何往客户端回传数据
public class ResponseroServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException {
//要求:往客户端回传字符串数据。
Printwriter writer = resp.getwriter();
writer.write( "response's content! ! !");
通过代码我们也看出了是通过流的方式进行传数据的
请求重定向
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)。
请求重定向的第一种方案:
//设置响应状态码302,表示重定向,(已搬迁)
resp.setStatus(302);
//设置响应头,说明新的地址在哪里 resp.setHeader("Location", "http:// localhost:8080");
请求重定向的第二种方案(推荐使用): resp. sendRedirect( "http: / / localhost:8080" );