title: 【学习之路】Servlet学习
draft: true
tags:


Servlet程序的实现代码

  1. 实现Servlet接口
  2. 重写service方法
  3. 到工程目录下的web.xml文件中去配置servlet程序访问地址
  1. public class HelloServlet implements Servlet {
  2. /**
  3. * service方法是专门用来处理请求和响应的
  4. * @param servletRequest
  5. * @param servletResponse
  6. * @throws ServletException
  7. * @throws IOException
  8. */
  9. @Override
  10. public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("Hello Servlet 被访问了");
  11. }
  12. }
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  3. version="4.0">
  4. <!-- servlet 标签给Tomcat 配置Servlet程序 -->
  5. <servlet>
  6. <!--servlet-name标签Servlet程序起一个别名(一般是类名)-->
  7. <servlet-name>HelloServlet</servlet-name>
  8. <!--servlet-class是Servlet程序的全类名-->
  9. <servlet-class>test.HelloServlet</servlet-class>
  10. </servlet>
  11. <!--servlet-mapping标签给servlet程序配置访问地址-->
  12. <servlet-mapping>
  13. <!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用-->
  14. <servlet-name>HelloServlet</servlet-name>
  15. <!--url-pattern标签配置访问地址 <br/>
  16. / 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径 <br/>
  17. /hello 表示地址为:http://ip:port/工程路径/hello <br/> -->
  18. <url-pattern>/hello</url-pattern>
  19. </servlet-mapping>
  20. </web-app>

常见错误

  1. 常见错误 :url-pattern 中配置的路径没有以斜杠打头:

Servlet - 图1

  1. 常见错误 :servlet-name 配置的值不存在:

Servlet - 图2

  1. 常见错误 :servlet-class 标签的全类名配置错误:

Servlet - 图3

Servlet的生命周期

  1. 执行Servlet构造器方法
  2. 执行init方法

第一步第二部是在第一次访问时调用

  1. 执行Service方法

第三步在每次访问时都会调用

  1. 执行destroy销毁方法

第四步在web工程停止的时候调用

通过HttpServlet实现Servlet程序

  1. 编写一个类继承Servlet类
  2. 更具业务需要重写doGet或doPost方法
  3. 到web.xml中的配置Servlet程序的访问地址
  1. public class HelloServlet2 extends HttpServlet {
  2. /**
  3. * doGet()在get请求的时候调用
  4. * @param req
  5. * @param resp
  6. * @throws ServletException
  7. * @throws IOException
  8. */
  9. @Override
  10. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  11. System.out.println("HelloServlet2 的 doGet 方法");
  12. }
  13. /**
  14. * doPost()在post请求的时候调用
  15. * @param req
  16. * @param resp
  17. * @throws ServletException
  18. * @throws IOException
  19. */
  20. @Override
  21. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  22. System.out.println("HelloServlet2 的 doPost 方法");
  23. }
  24. }

使用IDEA编辑器直接创建Servlet程序

Servlet - 图4

Servlet - 图5

Servlet类的继承体系

Servlet - 图6

ServletConfig类

  1. Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。
  2. Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对
    象。

  • ServletConfig类的三大作用

    1. 可以获取Servlet程序的别名 Servlet-name的值
    2. 获取初始化参数init-param
    3. 获取ServletContext对象
  • web.xml中 的配置
  1. <!-- servlet 标签给Tomcat 配置Servlet程序 -->
  2. <servlet>
  3. <!--servlet-name标签Servlet程序起一个别名(一般是类名)-->
  4. <servlet-name>HelloServlet</servlet-name>
  5. <!--servlet-class是Servlet程序的全类名-->
  6. <servlet-class>test.HelloServlet</servlet-class>
  7. <!--init-param是初始化参数-->
  8. <init-param>
  9. <!--是参数名-->
  10. <param-name>username</param-name>
  11. <!--是参数值-->
  12. <param-value>root</param-value>
  13. </init-param>
  14. <!--init-param是初始化参数-->
  15. <init-param>
  16. <!--是参数名-->
  17. <param-name>url</param-name>
  18. <!--是参数值-->
  19. <param-value>jdbc:mysql://localhost:3306/test</param-value>
  20. </init-param>
  21. </servlet>
  22. <!--servlet-mapping标签给servlet程序配置访问地址-->
  23. <servlet-mapping>
  24. <!--servlet-name标签的作用是告诉服务器,我当前配置的地址给哪个Servlet程序使用-->
  25. <servlet-name>HelloServlet</servlet-name>
  26. <!--
  27. url-pattern标签配置访问地址
  28. / 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
  29. /hello 表示地址为:http://ip:port/工程路径/hello
  30. -->
  31. <url-pattern>/hello</url-pattern>
  32. </servlet-mapping>
  • 注意点

重写init方法时要先super调用父类的方法super.init(config)将config参数进行储存

ServletContext类

  • ServletContext类的四个作用

    1. 获取web.xml中配置的上下文参数context-parm
    2. 获取当前工程的路径,格式:/工程路径
    3. 获取工程部署后在服务器硬盘上的绝对路径
    4. 像Map集合一样存取数据
  • ServletContext演示代码
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. // 1、获取web.xml中配置的上下文参数context-param
  3. ServletContext context = getServletConfig().getServletContext();
  4. String username = context.getInitParameter("username");
  5. System.out.println("context-param 参数 username 的值是:" + username);
  6. System.out.println("context-param 参数 password 的值是:" + context.getInitParameter("password"));
  7. // 2、获取当前的工程路径,格式: /工程路径
  8. System.out.println( "当前工程路径:" + context.getContextPath() );
  9. // 3、获取工程部署后在服务器硬盘上的绝对路径
  10. /**
  11. * /斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到IDEA代码的web目录
  12. */
  13. System.out.println("工程部署的路径是:" + context.getRealPath("/"));
  14. System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css"));
  15. System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" + context.getRealPath("/imgs/1.jpg"));
  16. }
  • web.xml中的配置
  1. <!--context-param是上下文参数(它属于整个web工程)-->
  2. <context-param>
  3. <param-name>username</param-name>
  4. <param-value>context</param-value>
  5. </context-param>
  6. <!--context-param是上下文参数(它属于整个web工程)-->
  7. <context-param>
  8. <param-name>password</param-name>
  9. <param-value>root</param-value>
  10. </context-param>
  • ServletContext 像 Map 一样存取数据
  1. public class ContextServlet1 extends HttpServlet {
  2. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  3. // 获取ServletContext 对象
  4. ServletContext context = getServletContext();
  5. System.out.println(context);
  6. System.out.println("保存之前: Context1 获取 key1 的值是:"+ context.getAttribute("key1"));
  7. context.setAttribute("key1", "value1");
  8. System.out.println("Context1 中获取域数据 key1 的值是:"+ context.getAttribute("key1"));
  9. }
  10. }