6.servlet

Servlet与JSP之间的关系

创建controller包,在其中创建Servlet.java的类文件,代替之前的doXXX.jsp文件

JSP本质就是servlet


一.Servlet特点

特点服务器端程序,多线程,效率高,可移植,易使用,功能强。
作用用作控制器

运行在服务器上的Java类,封装了协议及内置对象

用Servlet代替doXXX.jsp

Servlet类:
|——HttpServlet类

      |——doGET()

 	  |——doPost()

会调用javax.servlet包javax.servlet.http.HttpServlet包,这两个均为java扩展包。

二.Servlet类创建

在Java中,通常所说的 Servlet 是指 HttpServlet 对象,在声明一个对象为 Servlet 时,需要继承 HttpServlet 类或者实现 Servlet 接口。

HttpServlet 类是 Servlet 接口的一个实现类,继承此类后,需重写 HttpServlet 类中的方法对HTTP请求进行处理。

Servlet的两种编写方式

  • 1 继承HttpServlet,重写doGet(),doPost()

  • 2 实现Servlet,重写getServletConfig(),getServletInfo(),init(),destroy(),service()方法
    其中:

  • 1.调用构造方法,创建servlet对象,存放在servlet容器中

  • 2.init() 初始化

  • 3.service() 处理请求 ------> doGet()+doPost()

  • 4.响应结果

  • 5.destroy() 销毁

配置web.xml

//设置servlet名字

<servlet-name>sa</servlet-name>

//设置servlet类名

<servlet-class>com.servlet.DoReg</servlet-class>

//用于映射上面中的对外访问路径

//设置servlet的名称

<servlet-name>sa</servlet-name>

//设置servlet的请求路径

<url-pattern>/reg.do</url-pattern>

三.Servlet的生命周期(重点!!!)

Servlet是服务器端小程序,因此生命周期受web容器(也可看作是服务器)的控制。

Servlet的生命周期分:加载程序、初始化、服务、销毁、卸载5个部分。

1、由tomcat创建servlet对象
2、调用初始化init()方法 成员变量赋值等
3、执行service()方法
父类HttpServlet中
当客户端请求到达服务器后,先调用父类中的service()方法,
此方法判断客户端请求的方式是post还是get,来决定调用servlet的 doGet() 还是doPost()
4、响应结果
5、destroy()销毁 servlet容器中的servlet

Servlet的生命周期5个部分

1.加载Servlet (构造方法)
Web容器负责加载Servlet,当WEB容器启动时或第一次使用serblet时,容器会负责创建Servlet实例(需配置web.xml指定servlet的位置),成功加载后,web容器会通过映射的方式对Servlet进行实例化。

2.初始化 (init()方法)
当servlet被实例化后,容器将调用init()方法初始化这个对象。初始化包括建立数据库连接、读取源文件信息等。
如初始化失败,则此Servlet将被直接卸载(注意,不是直接销毁,而是直接卸载)。

3.处理服务 (service()方法)
当有请求提交时,servlet调用service()方法(常用的有doGet()和doPost())进行处理。在service()中,可通过ServletRequest接收客户的请求,也可通过ServletResponse响应客户信息。

4.销毁 destory()
当WEB容器关闭或检测到一个Servlet要从容器中被删除时,会自动调用destory()方法,释放实例所占用的资源。(注意:销毁servlet实例,并不是删掉了servlet实例)

5.卸载
在销毁后,该实例将等待被垃圾收集器回收,如在被回收前再次使用此servlet,会重新用init()方法初始化。

需要提醒的是:

在正常情况下,Servlet只会初始化一次,而处理服务会调用多次,销毁也只会调用一次。但如果一个servlet长时间不使用,也会被容器自动销毁,而如果需要再次使用时会重新进行初始化的操作,即在特殊情况下初始化可能会进行多次,销毁也可能进行多次。


四.Servlet API常用接口和类

(一)Servlet接口
对请求进行处理。

任何一个Servlet对象都要直接或间接地实现javax.servlet.Servlet接口。

  • init(ServletConfig config)
    //Servlet实例化后,Servlet容器调用该方法来完成初始化工作

  • service(ServletRequest request, ServletResponse response)
    //用于处理客户端的请求

  • distroy()
    //当Servlet对象从Servlet容器中移除时,调用该方法,释放资源

  • getServletConfig()
    //用于获取Servlet对象的配置信息,返回ServletConfig对象

  • getServletInfo()
    //返回有关Servlet的信息,它是纯文本格式字符串,如作者、版本等

(二)ServletConfig接口
位于javax.servlet包中,它封装了Servlet的配置信息。

  • getInitParameter(String name)
    //返回String类型名称为name的初始化参数值

  • getInitParameterNames()
    //获得所有初始化参数名的枚举集合

  • getServletContext()
    //用于获取Servlet上下文对象

  • getServletName()
    //返回Servlet对象的实例名

(三)HttpServletRequest接口

  • getContextPath()
    //返回请求的上下文路径,以"/"开始

  • getCookies()

  • getMethod()

  • getQueryString()

  • getRequestURI()

  • getRequestURL()

  • getServletPath()

  • getSession()
    HttpSession session = request.getSession();
    session.setAttribute(name, value);

(四)HttpServletResponse接口

  • addCookie(Cookie cookie)

  • sendError(int sc)

  • sendError(int sc, String msg)

  • sendRedirect(String location)

(五)GenericServlet类

