Servlet基础

本文介绍Servlet的基本概念,包括其定义、Tomcat容器等级、编写第一个Servlet的步骤、Servlet执行流程与生命周期等内容。同时对比Servlet与JSP的区别与联系,探讨两者如何通过MVC模式结合使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是Servlet

Servlet是在服务器上运行的小程序。
一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问这个驻留在服务器内存里的Servlet程序。


二、Tomcat容器等级

这里写图片描述


三、手写第一个Servlet

这里写图片描述

注意:页面中的/代表服务器根目录,web.xml中/代表项目根目录,请求重定向的/代表服务器根目录,请求转发的/代表项目根目录。

index.jsp :
超链接地址不能用/servlet/HelloServlet,因为第一个/表示服务器的根目录,而不是上下文地址(项目根目录)。
表单中action=”servlet/HelloServlet”与超链接地址写法相同。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>首页</title>
  </head>
  <body>
  <h1>第一个Servlet</h1>
  <hr>
  <a href="servlet/HelloServlet" target="_blank">Get请求</a>
  <hr>

  <form action="servlet/HelloServlet" name="loginForm" method="post">
    <table>
      <tr>
        <td>用户名:</td>
        <td><input type="text" name="username"/></td>
      </tr>
      <tr>
        <td>密码:</td>
        <td><input type="password" name="password"/></td>
      </tr>
      <tr>
        <td colspan="2"><input type="submit" value="登录"></td>
      </tr>
    </table>
  </form>

  </body>
</html>

web.xml : url-pattern格式:/servlet/HelloServlet,必须以/开头,表示的是项目根目录

<?xml version="1.0" encoding="UTF-8"?>
<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_3_1.xsd"
         version="3.1">

    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/servlet/HelloServlet</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>servlet.HelloServlet</servlet-class>
    </servlet>

</web-app>

servlet.HelloServlet :
请求重定向的地址: resp.sendRedirect(req.getContextPath() + “/index.jsp”);
服务器内部跳转:request.getRequestDispatcher(“/index.jsp”).forward(request, response); 或者使用 “../index.jsp”

编写Servlet的doPost方法时,需要抛出ServletExcpetion和IOException异常。

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("GET请求");
        resp.setContentType("text/html;charset=UTF-8"); //以html格式响应
        PrintWriter out = resp.getWriter();
        out.println("<strong>Hello</strong>");

        //重定向的地址
        resp.sendRedirect(req.getContextPath() + "/index.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("POST请求");
        resp.setContentType("text/html;charset=UTF-8"); //以html格式响应
        PrintWriter out = resp.getWriter();
        out.println("username: " + req.getParameter("username") + "<br>");
        out.println("password: " + req.getParameter("password") + "<br>");
    }
}

Servlet3.0新特性(得Tomcat7.0版本及以上)
不会自动在web.xml中生成该Servlet对应的mapping信息,而是在Servlet代码中加入注解@WebServlet

/**

 * 注解WebServlet用来描述一个Servlet

 * 属性name描述Servlet的名字,可选

 * 属性urlPatterns定义访问的URL,或者使用属性value定义访问的URL.(定义访问的URL是必选属性)

 */

@WebServlet(name="",urlPatterns="/xxx")

四、Servlet执行流程与生命周期

这里写图片描述

这里写图片描述

Servlet容器装载Servlet:

这里写图片描述
Tomcat是通过反射来创建servlet实例的
初始化后的Servlet实例长期驻留在服务器内存

Servlet工作流程分为三个阶段。init(初始化),service(运行),destroy(销毁)
Servlet没有main方法,所有行为由Container控制。Container就是一个java程序。
在加载Servlet的.class后,Servlet会由构造函数生成一个实例,然后Container调用init()方法完成参数的初始化,接着调用service()方法,service会根据网页的请求,调用doGet或者doPost方法,最后调用销毁方法。整个流程如下图:
这里写图片描述


五、Servlet与JSP九大内置对象

这里写图片描述


六、Servlet与JSP比较

1> JSP也是Servlet,它其实就是为了能够更方便的输出数据到客户端,JSP能做的事,只要不怕费事,Servlet一样可以完成。
2> Servlet是被Context的类加载器加载的,所以重写Servlet需要重新部署Context,JSP有自己的加载器,所以在你修改了JSP文件之后,没感觉服务器有什么动作,修改内容就显示出来了。
3> JSP封装了大量Servlet中的对象,例如Request,ServletContext,Session等,使用起来极其方便。
4> JSP是 可视化文件,Servlet会被编译成class文件,前者可以拿任何一个编辑器修改,后者不行
这里写图片描述

理解以下三点即可:
1、不同之处在哪?
Servlet在Java代码中通过HttpServletResponse对象动态输出HTML内容
JSP在静态HTML内容中嵌入Java代码,Java代码被动态执行后生成HTML内容
2、各自的特点
Servlet能够很好地组织业务逻辑代码,但是在Java源文件中通过字符串拼接的方式生成动态HTML内容会导致代码维护困难、可读性差
JSP虽然规避了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂的业务逻辑同样也是不可取的
3、通过MVC双剑合璧
既然JSP和Servlet都有自身的适用环境,那么能否扬长避短,让它们发挥各自的优势呢?答案是肯定的——MVC(Model-View-Controller)模式非常适合解决这一问题。
MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller):
Controller——负责转发请求,对请求进行处理(Servlet)
View——负责界面显示(JSP)
Model——业务功能编写(例如算法实现)、数据库设计以及数据存取操作实现(JavaBeans)
在JSP/Servlet开发的软件系统中,这三个部分的描述如下所示:
这里写图片描述

web浏览器发送HTTP请求到服务端,被Controller(Servlet)获取并进行处理(例如参数解析、请求转发)
Controller(Servlet)调用核心业务逻辑——Model部分,获得结果
Controller(Servlet)将逻辑处理结果交给View(JSP),动态输出HTML内容
动态生成的HTML内容返回到浏览器显示
MVC模式在Web开发中的好处是非常明显,它规避了JSP与Servlet各自的短板,Servlet只负责业务逻辑而不会通过out.append()动态生成HTML代码;JSP中也不会充斥着大量的业务代码。这大大提高了代码的可读性和可维护性。


七、获取初始化参数

在web.xml中可以配置servlet初始化参数。在servlet中可以通过ServletConfig接口来获取这些参数。

web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<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_3_1.xsd"
         version="3.1">
    <servlet-mapping>
        <servlet-name>TestServlet1</servlet-name>
        <url-pattern>/servlet/TestServlet1</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>TestServlet1</servlet-name>
        <servlet-class>servlet.TestServlet1</servlet-class>
        <init-param>
            <param-name>username</param-name>
            <param-value>mook</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>123456</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
</web-app>

TestServlet1.java :

/**
     * Initialization of the servlet. <br>
     *
     * @throws ServletException if an error occurs
     */
    public void init() throws ServletException {
        // Put your code here
        System.out.println("TestServlet1的init()方法...");
        System.out.println(this.getInitParameter("username"));
        System.out.println(this.getInitParameter("password"));
        System.out.println(this.getServletConfig().getInitParameter("username"));
    }

启动服务器,部署项目:

TestServlet1构造方法....
TestServlet1的init()方法...
mook
123456
mook
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值