一.初识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请求!");
}
第一个参数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);
}
输出截图:
2.获取请求参数(重点)
2.获取请求参数(重点)
获取单个参数值(getParameter):
获取单个参数值(getParameter):
根据参数名 获取单个参数值 ,如果是表单 ,参数名就是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);
}
}
浏览器中在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));
}
浏览器中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.转发路径,只写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); } }
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); } }
浏览器输入:
对应输出:
ps:因为Servlet0和Servlet1共用同一个request对象,所有在两个servlet中都可以获取name的参数值
三.Response对象
三.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"); } }
响应字符流形式的数据
响应字符流形式的数据
@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("服务器输出给客户端!"); } }
响应字节流形式的数据
响应字节流形式的数据
//响应字节流形式的数据 //使用字节输入流把图片读入程序中 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();
通过jar包中的类方法对接输入流和输出流
通过jar包中的类方法对接输入流和输出流
导入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);