毕设学习第八天SSM框架之SpringMVC

SpringMVC

Spring MVC 是 Spring 框架中基于 MVC 设计模式的 Web 开发模块,通过 DispatcherServlet 作为前端控制器统一处理请求,协调 HandlerMappingController 和 ViewResolver 等组件实现分层开发:用户请求由控制器处理业务逻辑并封装数据(Model),视图层渲染数据生成响应。它支持注解驱动(如 @Controller@RequestMapping),无缝集成 Spring 生态(如依赖注入、AOP),提供灵活的数据绑定、RESTful 接口开发能力,适用于构建结构清晰、松耦合的 Web 应用及 API 服务

MVC

MVC(Model-View-Controller)是一种软件设计模式,用于将应用程序的逻辑、数据和用户界面分离,以提高代码的可维护性和扩展性。

其核心思想是将系统分为三个独立且协作的组件:

Model(模型)

负责管理数据和业务逻辑(如数据库操作、状态管理)。

独立于用户界面,不直接处理用户交互,仅提供数据操作接口。

View(视图)

负责展示数据(如UI界面、网页、图表)。

从Model获取数据并渲染,但不处理业务逻辑。

Controller(控制器)

接收用户输入(如点击、表单提交),协调Model和View。

根据用户请求更新Model,并通知View同步更新显示。

Model由dao和service层以及javabean组成,Controller由Servlet组成,View为JSP和html组成

原始的web项目

传统的web项目都是一个页面需要注册一个Servlet,有个注意事项就是web项目需要在web下面新建一个lib目录把所有依赖复制进去才能部署到tomcat里面,不然会报空指针异常,同时页面如果输入框为空则传给后台的是空字符串而非null

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<mapper namespace="org.example.dao.UserMapper">


    <insert id="add" parameterType="org.example.pojo.User"  useGeneratedKeys="true" keyProperty="id" keyColumn="id">
        INSERT INTO
            user (`name`, `age`, `sex`, `address`)
        VALUES
            <foreach collection="userList" item="user" index="idx" separator=",">
                (#{user.name}, #{user.age}, #{user.sex}, #{user.address})
            </foreach>
    </insert>

    <delete id="delete" parameterType="_int">
        DELETE FROM user WHERE id = #{id}
    </delete>

    <update id="update" parameterType="org.example.pojo.User">
        UPDATE user
        <set>
            <if test="name != null">
                name = #{name}
            </if>
            <if test="age != null">
                age = #{age}
            </if>
            <if test="sex != null">
                sex = #{sex}
            </if>
            <if test="address != null">
                address = #{address}
            </if>
        </set>
        WHERE id = #{id}
    </update>

    <sql id="age_sex">
        <if test="age != null">
            AND age = #{age}
        </if>
        <if test="sex != null">
            AND sex = #{sex}
        </if>
    </sql>

    <select id="query"  parameterType="map" resultMap="user">
        SELECT *
        FROM user
        <where>
            <choose>
                <when test="name != null and name != ''">
                      name LIKE CONCAT('%', #{name}, '%')
                </when>
                <when test="address != null and address != ''">
                      AND address LIKE CONCAT('%', #{address}, '%')
                </when>
                <otherwise>
                      <include refid="age_sex"/>
                </otherwise>
            </choose>
        </where>
    </select>
    <select id="getAccount" resultType="org.example.pojo.Account">
        SELECT * FROM account WHERE id = #{account_id}
    </select>
    <select id="getRoles" resultType="org.example.pojo.Role">
        SELECT * FROM role R INNER JOIN user_role UR ON R.id = UR.r_id
        WHERE UR.u_id = #{id}
    </select>
    <resultMap id="user" type="org.example.pojo.User">
        <result column="id" property="id"/>
        <result column="name" property="name"/>
        <result column="age" property="age"/>
        <result column="sex" property="sex"/>
        <result column="address" property="address"/>
        <association column="account_id" property="account" javaType="org.example.pojo.Account"  select="getAccount"/>
        <collection column="id" property="roles" ofType="org.example.pojo.Role" select="getRoles"/>
    </resultMap>


    <select id="queryOne" resultMap="user_account">
        SELECT
            U.id          AS user_id,
            U.name        AS user_name,
            U.age,
            U.sex,
            U.address,
            A.id          AS account_id,
            A.name       AS account_name,
            A.password   AS account_password,
            R.id   AS role_id,
            R.name   AS role_name,
            R.description AS role_description
        FROM user AS U
                 INNER JOIN account AS A
                            ON U.account_id = A.id
                 INNER JOIN user_role AS UR
                            ON U.id = UR.u_id
                 INNER JOIN role AS R
                            ON UR.r_id = R.id
        WHERE U.id = #{id}
    </select>
    <resultMap id="user_account" type="org.example.pojo.User">
        <!-- User 字段映射 -->
        <result column="user_id"       property="id"/>
        <result column="user_name"     property="name"/>
        <result column="age"          property="age"/>
        <result column="sex"          property="sex"/>
        <result column="address"      property="address"/> <!-- 修正此处 -->

        <!-- Account 关联对象映射 -->
        <association property="account" javaType="org.example.pojo.Account">
            <result column="account_id"       property="id"/>
            <result column="account_name"    property="name"/>
            <result column="account_password" property="password"/>
        </association>
        
        <collection property="roles"  ofType="org.example.pojo.Role">
            <result column="role_id"       property="id"/>
            <result column="role_name"       property="name"/>
            <result column="role_description"       property="description"/>
        </collection>
    </resultMap>



</mapper>
<?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_4_0.xsd"
         version="4.0">
    <servlet>
        <servlet-name>user</servlet-name>
        <servlet-class>org.example.servlet.UserServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>user</servlet-name>
        <url-pattern>/user</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>

</web-app>
package org.example.servlet;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.example.dao.UserMapper;
import org.example.pojo.User;

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.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UserServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String name = req.getParameter("name");
        if (name == null) name = "";
        String sex = req.getParameter("sex");
        if (sex == null) sex = "";
        String address = req.getParameter("address");
        if (address == null) address = "";
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "%"+name+"%");
        map.put("sex",sex);
        map.put("address","%"+address+"%");
        String resource = "mybatis-config.xml";
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource)).openSession(true);
        UserMapper userDao = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userDao.query(map);
        req.setAttribute("userList", userList);
        req.getRequestDispatcher("/WEB-INF/jsp/user.jsp").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户信息表单</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
        }
        .container {
            width: 50%;
            margin: 50px auto;
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
        }
        h1 {
            text-align: center;
            color: #333;
        }
        form {
            display: flex;
            flex-direction: column;
        }
        input[type="text"] {
            padding: 10px;
            margin: 10px 0;
            border: 1px solid #ccc;
            border-radius: 4px;
            box-sizing: border-box;
        }
        input[type="radio"] {
            margin-right: 5px;
        }
        .radio-group {
            margin: 10px 0;
        }
        input[type="submit"] {
            padding: 10px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            box-sizing: border-box;
        }
        input[type="submit"]:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>
