一、Request对象
1. 基本概念
HttpServletRequest
继承自父接口ServletRequest
,它的对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户端及请求信息。
2. Request获取请求行信息
请求行的组成内容:请求方式 + 请求路径 + 协议版本
API:
1. String getMethod() 获取请求方式的类型
2. String getRequestURI() 获取请求行中的资源名部分
3. StringBuffer getRequestURL() 获取客户端发出请求 完整URL
4. String getProtocol() 获取当前协议的名称和版本
5. String getRemoteAddr() 获取IP地址
6. int getLocalPort() 获取端口
代码:
//1. 请求方式
String method = request.getMethod();
//2. 请求资源uri/url
String uri = request.getRequestURI();
String url = request.getRequestURL().toString();
//3. 当前的协议版本
String protocol = request.getProtocol();
//4. 当前网站的ip地址
String ip = request.getRemoteAddr();
int port = request.getLocalPort();
System.out.println("IP地址:" + ip + " 端口号:" + port);
3. Request获取请求头信息
API:
1. String getHeader(String name) 通过请求头的键获取到对应请求头的值
2. Enumeration getHeaderNames() 返回此请求包含的所有头名称的枚举
1)请求头中referer
:判断当前的请求是来自于哪个页面的,(经过哪个页面来到这个Servlet)
代码:
@WebServlet(urlPatterns = "/referer")
public class RefererServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取当前用户是经过哪个页面过来的。
String referer = request.getHeader("referer");
System.out.println("当前用户是经过:"+ referer +"页面过来的..");
}
}
2)请求头中user-agent
:获取客户端使用的是什么浏览器版本与浏览器内核
代码:
@WebServlet(urlPatterns = "/userAgent")
public class UserAgentServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取客户端当前使用浏览器版本
String userAgent = request.getHeader("user-agent");
if(userAgent.contains("Chrome")){
System.out.println("当前使用的是谷歌浏览器");
}else if(userAgent.contains("Firefox")){
System.out.println("当前使用的是火狐浏览器");
}else if(userAgent.contains("Trident")){
System.out.println("当前使用的是IE浏览器");
}
}
}
4. Request获取请求体参数数据
请求体,包含的是用户通过浏览器发送的请求参数
API:
1. String getParameter(String name) 根据表单的name属性,获取对应的值
2. String[] getParameterValues(String name) 获取name相同的所有value,例如复选框
3. Map getParameterMap() 参数名作为key,参数值作为value,封装到map中
代码:
@WebServlet(urlPatterns = "/getParam")
public class GetParamServlet extends HttpServlet {
//get请求方式提交的数据是不会出现中文乱码问题的。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//根据表单的name属性获取提交的数据
String userName = request.getParameter("username");
//获取兴趣爱好,如果是复选框,那么我们不能使用getParameter()获取请求参数,因为该方法只是返回一个值,应该使用getParameterValues
String[] hobby = request.getParameterValues("hobby");
System.out.println("用户名:"+ userName+" 爱好是:"+ Arrays.toString(hobby));
}
//post请求方式提交中文数据时会出现乱码
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置了request对象获取请求体时使用的码表
request.setCharacterEncoding("UTF-8");
//获取提交的name值
String userName = request.getParameter("username");
System.out.println("post方式获取到的名字:"+ userName);
}
}
5. Request获取工程名字
API:
1. String getContextPath() 获取工程项目名
代码:
@WebServlet(urlPatterns = "/getContextPath")
public class GetPathServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取当前到工程名字
String contextPath = request.getContextPath();
System.out.println("当前的工程名字:"+ contextPath);
}
}
二、Response对象
1. 基本概念
HttpServletResponse
对象封装了向客户端发送数据、发送响应头,发送响应状态码的方法,学会使用 HttpServletResponse
,才能给浏览器发送数据。
2. 常用API
1. void setStatus(int sc) 设置此响应的状态码
2. void setHeader(String name, String value) 用给定名称和值设置响应头
3. 响应头:location
作用: 浏览器一旦收到了location
的响应头,那么就会发生页面跳转
代码:
@WebServlet(urlPatterns = "/location")
public class LocationServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置状态码
response.setStatus(302);
//为response设置location的响应头
response.setHeader("location","/test/hello.html"); //通知浏览器跳转的页面
//上面代码可以换成请求重定向,上面代码是该句的原理
response.sendRedirect("/test/hello.html");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
4. 响应头:Content-Type
作用:
-
设置了response使用字符流时候使用的码表。
-
通知浏览器使用指定的码表去解码(解决浏览器乱码问题)
response.setContentType(“text/html;charset=utf-8”);
5. 响应头:refresh
作用:设置浏览器定时刷新页面或定时跳转到指定的资源
代码:
@WebServlet(urlPatterns = "/refresh")
public class RefreshServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//实现定时刷新,每一秒就定时刷新一次
//response.setHeader("refresh","1");
//实现定时跳转 3秒钟后跳转到hello.html页面上。
response.setHeader("refresh","3;url=/test/hello.html");
}
}
6. 响应头:Content-Disposition
作用:通知浏览器以附件的形式处理响应的内容
代码:
//需求: 向浏览器输出一张图片,然后通知浏览器以附件的形式下载
@WebServlet(urlPatterns = "/downImage")
public class ContentDispositionServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通知浏览器以附件的形式下载图片
response.setHeader("Content-Disposition","attachment;filename=1.jpg");
//找到图片,然后获取图片的输入流对象
// ServletContext对象可以理解为就是当前工程
ServletContext context = this.getServletContext();
//利用ServletContext 找web路径的下的资源文件
InputStream inputStream = context.getResourceAsStream("/img/1.jpg");
byte[] buf = new byte[1024];
int length = 0;
//获取向浏览器输出数据的输出字节流,Outputstream是通过response对象得到,那么response一旦死亡,outputstream也会死亡
OutputStream out = response.getOutputStream();
//边读边写
while((length = inputStream.read(buf))!=-1){
out.write(buf,0,length);
}
//关闭资源
inputStream.close();
}
}
7. 响应体
概述:就是服务器输出的数据,服务器输出数据给浏览器,浏览器显示给用户。
作用:
- 输出字符数据、字节数据
- 输出资源文件数据(资源图片)
- 输出缓存(内存中)图片 - - 验证码
三、解决中文乱码
四、请求转发和请求重定向的区别
1. 请求转发
request.getRequestDispatcher().forward()
,是一种服务器的行为,客户端只有一次请求,服务器端转发后会将请求对象保存,地址栏中的URL地址不会改变,得到响应后服务器端再将响应发给客户端。
request.getRequestDispatcher("success.jsp").forward(request,response);
2. 请求重定向
response.sendRedirect()
,是一种客户端行为,从本质上讲等同于两次请求,前一次请求对象不会保存,地址栏的URL地址会改变。
response.sendRedirect("success.jsp");
3. 区别
区别 | 请求转发 | 请求重定向 |
---|---|---|
哪里进行 | 服务器端 | 客户端 |
转发速度 | 快 | 慢 |
请求次数 | 一次 | 两次 |
地址栏 | 不变 | 发生改变 |
是否能跨域 | 不可以,只能访问本身的web资源 | 可以,能访问本身之外的资源 |
注意:请求转发跳转之间传输的信息不会丢失,重定向跳转之间传输的信息会丢失(request范围)。
4. 请求转发和重定向的应用场景
重定向需要经过客服端且还得发出一个新的请求,速度比转发慢,两者皆可时优先使用请求转发;
请求转发智能访问当前Web的应用程序,如果要访问到另外一个Web站点上的资源时,只能使用重定向。