Java入土--Servlet入门

Servlet

servlet 是由 Tomcat 创建的,运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。

Servlet 是独立于平台的,因为它们是用 Java 编写的。

快速入门

  1. 创建 Web 项目,导入 Servlet 依赖坐标
  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  //配置Tomcat的maven环境
    <build>
    <!--插件-->
    <plugins>
      <!--具体插件-->
      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
      </plugin>
    </plugins>
  </build>
  1. 创建:定义一个类,实现 Servlet 接口,并重写接口中的方法,并且在 service 方法中输入一句话。
public class ServletDemo1 implements Servlet{
    public void service(){
        //方法体
    }
}

  1. 配置:在类上使用@WebServlet 注解,配置该 Servlet 的访问路径。
@WebServlet("/demo1",loadOnStartup =1)
/*loadOnStartup是负整数时,
第一次访问时创建,0或正整数时,
服务器启动时创建对象,数字越小优先级越高。
*/
public class ServletDemo1 implements Servlet{
    public void service(){
        //方法体
    }
}

  1. 启动 Tomcat,浏览器中输入 URL 访问 Servlet
http://localhost:8080/web-demo/demo1

执行流程

localhost:8080 访问到 tomcat 服务器,web-dem0 访问到项目,/demo1 访问到了对应的 servlet。

在启动时,tomcat(Web 服务器)创建 servlet 对象,并且调用其中的 service 方法。

SErvlet 生命周期

生命周期是指一个对象从创建到销毁的过程,
Servlet 是运行在 Servlet 容器(Web 服务器,Tomcat)中,其生命周期由容器来管理,分为四个阶段。

  1. 加载和实例化阶段,默认情况下第一次访问 Servlet 时,由容器创建。
  2. 初始化阶段,在 servlet 实例化后,容器将调用 servlet 的 init()方法完成配置等初始工作,该方法只调用一次
  3. 请求处理,每次请求 servlet 时,servlet 容器都会调用 service 方法对请求进行处理。
  4. 服务终止,当需要释放内存或关闭服务器时,调用 destroy()方法,释放资源。
@WebServlet(value = "/demo1",loadOnStartup = 1)
public class ServletDemo1 implements Servlet {

//提供服务,每一次被访问是都会被访问
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hello world--");
    }
//完成初始化的方法,默认情况下,servlet第一次被访问时调用,且只调用一次
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("innit--");

    }
    //销毁方法,内存释放时或者服务器关闭时会调用一次,且只能调用一次。
    public void destroy() {
        System.out.println("destroy--")

    }
}

Servlet 体系结构

我们将来开发 B/S 架构的 web 项目。都是针对 HTTP 协议,所以我们自定义 Servlet,继承 HttpServlet,然后重写 doGet 和 doPost 方法。

@WebServlet("/demo2")
//基于HttpServlet的开发
public class ServletDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("get--");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("post---");
    }

由于提交方式不同,get 的提交方式提交信息在请求行里,而 post 请求的参数会在请求体中,不同的请求方式,进行分别处理,所以我们要调用不同的方法。
HttpServlet 会根据请求方式的不同调用不同的方法。

urlPattern 配置

Servlet 要想被访问,必须配置其访问路径(urlPattern)
1、 一个 Servlet 可以配置多个 urlPattern.

@WebServlet(urlPatterns={"/demo1","/demo2"})
  1. 匹配规则
  • 精确匹配:配置路径与访问路径相同
@WebServlet(urlPatterns = "/demo2")
localhost:8080/maven_test1/demo2
  • 目录匹配
@WebServlet(urlPatterns = "/user/*")
localhost:8080/maven_test1/user/aa;
localhost:8080/maven_test1/user/bb;
在目录匹配中,优先精确匹配。
  • 扩展名匹配
@WebServlet(urlPatterns = "*.do")
localhost:8080/maven_test1/aa.do;
localhost:8080/maven_test1/bb.do;
  • 任意匹配
@WebServlet(urlPatterns = "/")
@WebServlet(urlPatterns = "/*")
localhost:8080/maven_test1/aa;
localhost:8080/maven_test1/bb;

XML 配置方式编写 Servlet

<servlet>

       <servlet-name>simple</servlet-name>//我们定义的servlet应用名字

       <servlet-class>cn.mldn.lxh.servlet.SimpleServlet</servlet-class> //我们定义的servlet应用名字对应的具体servlet文件

</servlet>

<servlet-mapping>   //地址映射

       <servlet-name>simple</servlet-name> //我们定义的servlet应用名字

       <url-pattern>/demo</url-pattern> //地址名

</servlet-mapping>
posted @   喝茶谢谢  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示