HTTPservlet简单学习:下载文件,验证码动态图片生成,请求重定向

本文介绍了Java Web开发中的Maven及其核心思想,深入讲解了Servlet,包括ServletContext对象的作用、HttpServletRequest和HttpServletResponse的功能。重点讨论了如何使用HttpServletResponse进行文件下载、验证码生成和请求重定向,并分析了重定向与转发的区别。
摘要由CSDN通过智能技术生成

Java web学习

Maven

背景:

  1. javaweb开发中需要大量的jar包
  2. 让一个东西自动导入和配置jar包

Maven:架构管理工具

**核心思想:**约定大于配置

  • 有约束,不要去违反

Maven会规定你该如何去编写java代码

Servlet

简介

  • sun公司开发动态web的一门技术
  • Sun在这些api中提供了一个接口,叫做Servlet
    1. 编写类,实现Servlet接口
    2. 部署到web服务器中

ServletContext对象

web容器在启动的时候,它会为每一个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用

this.getInitParameter() //获取 初始化参数
this.getServletConfig() //获取Servlet的配置
this.getServletContext() //获取ServletContext对象
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        ServletContext servletContext = req.getServletContext();
    }

作用
  • 实现Servlet之间的数据共享

  • 可以保存一些东西

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doGet(req, resp);
            ServletContext servletContext = req.getServletContext();
            String username ="测试";
            servletContext.setAttribute("username",username);//将一个数据保存在ServletContext,名字为username,值为username
            
        }
    
RequestDispatcher getRequestDispatcher(String var1);
servletContext.getInitParameter(); //获取web应用的初始化参数(在web.xml中)
//请求转发
servletContext.getRequestDispatcher(String s);//获取转发的请求路径
requestDispatcher.forward(req,resp);  //调用forward实现请求转发,但浏览器的url不会改变
读取资源文件,把文件变成流

Properties

  • 在java目录下新建properties
  • 在resources目录下新建properties

都被打包同一个路径下:classes,类路径:classpath

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
        ServletContext servletContext = req.getServletContext();
        servletContext.getInitParameter();
        RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/jdbc.find");
        requestDispatcher.forward(req,resp);
        Properties properties=new Properties();
        InputStream is =servletContext.getResourceAsStream("/WEB-INF/classes/db.properties");
        properties.load(is);
        properties.getProperty("username")
    }

HttpServletRequest

HttpServletRequest代表客户端的请求,用户通过http协议访问服务器,http请求中的所有信息会被封装HttpServletRequest,通过HttpServletRequest可以获取客户端的所有信息

1.获取前端传递的参数
String getParameter(String var1);//常用
Enumeration<String> getParameterNames();
String[] getParameterValues(String var1);//常用
Map<String, String[]> getParameterMap();

后台接收中文乱码问题

req.setCharacterEncoding("UTF-8");
2.请求转发
RequestDispatcher getRequestDispatcher(String var1);
void forward(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;

HttpServletResponse

响应:

web服务器接收到客户端的http请求,针对这个请求,分别创建代表请求的HttpServletRequest对象,一个代表响应的HttpResponse

分类
负责向浏览器发送数据的方法
PrintWriter getWriter() throws IOException;
ServletOutputStream getOutputStream() throws IOException
负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);

void setContentLength(int var1);

void setContentLengthLong(long var1);

void setContentType(String var1);

void setHeader(String var1, String var2);

void setStatus(int var1);

常见应用
1.向浏览器输出消息
2.下载文件
  • 要获取下载文件的路径

  • 下载的文件名

  • 设置让浏览器支持下载我们需要的东西

  • 获取下载文件的输入流

  • 创建缓冲区

  • 获取IntputStream对象

  • 将FileIntputStream流写入到buffer缓冲区

  • 使用OutputSteam将缓冲区的数据输入到客户端

    public class Demo5 extends HelloServlet{
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doGet(req, resp);
    //                - 要获取下载文件的路径
            String realpath=this.getServletContext().getRealPath("/1.png");
    //                - 下载的文件名
            realpath.substring(realpath.lastIndexOf("//")+1);
    //                - 设置让浏览器支持下载我们需要的东西
            resp.setHeader("Content-Disposition", "attachment; filename=\"" + new String(fileName.getBytes(),"ISO-8859-1”) + "\"");
    //                - 获取下载文件的输入流
            FileInputStream fileInputStream =new FileInputStream(realpath);
    //                - 创建缓冲区
            int len =0;
            byte[] buffer=new byte[1024];
            //                - 获取IntputStream对象
            ServletOutputStream out =resp.getOutputStream();
    //                - 将FileIntputStream流写入到buffer缓冲区
            while((len=fileInputStream.read(buffer))>0)
            {
                out.write(buffer,0,len);
            }
    //                - 使用OutputSteam将缓冲区的数据输入到客户端
    
            out.close();
            fileInputStream.close();
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
                           }
    
3.验证码功能

后端实现java图片类(生成一个图片验证码)

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //让浏览器5秒自动刷新一次
        resp.setHeader("refresh","5");

        //在内存中创建一个图片
        BufferedImage bufferedImage=new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);

        //得到图片
        Graphics2D graphics= (Graphics2D) bufferedImage.getGraphics();
        //设置图片的背景颜色
        graphics.setColor(Color.black);
        graphics.fillRect(0,0,80,20);
        //给图片写数据
        graphics.setColor(Color.cyan);
        graphics.setFont(new Font(null,Font.ITALIC,20));
        graphics.drawString(makeNum(),0,20);
        
        //告诉浏览器,这个请求用图片的方式打开
        resp.setContentType("image/jpeg");
        //网站存在缓存,不让浏览器存缓存
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragme","no-cache");
        //把图片写给浏览器
        ImageIO.write(bufferedImage,"jpg",resp.getOutputStream());
    }
    //生成随机数
    private String makeNum()
    {
        Random random = new Random();
        String s =random.nextInt(9999999)+"";
        StringBuffer stringBuffer = new StringBuffer();
        //用0填充,使其成为8位
        for (int i=0;i<8-s.length();i++)
        {
            stringBuffer.append("0");
        }
        return stringBuffer.toString()+s;
    }
4.实现重定向

一个web资源收到客户端请求后,会通知客户端去访问另外一个web资源,这个过程叫重定向img

void sendRedirect(String var1) throws IOException;
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /* 重定向的实质
        resp.setHeader("Location","/r/index.jsp");
        resp.setStatus(302);
         */
        resp.sendRedirect("/index.jsp");
    }

面试题:重定向和转发的区别?

相同:

  • 页面会实现跳转

不同

  • url会不会产生变化 307,302
${pageContext.request.contextPath} <%--获取当前web目录--%>
        resp.setHeader("Location","/r/index.jsp");
        resp.setStatus(302);
         */
        resp.sendRedirect("/index.jsp");
    }

面试题:重定向和转发的区别?

相同:

  • 页面会实现跳转

不同

  • url会不会产生变化 307,302
${pageContext.request.contextPath} <%--获取当前web目录--%>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值