Web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,和代表响应的一个HttpServletResponse
如果要获取客户端请求过来的参数:找HttpServletRequest
如果要给客户端响应一些信息:找HttpServletResponse
一、方法简单分类
1、负责向浏览器发送数据的方法
ServletOutputStream getOutputStream() throws IOException; //写平常的流
使用:response.getOutputStream().write(data.getBytes(“UTF-8”));
PrintWriter getWriter() throws IOException; //一般写中文
使用: response.getWriter().write(data);
2、负责向浏览器发送一些响应头的方法
void setCharacterEncoding(String var1); //响应编码
void setContentLength(int var1); //响应的字符串长度
void setContentLengthLong(long var1);
void setContentType(String var1); //类型
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
3、响应状态码
int SC_OK = 200; //正常
int SC_MULTIPLE_CHOICES = 300; //重定向
int SC_NOT_FOUND = 404; //资源找不到
int SC_INTERNAL_SERVER_ERROR = 500; //服务器端错误
int SC_BAD_GATEWAY =502; //网关错误
二、常见用法
1、向浏览器输出消息
resp.getWriter().print(data);
2、下载文件
- 要获取下载文件的路径
- 下载的文件名是什么
- 设置想办法让浏览器能够支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入到buffer缓冲区
- 使用OutputStream将缓冲区中的数据输出到客户端
servlet.java:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、要获取下载文件的路径
//String path = this.getServletContext().getRealPath("/1.png"); 无法获取
//System.out.println(path); //C:\Users\yili\Desktop\LingNan\JAVA\Environment\Tomcat\apache-tomcat-9.0.44\webapps\re\1.png
//target下资源的路径
String path ="C:\\Users\\yili\\Desktop\\LingNan\\JAVA\\javaweb-02-maven\\HelloServletResponse\\target\\HelloServletResponse\\WEB-INF\\classes\\1.png";
//2、下载的文件名是什么
String filename = path.substring(path.lastIndexOf("\\") + 1);//1.png
//3、设置想办法让浏览器能够支持下载我们需要的东西
resp.setHeader("Content-Disposition", "attachment;filename="+filename);
//4、获取下载文件的输入流
FileInputStream is = new FileInputStream(path);
//5、创建缓冲区
int len =0;
byte[] buffer =new byte[1024];
//6、获取OutputStream对象 将流响应回去
ServletOutputStream outputStream = resp.getOutputStream();
//7、将FileOutputStream流写入到buffer缓冲区
while ((len=is.read(buffer))!=-1){
// 8、使用OutputStream将缓冲区中的数据输出到客户端
outputStream.write(buffer,0,len);
}
//9、关闭输入流和输出流
is.close();
outputStream.close();
}
3、验证码
servlet.java
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//让浏览器5秒刷新一次
resp.setHeader("refresh","5");
//在内存中创建一个图片
BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB); //参数 长 宽 颜色
//得到图片
Graphics2D graphics = (Graphics2D) image.getGraphics(); //画笔
//设置图片的背景颜色
graphics.setColor(Color.pink);
graphics.fillRect(0,0,80,20); //从(0,0)填充到(80,20)
//给图片写数据
graphics.setColor(Color.blue); //颜色
graphics.setFont(new Font(null,Font.BOLD,20)); //字体
graphics.drawString(roundnum(),0,20); //画字符串
//告诉浏览器这个请求用图片的方式打开
resp.setContentType("image/jpeg"); //规定image/jpeg 请求将是图片
//网站有缓存, 不让浏览器缓存
resp.setDateHeader("expires",-1); //让浏览器不去缓存图片
resp.setHeader("Cache-Control","no-cache"); //缓存策略为不缓存
resp.setHeader("Pragma","no-cache");
//把图片写给浏览器 ImageIO专门写图片
ImageIO.write(image,"jpg",resp.getOutputStream());
}
//生成随机数方法
private String roundnum() {
Random random = new Random();
// 要点:1、9999 随机数4位 2、 + "" 变为字符串
String num = random.nextInt(9999) + "";
/*在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer*/
StringBuffer sb = new StringBuffer();
/*保证 随机数一定是4位数
如若生成随机数是3位 循环条件4-3 进入循环 则有一位用0补上
* */
for (int j = 0; j < 4 - num.length(); j++) {
sb.append("0");
}
num = sb.toString() + num;
System.out.println(num);
return num;
}
每5s刷新
并且是以图片的形式、就是因为设置了setContentType(“image/jpeg”)