Request
1. request对象和response对象的原理:
(1)两个都是由服务器创建的,我们来使用它
(2)request是用来获取请求消息的,response是用来获取响应消息的
2. request对象继承体系结构:
ServletRequest 接口
继承
HttpServletRequest 接口
实现
org.apache.catalina.connector.RequestFacade 类(tomcat)
3. request功能:
可以获取请求消息数据
(1) 获取请求行数据 GET /request/demo1?name=zhangsan HTTP/1.1
- 方法及具体实现:
//获取请求方式:GET
String method = request.getMethod();
System.out.println(method);
//获取虚拟目录
String contextPath = request.getContextPath();
System.out.println(contextPath);
//获取servlet路径
String servletPath = request.getServletPath();
System.out.println(servletPath);
//获取get方式的请求参数
String queryString = request.getQueryString();
System.out.println(queryString);
//获取请求的URI
String requestURI = request.getRequestURI();
System.out.println(requestURI);
//获取请求的url
StringBuffer requestURL = request.getRequestURL();
System.out.println(requestURL);
//获取协议及版本
String protocol = request.getProtocol();
System.out.println(protocol);
//获取客户机的IP地址
String remoteAddr = request.getRemoteAddr();
System.out.println(remoteAddr);
结果展示:
URL:统一资源定位符
URI:统一资源标识符
URI的范围比URL的大
(2)获取请求头数据:
方法具体实现:
String getHeader(String name):通过请求头的名称获取请求头的值(重要)
Enumeration<String>
getHeaderNames():获取所有的请求头名称
//获取所有请求头名称
Enumeration<String> headerNames = request.getHeaderNames();
//遍历
while (headerNames.hasMoreElements()){
String s = headerNames.nextElement();
//根据名称获取请求头的值
String header = request.getHeader(s);
System.out.println(s+"==="+header);
}
//获取请求头数据 user-agent
String header = request.getHeader("user-agent");
if(header.contains("Chrome")){
System.out.println("谷歌浏览器。。");
}else if(header.contains("IE")){
System.out.println("IE浏览器。。。");
}
//referer
String referer = request.getHeader("referer");
System.out.println(referer);//http://localhost:8080/login.html
if(referer!=null){
if(referer.contains("login")){
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("优酷");
}else {
System.out.println("想看视频 来优酷吧!");
}
}
(3)获取请求体数据(只有在POST请求方式下,才有请求体。在请求体中封装了POST请求的请求参数)
实现步骤:
- 获取流对象
BufferedReader getReader():获取字符输入流,只能操作字符数据
ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
- 再从流对象中拿数据
//获取请求消息体 只有在post提交方式中
//获取字符流
BufferedReader reader = request.getReader();
//读取数据
String line=null;
while((line=reader.readLine())!=null){
System.out.println(line);
}
一些其他功能:
- 获取请求参数的通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数。
- String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
- String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
- Enumeration
<String>
getParameterNames():获取所有请求的参数名称- Map<String,String[]> getParameterMap():获取所有参数的map集合
代码实现:
//获取请求参数
String username = request.getParameter("username");
System.out.println("POST==="+username);
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
//获取所有请求参数的名称 获取所有键的名称
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()){
String s = parameterNames.nextElement();
System.out.println(s);
String parameter = request.getParameter(s);
System.out.println(parameter);
System.out.println("--------------- ");
}
//获取所有参数的map集合
Map<String, String[]> parameterMap = request.getParameterMap();
//遍历
Set<String> keySet = parameterMap.keySet();//所有key集合
for (String name : keySet) {
//根据key来获取值
String[] values = parameterMap.get(name);
System.out.println(name);
for (String value : values) {
System.out.println(value);
}
System.out.println("------------");
}
中文乱码问题:
1.get方式:tomcat 8 已经将get方式乱码问题解决了
2.post方式:会乱码。解决方式:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
2.请求转发:一种在服务器内部的资源跳转方式
步骤:
- 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
request.getRequestDispatcher("/requestDemo6").forward(request,response );
特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中。
- 转发是一次请求
共享数据:
概念:
1.域对象:一个有作用范围的对象,可以在范围内共享数据。
2.request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
方法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttitude(String name):通过键获取值
- void removeAttribute(String name):通过键移除键值对
//转发之前,存储数据
request.setAttribute("msg","hello");
request.getRequestDispatcher("/requestDemo6").forward(request,response );
//获取request域
Object msg = request.getAttribute("msg");
System.out.println(msg);
获取ServletContext:
ServletContext getServletContext()