web常用对象
一、HttpServletRequest 对象
1.1 常用形式
1)常用方法
常用方法 | 描述 |
---|---|
getRequestURL() | 获取客户端发出的请求时的完整 URL |
getRequestURI() | 获取请求行中的资源名称部分(项目名称开始) |
getQueryString() | 获取请求行中的参数部分 |
getMethod() | 获取客户端请求方式 |
getProtocol() | 获取 HTTP 版本号 |
getContextPath() | 获取 webapp 名字 |
2) 获取请求头
方法 | 描述 |
---|---|
getHeader(String) | 获取单个请求头内容 |
Enumeration getHeaderNames() | 获取所有的请求头名称集合 |
3) 获取客户端请求参数(客户端提交的数据)
方法 | 描述 |
---|---|
getParameter(name) | 获取指定名称的参数 |
getParameterValues(String name) | 获取指定名称参数的所有值 |
getParameterNames() | 获取一个包含请求消息中的所有参数名的 Enumeration 对象 |
getParameterMap() | 返回一个保存了请求信息中的所有参数名称和值的Map对象 |
1.2 请求乱码解决
原创博客:
https://blog.csdn.net/L6_6LXXX/article/details/100549484
1.3请求转发
1)定义:
请求转发,是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的 URL 地址不会改变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。
2)写法:
request.getRequestDispatcher("转发的路径").forward(request,response);
1.4request作为域对象
1)定义:
通过该对象可以在一个请求中传递数据
2)作用范围:
在一次请求中有效及服务器跳转无效,
注:经过请求转发,request域中的数据仍然存在。
3)相关方法:
request.setAttribute(String name, Object o); // 设置域对象内容
request.getAttribute(String name); // 获取域对象内容
request.removeAttribute(String name); //删除域对象内容
二、HttpServletResponse 对象
2.1 常用方法
常用方法 | 描述 |
---|---|
addHeader(String name, String value) | 添加指定的键值到响应头信息中 |
containsHeader(String name) | 判断响应的头部是否被设置 |
encodeURL(String url) | 编码指定的 URL |
sendError(int sc) | 使用指定状态码发送一个错误到客户端 |
setHeader(String name, String value) | 设置指定响应头的值 |
setStatus(int sc) | 给当前响应设置状态 |
setContentType(String ContentType) | 设置响应的 MIME 类型 |
getWriter() | 获取输出字符流 |
getOutputStream() | 获取输出的字节流 |
2.2 刷新和页面自动跳转
1)刷新:
response.setHeader("refresh","2");//在请求头中添加定时刷新信息,单位为秒
2)页面跳转:
response.setHeader("refresh","3;URL=跳转页面的地址");//但该方法返回后刷新就无法跳转了
一般采用 HTML 的方式进行设置
<meta http-equiv="refresh" content="3;http://www.baidu.com" />
2.3 数据响应
1)获取字符流
PrintWriter out = resp.getWriter();
out.write("<h1>Hello World</h1>");
2)获取字节流
ServletOutputStream out = resp.getOutputStream();
out.write("<h1>Hello World</h1>").getBytes());
注意:
1. 字符流只能响应字符
2. 字节流能响应一切(图片等等)
3. 两者不能同时使用
2.4 乱码解决
字符字节通用解决方法:
保证发送端和接收端的编码一致
response.setContentType("text/html;charset=utf-8");
总结:
要想解决响应的乱码,只需要保证使用支持中文的编码格式。并且保证服务器端 和客户端使 用相同的编码方式即可。
2.5 响应图片
在客户端解析资源时默认是以文本(text/html)的形式,当响应图片时需要指定响应头信息,告知客户端响应内容为图片形式,使用一种叫做 MIME 类型的东西来指定。MIME 类型见 Tomcat 的 web.xml 文件。
如下(只截取了一部分):
<mime-mapping>
<extension>jpeg</extension>
<mime-type>image/jpeg</mime-type>
</mime-mapping>
<mime-mapping>
<extension>jpg</extension>
<mime-type>image/jpeg</mime-type>
</mime-mapping>
<mime-mapping>
<extension>jpgm</extension>
<mime-type>video/jpm</mime-type>
</mime-mapping>
<mime-mapping>
<extension>jpgv</extension>
<mime-type>video/jpeg</mime-type>
</mime-mapping>
<mime-mapping>
<extension>jpm</extension>
<mime-type>video/jpm</mime-type>
</mime-mapping>
代码
//通过输入流读取图片,然后通过输出流输出图片
//设置响应字符集
response.setContentType("text/html;charset=utf-8");
// 获取用户请求图片名称参数
String imageName = request.getParameter("imageName");
// 判断参数
if(imageName == null || "".equals(imageName)){
response.getWriter().write("请告诉我你要看啥图片");
return;
}
// 获取图片路径
String realPath = request.getServletContext().getRealPath("/WEB-INF/image/");
System.out.println(realPath);
System.out.println(realPath + imageName);
// 得到图片
//路径无法确定
//File file = new File("E:/Journey/Mage/class/06middle/code/servletResponse/WebContent/image/timg.jpg");
File file = new File(realPath + imageName);
// 判断是否存在并且是否是文件
if(file != null && file.isFile()){
// 判断用户访问的图片类型
String imageType = imageName.split("\\.")[1];
if("jpg".equals(imageType) || "jpeg".equals(imageType)){
response.setContentType("image/jpeg;charset=utf-8");
}else if("png".equals(imageType)){
response.setContentType("image/png;charset=utf-8");
}else if("gif".equals(imageType)){
response.setContentType("image/gif;charset=utf-8");
}
// 是文件
// 获取输入流
FileInputStream in = new FileInputStream(file);
// 获取字节输出流
ServletOutputStream out = response.getOutputStream();
// 响应图片
// 创建字节数组
byte[] car = new byte[1024];
int len = 0;
while((len = in.read(car)) != -1){
out.write(car, 0, len);
}
// 关闭
in.close();
out.close();
}else{
// 不是文件或者不存在
response.getWriter().write("请输入正确的图片名称");
return;
}
2.6 重定向跳转
1) 定义:
重定向是一种服务器指导客户端的行为。客户端发出第一个请求,被服务器接收,经过处理服务器进行响应,与此同时,服务器给客户端一个地址(重定向跳转请求的地址response.sendRedirect(“url”);),当客户端接收到响应后,立刻、马上、自动根据服务器给的地址进行第二个请求的发送,服务器接收请求并作出响应,重定向完成。从描述中可以看出重定向当中有两个请求存在,并且属于客户端行为
2) 写法:
response.sendRedirect("index.html")
三、请求时的路径问题
相对路径
相对当前资源的路径
绝对路径
以 http:// 开头,只有客户端跳转才能使用,此时需要写出资源的完整路径
以 / 开头,则是绝对到端口后的
注意:
-
浏览器中:“/”代表的是 http://主机|IP:端口 (重定向)
-
服务器中:“/”代表的是 http://主机|IP:端口/站点名 (请求转发)
四、Cookie
4.1Cookie 的创建和发送
// 创建Cookie对象
new Cookie(“key”,”value”);
// 响应给客户端
response.addCookie(cookie);
4.2 Cookie 的获取
// 获取客户端的Cookie数组
Cookie[] cookies = req.getCookies();
// 判断是否为空
if(cookies != null && cookies.length > 0){
// 遍历
for (Cookie cookie : cookies) {
// 获取键名
String name = cookie.getName();
// 获取键值
String value = cookie.getValue();
System.out.println("键:" + name + ",值:" + value);
}
}
4.3 Cookie 到期时间的设定
方法:
setMaxAge(int expiry);
参数的含义:
-
负整数:cookie 的 maxAge 属性的默认值就是 -1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就会消失。
-
正整数:表示 cookie 对象可存活指定的秒数。当生命大于 0 时,浏览器会把 Cookie 保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie 也会存活相应的时间。
-
零:cookie 生命等于 0 是一个特殊的值,它表示 cookie 被作废!也就是说,如果原来浏览器已经保存了这个 Cookie,那么可以通过 Cookie 的 setMaxAge(0) 来删除这个 Cookie。 无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie。
4.4 注意
- Cookie 中如果有中文则通过 URLEncoder.encode() 来进行编码,获取时通过 URLDecoder.decode() 来进行解码。
- Cookie 的存储是有上限的
- 服务器端发送重复名称且路径一致的 Cookie 那么会覆盖原有的 Cookie。