<div class="container">
    <h1>用户信息</h1>
    <form action="/user" method="get">
        <input type="text" name="name" placeholder="用户名" />
        <div class="radio-group">
            <label>
                <input type="radio" name="sex" value="男" /> 男
            </label>
            <label>
                <input type="radio" name="sex" value="女" /> 女
            </label>
        </div>
        <input type="text" name="address" placeholder="地址" />
        <input type="submit" value="提交" />
    </form>
</div>
</body>
</html>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户信息</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
        }
        table {
            width: 80%;
            margin: 50px auto;
            border-collapse: collapse;
            background-color: #fff;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
        }
        th, td {
            padding: 12px;
            text-align: left;
            border-bottom: 1px solid #ddd;
        }
        th {
            background-color: #f2f2f2;
            color: #333;
        }
        tr:nth-child(even) {
            background-color: #f9f9f9;
        }
        tr:hover {
            background-color: #f1f1f1;
        }
    </style>
</head>
<body>
<table>
    <thead>
    <tr>
        <th>用户名</th>
        <th>年龄</th>
        <th>性别</th>
        <th>地址</th>
        <th>角色</th>
        <th>账户用户名</th>
    </tr>
    </thead>
    <tbody>
    <c:forEach var="user" items="${userList}">
        <tr>
            <td>${user.name}</td>
            <td>${user.age}</td>
            <td>${user.sex}</td>
            <td>${user.address}</td>
            <td>
                <c:forEach var="role" items="${user.roles}">
                    ${role.name}: ${role.description}<br>
                </c:forEach>
            </td>
            <td>${user.account.name}</td>
        </tr>
    </c:forEach>
    </tbody>
</table>
</body>
</html>

前端和页面控制器

