目录
Reques
获取请求数据
Reques继承体系
ServletRequest<-----HttpServletRequest<---------RequestFacade
ServletRequest:Java提供的请求对象根接口
HttpServletRequest:Java提供的对Http协议封装的请求对象接口
RequestFacade:Tomcat定义的实现类
1、Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法中
2、查看Request,查看HttpServletRequest就可以了
Reques获取请求数据
请求数据分为三部分
1、请求行
GET /request-demo/req1?username=zhangsan GTTP/1.1
获取请求方式
String getMethod() //GET
获取虚拟目录(项目访问路径)
String getContextPath() //request-demo
获取URL(统一资源定位符)
StringBuffer getRequestURL() //http:localhost:8080/request-demo/req1
获取URI(统一资源标识符)
String getRequestURI() //request-demo/req1
获取请求参数(GET)
String getQueryString() //username=zhangsan&password=123
package top.wogong.web;
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("/app")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求方式
String method = req.getMethod();
System.out.println("获取请求方式:"+method);
// 获取虚拟目录
String contextPath = req.getContextPath();
System.out.println("获取虚拟目录"+contextPath);
// 获取URL
StringBuffer requestURL = req.getRequestURL();
System.out.println("URL:"+requestURL);
// 获取URI
String requestURI = req.getRequestURI();
System.out.println(requestURI);
// 获取请求参数
String queryString = req.getQueryString();
System.out.println("参数:"+queryString);
}
}
2、请求头
User-Agent:Mozilla/5.0 Charome/91.0.4472.106
根据请求头名称,获取值
String getHeader(String name)
3、请求体
获取字节输入流
ServletInputSream getInputStream()
获取字符输入流
BuffereReader getReader()
Ruquest通用方式获取请求参数
GET方式
String getQueryString()
POST
BufferedReader getReader()
通用方法
获取所有参数Map集合
Map<String,String[]> getParameterMap()
根据名称获取参数值(数组)
String[] getParameterValues(Stirng name)
根据名称获取参数值(单个值)
String getParameter(String name)
乱码
POST
rep.setCharacterEncoding("编码格式")
URL编码
将字符串按照编码方式转为二进制
每个字节转为2个16进制数并在前边加上%
package top.wogong.web;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class URLDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
String username="张三";
//URL编码
String encode = URLEncoder.encode(username, "utf-8");
System.out.println(encode);
//URL解码
String decode = URLDecoder.decode(encode, "ISO-8859-1");
// System.out.println(decode);
//转换为字节数据
byte[] bys=decode.getBytes("ISO-8859-1");
//4.将字节数组转为字符串
String s=new String(bys,"utf-8");
System.out.println(s);
}
}
GET乱码解决
1、先将乱码数据进行编码(转为字节数组)
//使用getBytes("编码格式")
//byte[] bytes=String.getBytes("编码格式")
byte[] bys=username.getBytes(StandardCharsets.ISO_8859_1)
2、字节数组解码
//new String(byte[],"编码方式")
username=new String(bys,StandardCharsets.UTF_8)
Reques请求转发
一种在服务器内部的资源跳转方式
req.getRequeestDispatcher("资源B路径").forward(req,resp)
请求转发资源间共享数据:使用Request对象
存储数据到request域中
void setAttribute(String name,Object o)
根据key,获取值
Object getAttribute(String name)
根据key,删除该键值对
void removeAttribute(String name)
请求转发特点
浏览器地址栏路径不发生变化
只能转发到当前服务器的内部资源
一次请求,可以在转发的资源间使用request共享数据
Response
设置响应数据
Response体系结构
ServletResponse<-----HttpServletResponse<-----------ResponseFacade
ServletResponse:Java提供的请求对象根接口
HttpServletResponse:Java提供的对Http协议封装的请求
ResponseFacade:Tomcat定义的实现类
Response设置响应数据功能介绍
响应数据分为三部分
响应行
HTTP/1.1 200 OK
设置响应状态码
void setStatus(int sc)
响应头
Content-Type:text/html
设置响应头
void setHeader(String name,String value)
响应体
<html>
<head>
</head>
<body>
</body>
</html>
获取字符输出流
PrintWriter getWriter()
获取字节输出流
ServletOutputStream getOutputStream()
Response重定向
一种资源跳转方式
实现方式
//设置状态码
resp.setStatus(302)
//设置跳转路径
resp.setHeader("location","资源B的路径")
简化方式
resp.sendRedirect("资源路径")
package top.wogong.web.response;
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("/resp")
public class ResponseDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//重定向
//设置响应状态码
// resp.setStatus(302);
//设置响应头
// resp.setHeader("location","/resp2");
//简化
resp.sendRedirect("/resp2");
System.out.println(req.getContextPath());
System.out.println("ok");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
package top.wogong.web.response;
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("/resp2")
public class ResponseDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo2");
}
}
重定向的特点
浏览器地址栏路径发生变化
可以重定向到任意位置的资源(服务器内部,外部)
两次请求,不能在多个资源使用request共享数据
路径问题
浏览器使用:需要加虚拟目录(项目访问路径)
服务器使用:不需要加虚拟目录
Response响应字符数据
使用
1、通过Response对象获取字符输出流
PrintWriter writer=resp.getWriter()
2、写数据
writer.write("aaa")
设置编码,放在流的前面
resp.setContentType()
package top.wogong.web.response;
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;
import java.io.PrintWriter;
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
// resp.setHeader("content-type","text/html");
writer.write("aaaa");
writer.write("<h1>张三</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
Response响应字节数据
使用
1、通过Response对象获取字符输出流
ServletOutputStream outputStream=resp.getOutputSream()
2、写数据
outputStream.write(字节数据)
使用IOUtils工具类
导入坐标
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
使用
IOUtilscopy(输入流,输出流)
package top.wogong.web.response;
import org.apache.commons.io.IOUtils;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
@WebServlet("/reps4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//读取文件
FileInputStream fs = new FileInputStream("E:\\Projects\\ideaProject\\wogongwed\\src\\12.jpg");
ServletOutputStream outputStream = resp.getOutputStream();
// byte[] bytes=new byte[1024];
// int i;
// while ((i=fs.read(bytes))!=-1){
// outputStream.write(bytes,0,i);
// }
//使用工具类
IOUtils.copy(fs,outputStream);
fs.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}