服务器在接收到请求后,会给此次请求创建一个request对象, 此对象中封存了此次请求相关的数据
作用:
存储请求数据
注意:
每次请求都会创建新的request对象存储请求数据
特点:
request对象由服务器创建一次请求创建一个request对象生命周期为一次请求内,请求结束即销毁此次请求的request对象
使用:
1. 请求对象: HttpServletRequest(I), 继承了ServletRequest(I)
2. 通过请求对象, 程序员可以在service方法中获取客户端提交的请求信息
表单信息补充:
readonly 只读: 会提交表单内存在的信息,但不能修改
disabled 有障碍的: 不会提交表单信息也不能修改
作用域
请求信息包括:
>请求行
>>请求方式
>>资源路径(URL统一资源定位符 / URI 统一资源标识符 )
URL:网络中的资源
URI:服务器内部资源
>>Servlet路径( 本次访问路径,也就web.xml中最后配置访问的地址)
>>协议版本号
>>协议
>请求头
> > User-Agent: 用于描述客户端浏览器的类型
> > Referer: 用于记录当前请求是由哪个路径发出的
>请求体
>>获取请求实体
>其他信息
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
private void getreqline(HttpServletRequest req) {
// >>请求方式
System.out.println("获取请求方式:"+req.getMethod());
// >>资源路径(URL统一资源定位符 / URI 统一资源标识符 )
// URL:网络中的资源
System.out.println("获取统一资源定位符:"+req.getRequestURL());
// URI:服务器内部资源
System.out.println("获取统一资源标识符:"+req.getRequestURI());
// >>Servlet路径( 本次访问路径,也就web.xml中最后配置访问的地址)
System.out.println("获取Servlet路径:"+req.getServletPath());
// >>协议版本号
System.out.println("获取协议版本号:"+req.getProtocol());
// >>协议
System.out.println("获取协议:"+req.getScheme());
}
>请求头
> > User-Agent: 用于描述客户端浏览器的类型
> > Referer: 用于记录当前请求是由哪个路径发出的
private void getreqHeader(HttpServletRequest req) {
// > > User-Agent: 用于描述客户端浏览器的类型这里是获取单个
String header = req.getHeader("User-Agent");
System.out.println("User-Agent"+header);
System.out.println("______________________________");
// > >获取所有头信息 因为是集合所以需要遍历读取
Enumeration<String> names = req.getHeaderNames();
// 使用方法hasMoreElements获取元素
while (names.hasMoreElements()){
String s = names.nextElement();
// 获取单个元素信息
System.out.println(s+":"+req.getHeader(s));
}
}
>获取请求其他信息
private void getreqOther(HttpServletRequest req) {
System.out.println("获取主机名:"+req.getLocalName());
System.out.println("获取主机ip:"+req.getLocalAddr());
System.out.println("获取主机PORT:"+req.getLocalPort());
System.out.println("获取客户端IP:"+req.getRemoteAddr());
System.out.println("获取客户端地址:"+req.getRemotePort());
//这个是重点
System.out.println("获取上下文路径:"+req.getContextPath());
}
完整代码
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* request对象学习之获取请求数据
* 请求数据:
* 请求行:请求方式 请求URL 协议
* getMethod(); 返回请求方式
* getRequestUrl(); 返回请求url
* getRequestUri(); 返回请求uri
* getQueryString(); 返回get请求中的URL中的用户数据 注意:post请求中没有此方法。
* getSchema(); 返回协议
* 请求头
* getHeader(String name) 根据键名获取请求头信息
* 注意:如果获取的请求头信息不存在返回null。
* getHeaderNames() 返回存储了请求头键名的枚举集合。
* 请求实体
* getParameter(String name) 根据键名获取数据
* 注意:
* 键名其实就是前端页面中的表单标签的name属性的值或者前端页面其他方式提交数据的键的名字
* 如果请求中没有对应的请求数据,则返回null.
* getParameterValues(String name) 根据键名获取同名不同的值,返回数组
* 注意:如果没有对应的键名,则返回null
* getParameterNames() 返回实体数据中键名的枚举
* 请求网络相关数据
* getRemoteAddr() 获取客户端的IP地址
* getRemotePort() 获取客户端端口号
* getLocalAddr() 获取服务器端的ip
* getLocalPort() 获取服务器端的端口号
* @author MyPC
*/
public class RequestServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取请求信息
//获取请求行信息
//获取请求方式
String method = req.getMethod();
System.out.println("请求方式:"+method);
//获取请求URL信息
StringBuffer requestURL = req.getRequestURL();
System.out.println("请求URL:"+requestURL.toString());
//获取请求URI信息
String requestURI = req.getRequestURI();
System.out.println("请求URI:"+requestURI);
//获取get请求URL中的请求数据
String queryString = req.getQueryString();
System.out.println("获取get请求URL中的数据:"+queryString);
//获取协议
String scheme = req.getScheme();
System.out.println("获取请求协议:"+scheme);
//获取请求头信息
//根据键名获取请求头信息
String header = req.getHeader("User-Agent2");
System.out.println("获取浏览器版本信息:"+header);
//获取请求头中键名的枚举
Enumeration headerNames = req.getHeaderNames();
while(headerNames.hasMoreElements()){
//获取请求头键名
String name=(String) headerNames.nextElement();
//获取请求头的键名对应的值
String value=req.getHeader(name);
System.out.println(name+":"+value);
}
//获取请求实体数据(用户数据)
//根据键名获取数据
String uname = req.getParameter("uname");
String pwd=req.getParameter("pwd");
System.out.println("请求实体数据:"+uname+":"+pwd);
//获取同名不同值的实体数据
String[] favs = req.getParameterValues("fav");
if(favs!=null){
for(String s:favs){
System.out.println("fav的值为:"+s);
}
}
//获取请求实体中键名的枚举
Enumeration names = req.getParameterNames();
while(names.hasMoreElements()){
//获取键名
String name=(String) names.nextElement();
//判断
if("fav".equals(name)){
String[] favs2=req.getParameterValues(name);
if(favs!=null){
for(String s:favs2){
System.out.println(name+":"+s);
}
}
}else{
//获取值
String value=req.getParameter(name);
System.out.println(name+":"+value);
}
}
//请求相关的网络数据
//获取客户端信息
String remoteAddr = req.getRemoteAddr();
System.out.println("获取客户端的IP:"+remoteAddr);
//获取客户端的端口号(浏览器)
int remotePort = req.getRemotePort();
System.out.println("获取客户端的端口号:"+remotePort);
//获取服务器主机ip
String localAddr = req.getLocalAddr();
System.out.println("获取服务器ip:"+localAddr);
//获取服务器的端口号
int localPort=req.getLocalPort();
System.out.println("获取服务器端口号:"+localPort);
//处理请求信息
//响应处理结果
}
}
响应对象:
响应行:协议版本号 状态码 描述信息 (这些不需要程序员自己操作)
响应头:服务器告诉浏览器的信息 Content-Tyep ,Location
响应实体:响应到浏览器的内存
package com.LinL.test;
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 ResponseServlet extends HttpServlet {
// 响应对象:
// 响应行:协议版本号 状态码 描述信息 (这些不需要程序员自己操作)
// 响应头:服务器告诉浏览器的信息 Content-Tyep ,Location
// 响应实体:响应到浏览器的内存
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//不设置Content-Type响应头 默认是text/plain
// resp.setHeader("Content-Type","text/html;charset =UTF-8");
//上一句话的缩写
resp.setContentType("text/html;charset=UTF-8");
//可以自己设置响应头,name和value都只允许出现ASCII码不能中文,唯一,会被覆盖
resp.setHeader("Lin", "Liangg");
//设置多个响应头,set会覆盖 add不会覆盖
resp.addHeader("theOneday", "927");
resp.addHeader("theML", "1027");
resp.addHeader("theGoBj", "0215");
// 测试响应实体
resp.getWriter().print("<h6>我</h6>");
}
}
response.getWriter().print(),不仅可以打印输出文本格式的(包括html标签),还可以将一个对象以默认的编码方式转换为二进制字节输出
而response.getWriter().writer(),只能打印输出文本格式的(包括html标签),不可以打印对象
package com.bjsxt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*resp对象之处理响应学习:
* 设置响应行: 协议 状态码 状态消息
* resp.sendError(int status);
* 作用:可以自主的响应状态给浏览器
* 设置响应头
* addHeader(String name,String value) 添加响应头信息,同名数据不会覆盖
* setHeader(String nanme,String value) 设置响应头信息,会覆盖原有信息。如果没有此响应头则添加该信息。
* 设置响应实体(处理结果)
* resp.getWriter().write("实体内容");
* 注意:
* 实体内容可以分开进行响应。
* 注意:
一旦使用resp对象作出了请求响应,则意味着此次请求处理完毕。服务器在响应后会将此次请求相关
的req对象和resp对象销毁。
* @author MyPC
*
*/
public class ResponseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取请求数据
//处理请求数据
//响应处理结果
//设置响应行
//自定义响应404异常
//resp.sendError(404);
//设置响应头
//添加响应头信息
resp.addHeader("mouse","thinkpad");
resp.addHeader("mouse","thinkpad2");
//设置响应头
//resp.setHeader("mouse", "two fly birds");
//resp.setHeader("mouse", "two fly birds2");
//设置响应实体
resp.getWriter().write("resp object");
resp.getWriter().write("resp object");
resp.getWriter().write("resp object");
resp.getWriter().write("resp object");
}
}
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!