前端控制器是一种设计模式,旨在集中处理所有客户端请求。在这种模式下,所有的请求都被发送到一个统一的控制器,由它来分发请求到相应的处理程序。这种方式有助于简化请求处理流程,增强系统的可维护性和扩展性。

页面控制器是一种设计模式,每个页面都有一个独立的控制器来处理与该页面相关的请求。每个控制器负责处理特定页面的请求和响应,通常与特定的视图相对应。这种方式使得每个页面的逻辑和视图紧密结合,便于管理和维护。

相比于传统的MVC,Spring MVC和其他许多Web框架一样,是围绕前端控制器模式设计的,其中一个中央 Servlet,即 DispatcherServlet,为请求处理提供了一个共享算法,而实际工作则由可配置的委托组件执行,即多了一个中央处理器。

<?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_4_0.xsd"
         version="4.0">

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationcontext.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationcontext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <bean id="/user" class="org.example.controller.UserController"/>

</beans>
package org.example.controller;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.example.dao.UserMapper;
import org.example.pojo.User;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class UserController implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
        String name = request.getParameter("name");
        if (name == null) name = "";
        String sex = request.getParameter("sex");
        if (sex == null) sex = "";
        String address = request.getParameter("address");
        if (address == null) address = "";
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name", "%"+name+"%");
        map.put("sex",sex);
        map.put("address","%"+address+"%");
        String resource = "mybatis-config.xml";
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource)).openSession(true);
        UserMapper userDao = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userDao.query(map);
        modelAndView.addObject("userList", userList);
        modelAndView.setViewName("user");
        return modelAndView;
    }
}

SpringMVC进行配置将所有的Servlet都放入容器中统一管理,并且还添加一个DispatcherServlet作为所有Servlet和页面之间的中介

处理流程:

客户端请求 → DispatcherServlet → HandlerMapping → HandlerExecutionChain → HandlerAdapter → Controller → ModelAndView → ViewResolver → View渲染 → 响应

注解开发

由于配置文件过于繁琐,为了简化现在大部分的项目都是采用注解进行开发的方式

 

对比维度 Model ModelAndView
创建方式 自动由Spring注入控制器方法参数 需手动通过new ModelAndView()创建
数据传递方法 model.addAttribute(key, value) mav.addObject(key, value)
视图控制方法 无法直接指定视图,需返回视图名称 通过构造函数或setViewName()指定视图
返回值类型 通常返回字符串(视图名称) 直接返回ModelAndView对象
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
                           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <context:component-scan base-package="org.example.controller"/>

    <!--
     该配置启用Spring MVC的默认Servlet处理器。它允许Spring MVC将静态资源(如图片、CSS、JavaScript等)请求交给容器的默认Servlet(通常是DefaultServlet)处理,而不是让Spring的DispatcherServlet来处理这些请求。
     -->
    <mvc:default-servlet-handler/>
    <!--
    该配置启用Spring MVC的注解驱动模式。它允许Spring MVC根据控制器中的注解(如@RequestMapping、@ResponseBody、@ModelAttribute等)来处理请求和响应。
    -->
    <mvc:annotation-driven/>
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>
package org.example.controller;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.example.dao.UserMapper;
import org.example.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class UserController{
    @RequestMapping("/user")
    public String myUserLIst(
            @RequestParam("name") String name,
            @RequestParam("sex") String sex,
            @RequestParam("address") String address,
            Model model) throws IOException {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name",name);
        map.put("sex",sex);
        map.put("address",address);
        String resource = "mybatis-config.xml";
        SqlSession sqlSession = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource)).openSession(true);
        UserMapper userDao = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userDao.query(map);
        model.addAttribute("userList", userList);
        return"user";
    }
}
<?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_4_0.xsd"
         version="4.0">

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationcontext.xml</param-value>
    </context-param>
    <!-- 配置DispatcherServlet以及Spring的上下 -->
    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationcontext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

 Spring整合Mybatis

 

这里我采用的是第二行的版本搭配

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>untitled</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.13</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.3.13</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.13</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.13</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.1.2</version>
        </dependency>

        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.9</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.9.9</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.6</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/log4j/log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/taglibs/standard -->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>


