• Java学习——Servlet服务器请求响应程序


    Servlet服务器程序

    1. Servlet的概念

    Servlet(Server + Applet):运行在Web服务器端(Tomcat)的小程序。

    Servlet的主要作用:接收客户端浏览器的请求,还可以为客户端浏览器做出响应。

    • 学习Servlet技术三大目的:

      • 让程序运行在服务器端

      • 接收客户端浏览器的请求参数

      • 用户需求,对客户端进行数据响应

    JavaWeb技术有三大组件:Servlet,Filter,Listener

    JavaWeb还有十三规范:Tomcat服务器支持其中的2个Servlet和jsp


    2. Servlet程序快速入门

    2.1 创建第一个Servlet项目(响应字符串)

    ① 创建Java EE(Java Enterprise),勾选Web Application(4.0)

    ② 在web目录下创建index.html文件

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <h1>Servlet请求: 前端 --> 后台h1>
    9. <a href="helloServlet">访问helloServleta>
    10. body>
    11. html>

    ③ 在scr目录下创建目录,并创建HelloServlet类

    ④ HelloServlet类继承HttpServlet,重写service方法(有两个service方法,注意选择)

    1. package com.aaa.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.http.HttpServlet;
    4. import javax.servlet.http.HttpServletRequest;
    5. import javax.servlet.http.HttpServletResponse;
    6. import java.io.IOException;
    7. //请求 --- 响应(控制台输出字符串)
    8. public class HelloServlet extends HttpServlet {
    9. @Override
    10. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    11. System.out.println("HelloServlet ---> 重写父类service方法");
    12. }
    13. }

     ⑤ 在WEB-INF中选择web.xml配置标签 建立HelloServlet关联

    1. "1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <servlet>
    7. <servlet-name>helloservlet-name>
    8. <servlet-class>com.aaa.servlet.HelloServletservlet-class>
    9. servlet>
    10. <servlet-mapping>
    11. <servlet-name>helloservlet-name>
    12. <url-pattern>/helloServleturl-pattern>
    13. servlet-mapping>
    14. web-app>

    ⑥ 配置并启动Tomcat ,打开浏览器访问地址                配置Tomcat教程请见:idea配置tomcat

     

    ⑦ 点击超链接(重定向)标签,跳转至helloServlet页面,成功。

    图解:

    • 请求路径必须加”/“原因:

    /helloServlet中,/代表web_Servlet

    效果:        (gif动图建议放大观看)

    2.2 标签方式&注解方式 

    使用注解方式配置的优势: 代码更加简单

    使用注解方式配置的劣势: 耦合度高

    在上文提到配置web.xml文件标签,在Java中提供更简单的注解方式,只需要在类上加上@WebServlet(value = "请求地址")

    注意:

    • 注解方式和标签方式二选一即可,如使用注解方式 需要把web.xml中标签注释或删除!

    • value的值等于原来的中的值,简写 :  @WebServlet("请求地址")

    1. @WebServlet(value = "/test")
    2. public class TestServlet extends HttpServlet {}

    一般更推荐使用配置文件方式配置Servlet,尤其是配置第三方框架中的Servlet:例如SpringMVC中的DispatcherServlet,只能够使用配置文件方式进行配置。 

    2.3 响应跳转(sendRedirect)

    ① index.中新增超链接标签

    <a href="testSend">使用sendRedirecta>

    ② 新建success.html ,转发用

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>跳转页面title>
    6. head>
    7. <body>
    8. <h1>跳转页面h1>
    9. body>
    10. html>

    ② 新建TestSendRedirect测试类

    1. package com.aaa.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. //请求 -- 响应(跳转页面)
    9. @WebServlet("/testSend")
    10. public class TestSendRedirect extends HttpServlet {
    11. @Override
    12. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. System.out.println("service--->跳转success.html");
    14. resp.sendRedirect("success.html");
    15. }
    16. }

    执行查看效果:        (gif动图建议放大观看)


    3. Servlet的生命周期和生命周期方法

    ① Servlet对象的创建:构造器

    • 默认情况下,Servlet容器第一次收到HTTP请求时创建对应Servlet对象。

    • 容器之所以能做到这一点是由于我们在注册Servlet时提供了全类名,容器使用反射技术创建了Servlet的对象。

    ② Servlet对象初始化:init()

    • Servlet容器创建Servlet对象之后,会调用init(ServletConfig config)方法。

    • 作用:是在Servlet对象创建后,执行一些初始化操作。例如,读取一些资源文件、配置文件,或建立某种连接(比如:数据库连接)

    • init()方法只在创建对象时执行一次,以后再接到请求时,就不执行了

    • 在javax.servlet.Servlet接口中,public void init(ServletConfig config)方法要求容器将ServletConfig的实例对象传入,这也是我们获取ServletConfig的实例对象的根本方法。

    ③ 处理请求:service()

    • 在javax.servlet.Servlet接口中,定义了service(ServletRequest req, ServletResponse res)方法处理HTTP请求。

    • 在每次接到请求后都会执行。

    • 上一节提到的Servlet的作用,主要在此方法中体现。

    • 同时要求容器将ServletRequest对象和ServletResponse对象传入。

    ④ Servlet对象销毁:destroy()

    • 服务器重启、服务器停止执行或Web应用卸载时会销毁Servlet对象,会调用public void destroy()方法。

    • 此方法用于销毁之前执行一些诸如释放缓存、关闭连接、保存内存数据持久化等操作。

    代码解析:

    ① index.html 中新增超链接标签

    <a href="testServlet">testServlet生命周期a>

    ② 新建TestServlet测试类(使用注解方式) 

    1. package com.aaa.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet("/testServlet")
    9. public class TestServlet extends HttpServlet {
    10. public TestServlet(){
    11. System.out.println("TestServlet--->无参构造器");
    12. }
    13. @Override
    14. public void destroy() {
    15. System.out.println("servlet--->destroy() 销毁方法");
    16. }
    17. @Override
    18. public void init() throws ServletException {
    19. System.out.println("servlet--->init() 初始化方法");
    20. }
    21. @Override
    22. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    23. System.out.println("TestServlet--->重写service");
    24. }
    25. }

    执行查看效果:        (gif动图建议放大观看)

    • Tomcat服务器启动的时候,直接创建Servlet对象

    • service方法:

      • 接收浏览器请求的方法

      • 每次请求,都会调用service方法,对象生命周期的中间部分

      • 调用者是Tomcat引擎

    • Servlet对象的销毁时机

      • 关闭Tomcat服务器,对象就销毁,会调用方法destroy(),Tomcat引擎调用

      • 问题:destroy()方法,对象销毁之前调用

      • 销毁:没有引用变量,保存该类的对象,不是在内存中清理了

      • 将Web项目从服务器中移除


    4. 相对路径的使用(不建议使用)

    相对路径的概念:

    相对路径是不以/开头的路径写法,编写相对路径的原则是以目标资源的uri路径相对当前资源的uri路径

    5. 绝对路径的使用(建议使用)

    绝对路径的概念:

    绝对路径是以/开头的路径写法,编写绝对路径的原则是通过目标资源的uri访问目标资源,但是特殊情况是请求转发,如果是请求转发访问目标资源的话,那么绝对路径是在uri的基础之上省略/项目部署名

    在请求转发的时候使用绝对路径的写法是: /资源名,其实就是在uri的基础上省略/项目部署名

    相对路径&绝对路径代码解析:

    ① 新建目录 a-b-c-c.html

    ②  index.html 中新增超链接标签

    <a href="testGoC">C.htmla>

    ③ 新建CtestServletTest测试类

    1. package com.aaa.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet("testGoC")
    9. public class CtestServletTest extends HttpServlet {
    10. @Override
    11. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    12. System.out.println("跳转--- c.html");
    13. resp.sendRedirect("a/b/c/c.html");
    14. }
    15. }

    ④ 新建c.html

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. head>
    7. <body>
    8. <h1>C.html ---> (web\a\b\c\c.html)h1>
    9. <a href="ctest111">ctest111--相对路径(默认拼接之前访问路径)a>
    10. <a href="/web_Servlet/a/b/c/ctest222">ctest222--绝对路径a>
    11. body>
    12. html>

    ⑤ 新建 CtestServlet1&CtestServlet2测试类

    1. package com.aaa.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet(value = "/a/b/c/ctest111") //相对路径
    9. public class CtestServlet1 extends HttpServlet {
    10. @Override
    11. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    12. System.out.println("CtestServlet1()--->>>相对路径");
    13. }
    14. }
    1. package com.aaa.servlet;
    2. import javax.servlet.ServletException;
    3. import javax.servlet.annotation.WebServlet;
    4. import javax.servlet.http.HttpServlet;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. import java.io.IOException;
    8. @WebServlet(value = "/a/b/c/ctest222") //绝对路径
    9. public class CtestServlet2 extends HttpServlet {
    10. @Override
    11. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    12. System.out.println("CtestServlet2()--->>>绝对路径");
    13. }
    14. }

    图解:

    对应关系: 

  • 相关阅读:
    【opencv-c++】斑点检测即Blob检测
    C++之委托构造函数实例(二百四十三)
    猿创征文|Hystrix的概念与简单使用
    【Ceres】Ceres学习笔记2 BA相关
    LeetCode 290. Word Pattern
    动态规划-完全平方数
    一文速学-Base64算法及编解码方法+Python代码
    MySQL视图&用户管理
    Android下的app性能测试应主要针对那些方面,如何开展?
    SpringBoot 如何实现文件上传和下载
  • 原文地址:https://blog.csdn.net/Lwehne/article/details/128045727