手写Servlet

本文通过手写Servlet来深入理解其工作原理。首先在Tomcat的webapps目录下创建myServlet,接着创建WEB-INF及classes目录,放置源码和配置文件。在web.xml中进行配置,确保servlet-api.jar在classpath中,编译Java文件并启动服务器。通过http请求访问Servlet,可以看到Servlet的生命周期,包括初始化、服务和销毁等关键步骤。

Servlet作为JAVAEE支持的标准之一,有着广泛应用。在此手写一个Servlet加深理解。在tomcat的webapps文件夹中新建一个文件夹myServlet,在此文件下新建下新建WEB-INF文件夹,再在此文件夹下新建classes文件夹存放FirstServlet.java,同时在WEB-INF文件夹下新建web.xml文件。

FirstServlet.java文件如下:

package com.bankcomm.servlet;

import java.io.*;
import javax.servlet.*;

public class FirstServlet extends GenericServlet{
	
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
	{
	    OutputStream out = res.getOutputStream();
		out.write("hello servlet!".getBytes());

	}
}

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>
        <servlet-name>FirstServlet</servlet-name>
        <servlet-class>com.bankcomm.servlet.FirstServlet</servlet-class>
    </servlet>
	
	
	 <servlet-mapping>
        <servlet-name>FirstServlet</servlet-name>
        <url-pattern>/FirstServlet</url-pattern>
    </servlet-mapping>
	</web-app>

在编译java文件前要将tomcat中的servlet-api.jar文件加入classpath中,再执行javac -d . FirstServlet.java编译java文件。启动tomcat服务器,在浏览器栏中输入http://127.0.0.1:8080/myServlet/FirstServlet即可得到正确响应。

整个Servlet调用过程如下:

     1)客户机连上Web服务器

     2)发送http请求给服务器

     3)服务器解析出客户机想访问的主机名

     4)服务器解析出客户机想访问的web应用

     5)服务器解析出客户机想访问的web资源

     6)web服务器第一次调用FirstServlet.java类创建servlet实例对象(客户第一次访问创建,驻留在内存中,响应后续请求)

     7)调用servlet的init方法完成实例对象的初始化

     8)创建代表请求的request和代表响应的response对象,然后调用servlet的service方法

     9)service方法执行,向代表客户端响应的response对象写入了向客户端输出的数据。

   10)service方法返回

   11)服务器从response中取出数据,构建一个http响应,会写给客户机

   12)客户机解析http响应并显示。

从servlet角度来看,当web服务器收到客户端的Servlet访问请求后,其整个生命周期如下:

     1)Web服务器首先检查是否已经装载并创建了该Servlet的实例对象,如果是,则直接跳到第4)步,否则执行第20步。

     2)装载并创建该Servlet的一个实例对象。

     3)调用Servlet实例对象的init()方法。

     4)web服务器创建一个用于封装http请求消息的HttpServletRequest对象和一个封装http响应消息的HttpServletResponse对象。然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。

     5)web应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destory()方法。

Spring MVC 相较于传统 Servlet 具有多方面的优势: - **减少开发工作量**:使用 Spring MVC 可以避免频繁地创建 Servlet,减少了开发者的工作量。例如在构建项目时,开发者无需为每个请求处理逻辑都编写一个单独的 Servlet [^2]。 - **支持 MVC 架构清晰分离**:Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。它将业务逻辑、数据和视图进行分离,使得代码结构更加清晰,便于维护和扩展 [^1][^4]。 - **灵活的配置与扩展机制**:Spring MVC 提供了灵活的配置方式,可以通过 XML 配置文件或 Java 注解来配置控制器、视图解析器等组件。同时,它还支持自定义拦截器、处理器适配器等,方便开发者根据具体需求进行扩展 [^1]。 - **集成众多强大功能**:Spring MVC 可以与 Spring 框架的其他模块(如 Spring Security、Spring Data 等)无缝集成,利用这些模块提供的功能,能够帮助开发人员更快地实现业务需求。例如,使用 Spring Security 可以方便地实现用户认证和授权功能 [^1][^3]。 - **更好的测试支持**:Spring MVC 对测试提供了良好的支持,可以使用 JUnit 等测试框架对控制器进行单元测试,模拟请求和响应,验证控制器的逻辑是否正确 [^1]。 ### 代码示例 以下是一个简单的 Spring MVC 控制器示例: ```java import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class HelloController { @RequestMapping("/hello") @ResponseBody public String hello() { return "Hello, Spring MVC!"; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值