Servlet的学习 B站笔记

Servlet

1.Servlet简介

  • Servlet就是sun公司开发动态web的一门技术
  • Sun在这些API中提供了一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:
    • 编写一个类,实现Servlet接口
    • 把开发好的Java类部署到WEB服务器中

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

2.HelloServlet

  1. 创建一个普通的maven项目,删掉里面的src目录,以后的学习就在这个目录里面建立Moudel;这个工程就是Maven主工程;

  2. 关于Maven父子工程的理解:

    父项目中会有

    	<modules>
            <module>servlet-01</module>
    	</modules>
    

    子项目会有

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

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

    son extends  father
    
  3. Maven环境优化

    1. 修改web.xml为最新
    2. 将maven的结构搭建完整
  4. 编写一个Servlet程序

    1. 编写一个普通类

    2. 实训Servlet接口,这里我们直接继承HttpServlet

      public class HelloServlet extends HttpServlet {
          //由于get或者post只是请求实现不同的方式,可以相互调用,业务逻辑都一样;
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      
              //ServletOutputStream outputStream = resp.getOutputStream();
              PrintWriter writer = resp.getWriter();//响应流
              writer.print("Hello Servlet");
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              super.doPost(req, resp);
          }
      }
      
  5. 编写Servlet的映射

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

    <!--注册Servlet-->
        <servlet>
            <servlet-name>hello</servlet-name>
            <servlet-class>com.su.servlet.HelloServlet</servlet-class>
        </servlet>
      <!--Servlet的请求路径-->
        <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello</url-pattern>
        </servlet-mapping>
    
  6. 配置Tomcat

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

  7. 启动测试 ok!

Servlet原理

Servlet是又web服务器调用,web服务器在收到浏览器请求之后,会:

Mapping问题

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

    <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
  2. 一个Servlet可以指定多个映射路径

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

  4. 默认请求路径

  5. 指定一些后缀或者前缀等等

  6. 优先级问题

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

    <!--404-->
        <servlet>
            <servlet-name>error</servlet-name>
            <servlet-class>com.su.servlet.ErrorServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>error</servlet-name>
            <url-pattern>/*</url-pattern>
        </servlet-mapping>
    </web-app>
    

ServletContext(上下文)

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

  1. 共享数据

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

    public class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            //this.getInitParameter() 初始化参数
            //this.getServletConfig() Servlet配置
            //this.getServletContext() Servlet上下文
            ServletContext context = this.getServletContext();
            String username = "苏伟良";//数据
            context.setAttribute("username",username);//将一个数据保存在了ServletContext中,名字为:username,值为:username
            System.out.println("Hello");
    
        }
    }
    
    public class GetServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context = this.getServletContext();
            String username = (String) context.getAttribute("username");
            resp.setContentType("text/html");
            resp.setCharacterEncoding("utf-8");
            resp.getWriter().print("名字"+username);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        }
    }
    
    </servlet>
        <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <url-pattern>/hello</url-pattern>
        </servlet-mapping>
        <servlet>
            <servlet-name>name</servlet-name>
            <servlet-class>com.su.servlet.GetServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>name</servlet-name>
            <url-pattern>/name</url-pattern>
        </servlet-mapping>
    

    测试访问结果;

  2. 获取初始值参数

    <!--配置一些web应用初始化参数-->
        <context-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306.mybatis</param-value>
        </context-param>
    
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context = this.getServletContext();
            String url = context.getInitParameter("url");
            resp.getWriter().print(url);
        }
    
  3. 请求转发

     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context = this.getServletContext();
            System.out.println("进入了Demo04");
            //RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//转发的请求路径
            //requestDispatcher.forward(req,resp);//调用forward实现请求转发;
            context.getRequestDispatcher("/gp").forward(req,resp);
        }
    
  4. 读取资源文件

    properties

    • 在java目录下创建properties
    • 在resources目录下创建properies

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

posted @ 2021-07-07 09:24  WELLZZZ  阅读(41)  评论(0)    收藏  举报