Servlet简介

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

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

HelloServlet

Servlet接口在Sun公司有两个默认的实现类 HttpServlet,GenericServlet

构建一个普通的Maven项目 删除src目录 以后的学习在这个项目里建立Model
这个空的工程就是Maven主工程

关于父子工程的理解

父项目中会有一个

  1. <modules>
  2. <module>servlet-01</module>
  3. </modules>

子项目中会有一个

  1. <parent>
  2. <artifactId>javaweb-02-servlet</artifactId>
  3. <groupId>org.example</groupId>
  4. <version>1.0-SNAPSHOT</version>
  5. </parent>

父项目中的jar包子项目可以使用

Maven环境优化
修改web.xml为最新的
将Maven的结构搭建完整
编写一个Servlet程序
编写一个普通类
实现SerVlet接口 继承HttpServlet

  1. package com.deng.servlet;
  2. import javax.servlet.ServletException;
  3. import javax.servlet.ServletOutputStream;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import java.io.IOException;
  8. import java.io.PrintWriter;
  9. public class HelloServlet extends HttpServlet {
  10. //由于get和post只是请求实现的不同方式 可以互相调用 业务逻辑都一样
  11. @Override
  12. protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
  13. PrintWriter writer = response.getWriter(); //响应流
  14. //ServletOutputStream outputStream = response.getOutputStream();
  15. writer.println("Hello Servlet");
  16. }
  17. @Override
  18. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  19. doPost(req, resp);
  20. }
  21. }

编写Servlet的映射

  • 为什么需要映射
    • 写的是java代码 但是需要通过服务器访问 而浏览器需要连接web服务器 所以需要 在web服务中注册servlet 还需要给他一个浏览器能够访问的路径

配置tomcat

Servlet原理

Servlet是由web服务器调用 web服务器在收到浏览器请求之后,会
image.png

Mapping问题

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

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

    1. <servlet-mapping>
    2. <servlet-name>hello</servlet-name>
    3. <url-pattern>/hello </url-pattern>
    4. </servlet-mapping>
    5. <servlet-mapping>
    6. <servlet-name>hello</servlet-name>
    7. <url-pattern>/hello1 </url-pattern>
    8. </servlet-mapping>
    9. <servlet-mapping>
    10. <servlet-name>hello</servlet-name>
    11. <url-pattern>/hello2 </url-pattern>
    12. </servlet-mapping>
  • 一个Servlet可以指定通用映射路径

    1. <servlet-mapping>
    2. <servlet-name>hello</servlet-name>
    3. <url-pattern>/hello/* </url-pattern>
    4. </servlet-mapping>
  • 默认请求路径

    1. <servlet-mapping>
    2. <servlet-name>hello</servlet-name>
    3. <url-pattern>/* </url-pattern>
    4. </servlet-mapping>
  • 指定后缀(前面不能加/)

    1. <servlet-mapping>
    2. <servlet-name>hello</servlet-name>
    3. <url-pattern>*.deng </url-pattern>
    4. </servlet-mapping>

    优先级问题

    指定了固有的映射、路径优先级最高

    ServletContexct(实现数据共享)

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

  • 共享数据

    • 我在这个SerVlet中保存的数据 可以在另外一个servlet中拿到 ```java //在这个Servlet中为ServletContext添加数据 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置默认编码格式 resp.setContentType(“text/html”); resp.setCharacterEncoding(“utf-8”); ServletContext context = this.getServletContext(); String name = “deng”; //数据 context.setAttribute(“username”,name); //将一个数据以键值对的形式保存在ServletContext中

      } //在这个Servlet中从ServletContext获取数据 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); Object username = context.getAttribute(“username”); resp.setContentType(“text/html”); resp.setCharacterEncoding(“utf-8”); resp.getWriter().println(username); }

  1. ```java
  2. <!--配置XML-->
  3. <servlet>
  4. <servlet-name>set</servlet-name>
  5. <servlet-class>com.deng.servlet.HelloServlet</servlet-class>
  6. </servlet>
  7. <!--Servlet映射-->
  8. <servlet-mapping>
  9. <servlet-name>set</servlet-name>
  10. <url-pattern>/setname</url-pattern>
  11. </servlet-mapping>
  12. <!--配置XML-->
  13. <servlet>
  14. <servlet-name>get</servlet-name>
  15. <servlet-class>com.deng.servlet.GetServlet</servlet-class>
  16. </servlet>
  17. <servlet-mapping>
  18. <servlet-name>get</servlet-name>
  19. <url-pattern>/getname</url-pattern>
  20. </servlet-mapping>

获取初始化参数

  1. <!--web.xml-->
  2. <!--以键值对的方式-->
  3. <context-param>
  4. <param-name>url</param-name>
  5. <param-value>jdbc:mysql://localhost:3306</param-value>
  6. </context-param>

获取初始化参数

  1. @Override
  2. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  3. ServletContext servletContext = this.getServletContext();
  4. resp.setCharacterEncoding("utf-8");
  5. resp.setContentType("text/html");
  6. //获取初始化参数
  7. String url = servletContext.getInitParameter("url");
  8. resp.getWriter().println(url);
  9. }

请求转发

  1. <servlet>
  2. <servlet-name>Demo4</servlet-name>
  3. <servlet-class>com.deng.servlet.ServletDem04</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>Demo4</servlet-name>
  7. <url-pattern>/demo4</url-pattern>
  8. </servlet-mapping>
  1. @Override
  2. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  3. ServletContext context = this.getServletContext();
  4. //转发的请求路径
  5. RequestDispatcher dispatcher = context.getRequestDispatcher("/get");
  6. dispatcher.forward(req,resp); //调用forward实现请求转发
  7. //context.getRequestDispatcher("/get").forward();
  8. }

请求转发和重定向分析图
image.png

读取资源文件

properties类

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

发现:都被打包到了同一个路径下,classes(类路径)、

  1. //db.properties
  2. Driver=driver
  3. url=jdbc:mysql://localhost:3306/mybaties
  4. username=tom
  5. password = 123321
  1. <servlet>
  2. <servlet-name>prop</servlet-name>
  3. <servlet-class>com.deng.servlet.PropertiesServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>prop</servlet-name>
  7. <url-pattern>/prop</url-pattern>
  8. </servlet-mapping>
  1. @Override
  2. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  3. ServletContext context = this.getServletContext();
  4. //将文件转为输入流(相对位置)
  5. InputStream stream = context.getResourceAsStream("WEB-INF/classes/db.properties");
  6. //new一个Properties对象并读入数据
  7. Properties properties = new Properties();
  8. properties.load(stream);
  9. //获取数据
  10. String username = properties.getProperty("username");
  11. String password = properties.getProperty("password");
  12. resp.getWriter().println(username+" "+password);
  13. }