Servlet学习

 

servlet的简介

什么叫servlet

servlet是运行在WEB服务器上的的java应用程序,可以生成动态WEB页面, 属于客户和服务器响应的中间层。

 

  • servlet就是sun公司开发动态web的一门技术

    • sun公司在这些API中提供一个接口叫servlet

    • 如果你想开发一个servlet的程序,需要完成以下两步

    • 1.编写一个类实现servlet接口

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

       

把实现servlet接口的java程序叫,servlet,(本质还是一个servlet)

 

 

  1. 创建maven项目的以一种方式

    1.1 构建一个普通的maven项目,删掉里面的src目录,以后学习就是在这个项目里面建立moudel,这个空的工程就是maven的主工程

    1.2 关于maven的父子工程的理解:

    父目录中会多出一个model标记

     <modules>
           <module>servlet01</module>
       </modules>

     

    子项目中会多出

      <parent>
           <artifactId>javaweb-02-servlet</artifactId>
           <groupId>com.kuang</groupId>
           <version>1.0-SNAPSHOT</version>
       </parent>

 

  1. MAVEN的准备工作

    1.将web.xml 改为最新的

    2.将maven的结构搭建完整 ,添加 “java文件夹”和resources文件夹

 

 

 

开始写第一个servlet程序

1.编写一个类继承HttpServlet  

image-20210509124412520

 

重写doGet 和doPost()方法

 

2.写好后,编写servlet映射

为什么要映射 ,因为我们写的java程序,但是想在浏览器访问,而浏览器需要连接web服务器(这里使用tomca服务器),所以我们在web服务中注册我们写的servlet,还需要给它一个能访问的路径

 

 

Servlet原理

Servlet是由WEB服务器,WEB服务器在收到浏览器请求后

 

 

 

servlet 的映射路径优先级问题

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

例如 默认的 /*

image-20210509210800673

指定了 /hell

image-20210509210839509

 

 

 

ServletContext

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

作用

1. 共享数据   :我在这个Servlet保存的数据,可以在另一个Servlet中拿到

 

ServletContext的 存储值的方式

image-20210510164212416

 

另一个servlet获取 ServletContext获取值的方式

image-20210510164338889

 

 

ServletContext读取配置文件

 

  1. 获取ServletContext对象

  2. 调用读取配置的方法 InputStean getResourceAsStream();

image-20210510205742706

配置文件的路径解释: 当前目录下, WEB-INF/classes/ 下的db.properties

 

  1. 创建Properties对象 , 并加载

  2. Properties p=new Properties();
    p.load(is);
  3. 读取配置文件db.properties的属性

    String username = p.getProperty("username");
    String password = p.getProperty("password");

     

接下来学习 HttpServletResponse and HttpServletRequest

 

响应状态码

1.  200 : 请求响应成功
  2. 3xx : 请求重定向
  3. 4xx : 找不到资源
  4. 5xx:   服务器代码错误    

 

 

 

 

实现一个验证码

  1. 让网页3秒刷新一次

      resp.setHeader("refresh","3");
  2. 在内存中创建一张验证码图片

    image-20210511204346602

    生成的图片就是一个黑框 , 设置其属性

     

    步骤

    image-20210511204515173

     

 

重定向 (Redirect) and 请求转发的区别 (面试题)

 

相同点: 页面都会发生跳转

 

不同点: 重定向(页面跳转的同时,地址栏也会跟着跳转) 请求转发 (地址栏不会发生变化)

 

 ${pageContext.request.contextPath}    //这样部署,路径永远都是正确的, (代码的意思:代表当前项目)  

 

 

请求转发 req.getRequestDispatcher(" 路径").forword(req,resp);

 req.getRequestDispatcher(req.getContextPath()+"success.jsp").forward(req,resp)  // 报错 /r/r/success.jsp   
     //为什么出现这个错误   因为 “/”已经代表的是当前项目, req.getContextPath()--》也是代表当前项目,所以会出现/r/r/success.jsp
    
     
//请求转发正确写法
      req.getRequstDispatcher("/success.jsp").forwoar(req,resp);

     
     
     

 

重定向 resp.senRedirect("路径");

resp.senRedirect(req.getContextPath()+"/success.jsp")    //不会报错