Request和Response对象详解
【摘要】
一.初识Request和Response对象
Request和Response对象都是doGet/doPost方法的形参,都是由服务器创建的 例如:
@Override
protected v...
一.初识Request和Response对象
- Request和Response对象都是doGet/doPost方法的形参,都是由服务器创建的
例如:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet处理doGet请求!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet处理doPost请求!");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
第一个参数req是request对象,第二个参数resp是response对象
- request负责封装请求行信息(请求方式,请求路径,请求参数),response负责封装响应信息(响应头,响应体)。
二.Request对象
1.常用方法(非重点,只做了解):
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet处理doGet请求!");
System.out.println("————————————----------获取请求行————————————---------");
//1.获取请求方式 GET/POST
String method= req.getMethod();
//2.获取虚拟路径,工程访问路径 /req
String contextPath = req.getContextPath();
//3.获取servlet路径 /as
String servletPath = req.getServletPath();
//4.获取get方式的请求参数,
String qs = req.getQueryString();
//5.获取uri :contextPath+servletPath /req/as
String uri = req.getRequestURI();
//6.获取url:http://localhost:80/req/as?name=aa
StringBuffer url = req.getRequestURL();
//7.获取传输协议名 http
String protocol = req.getProtocol();
//8.获取客户端的ip: localhost
String ip = req.getRemoteAddr();
System.out.println(method);
System.out.println(contextPath);
System.out.println(servletPath);
System.out.println(qs);
System.out.println(uri);
System.out.println(url);
System.out.println(protocol);
System.out.println(ip);
System.out.println("————————————----------获取请求头————————————---------");
//1.根据头名称获取头值
String userAgent = req.getHeader("user-agent");
System.out.println(userAgent);
String referer = req.getHeader("referer");
System.out.println(referer);
//2.获取所有头名称
Enumeration<String> hnames = req.getHeaderNames();
while (hnames.hasMoreElements()){
//循环变量迭代器,取出每一个头名称
String name = hnames.nextElement();
//根据头名称获取头值
String value = req.getHeader(name);
System.out.println(name+"--"+value);
}
System.out.println("————————————----------获取请求体数据————————————---------");
//ps:get方式无请求体,post方式才有请求体
//1.从request对象中获取字符流--字符流中包含请求体数据
BufferedReader br = req.getReader();
//2.从字符输入流中读取一行数据---请求体数据
String data = br.readLine();
System.out.println(data);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
输出截图:
2.获取请求参数(重点)
根据参数名 获取单个参数值 ,如果是表单 ,参数名就是input的name值。
package com.ysw;
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;
@WebServlet("/ysw3")
public class HelloServlet3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("注解版,servlet处理get请求!");
String name = req.getParameter("name");
String position = req.getParameter("position");
String route = req.getParameter("route");
System.out.println(name+"---"+position+"---"+route);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
浏览器中在url后面输入?name=xxx&position=xxx&route=xxx
例如:
对应输出:
System.out.println("——————————————————————————获取多个参数名和参数值—————————————————————-—");
Enumeration<String> names = req.getParameterNames();
while (names.hasMoreElements()){
//获取Enumeration集合中的每一个参数名
String name1 = names.nextElement();
//根据参数名 获取多个参数值
String [] value = req.getParameterValues(name1);
System.out.println(name1+"--"+ Arrays.toString(value));
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
浏览器中url和参数如下:
对应输出:
System.out.println("——————————————————————————一次性获取所有的参数名和参数值—————————————————————-—");
Map<String, String[]> parameterMap = req.getParameterMap();
System.out.println("########################第一种遍历方式####################");
//把map集合变成set集合,set集合相当于是键值对
Set<Map.Entry<String, String[]>> entries = parameterMap.entrySet();
for (Map.Entry<String, String[]> entry : entries){
String key = entry.getKey();
String[] values = entry.getValue();
System.out.println(key+":"+Arrays.toString(values));
}
System.out.println("########################第二种遍历方式####################");
Set<String> strings = parameterMap.keySet();
for (String string : strings) {
System.out.println(string+"--"+Arrays.toString(parameterMap.get(string)));
}
System.out.println("########################第三种遍历方式####################");
Collection<String[]> values = parameterMap.values();
for (String[] value : values) {
System.out.println(Arrays.toString(value));
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
对应输出:
转发的特点:
1.服务器行为
2.只在同一个项目的资源之间进行转发
3.不论转发多少次,只能算是一次请求
4.转发路径,只写servlet路径,不用加上虚拟路径
Servlet0:
@WebServlet("/forward")
public class Servlet0 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入了Servlet0的doGet");
String name = req.getParameter("name");
System.out.println(name);
//1.转发到Servlet的doGet,传入request对象作为forward的实参,说明两个servlet使用的是同一个request对象
//2.转发是服务器行为,是在同一个项目内部进行转发,因此转发路径只写servlet路径,不用写工程访问路径
req.getRequestDispatcher("/fw").forward(req,resp);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
Servlet1:
@WebServlet("/fw")
public class Servlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("进入了Servlet1的doGet");
String name = req.getParameter("name");
System.out.println(name);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
浏览器输入:
对应输出:
ps:因为Servlet0和Servlet1共用同一个request对象,所有在两个servlet中都可以获取name的参数值
三.Response对象
1.设置状态码 setStatus(int status);
2.设置响应头 setHeader(String name,String value);
3.设置响应体:
字符流响应体:getWriter().write(“字符数据”);–如:文本数据
字节流响应体:getOutputStream().write(); --如;图片,视频,音频
例如:
@WebServlet("/ysw4")
public class HelloServlet4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("开始重定向,访问一个新网址!");
//设置状态码,302为重定向
resp.setStatus(302);
//设置响应头
resp.setHeader("location","http://www.baidu.com");
// //###################简化版本:########################
// resp.sendRedirect("http://www.baidu.com");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
@WebServlet("/send")
public class ServletOut extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置contentType,避免乱码
resp.setContentType("text/html;charset=UTF-8");
PrintWriter writer = resp.getWriter();
writer.write("服务器输出给客户端!");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
//响应字节流形式的数据
//使用字节输入流把图片读入程序中
FileInputStream fileInputStream = new FileInputStream("/Users/yushiwen/IdeaProjects/seven_day/src/com/ysw/img/xiamu.jpg");
//获取字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
int i = 0;
while ((i=fileInputStream.read())!=-1){
outputStream.write(i);
}
fileInputStream.close();
outputStream.close();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
导入jar包:
//#############################通过jar包工具########################
//使用字节输入流把图片读入程序中
FileInputStream fileInputStream = new FileInputStream("/Users/yushiwen/IdeaProjects/seven_day/src/com/ysw/img/xiamu.jpg");
//获取字节输出流
ServletOutputStream outputStream = resp.getOutputStream();
//通过jar包中的类方法对接输入流和输出流
IOUtils.copy(fileInputStream,outputStream);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
文章来源: blog.csdn.net,作者:Mr.Yushiwen,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/MrYushiwen/article/details/107553471
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)