web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest
对象,代表响应的一个HtpServletResponse
如果要获取客户端请求过来的参数:找HttpServletRequset
如果要给客户端响应一些信息: 找HttpServletResponse
HttpServletResponse
1.简单分类
(1)负责向浏览器发送数据的方法
getOutPutStream() //写文件
getWrite() //写汉字
(2)负责向浏览器发送响应头的方法
setCharacterEncoding(String var1)
setContentLength(int var1)
setContentLengthLong(long var1)
setContentType(String var1)
setDateHeader(String var1,long var2)
addDateHeader(String var1,long var2)
setHeader(String var1,long var2)
addHeader(String var1,long var2)
setIntHeader(String var1,long var2)
addIntHeader(String var1,long var2)
(3)响应的状态码
2.常见应用
(1)向浏览器输出消息
(2)下载文件
public class FileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ①要获取下载文件的路径
String realPath = “E:\IDEAStudy\ServletTest\servlet2\src\main\resources\1.jpg”;
// String realPath = this.getServletContext().getRealPath("/1.png");
// ②下载的文件名是什么?
String filename = realPath.substring(realPath.lastIndexOf("\" + 1));
// realPath.substring(realPath.lastIndexOf("\\"+1);
// ③设置想办法让浏览器能够支持下载我们需要的东西 Web头文件 中文文件名URLEncoder.encode()编码,否则有可能乱码;
resp.setHeader(“Content-Disposition”,“attachment;filename=”+ URLEncoder.encode(filename,“utf-8”));
// ④获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
// ⑤创建缓冲区
int len = 0;
byte[] buffer= new byte[1024];
// ⑥获取OutPutStream对象
ServletOutputStream out = resp.getOutputStream();
// ⑦将FileOutPutStream流写入到buffer缓冲区
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
// ⑧使用OutPutStream将缓冲区中的数据输出到客户端
过程报错
错误:java: Compilation failed: internal java compiler error
原因:JDK版本问题
解决1.查看工程jdk
2.查看模块jdk
3.查看编译器版本
maven项目pom引入依赖
org.apache.maven.plugins
maven-compiler-plugin
1.8
1.8
(3)验证码功能
验证码怎么来?
前端实现
后端实现 Java的图片类Image类
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.white);//颜色
graphics.fillRect(0,0,80,20);//填充颜色 坐标
//给图片写数据
graphics.setColor(Color.blue);
graphics.setFont(new Font(null,Font.BOLD,20));
graphics.drawString(makeNum(),0,20);
//告诉浏览器 这个请求用图片的方式打开
resp.setContentType(“image/png”);
//网站存在缓存,不让浏览器缓存
resp.setDateHeader(“expires”,-1);
resp.setHeader(“Cache-Control”,“no-cache”);
resp.setHeader(“Pragma”,“no-cache”);
//把图片写给浏览器
ImageIO.write(image,“jpg”,resp.getOutputStream());
}
//生成随机数
private String makeNum(){
Random random = new Random();
String num = random.nextInt(9999) + ""; //随机生成0-9999的的一个整数
StringBuffer sb = new StringBuffer();
for(int i = 0;i < 4-num.length();i++){ //保证必定为4位 如果生成的整数不足四位,用0填补
sb.append("0");
}
num = sb.toString() + num;
return num;
}
(4)实现重定向
一个Web资源B收到客户端A请求后,B会通知A 去访问另外一个web资源C,这个过程叫重定向
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*resp.setHeader("Location","/r/imageServlet");
resp.setStatus(302);*/ //HttpServletResponse
resp.sendRedirect("/r/imageServlet");
}
重定向与转发的区别
相同点:页面都会实现跳转
不同点:
请求转发的时候 url不会变化 307
重定向的时候,url地址栏会发生变化 302
HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息
1.获取前端传递的参数
String getParameter()
String[] getParameterValue()
2.请求转发