一、概述
在创建 servlet 时会覆盖 service() 方法,或 doGet()/doPost() ,这些方法都有两个参数,一个为代表请求的 request 和代表响应的 response 。 service 方法中的 response 的类型是 ServletResponse ,而 doGet/doPost 方法的 response 的类型是 HttpServletResponse,HttpServletResponse 是ServletResponse的子接口,功能和方法更加强大。
二、流程
三、HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表相应的一个HttpServletResponse:
- 如果要获取请求的参数:HttpServletRequest
- 如果要给客户端相应一些信息:HttpServletResponse
简单分类
ServletOutputStream getOutputStream() throws IOException;
PrintWriter getWriter() throws IOException;
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);
void setStatus(int var1);//设置状态码
/*状态码不需要记忆,忘掉建议百度,常见的为404,500,200*/
常见应用
- 向浏览器输出东西
下载文件—-上传文件
(1). 获取下载文件的路径 (2). 获取下载的文件名 (3). 设置浏览器,让它能够支持我们的下载 (4). 获取下载文件的输入流 (5). 创建缓冲区 (6). 获取OutputStream对象 (7). 将获取的文件流写入到buffer缓冲区 (8). 使用OutputStream将缓冲区里面的文件刷入flush或close本地硬盘
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String realPath = "E:\\ideaWorkplace\\com.yu\\response\\src\\main\\resources\\1.jpg";
System.out.println("下载文件的路径:"+realPath);
String fileName = realPath.substring(realPath.lastIndexOf("//")+1);
resp.setHeader("Content-disposition","attachment;filename="+ URLEncoder.encode(fileName));
FileInputStream in = new FileInputStream(realPath);
int len=0;
byte[] buffer = new byte[1024];
ServletOutputStream out = resp.getOutputStream();
while ((len=in.read(buffer))!=-1){
out.write(buffer,0,len);
}
in.close();
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
验证码生成
前端实现
后端实现,需要用到java的图片类,产生一个图片
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(200,200,BufferedImage.TYPE_INT_RGB);
//开始画图
Graphics2D g=(Graphics2D) image.getGraphics();
//设置图片背景颜色
g.setBackground(Color.white);
g.fillRect(0,0,100,50);
//写入验证码
g.setColor(Color.GREEN);
g.setFont(new Font(null,Font.ROMAN_BASELINE,20));
g.drawString(makeNumber(),0,25);
//高速浏览器,这个请求用图片的方式打开
resp.setContentType("image/png");
//设置不让浏览器缓存图片
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Program","no-cache");
//把图片写给浏览器
boolean write = ImageIO.write(image,"png", resp.getOutputStream());
}
//生成随机数
private String makeNumber(){
Random r = new Random();
String num=r.nextInt(99999999)+"";
StringBuffer sBuffer = new StringBuffer();
for (int i = 0; i < 8-num.length(); i++) {
sBuffer.append("x");
}
return sBuffer.toString()+num;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
## 好了本篇文章就到这里啦,剩下的便是自行参悟喽
评论 (0)