zoukankan      html  css  js  c++  java
  • 【后端】SpringMVC Controller(接口定义 & 注解开发)

    ✨控制器Controller

    • 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。
    • 控制器负责解析用户的请求并将其转换为一个模型。
    • 在 SpringMVC 中一个控制器类可以包含多个方法。
    • 在 SpringMVC 中,对于Controller的配置方式有很多种。

    ✨项目环境搭建

    新建Maven项目

    导入依赖

    <dependencies>
    
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>
    
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.9</version>
        </dependency>
    
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
    
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
        </dependency>
    
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    
    </dependencies>
    

    添加Web框架支持

    在新建模块根目录右键 -> 添加框架支持

    image-20210824203540591

    选择 Web 应用程序 注意版本:4.0

    配置DispatchServlet

    web/WEB-INF下修改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_4_0.xsd"
             version="4.0">
        <!--    配置DispatchServlet-->
        <servlet>
            <servlet-name>SpringMVC</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
    <!--            绑定SpringMVC配置文件-->
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc-servlet.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>
    
        <servlet-mapping>
            <servlet-name>SpringMVC</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    
    </web-app>
    

    配置SpringMVC

    src/main/resources目录下新建springmvc-servlet.xml

    内容如下

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           https://www.springframework.org/schema/context/spring-context.xsd
           http://www.springframework.org/schema/mvc
           https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <context:component-scan base-package="com.example.controller"/>
        <mvc:default-servlet-handler/>
        <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>
    

    前端JSP

    web/WEB-INF下新建目录jsp

    web/WEB-INF/jsp目录下新建test.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    ${msg}
    </body>
    </html>
    

    配置Tomcat

    添加Tomcat配置后 在“部署”选择对应工件


    ✨实现方式一:接口定义

    实现Controller接口

    src/main/java下新建软件包com.example.controller

    新建类ControllerTest01

    package com.example.controller;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ControllerTest01 implements Controller {
        @Override
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
            ModelAndView modelAndView = new ModelAndView();
    
            modelAndView.addObject("msg", "ControllerTest01");
            modelAndView.setViewName("test");
    
            return modelAndView;
        }
    }
    

    注入Controller

    springmvc-servlet.xml中注入Controller

    <bean name="/test01" class="com.example.controller.ControllerTest01"/>
    

    /test01为url跳转地址

    启动Tomcat服务后在url后输入/test01

    项目结构修改

    在项目结构设置中选择“工件”

    WEB-INF目录下新建lib目录

    lib目录右键 -> 添加副本 -> 库文件

    选择添加所有外部库

    image-20210824211523504

    测试

    重启Tomcat服务 在url后输入/test01

    测试成功


    过程详解

    此时项目结构如下

    • 接收到url参数/test01时由ControllerTest01中的handleRequest方法返回名称为testmodelAndView
    • 视图解析器根据视图名称test拼接得到/WEB-INF/jsp/test.jsp定位到资源
    • 将test中的${msg}渲染为handleRequest方法返回的modelAndView中的msg对应数据
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView = new ModelAndView();
    
        modelAndView.addObject("msg", "ControllerTest01");
        modelAndView.setViewName("test");
    
        return modelAndView;
    }
    
    <!--    视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
    <!--        前缀-->
            <property name="prefix" value="/WEB-INF/jsp/"/>
    <!--        后缀-->
            <property name="suffix" value=".jsp"/>
        </bean>
    

    ✨实现方式一:注解开发

    Controller类

    src/main/java下的软件包com.example.controller

    新建类ControllerTest02

    package com.example.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    //代表这个类被Spirng接管 被注解的类中的所有方法 如果返回值是String 并且有具体页面可以跳转 就会被视图解析器解析
    public class ControllerTest02 {
    
    //    /test02 映射到该方法 返回test视图
        @RequestMapping("/test02")
        public String test02(Model model){
    
            model.addAttribute("msg", "ControllerTest02");
    //        返回视图名称
            return "test";
        }
    
        @RequestMapping("/test03")
        public String test03(Model model){
    
            model.addAttribute("msg", "ControllerTest03");
    
            return "test";
        }
    }
    

    SpringMVC配置解析

    之前在springmvc-servlet有如下配置项

    <context:component-scan base-package="com.example.controller"/>
    <mvc:default-servlet-handler/>
    <mvc:annotation-driven/>
    

    作用如下

    <!-- 自动扫描包 让指定包下的注解生效 由IoC容器统一管理 -->
    <context:component-scan base-package="com.example.controller"/>
    <!-- 让SpringMVC不处理静态资源 -->
    <mvc:default-servlet-handler/>
    <!--
    支持mvc注解驱动
        在spring中一般采用@RequestMapping注解来完成映射关系
        要想使@RequestMapping注解生效
        必须向上下文中注册DefaultAnnotationHandlerMapping
        和一个AnnotationMethodHandlerAdapter实例
        这两个实例分别在类级别和方法级别处理。
        而annotation-driven配置帮助我们自动完成上述两个实例的注入。
     -->
    <mvc:annotation-driven/>
    

    测试

    重启Tomcat服务 在url后输入/test02/test03

    测试成功

    过程详解

    此时项目结构如下

    • 接收到url参数/test02时由ControllerTest02中的test02方法返回视图名称test
    • 视图解析器根据视图名称test拼接得到/WEB-INF/jsp/test.jsp定位到资源
    • 将test中的${msg}渲染为handleRequest方法返回的modelAndView中的msg对应数据
    //    /test02 映射到该方法 返回test视图
    @RequestMapping("/test02")
    public String test02(Model model){
    
        model.addAttribute("msg", "ControllerTest02");
        //        返回视图名称
        return "test";
    }
    



    ✨参考及引用

    https://www.bilibili.com/video/BV1aE41167Tu?p=8

    狂神说SpringMVC03:RestFul和控制器 (qq.com)


    ⭐转载请注明出处

    本文作者:双份浓缩馥芮白

    原文链接:https://www.cnblogs.com/Flat-White/p/15182672.html

    版权所有,如需转载请注明出处。

  • 相关阅读:
    凸松弛技术解密
    机器学习中的逻辑回归模型简介
    机器学习中的损失函数
    逻辑回归的MATLAB实现(二分类问题)
    Lua和C++交互详细总结【转载】
    微擎手机端上传视频(图片)
    IOS开发:UIAlertView使用
    高度自适应问题
    css样式问题
    browser-sync
  • 原文地址:https://www.cnblogs.com/Flat-White/p/15182672.html
Copyright © 2011-2022 走看看