java web-7.2 Request_获取请求数据
request功能
一、获取请求消息数据
1.获取请求行数据
2.获取请求头数据
- 获取请求体数据
二、其他功能
1.获取请求参数通用方式
2.请求转发
3.共享数据
4.获取ServletContext
一.获取请求消息数据
(1)获取请求行数据
GET /try/demo1?name=zhangsan HTTP/1.1
方法介绍
①获取请求方式 :GET String getMethod()
②获取虚拟目录:/try String getContextPath()
③获取Servlet路径 :/demo1 String getServletPath()
④获取get方式请求参数 :name=zhangsan String getQueryString()
⑤获取请求URI:String getRequestURI(): try/demo1 URI:统一资源标识符 StringBuffer getRequestURL()
//localhost/try/demo1 URL:统一资源定位符
⑥获取协议及版本 :HTTP/1.1 String getProtocol()
⑦获取客户机的ip地址: String getRemoteAddr()
代码演示
package web.request;
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;
/* 演示request对象获取请求行数据 */
@WebServlet( "/requestDemo1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ①获取请求方式 :GET `String getMethod()`
String method = req.getMethod();
System.out.println(method);
//②获取虚拟目录:/try `String getContextPath()`
String contextPath = req.getContextPath();
System.out.println(contextPath);
//③获取Servlet路径 :/demo1 `String getServletPath()`
String servletPath = req.getServletPath();
System.out.println(servletPath);
//④获取get方式请求参数 :name=zhangsan `String getQueryString()`
String queryString = req.getQueryString();
System.out.println(queryString);
/* ⑤获取请求URI: `String getRequestURI(): try/demo1 StringBuffer getRequestURL():http://localhost/try/demo1` */
String requestURI = req.getRequestURI();
System.out.println(requestURI);
StringBuffer requestURL = req.getRequestURL();
System.out.println(requestURL);
//⑥获取协议及版本 :HTTP/1.1 `String getProtocol()`
String protocol = req.getProtocol();
System.out.println(protocol);
//⑦获取客户机的ip地址: `String getRemoteAddr()`
String remoteAddr = req.getRemoteAddr();
System.out.println(remoteAddr);
}
}
注意:写在doGet中。
结果
启动,输入
结果显示:
(2)获取请求头数据
方法:
String getHeader(String name):通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames():获取所有的请求头名称
代码示例
示例1
package web.request;
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 doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super.doPost(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//演示获取请求头数据
//1.获取所有请求头名称
Enumeration<String> headerNames = req.getHeaderNames();
//2遍历
while (headerNames.hasMoreElements()){
String name = headerNames.nextElement();
//根据名称获取请求头的值
String value = req.getHeader(name);
System.out.println(name+"---"+value);
}
}
}
结果
示例2:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//演示获取请求头数据user-agent
String agent = req.getHeader("user-agent");
//判断agent的浏览器版本
if(agent.contains("Chrome")){
System.out.println("谷歌哥哥哥哥");
}else if(agent.contains("Firefox")){
System.out.println("火狐呼呼呼");
}
}
结果:
示例3:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//演示获取请求头数据:refer
String refer = req.getHeader("referer");
System.out.println(refer);
}
这样的结果是null,应该从其他地方跳转到这个页面
添加一个login.html页面,使它跳转到这个页面获取referer
<body>
<form action="/demo3" method="GET">
<input name = "username">
<input type="submit" value="提交">
</form>
<hr>
<a href="/pro1/requestDemo4">demo4</a>
</body>
启动服务器到login.html页面,点击demo4服务台会出现referer
服务台出现referer
可以通过referer完成防盗链
//防盗链
if(refer != null){
//正常访问
System.out.println("播放电影");
}else {
//盗链
System.out.println("i想看电影吗,来Uk");
}
(3)获取请求体数据
请求体:只有post请求方式,才有请求体,在请求体中封装了post请求的请求参数
步骤:
①获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
②再从流对象中拿数据
示例
1.写一个 regist页面
<body>
<form action="/pro1/requestDemo5" method="post">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="text" placeholder="请输入密码" name="password"><br>
<input type="submit" value="注册">
</form>
</body>
2.写一个requestDemo5
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求消息体--请求参数
//1.获取字符流
BufferedReader br = req.getReader();
//2.读取数据
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
}
3.启动服务器,输入用户名密码
4.看后台返回的参数
二.其他功能
1.获取请求参数通用方式 即无论是post还是get请求方式 都可以使用下列方法获取请求参数
(1)String getParameter(String name)
:根据参数名称获取参数值 username=zhangsan&password=123456
(2)String[] getParameterValues(String name)
:根据参数名称获取参数值的数组 hobby=music&hobby=game
(3)Enumeration<String> getParameterNames()
:获取所有请求的参数名称
(4)Map<String,String[]> getParameterMap():
获取所有参数的map集合
代码示例
①regist2
<body>
<form action="/pro1/requestDemo6" method="post">
<input type="text" placeholder="请输入用户名" name="username"><br>
<input type="text" placeholder="请输入密码" name="password"><br>
<input type="checkbox" name="hobby" value="game">游戏
<input type="checkbox" name="hobby" value="music">音乐
<br>
<input type="submit" value="注册">
</form>
</body>
②RequestDemo6
@WebServlet( "/requestDemo6")
public class RequestDemo6 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//post 获取请求参数
//根据参数名称获取参数值
String username = req.getParameter("username");
System.out.println("username");
System.out.println("post"+username);
System.out.println("========================================");
//根据参数名称获取参数值的数组
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println("hobby");
System.out.println(hobby);
}
System.out.println("============================================");
// 获取所有请求的参数名称
Enumeration<String> parameterNames = req.getParameterNames();
while(parameterNames.hasMoreElements()){
String s = parameterNames.nextElement();
System.out.println(s);
String value = req.getParameter(s);
System.out.println(value);
System.out.println("-------分隔符------");
}
System.out.println("========================================");
//获取所有参数的map集合
Map<String, String[]> parameterMap = req.getParameterMap();
//遍历
Set<String> keyset = parameterMap.keySet();
for (String s : keyset) {
String[] values = parameterMap.get(s);
System.out.println(s);
for (String value : values) {
System.out.println(value);
}
System.out.println("+++++++分隔符++++++++++");
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//get 获取请求参数
/* //根据参数名称获取参数值 String username = req.getParameter("username"); System.out.println("post"+username); */
this.doPost(req, resp);
}
}
③启动服务器,输入用户名密码
④看后台结果
注意:获取请求参数中文乱码问题
(1)get方式:tomcat8 已经将get方式乱码问题解决了
(2)post方式:会乱码
解决方法:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
2.请求转发一种在服务器内部的资源跳转方式
(1)步骤:
①通过request对象获取请求转发器对象:
RequestDispatcher getRequestDispatcher(String path)
②使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)
(2)特点
①地址栏路径不发生变化:访问了8也访问了9
②只能转发到当前服务器内部资源中
③转发是一次请求
3.共享数据
(1)域对象:一个有作用范围的对象,可以在范围内共享数据
(2)request域:代表一次请求的范围,一般用于请求转发的多个资源中共享的数据
(3)方法:
①void setAttribute(String name,Object obj):存储数据
②Object getAttribute(String name):通过键获取值
③void removeAttribute(String name):通过键移除键值对
例如:在demo8中req.setAttribute("msg","hello"); req.getRequestDispatcher("/requestDemo9").forward(req,resp);
在demo9中
Object msg = req.getAttribute("msg");
System.out.println(msg);
4.获取ServletContext
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = req.getServletContext();
System.out.println(servletContext);
}
还没有评论,来说两句吧...