(六)HttpServlet类

  • service()//服务

  • doGet() //get提交

  • doPost() //post提交

  • doPut()

  • doDelete()

-doHead()

  • doTrace()

  • doOption()

Servlet跳转 客户端跳转(重定向): request.sendRedirect(url);

服务器端跳转(转发:) request.getRequestDispatcher(url)
forward(request, response);


例子:
AddDeptServlet.java

package cn.qf.emp.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import cn.qf.emp.pojo.Dept;
import cn.qf.emp.service.DeptService;

/**
 * Servlet implementation class AddDeptServlet
 */
@WebServlet("/ads")
public class AddDeptServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public AddDeptServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("utf-8");
		//获取表单数据
		Dept dept=new Dept();
		dept.setDeptno(request.getParameter("dno"));
		dept.setDname(request.getParameter("dname"));
		dept.setLoc(request.getParameter("loc"));
		//调用业务逻辑
		DeptService ds=new DeptService();
		String ret=ds.addDept(dept);
		//分发转向
		if(ret.equals("添加成功")){
			//不能在servlet中直接使用session,通过request对象获取
			//HttpSession session=request.getSession();
		
			response.sendRedirect("index.jsp");
		}else{
			response.sendRedirect("AddDept.jsp");
		}
	}

}

AddDept.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加部门</title>
</head>
<body>
<form method="post" action="ads">
<p><input type="text" name="dno"/></p>
<p><input type="text" name="dname"/></p>
<p><input type="text" name="loc"/></p>
<p><input type="submit" value="添加部门"/></p>
<p><input type="reset" value="重置"/></p>
</form>
</body>
</html>
<think>好的,我现在需要解决用户提到的Spring MVC中DispatcherServlet未分配到Servlet接口的问题。用户提供的引用内容提到了几个可能的解决案,我需要整理这些信息,并确保回答符合用户的要求。 首先,根据引用[1]和[2],问题可能出在缺少Servlet API依赖或者版本冲突。用户提到导入Tomcat依赖或降低spring-webmvc版本可能有效。我需要验证这些法的正确性,并考虑其他可能性,比如Jakarta EE的包名变更。 接下来,我需要按照用户的指示,分步骤解释解决案。第一步应该是检查Servlet依赖,确保项目中有正确的依赖,比如javax.servlet或jakarta.servlet。然后检查版本兼容性,特别是Spring和Servlet容器的版本是否匹配。例如,Spring 6可能需要Jakarta EE 9+,而旧版本可能需要J2EE 8或更早。 另外,用户可能混淆了不同的包名,比如jakarta.servletjavax.servlet,这可能导致类加载问题。需要提醒用户检查包名是否正确导入,并在web.xml中正确配置DispatcherServlet。 还有可能需要排除冲突的依赖,使用Maven或Gradle的依赖排除功能。最后,如果问题依旧,建议用户清理并重新构建项目,确保所有依赖正确加载。 在回答结构上,要分步骤清晰,每个步骤给出具体操作和示例,比如Maven依赖代码,或者配置文件的修改。同时,生成的相关问题要围绕依赖管理、版本冲突、配置检查等面,帮助用户扩展理解。 需要确保使用中文回答,行内公式用$...$,独立公式用$$...$$,但这个问题可能不涉及数学公式,所以可能不需要使用。最后检查引用标识是否正确添加,确保引用来源明确。</think>### 解决案:Spring MVC DispatcherServlet 未分配到 Servlet 接口的问题 此问题通常由 **Servlet API 依赖缺失**或 **版本不兼容** 导致。以下是分步解决案: --- #### 1. **检查 Servlet API 依赖** Spring MVC 的 `DispatcherServlet` 需要 Servlet 容器提供的 `javax.servlet.Servlet` 或 `jakarta.servlet.Servlet` 接口支持。 - **若使用 Maven**,添加 Tomcat 提供的 Servlet API 依赖: ```xml <dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-servlet-api</artifactId> <version>8.5.85</version> <!-- 根据 Tomcat 版本调整 --> <scope>provided</scope> </dependency> ``` - **若使用 Jakarta EE 9+**(如 Tomcat 10+),需改用 `jakarta.servlet` 包名,并确认 Spring 版本兼容性[^1][^2]。 --- #### 2. **确认 Spring 与 Servlet 容器版本兼容** - **Spring 5.x**:兼容 `javax.servlet`(Tomcat 8/9)。 - **Spring 6.x**:仅兼容 `jakarta.servlet`(Tomcat 10+)。 如果版本不匹配,需 **降低 Spring 版本** 或 **升级 Servlet 容器**。例如: ```xml <!-- 将 Spring 6.x 降级为 5.x --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.30</version> </dependency> ``` --- #### 3. **检查 web.xml 配置** 确保 `web.xml` 中正确声明 `DispatcherServlet`,包名与依赖一致: ```xml <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> ``` 若使用 Jakarta EE,需确保 IDE 和容器均支持 `jakarta.servlet`。 --- #### 4. **排除依赖冲突** 若项目中存在多个 Servlet API 依赖(如旧版 `javax.servlet` 和 `jakarta.servlet`),需通过 Maven/Gradle 排除冲突: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.30</version> <exclusions> <exclusion> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> </exclusion> </exclusions> </dependency> ``` --- #### 5. **清理并重建项目** 依赖变更后,执行清理操作: - Maven:`mvn clean install` - Gradle:`gradle clean build` 确保 IDE 重新加载依赖(如 IntelliJ 的 `Reload All Maven Projects`)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值