目录
servlet_01
package com.example.session_cookie_01;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.DataInput;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
/**
* @Author shawcd
* @Description //TODO $
* @Date $ $
* @Param $
* @return $
*/
@WebServlet(name = "cookisServlet",value = "/cookie")
//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器 告诉你 你来的时间,把这个时间封装成为一个信件 你下次带来 我就知道你来了
//解决中文乱码
req.setCharacterEncoding("gbk");
resp.setCharacterEncoding("gbk");
//
PrintWriter out = resp.getWriter();
//Cookie 服务器端从客户端获取
Cookie[] cookies = req.getCookies();
//判断cookies是否存在
if (cookies != null){
out.write("你上一次访问的时间是:");
//如果存在怎么办
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//获得cookie的名字
if (cookie.getName().equals("lastLoginTime")){
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(date.toString());
}
}
}else{
out.write("这是您第一个访问本站!");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//设置cookie持续时间为一天
cookie.setMaxAge(60*60*24);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
1.共享数据
在一个servlet中保存的数据,可以在另一个servlet中获得!
2.面试问题:转发 重定向
同:都会跳转页面
不同:1、请求次数不同(重定向至少请求两次,转发请求一次);2、重定向时地址栏会发生变化,而转发时地址栏不会发生变化;3、重定向两次请求不共享数据,转发一次请求共享数据。
3下载资源(了解)
- 向浏览器输出消息(一直在讲,就不说了)
- 下载文件
- 要获取下载文件的路径
- 下载的文件名是啥?
- 设置想办法让浏览器能够支持下载我们需要的东西
- 获取下载文件的输入流(写过的获取输入流文件)
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入到bufer缓冲区
- 使用OutputStream将缓冲区中的数据输出到客户端!
@WebServlet(name = "fileServlet", value = "/response")
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
FileInputStream in = null;
ServletOutputStream out = null;
try {
// 1. 要获取下载文件的路径
String realPath = "D:\\AbandonIT\\Idea\\JavaWeb_kuangshen\\response\\target\\classes\\1.jpg";
System.out.println("下载的文件路径是"+realPath);
// 2. 下载的文件名是啥?
String filename = realPath;
// System.out.println("下载的文件名字叫"+filename);
// 3. 设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,中文文件名URLEncoder.encode编码,否则有可能乱码
resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(filename,"utf-8"));
// System.out.println("测试03");
// 4. 获取下载文件的输入流
in = new FileInputStream(realPath);
// System.out.println("测试04");
// 5. 创建缓冲区
int len;
byte[] buffer = new byte[1024];
// System.out.println("测试05");
// 6. 获取OutputStream对象
out = resp.getOutputStream();
// 7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端!
if ((len = in.read(buffer)) > 0){
out.write(buffer,0,len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
4.验证码(了解)
@WebServlet(name="imageServlet",value="/image")
public class ImageServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如何让浏览器5秒刷新一次;
resp.setHeader("refresh","3");
//在内存中差创建一个图片
BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
//得到图片
Graphics2D graphics = (Graphics2D) image.getGraphics();
//设置图片的背景颜色
graphics.setColor(Color.white);
graphics.fillRect(0,0,80,20);
//给图片写数据
graphics.setColor(Color.cyan);
graphics.setFont(new Font(null,Font.BOLD,20));
graphics.drawString(makeNum(),0,20);
//告诉浏览器,这个请求用图片的方式打开
resp.setContentType("image/jpg");
//网站存在缓存,不让浏览器缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//把图片写给浏览器
ImageIO.write(image, "jpg", resp.getOutputStream());
}
//生成随机数
public String makeNum(){
// Random random = new Random();
// String num = random.nextInt(9999)+"";
// StringBuffer sb = new StringBuffer();
// for (int i = 0; i < 4-num.length(); i++) {
// sb.append("0");
// }
// num=sb.toString()+num;
// return num;
String num = (int)((Math.random()*9+1)*1000)+"";
return num;
}
}
5.获取随机数(验证码问题附带)
生成6位随机数(不会是5位或者7位,仅只有6位):
System.out.println((int)((Math.random()*9+1)*100000));
同理,生成5位随机数:
System.out.println((int)((Math.random()*9+1)*10000));
同理,生成4位随机数:
System.out.println((int)((Math.random()*9+1)*1000));
6.重定向/转发
6.1重定向
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username +":" + password);
resp.sendRedirect("/response/success.jsp");
}
6.2 转发
req.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");
System.out.println("username = " + username);
System.out.println("password = " + password);
System.out.println(Arrays.toString(hobbys));
req.getRequestDispatcher("/success.jsp").forward(req,resp);
7.jsp
<html>
<body>
<h2>Hel1o World!</h2>
<%--这里超交的路径,需要寻找到项目的路径--%>
<%--${pageContext. request, contextPath}代表当前的项目--%>
<form action="${pageContext. request.contextPath}/request" method="get">
用户名: <input type="text" name="username"> <br>
密码: <input type="password" name="password"> <br>
<input type="submit">
</form>
</body>
</html>
8.cookie
- 服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以了; cookie
- 服务器登记你来过了,下次你来的时候我来匹配你; seesion
cookie:一般会保存在本地的 用户目录下 appdata;
- 一个网站cookie是否存在上限!聊聊细节问题
- 一个Cookie只能保存一个信息;
- 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
- Cookie大小有限制4kb;
- 300个cookie浏览器上限
删除Cookie;
不设置有效期,关闭浏览器,自动失效;
设置有效期时间为 0 ;
概括代码
Cookie[] cookies = req.getCookies(); //获得Cookie
cookie.getName(); //获得cookie中的key
cookie.getValue(); //获得cookie中的vlaue
new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie
cookie.setMaxAge(24*60*60); //设置cookie的有效期
resp.addCookie(cookie); //响应给客户端一个cookie
全部代码
package com.example.session_cookie_01;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.DataInput;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
/**
* @Author shawcd
* @Description //TODO $
* @Date $ $
* @Param $
* @return $
*/
@WebServlet(name = "cookisServlet",value = "/cookie")
//保存用户上一次访问的时间
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//服务器 告诉你 你来的时间,把这个时间封装成为一个信件 你下次带来 我就知道你来了
//解决中文乱码
req.setCharacterEncoding("gbk");
resp.setCharacterEncoding("gbk");
//
PrintWriter out = resp.getWriter();
//Cookie 服务器端从客户端获取
Cookie[] cookies = req.getCookies();
//判断cookies是否存在
if (cookies != null){
out.write("你上一次访问的时间是:");
//如果存在怎么办
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//获得cookie的名字
if (cookie.getName().equals("lastLoginTime")){
long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(date.toString());
}
}
}else{
out.write("这是您第一个访问本站!");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//设置cookie持续时间为一天
cookie.setMaxAge(60*60*24);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
ps:防止乱码(在方法最上部分)
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");