一、原理
1. request和response对象是由服务器创建的。我们来使用它们 (我们不创建,仅仅使用,做IDEA的搬运工)
2. request对象是来获取请求消息,response对象是来设置响应消息
2. request对象继承体系结构:
ServletRequest – 接口
继承 |
HttpServletRequest – 接口
实现 |
rg.apache.catalina.connector.RequestFacade 类(tomcat)
二、方法及功能
方法名 | 作用 |
---|---|
isUserInRole | 判断认证后的用户是否属于某一成员组 |
getAttribute | 获取指定属性的值,如该属性值不存在返回Null |
getAttributeNames | 获取所有属性名的集合 |
getCookies | 获取所有Cookie对象 |
getCharacterEncoding | 获取请求的字符编码方式 |
getContentLength | 返回请求正文的长度,如不确定返回-1 |
getHeader | 获取指定名字报头值 |
getHeaders | 获取指定名字报头的所有值,一个枚举 |
getHeaderNames | 获取所有报头的名字,一个枚举 |
getInputStream | 返回请求输入流,获取请求中的数据 |
getMethod | 获取客户端向服务器端传送数据的方法 |
getParameter | 获取指定名字参数值 |
getParameterNames | 获取所有参数的名字,一个枚举 |
getParameterValues | 获取指定名字参数的所有值 |
getProtocol | 获取客户端向服务器端传送数据的协议名称 |
getQueryString | 获取以get方法向服务器传送的查询字符串 |
getRequestURI | 获取发出请求字符串的客户端地址 |
getRemoteAddr | 获取客户端的IP地址 |
getRemoteHost | 获取客户端的名字 |
getSession | 获取和请求相关的会话 |
getServerName | 获取服务器的名字 |
getServerPath | 获取客户端请求文件的路径 |
getServerPort | 获取服务器的端口号 |
removeAttribute | 删除请求中的一个属性 |
setAttribute | 设置指定名字参数值 |
1.获取请求行数据
- GET /Http_Demo_war_exploded/demo1?name=zhangsan HTTP/1.1
- 方法:
①. 获取请求方式 :GET
* String getMethod()
② 获取虚拟目录:/Http_Demo_war_exploded
* String getContextPath()
③. 获取Servlet路径: /demo1
* String getServletPath()
④. 获取get方式请求参数:name=zhangsan
* String getQueryString()
⑤ (*)获取请求URI:/day14/demo1
* String getRequestURI(): /Http_Demo_war_exploded/demo1
* StringBuffer getRequestURL() :http://localhost/day14/demo1
* URL:统一资源定位符 : http://localhost/day14/demo1 中华人民共和国
* URI:统一资源标识符 : /day14/demo1 共和国
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet........");
String method = req.getMethod(); //获取请求方式 :GET
System.out.println(method);
String contextPath = req.getContextPath(); //(*)获取虚拟目录:/Http_Demo:war exploded
System.out.println(contextPath);
String servletPath = req.getServletPath(); //获取Servlet路径: /demo1
System.out.println(servletPath);
String queryString = req.getQueryString(); //获取get方式请求参数:name=zhangsan
System.out.println(queryString);
String requestURI = req.getRequestURI(); //(*)获取请求URI:/Http_Demo_war_exploded/demo1
System.out.println(requestURI);
StringBuffer requestURL = req.getRequestURL(); //(*)获取请求URI:http://localhost/Http_Demo_war_exploded/demo1
System.out.println(requestURL);
String protocol = req.getProtocol(); //获取协议及版本:HTTP/1.1
System.out.println(protocol);
String remoteAddr = req.getRemoteAddr(); //获取客户机的IP地址:0:0:0:0:0:0:0:1
System.out.println(remoteAddr);
}
2.获取请求头数据
- 方法:
* String getHeader(String name):通过请求头的名称获取请求头的值
* Enumeration getHeaderNames():获取所有的请求头名称
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet........");
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 doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet........");
String agent = req.getHeader("user-agent");
if(agent.contains("Firefox")){
System.out.println("火狐来了");
}else if(agent.contains("Chrome")){
System.out.println("谷歌来了");
}
}
假设我做了一个电影网站,我花了300W打广告,某度,某浪,和某狐各100W,但是我想知道哪里来的访问量最多,这个时候我们就可以通过referer来统计各个网站来的访客数量。
而作为优酷,我为了防止被盗取资源,所以要判断你是从哪个网站来的?如果不是从优酷首页进来的,我就不给你播放。
防盗链方法:防止其他网站盗取资源
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet........");
String referer = req.getHeader("referer");
if(referer.contains("/demo4")){
System.out.println("正常播放");
}else{
System.out.println("想看吗?来优酷啊");
}
}
3.获取请求体数据
- 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
- 步骤:
①. 获取流对象
* BufferedReader getReader():获取字符输入流,只能操作字符数据(高效)
* ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
* 在文件上传知识点后讲解
②. 再从流对象中拿数据
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost.......");
BufferedReader reader = req.getReader(); //1.获取字符流
String line = null;
while((line = reader.readLine()) != null){ //2.读取数据
System.out.println(line);
}
}
4.其他功能
①. 获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
- String getParameter(String name):根据参数名称获取参数值 username=zs&- password=123
- String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
- Enumeration getParameterNames():获取所有请求的参数名称
- Map<String,String[]> getParameterMap():获取所有参数的map集合
②请求转发:一种在服务器内部的资源跳转方式
浏览器访问AServlet,A发现没有浏览器找的资源,但是知道B那里有,所以转发给B
步骤:
- 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中。
- 转发是一次请求
@WebServlet("/demo8")
public class http_demo8 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Demo8被访问了");
/* RequestDispatcher requestDispatcher = req.getRequestDispatcher("/demo9");
requestDispatcher.forward(req,resp);*/
//转发
req.getRequestDispatcher("/demo9").forward(req,resp);
}
}
③共享数据:A完成后需要告知B已经完成到哪了
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttitude(String name):通过键获取值
- void removeAttribute(String name):通过键移除键值对
@WebServlet("/demo8")
public class http_demo8 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("Demo8被访问了");
//存储数据到request中
req.setAttribute("msg","hello");
req.getRequestDispatcher("/demo9").forward(req,resp);
}
}
@WebServlet("/demo9")
public class http_demo9 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置流的字符编码
System.out.println("Demo9被访问了");
//获取demo8的传送数据
Object msg = req.getAttribute("msg");
System.out.println(msg);
}
}