千家信息网

Java中的小服务程序Servlet实例分析

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,本篇内容主要讲解"Java中的小服务程序Servlet实例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java中的小服务程序Servlet实例分析"
千家信息网最后更新 2025年02月02日Java中的小服务程序Servlet实例分析

本篇内容主要讲解"Java中的小服务程序Servlet实例分析",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java中的小服务程序Servlet实例分析"吧!

Servlet

1 Servlet 简介

Servlet就是Sun 公司开发动态web的一门技术

Sun在这些API中提供一个接口叫做:Servlet ,如果你向开发一个Servlet程序,只需要完成两个小步骤

  • 编写一个类,实现Servlet接口

  • 把开发好的Java类部署到web服务器中

把实现Servlet接口的Java程序叫做 Servlet

2 HelloServlet

构建一个普通的Maven项目,删除里面的src目录。这个空的工程就是Maven主工程

关于Maven父子工程的理解:

父项目中会有

        servlet-02    

子项目中会有

         javaweb-02-servlet        com.srx        1.0-SNAPSHOT    

父项目中的Java子项目可以直接使用

son  extends father

Maven环境优化

  1. 修改web.xmd为最新的

  2. 将maven的结构搭建完整

编写一个Servlet程序

编写Servlet的映射

为什么需要映射,我们系的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet 还需要给他一个浏览器 能够访问的路径

            hello        com.srx.HellowServlet                    hello        hello    

配置Tomcat

注意:配置项目发布的路径就可以了

启动测试 欧克

3 Servlet 原理

servlet 是由web服务器调用,wev服务器在收到浏览器请求之后

4 Mapping 问题

一个Servlet 可以指定一个映射路径


一个Servlet 可以指定多个映射路径

    hello    /hello    hello    /hello1    hello    /hello2    hello    /hello3

一个Servlet 可以指定通用映射路径

    hello    /hello/*

默认请求路径

    hello    /*

指定一些后缀或者前缀等等…

    hello    *.abc

优先级问题

指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;

             error        com.srx.Error                error        /*    

5 servletContext

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

1.共享数据

我在这个Servlet中保存的数据,可以在另外一个servlet中拿到

存放数据的类

public class test extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //this.getInitParameter(); //初始化参数        //this.getServletContext(); // servlet 上下文        //this.getServletConfig();   servlet 配置        ServletContext servletContext = this.getServletContext();        String username="我爱学习";        //将一个数据保存在ServletContext中 名字为 uesrname  值为 username        servletContext.setAttribute("username",username);        System.out.println("hello");    }}

输出的类

public class show  extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        ServletContext servletContext = this.getServletContext();        resp.setContentType("text/html");        resp.setCharacterEncoding("utf-8");        String username = (String) servletContext.getAttribute("username");        resp.getWriter().print("姓名:"+username);    }}

配置的文件

          test         com.srx.test               test       /test                   getc        com.srx.show                    getc        /getc    

测试访问结果

2.获取初始化参数

          url        JDBC:mysql//localhost:3306/mybatis  

测试类

public class context extends HttpServlet {    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        ServletContext Context = this.getServletContext();        String url = Context.getInitParameter("url");       resp.getWriter().print(url);    }}

路径

         url        com.srx.context                url        /url    

3.请求转发

public class ServletDemo extends HttpServlet {    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        System.out.println("进入了这个方法");        ServletContext context = this.getServletContext();//        RequestDispatcher zf = context.getRequestDispatcher("zf");   //转发的路径//        zf.forward(req,resp);   //调用forward 方法 实现转发        //简写        context.getRequestDispatcher("/getc").forward(req,resp);    }}
            zzz        com.srx.ServletDemo                    zzz        /zzz    


4.读取资源文件

properties

  • 在java目录中新建properties

  • zairesource目录下新建properties

发现:都被打包到了同一个路径下;classes 我们俗称这个路径为classpath;

思路: 需要一个文件流

public class ServletDemo1 extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");        Properties prop = new Properties();        prop.load(is);        String user = prop.getProperty("username");        String pwd = prop.getProperty("password");        resp.getWriter().print(user+":"+pwd);    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req,resp);    }}

映射

           bbb        com.srx.ServletDemo1                    bbb        /bbb    

6、HttpServletResponse

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

  • 如果获取客户端请求过来的参数 找 httpServletRequest

  • 如果要给客户端响应一些信息:找HttpServletResponse

1下载文件

向浏览器输出信息

2 下载文件

  • 要获取下载文件的路径

  • 下载的文件名是啥

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

  • 获取下载文件的输入流

  • 创建缓冲区

  • 获得OutputStream对象

  • 将FileOutputStream流写入到Buffer缓冲区

  • 使用OutputStream将缓冲区中的数据输出到客户端。

案例

public class FileServlet  extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//    - 要获取下载文件的路径        String realPath = "D:\软件安装路径\javaweb-02-servlet\response\target\classes\111.png";        System.out.println("文件的下载路径"+realPath);//    - 下载的文件名是啥        String substring = realPath.substring(realPath.lastIndexOf("\") + 1);//    - 设置想办法让浏览器支持下载我们所需要的东西        resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(substring,"utf-8"));//    - 获取下载文件的输入流        FileInputStream in = new FileInputStream(realPath);//    - 创建缓冲区        int len = 0;        byte[] buffer=new byte[1024];//    - 获得OutputStream对象        ServletOutputStream outputStream = resp.getOutputStream();//    - 将FileOutputStream流写入到Buffer缓冲区 使用OutputStream将缓冲区中的数据输出到客户端        while ((len=in.read(buffer))>0){            outputStream.write(buffer,0,len);        }        in.close();        out.close();    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {       doGet(req, resp);    }}

3 随机刷新的验证码图片

public class ImgServlet  extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //使浏览器2秒刷新一次;        resp.setHeader("refresh","0.5");        //在内存中创建一个图片        BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);        //得到图片        Graphics2D g = (Graphics2D) image.getGraphics();  //笔        //设置图片的背景颜色        g.setColor(Color.white);        g.fillRect(0,0,80,20);        //给图片写数据        g.setColor(Color.BLUE);        g.setFont(new Font(null,Font.BOLD,20));        g.drawString(makeNum(),0,20);        //告诉浏览器 请求图片的方式打开        resp.setContentType("image/jpeg");        //网站存在缓存,不让浏览器缓存        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(9999999)+"";        StringBuffer sb = new StringBuffer();        for (int i = 0; i <7-num.length(); i++) {            sb.append("0");        }        num =sb.toString()+num;         return  num;    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req, resp);    }}

4 重定向

b一个web资源收到客户端a请求后,b他回通知a客户端去访问另一个web资源c,这个过程叫重定向

常见场景:

用户登录

void sendRedirect(String var1) throws IOException;

测试:

public class RedirectServlet  extends HttpServlet {    @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//        //具体实现//        resp.setHeader("Location","/rr/img");//        resp.setStatus(302);        //重定向        resp.sendRedirect("/rr/img");    }    @Override    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        doGet(req, resp);    }}

面试题:请你聊一聊重定向和转发的区别?

相同点:

  • 页面都会实现跳转

不同点:

  • 请求转发的时候 url不会产生变化

  • 重定向时候,url地址栏回发生变化

到此,相信大家对"Java中的小服务程序Servlet实例分析"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0