客户端向服务器发送http请求,则会产生HttpServl
uest对象给服务器。HttpServletRequest封装了客户端的信息,服务器servlet程序可以通过request对象操纵客户端的信息.HttpServletRequest是ServletRequest的子接口,因为ServletRequest没有与HTTP相关的api,而HttpServletRequest增加了与HTTP协议相关的api。
常用状态码:
200--请求处理成功
302--客户段重定向
304--客户端访问资源没有被修改,客户端访问本地资源
404--访问资源不存在
500--服务器内部出错
常用api:
response.setstatus
通过response实现重定向
response.setStatus(302);
response.setHeader("Location", "/day06/aweiyo.html"); 浏览器重定向到aweiyo.html页面
// / 由客户端定向服务器,代表客户端 / , 必须添加工程虚拟目录
用户登录错误,返回到首页的重定向案例~
public class ResponseServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获得客户端的用户名和密码
String uesrname=request.getParameter("username");
String password=request.getParameter("password");
//判断是否用户名,密码是否正确,假设用户名和密码都是admin
if("admin".equals(uesrname)&&"admin".equals(password)){
response.setStatus(302);
response.setHeader("Location", "/welcome.html");
//response.sendRedirect("Location", "/welcome.html");此局可以完成上面的效果,所以一般也是用这种写法
}else{
response.setStatus(302);
response.setHeader("Location", "/response/login.html");
//response.sendRedirect( "/response/login.html");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
自动跳转还可以使用meta:在HTML中加入下面代码
<meta content="3;url=/day06/response/demo03/result.html" http-equiv="refresh">
通过servlet禁止缓存,以下三行代码~
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("expires", -1);
response生成客户端的响应
response.setContentType("text/html;charset=utf-8");
开发中只需要使用setContentType 就可以了
响应流的注意事项:
1、getOutputStream和getWriter 不能同时使用
2、必须在getOutputStream和getWriter 之前 设置响应 编码
3、getOutputStream和getWriter 输出内容 是 HTTP响应体
4、getOutputStream和getWriter 存在缓冲区的 ,在service方法结束时,自动关闭流,flush缓冲区内容
通过response实现文件下载
第一种:通过超链接 完成文件下载
* 如果浏览器可以识别该文件格式,直接打开,只有链接文件浏览器不识别文件格式,才会实现下载
第二种:通过Servlet程序实现下载
原理:通过Servlet读取目标程序,将资源返回客户端
通过程序下载文件 设置两个头信息 Content-Type Content-Disposition
response.setContentType(getServletContext().getMimeType(filename)); ---- 设置文件类型
response.setHeader("Content-Disposition", "attachment;filename="+ filename); ---- 设置文件以附件形式下载(对于浏览器识别格式文件)
通过response生成验证码
public class ResponseServlet7 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
int width=120;
int height=30;
//创建一张内存中的缓存图片
BufferedImage bufferedimage=new BufferedImage(width,height, BufferedImage.TYPE_INT_RGB);
//设置背景色
Graphics graphics=bufferedimage.getGraphics();
graphics.setColor(Color.yellow);
graphics.fillRect(0, 0, width, height);
//画边框
graphics.setColor(Color.blue);
graphics.drawRect(0, 0, width-1, height-1);//必须长宽都减一,否则覆盖了
//写验证码内容
graphics.setColor(Color.red);
graphics.setFont(new Font("宋体", Font.BOLD, 18));
String context ="1234567890qwertyuiopsadfghjklzxcvnbm";
//从验证码内容中随机抽取四个字
Random random=new Random();
int x=30;//一个验证码的长
int y=20;//一个验证码的宽
for(int i=0;i<4;i++){
int index=random.nextInt(context.length());
char letter=context.charAt(index);
graphics.drawString(letter+"", x, y);//把一个字符变成字符串最简便的方法是该字符+""
x+=20;
}
//随机释放干扰线
int x1,x2,y1,y2;
graphics.setColor(Color.LIGHT_GRAY);
for(int i=0;i<10;i++){
x1=random.nextInt(width);
x2=random.nextInt(width);
y1=random.nextInt(height);
y2=random.nextInt(height);
graphics.drawLine(x1, y1, x2, y2);
}
//释放图形资源
graphics.dispose();
//将图片输出到浏览器 ImageIo
//将内存的图片成3gp格式到浏览器
ImageIO.write(bufferedimage, "jpg", response.getOutputStream());
System.out.println("00");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}