SpringMVC 结合 Servlet 不成功问题集锦

发布时间 2023-04-05 16:39:18作者: 软柠柠吖

问题集锦

question 1:Tomcat 10 版本太高

cause

Tomcat 10 版本.

image-20230405092058566.

主要就是说Tomcat 10 之前的用户如果使用 Tomcat 10 就需要将 javax.* 的导入转变为 jakarta.*。这样才能将代码在 Tomcat 10 中部署,还给你了一个迁移工具migration tool 来帮助你迁移代码。


resolve

Tomcat 9 版本及以下。

咱们主要来学习如何使用 Tomcat 来部署运行项目,如果自己还需手动迁移代码,那么花费的时间有点得不偿失了(大佬除外)。


question 2:idea 的 web 项目标志没有了蓝点image-20230405093042848.

cause

正确的 web 项目:image-20230405093107805.

错误的 web 项目:image-20230405093153627.


resolve

Project Structure -> Artifacts

image-20230405093429102.

Project Structure -> Modules -> 选择自己具体的 Module -> 点击 +

image-20230405093809957image-20230405094105202.

注意一下,一般是没有什么问题。

image-20230405094323226.

别忘记了 ApplyApplyApply!,别问为什么,因为我也忘了。

image-20230405094853294.

成功了!

image-20230405094917603image-20230405095134592.


question 3:路径映射不正确

cause

org.springframework.web.servlet.DispatcherServlet.noHandlerFound No mapping for GET /login

你确定你的环境配置没有问题,但是报 404 问题,这可能是一个解决方案!


resolve

web.xml

<!--
   DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,而且负责职责的分派,
          而且与 Spring IoC 容器无缝集成,从而可以获得 Spring 的所有好处。

  DispatcherServlet 主要用作职责调度工作,本身主要用于控制流程,主要职责如下:
  1、文件上传解析,如果请求类型是 multipart 将通过 MultipartResolver 进行文件上传解析;
  2、通过 HandlerMapping,将请求映射到处理器(返回一个 HandlerExecutionChain,它包括一个处理器、多个 HandlerInterceptor 拦截器);
  3、通过 HandlerAdapter 支持多种类型的处理器(HandlerExecutionChain 中的处理器);
  4、通过 ViewResolver 解析逻辑视图名到具体视图实现;
  5、本地化解析;
  6、渲染具体的视图等;
  7、如果执行过程中遇到异常将交给 HandlerExceptionResolver 来解析。
 -->
<servlet>
    <description>spring mvc servlet</description>
    <servlet-name>springMvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <description>spring mvc 配置文件</description>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <!-- 
	url-pattern 的值为 / 
	Spring 原话:Fortunately the default Servlet mapping "/" is a good choice.
	-->
    <url-pattern>/</url-pattern>
</servlet-mapping>

Path Matching.

原文就看懂了这一句话:

image-20230405101924964.


question 4:taglib 标签找不到

resolve

导入依赖

<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

question 5:jdbcTemplate 数据库字段与 model 字段不一致

cause

数据库字段:

image-20230405102356387.

model 字段:

image-20230405102430899.

resolve

Using the JDBC Core Classes to Control Basic JDBC Processing and Error Handling.

package com.rnny.utils;

import com.rnny.model.User;
import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;

public class UserRowMapper implements RowMapper<User> {

    @Override
    public User mapRow(ResultSet rs, int rowNum) throws SQLException {
        User user = new User();
        user.setId(rs.getInt("id"));
        user.setUsername(rs.getString("name"));
        user.setPassword(rs.getString("password"));
        return user;
    }
}

查询一个对象

public User selectByPrimaryKey(int id) {
    User user;
    String sql = "select * from user where id = ?;";
    user = jdbcTemplate.queryForObject(sql, new UserRowMapper(), id);
    return user;
}

查询多个对象

public List<User> getAll() {
    List<User> userList = new ArrayList<>();
    String sql = "select id, name, password from user;";
    userList = jdbcTemplate.query(sql, new UserRowMapper());
    return userList;
}