1.概念
<1>请求:请求:获取资源。在BS架构中,就是客户端浏览器向服务器端发出询问。
<2>请求对象:就是在项目当中用于发送请求的对象。
<3>对象创建:需要实现ServletRequest和HttpservletRequest接口,不过在tomcat底层已经帮我们创建好了请求对象。
关系视图如下:
2.Request获取路径的相关方法
注:浏览器返回【本机地址】ipv6和ipv4的地址是本地host文件控制
//Request获取路径的相关方法
@WebServlet("/ServletDemo1")
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取虚拟目录名称getContextPath()
String contextPath = req.getContextPath();
System.out.println(contextPath);
//2.获取Servlet映射路径getServletPath()
String servletPath = req.getServletPath();
System.out.println(servletPath);
//3.获取访问者ip getRemoteAddr()
String remoteAddr = req.getRemoteAddr();
//http://127.0.0.1:8080 //127.0.0.1
//http://localhost:8080[和host文件的配置有关] //0:0:0:0:0:0:0:1
System.out.println(remoteAddr);
//4.获取请求消息的数据getQueryString()
//?username=zhangsan&password=123456
String queryString = req.getQueryString();
System.out.println(queryString);
//5.获取统一资源标识符 getRequestURI()
String requestURI = req.getRequestURI();
System.out.println(requestURI);
//URL更精确,表示范围比URI小
//6.获取统一资源定位符 getRequestURL()
StringBuffer requestURL = req.getRequestURL();
System.out.println(requestURL);
//浏览器访问http://127.0.0.1:8080/ServletRequest/ServletDemo1?username=zhangsan&password=123456
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
打印结果:
-----------------------------------------------------------------------
/ServletRequest
/ServletDemo1
127.0.0.1
null
/ServletRequest/ServletDemo1
http://127.0.0.1:8080/ServletRequest/ServletDemo1
3.Request获取请求头内信息的相关方法
//Request获取请求头内信息的相关方法
@WebServlet("/ServletDemo2")
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//请求头名称[可以有多个值]不区分大小写
//1.getHeader("请求头名称")根据请求头名称获取值
String connection = req.getHeader("Connection");
System.out.println(connection);
System.out.println("------------------------");
//返回类型和前面不同,返回为集合
//2.getHeader("请求头名称")根据请求头名称[有多个值]获取多个值
String AcceptEncoding = req.getHeader("Accept-Encoding");
System.out.println(AcceptEncoding);
System.out.println("------------------------");
//3.getHeaderNames获取所有的请求头名称
Enumeration<String> headerNames = req.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
String value = req.getHeader("s");
System.out.println(headerName + "..." + value);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
打印结果:
----------------------------------------------------------------------
keep-alive
------------------------
gzip, deflate
------------------------
host...null
user-agent...null
accept...null
accept-language...null
accept-encoding...null
connection...null
cookie...null
upgrade-insecure-requests...null
sec-fetch-dest...null
sec-fetch-mode...null
sec-fetch-site...null
sec-fetch-user...null
4.获取请求参数相关信息的方法
表单属性为【form action="/ServletRequest/ServletDemo3" method=“post” autocomplete=“off”】
@WebServlet("/ServletDemo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.getParameter()根据名称获取数据
String value = req.getParameter("name");
System.out.println(value);
System.out.println("-------------------------");
//2.getParameterValues()根据名称获取所有数据
String[] hobbies = req.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbies));
/*for (String hobby : hobbies) {
System.out.println(hobby);
}*/
System.out.println("-------------------------");
//3.getParameterNames()获取所有名称
Enumeration<String> parameterNames = req.getParameterNames();
while (parameterNames.hasMoreElements()){
String s = parameterNames.nextElement();
System.out.println(s);
}
System.out.println("-------------------------");
//4.getParameterMap()获取所有参数的键值对,存入Map集合
Map<String, String[]> parameterMap = req.getParameterMap();
Set<String> keys = parameterMap.keySet();
for (String key : keys) {
String[] values = parameterMap.get(key);
System.out.println(key + Arrays.toString(values));
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
打印结果:
----------------------------------------------------------------------
zhangsan
-------------------------
[study, game, book]
-------------------------
name
password
hobby
-------------------------
name[zhangsan]
password[123456]
hobby[study, game, book
5.通过流对象获取数据
【请求方法必须是post方式】
表单属性为【form action="/ServletRequest/ServletDemo7" method=“post” autocomplete=“off”】
//通过流对象获取数据[请求方法必须是post方式]
//不是自己new的都不需要释放资源
@WebServlet("/ServletDemo7")
public class ServletDemo7 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//字符流
/*BufferedReader br = req.getReader();
String line = br.readLine();
while (line != null) {
System.out.println(line);
line = br.readLine();
}*/
//字节流[应用场景,上传文件]
ServletInputStream sis = req.getInputStream();
byte[] bytes = new byte[1024];
int len = sis.read(bytes);
while (len!=-1){
System.out.println(new String(bytes,0,len));
len = sis.read(bytes);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
打印结果:
---------------------------------------------------------------------
name=%E6%9D%8E%E5%9B%9B&password=123&hobby=game
6.请求转发
表单属性为【form action="/ServletRequest/ServletDemo9" method=“post” autocomplete=“off”】
//ServletDemo9
@WebServlet("/ServletDemo9")
public class ServletDemo9 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求字符编码,防止乱码
req.setCharacterEncoding("utf-8");
//设置共享数据setAttribute(键,值)
System.out.println("ServletDemo9设置共享数据");
req.setAttribute("name","zhangsan");
//getRequestDispatcher()获取请求调度对象[中介]
RequestDispatcher rd = req.getRequestDispatcher("/ServletDemo10");
//实现转发功能[参数为请求对象和相应对象]
rd.forward(req,resp);//所以ServletDemo9中接收的请求参数也会传递到10中
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
//ServletDemo10
@WebServlet("/ServletDemo10")
public class ServletDemo10 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求字符编码,防止乱码
req.setCharacterEncoding("utf-8");
//获取共享数据
System.out.println("ServletDemo10获取共享数据");
Object name = req.getAttribute("name");
System.out.println(name);
System.out.println("获取ServletDemo7的请求参数");
System.out.println(req.getParameter("name"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
打印结果:
----------------------------------------------------------------------
ServletDemo9设置共享数据
ServletDemo10获取共享数据
zhangsan
获取ServletDemo7的请求参数
王五