一,Request
1.1 request的继承体系
继承体系1.2 获取请求数据
-
1 请求行(get获取)
请求行
String getMethod():获取请求方式GET
String getContextPath():获取项目访问路径 :/request-demo
StringBuffer getRequestURL():获取URL,http://localhost/request-demo/req1
String getRequestURI():获取标识符 :request-demo/req1
String getQueryString():获取请求参数 :user=hx&pwd=123 -
2 请求头 (就是键值对的形式)
请求头 -
3 请求体(post获取)
post请求的数据
用输入流来获取
纯文本形式用字符输入流 BufferReader getReader()获取字符输入流
获取字节数据,比如图片:ServletInputStream getInputStream() 获取字节输入流
1.3 获取请求参数
GET获取请求参数String getQueryString()
POST获取请求参数 BufferReader getReader()
image.png
image.png
@WebServlet("/demo2")
public class ServletDemo2 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get..................");
//获取所有参数的map集合
Map<String ,String[]> map = req.getParameterMap();
//遍历键名
for (String key : map.keySet()) {
System.out.println(key+":");
//遍历值
String[] values = map.get(key);
for (String value : values) {
System.out.print(value+" ");
}
System.out.println();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post..................");
this.doGet(req,resp);
}
取单独一个键的值,数组
String[] hobbies = req.getParameterValues("hobby");
for(String hobby:hobbies){
System.out.println(hobby);
}
根据key获取单独属性值
String name = req.getParameter("name");
String password = req.getParameter("pwd");
可以使用Servlet模板来创建这种servlet
1.4 解决输入中文乱码问题
post请求解决中文乱码request.setCharacterEnconding('utf-8');
get请求解决中文乱码``
在get请求中,他会将utf-8的编码将字符串转换为二进制数的形式进行传播,那么tomcat的默认解码是ISO-8859-1 所以会出现乱码
那么utf-8 一个中文代表三个字节,每个字节转换2个16进制并在前添加%.如果两个汉字中文编码url就变成了6个
%E5%A0%E4%B8%BC%F5%
解决方法
将字符串转换为字节数据,在将字节数组转换为字符串
byte[] bytes = decode.getBytes("ISO-8859-1");
String s = new String(bytes,"utf-8");
1.5 请求转发
一种服务器内部的资源跳转方式
内部跳转
req.getRequestDispatcher("资源B路径").forward(req,res);
二,Response
使用Response对象设置响应数据。
- 1 响应行
HTTP/1.1 200 OK
void setStatus(int sc);//设置响应状态码 - 2 响应头
Content-Type:text/html - 3 响应体
<html><head></head></html>
获取字符输出流 PrintWrite getWriter()
获取字节输出流 ServletOutputStream getOutputStream()
2.2 response完成重定向
一种资源跳转的方式
resp.setStatus(302);
resp.setHeader("location","跳转的路径 ")
关于路径
如果是浏览器使用需要+项目根目录访问路径
如果是服务器内部使用 不需要+目录
关于重定向可以动态获取虚拟目录
String contextPath = request.getContextPath();
resp.setHeader(contextPath+"/resp");
2.3 Response响应字符数据
使用Response对象获取字符输出流
1
PrintWriter writer = resp.getWriter();
2
writer.write("啊啊");
2.4Response响应字节数据
1
ServletOutputStream = resp.getOutputStream();
2
outputStream.write(字节数据);//图片 音频 等等
可以使用IOUtils工具类进行字节的复制操作
在pom.xml导入以下标签
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
使用IOUtils.copy(输入流,输出流);
网友评论