</project>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
                           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="org.example.controller"/>

    <!--
     该配置启用Spring MVC的默认Servlet处理器。它允许Spring MVC将静态资源(如图片、CSS、JavaScript等)请求交给容器的默认Servlet(通常是DefaultServlet)处理,而不是让Spring的DispatcherServlet来处理这些请求。
     -->
    <mvc:default-servlet-handler/>
    <!--
    该配置启用Spring MVC的注解驱动模式。它允许Spring MVC根据控制器中的注解(如@RequestMapping、@ResponseBody、@ModelAttribute等)来处理请求和响应。
    -->
    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 通过IOC创建dataSource,sqlSessionFactory和sqlSessionTemplate的实例 -->

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;useSSL=false&amp;characterEncoding=utf8"/>
        <property name="username" value="billsaifu"/>
        <property name="password" value="123456"/>
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:org/example/dao/*.xml"/>
    </bean>

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>
    <bean id="userMapper" class="org.example.dao.UserMapperImpl">
        <property name="sqlSession" ref="sqlSessionTemplate"/>
    </bean>

</beans>
<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <typeAliases>
        <package name="org.example.dao"/>
        <package name="org.example.pojo"/>
    </typeAliases>
</configuration>
package org.example.dao;

import org.example.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;

import java.util.Collections;
import java.util.List;
import java.util.Map;

public class UserMapperImpl implements UserMapper{

    private SqlSessionTemplate sqlSession;

    public void setSqlSession(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }

    @Override
    public int add(List<User> userList) {
        return sqlSession.getMapper(UserMapper.class).add(userList);
    }

    @Override
    public int delete(int id) {
        return sqlSession.getMapper(UserMapper.class).delete(id);
    }

    @Override
    public int update(User user) {
        return sqlSession.getMapper(UserMapper.class).update(user);
    }

    @Override
    public List<User> query(Map<String, Object> map) {
        return sqlSession.getMapper(UserMapper.class).query(map);
    }

    @Override
    public User queryOne(int id) {
        return sqlSession.getMapper(UserMapper.class).queryOne(id);
    }
}
package mybatis;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.example.dao.UserMapper;
import org.example.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MybatisTest {
    public Logger log = Logger.getLogger(MybatisTest.class);
    @Test
    public void test1() throws IOException {
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        log.info("开启会话");
        UserMapper userDao = ac.getBean("userMapper", UserMapper.class);
        Map<String,Object> map = new HashMap<>();
        map.put("name","%%");
        map.put("address","%%");
        List<User> users = userDao.query(map);
        for (User user : users) {
            user.userPrint();
        }
        userDao.queryOne(1).userPrint();
        log.info("关闭会话");
    }
}

还可以更加简化,并且加上事物配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
                           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
                           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <context:component-scan base-package="org.example.controller"/>

    <!--
     该配置启用Spring MVC的默认Servlet处理器。它允许Spring MVC将静态资源(如图片、CSS、JavaScript等)请求交给容器的默认Servlet(通常是DefaultServlet)处理,而不是让Spring的DispatcherServlet来处理这些请求。
     -->
    <mvc:default-servlet-handler/>
    <!--
    该配置启用Spring MVC的注解驱动模式。它允许Spring MVC根据控制器中的注解(如@RequestMapping、@ResponseBody、@ModelAttribute等)来处理请求和响应。
    -->
    <mvc:annotation-driven/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 通过IOC创建dataSource,sqlSessionFactory和sqlSessionTemplate的实例 -->

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;useSSL=false&amp;characterEncoding=utf8"/>
        <property name="username" value="billsaifu"/>
        <property name="password" value="123456"/>
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:org/example/dao/*.xml"/>
    </bean>
    <bean id="userMapper" class="org.example.dao.UserMapperImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

    <!-- 声明事物 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add"/>
            <tx:method name="update"/>
            <tx:method name="delete"/>
            <tx:method name="query"/>
            <tx:method name="queryOne"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <!-- 事物的切入点 -->
        <aop:pointcut id="txPointcut" expression="execution(* org.example.dao.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
    </aop:config>
</beans>

 

package org.example.dao;

import org.example.pojo.User;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import java.util.Collections;
import java.util.List;
import java.util.Map;

public class UserMapperImpl extends SqlSessionDaoSupport implements UserMapper{


    @Override
    public int add(List<User> userList) {
        return getSqlSession().getMapper(UserMapper.class).add(userList);
    }

    @Override
    public int delete(int id) {
        return  getSqlSession().getMapper(UserMapper.class).delete(id);
    }

    @Override
    public int update(User user) {
        return  getSqlSession().getMapper(UserMapper.class).update(user);
    }

    @Override
    public List<User> query(Map<String, Object> map) {
        return  getSqlSession().getMapper(UserMapper.class).query(map);
    }

    @Override
    public User queryOne(int id) {
        return  getSqlSession().getMapper(UserMapper.class).queryOne(id);
    }
}
package org.example.controller;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.example.dao.UserMapper;
import org.example.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class UserController{
    @Autowired
    @Qualifier("userMapper")
    private UserMapper userDao;

    @RequestMapping("/user")
    public String myUserLIst(String name, String sex, String address, Model model) throws IOException {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name",name);
        map.put("sex",sex);
        map.put("address",address);
        List<User> userList = userDao.query(map);
        model.addAttribute("userList", userList);
        return"user";
    }
}

 

但是启动后报错了

原因和解决办法

 

<?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_4_0.xsd"
         version="4.0">
    
     <!-- 明确绝对排序 -->
    <absolute-ordering/>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationcontext.xml</param-value>
    </context-param>
    <!-- 配置DispatcherServlet以及Spring的上下文 -->
    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationcontext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

 RestFul风格

RestFul风格是一种基于HTTP协议的软件架构风格,强调简洁、高效和易用性,其核心思想是通过统一的HTTP方法(如GET、POST、PUT、DELETE)对资源进行增删改查(CRUD)操作,而非依赖URL参数或自定义动作。

对比维度 传统风格 RESTful风格
URL设计 包含动作动词(如/getUser?id=1 仅用名词(如/users/1
参数传递 查询字符串(?key=value 路径变量(/users/{id}
操作区分 依赖URL或参数(如action=delete 通过HTTP方法区分(如DELETE请求)
状态管理 可能依赖Session或Cookie 完全无状态
可读性 低,URL冗长且语义模糊 高,URL简洁且自描述

HTTP方法

HTTP方法 语义 幂等性 安全性 典型场景 示例
GET 获取资源 查询数据,无副作用 GET /users/1
POST 创建资源 提交新数据,服务端生成ID POST /users
PUT 全量替换资源 更新已知ID的资源(全部字段) PUT /users/1
PATCH 部分更新资源 仅修改资源的指定字段 PATCH /users/1 {name: "Alice"}
DELETE 删除资源 移除指定资源 DELETE /users/1
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户信息表单</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f4f4f4;
            margin: 0;
            padding: 0;
        }
        .container {
            width: 50%;
            margin: 50px auto;
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
        }
        h1 {
            text-align: center;
            color: #333;
        }
        form {
            display: flex;
            flex-direction: column;
        }
        input[type="text"] {
            padding: 10px;
            margin: 10px 0;
            border: 1px solid #ccc;
            border-radius: 4px;
            box-sizing: border-box;
        }
        input[type="radio"] {
            margin-right: 5px;
        }
        .radio-group {
            margin: 10px 0;
        }
        input[type="submit"] {
            padding: 10px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
            box-sizing: border-box;
        }
        input[type="submit"]:hover {
            background-color: #45a049;
        }
    </style>
</head>
<body>
<div class="container">
    <h1>用户信息</h1>
    <form id="userForm" method="post">
        <input type="text" name="name" placeholder="用户名" id="name">
        <div class="radio-group">
            <label><input type="radio" name="sex" value="男">男</label>
            <label><input type="radio" name="sex" value="女">女</label>
        </div>
        <input type="text" name="address" placeholder="地址" id="address">
        <input type="submit" value="提交">
    </form>
</div>
</body>
</html>
<script>
    document.getElementById('userForm').addEventListener('submit', function(e) {
        e.preventDefault();
        var name = document.getElementById('name').value;
        var sex = document.querySelector('input[name="sex"]:checked')?.value || '';
        var address = document.getElementById('address').value;
        var actionUrl = '/user/' + name + '/' + sex + '/' + address;
        this.action = actionUrl;
        this.submit();
    });

</script>
package org.example.controller;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.example.dao.UserMapper;
import org.example.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class UserController{
    @Autowired
    @Qualifier("userMapper")
    private UserMapper userDao;

    // 设置多个url处理空参问题
    @RequestMapping(
            value = {"/user",
                     "/user/{name}",
                    "/user/{name}/{sex}",
                    "/user/{name}/{sex}/{address}"},
            method = RequestMethod.POST)
    public String myUserLIst(@PathVariable(required = false) String name,@PathVariable(required = false) String sex,@PathVariable(required = false) String address, Model model) throws IOException {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name",name);
        map.put("sex",sex);
        map.put("address",address);
        List<User> userList = userDao.query(map);
        model.addAttribute("userList", userList);
        return"user";
    }
}

 

<?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_4_0.xsd"
         version="4.0">

    <absolute-ordering/>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationcontext.xml</param-value>
    </context-param>
    <!-- 配置DispatcherServlet以及Spring的上下文 -->
    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationcontext.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!-- 处理编码问题 -->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

Json格式

基本结构

  • 键值对(Key-Value Pairs)
    数据以 "key": value 形式表示,键必须用双引号包裹,值可以是多种数据类型,之间用,隔开。

数据类型

类型 示例
字符串(String) "name": "张三"
数字(Number) "age": 30 或 "price": 99.5
布尔值(Boolean) "isStudent": true
空值(Null) "address": null
对象(Object) "address": { "city": "北京" }
数组(Array) "hobbies": ["阅读", "运动"]
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.18.2</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
                           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
                           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <context:component-scan base-package="org.example.controller"/>

    <!--
     该配置启用Spring MVC的默认Servlet处理器。它允许Spring MVC将静态资源(如图片、CSS、JavaScript等)请求交给容器的默认Servlet(通常是DefaultServlet)处理,而不是让Spring的DispatcherServlet来处理这些请求。
     -->
    <mvc:default-servlet-handler/>
    <!--
    处理Json中文乱码问题
    -->
    <mvc:annotation-driven>
        <mvc:message-converters>
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
           <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
               <property name="objectMapper">
                   <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                       <property name="failOnEmptyBeans" value="false"/>
                   </bean>
               </property>
           </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 通过IOC创建dataSource,sqlSessionFactory和sqlSessionTemplate的实例 -->

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;useSSL=false&amp;characterEncoding=utf8"/>
        <property name="username" value="billsaifu"/>
        <property name="password" value="123456"/>
    </bean>

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:org/example/dao/*.xml"/>
    </bean>
    <bean id="userMapper" class="org.example.dao.UserMapperImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

    <!-- 声明事物 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add"/>
            <tx:method name="update"/>
            <tx:method name="delete"/>
            <tx:method name="query"/>
            <tx:method name="queryOne"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <!-- 事物的切入点 -->
        <aop:pointcut id="txPointcut" expression="execution(* org.example.dao.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
    </aop:config>
</beans>
package org.example.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.log4j.Logger;
import org.example.dao.UserMapper;
import org.example.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class UserController{
    @Autowired
    @Qualifier("userMapper")
    private UserMapper userDao;

    private static Logger logger = Logger.getLogger(UserController.class);

    @ResponseBody
    @RequestMapping(
            value = {"/user",
                     "/user/{name}",
                    "/user/{name}/{sex}",
                    "/user/{name}/{sex}/{address}"},
            method = RequestMethod.POST)
    public String myUserLIst(@PathVariable(required = false) String name,@PathVariable(required = false) String sex,@PathVariable(required = false) String address, Model model) throws IOException {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("name",name);
        map.put("sex",sex);
        map.put("address",address);
        List<User> userList = userDao.query(map);
        ObjectMapper mapper = new ObjectMapper();
        String useristJson=mapper.writeValueAsString(userList);
//        model.addAttribute("userList", userList);
        return useristJson;
    }
}

拦截器

拦截器(Interceptor)是 Spring MVC 提供的 请求处理流程中的扩展点,用于在请求到达 Controller 前、后或完成后插入自定义逻辑(如权限校验、日志记录)。

特性 拦截器(Interceptor) 过滤器(Filter)
归属 Spring MVC 组件 Servlet 规范
作用范围 仅拦截 Spring MVC 管理的请求 拦截所有请求(包括静态资源)
依赖 可访问 Spring 上下文(Bean) 无法直接使用 Spring 功能
执行时机 Controller 前后 在 Servlet 前后(更底层)

过滤器与拦截器的执行顺序: 过滤器在拦截器之前执行,拦截器在过滤器之后执行。

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="org.example.config.MyInterceptors"/>
    </mvc:interceptor>
</mvc:interceptors>
package org.example.config;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyInterceptors implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String name = request.getParameter("name");
        String sex = request.getParameter("sex");
        String address = request.getParameter("address");
        System.out.println(name+" "+sex+" "+address);
        return true;
    }
}
posted @ 2025-02-19 21:32  突破铁皮  阅读(29)  评论(0)    收藏  举报