文章目录
JavaWeb(2) - Request/Response
Request
Request 继承体系
- Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递导service方法中
- 注意:使用request对象,查阅JavaEE API文档的HttpServletRequest接口
获取请求数据
请求数据分为3部分
请求行:GET/request-demo/req?username=zhangsan HTTP/1.1
// 获取请求方式: GET
String getMethod()
// 获取虚拟目录(项目访问路径):/request-demo
String getContextPath()
// 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
StringBuffer getRequestURL()
// 获取URI(统一资源标识符):/request-demo/req1
String getRequestURI()
// 获取请求参数(GET方式):username=zhangsan&password=123
String getQueryString()
请求头:User-Agent:Mozilla/5.0 Chrome/91.0.4472.106
// 根据请求头名称,获取值(GET方式)
String getHeader(String name)
请求体 :username=superbaby&password=123
// 获取字节输入流
ServletInputStream getInputStream()
// 获取字符输入流(POST方式)
BufferedReader getReader()
通用方式获取请求参数
获取所有参数Map集合
Map<String,String[]> getParameterMap()
根据名称获取参数值(数组)
String[] getParameterValues(String name)
根据名称获取参数值(单个值)
String getParameter(String name)
提升开发效率的技巧:使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同;具体方法如下
- 设置模板
- 生成代码:在指定的文件目录下右键选择新建servlet文件,根据要求命名
@WebServlet("/req4") public class RequestDemo4 extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
请求参数中文乱码处理
请求参数如果存在中文数据,则会乱码其解决方案如下:
POST:设置输入流的编码
request.setCharacterEncoding("UTF-8");
请求转发
定义:一种在服务器内部的资源跳转形式,即跳转到另一个servlet服务中
实现方式:
req.getRequestDispatcher("[资源B路径]").forward(request,response);
代码示例:
/**
* 请求转发 servlet1
*/
@WebServlet("/req5")
public class RequestDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo5...");
//请求转发
request.getRequestDispatcher("/req6").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
/**
* 请求转发 servlet2
*/
@WebServlet("/req6")
public class RequestDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("demo6...");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
代码展示效果:
请求转发资源间共享数据:使用Request对象
// 存储数据导 request域中
void setAttribute(String name,Object o)
// 根据key,获取值
Object getAttribute(String name)
// 根据key,删除该键值对
void removeAttribute(String name)
请求转发特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器的内部资源
- 一次请求,可以在转发的资源间使用request共享数据
Response
Response 设置响应数据功能介绍
响应数据分为3部分
-
响应行:
HTTP/1.1 200 OK
//设置响应状态码 void setStatus(int sc);
-
响应头:
Content-Type:text/html
//设置响应头键值对 void setHeader(String name,String value);
-
响应体:
<html><head><body></body></html>
//获取字符输出流 PrintWriter getWriter(); //获取字节输出流 ServletOutputStream getOutputStream();
Response 完成重定向
重定向:一种资源跳转方式
实现方式:
response.setStatus(302);
response.setHeadler("location","[资源B的路径]")
//简化版
response.sendRedirect("[资源B的路径]");
重定向特点:
- 浏览器地址栏路径发生变化
- 可以重定向任意位置的资源(服务器内部,外部均可)
- 再次请求,不能在多个资源使用request共享数据
资源路径问题
明确路径谁使用:如果是浏览器使用则需要加虚拟目录(即项目访问路径);如果是服务端使用,则不需要加虚拟目录
Response 响应字符数据
注意:流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
通过Response对象获取字符输出流
PrintWriter writer = response.getWriter();
写数据
writer.write("aaa");
Response 字节数据
通过Response对象获取字节输出流
ServletOutputStream outputStream = response.getOutputStream();
写数据
outputStream.write("[字节数据]")
IOUtils工具类使用
-
导入坐标
<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency>
-
使用
IOUtils.copy(inputStream,outputStream);
代码实例
/**
* 响应字节数据:设置字节数据的响应体
*/
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 读取文件
FileInputStream fis = new FileInputStream("D://Downloads/搞笑.jpg");
//2. 获取response字节输出流
ServletOutputStream os = response.getOutputStream();
//3. 完成流的copy
/* byte[] buff = new byte[1024];
int len = 0;
while((len = fis.read(buff))!=-1){
os.write(buff,0,len);
}*/
IOUtils.copy(fis,os);
fis.close();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}