SpringMVC框架使用

环境:

  1. idea开发

  2. jdk1.8

  3. tomcat8.5

非注解方式:

  1. 新建maven工程

  2. pox.xml中导入依赖

    <!--    公共依赖-->
    <dependencies>
        <!-- https://mvnrepository.com/artifact/junit/junit 单元-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.4</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/jsp-api -->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok 方便pojo类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
            <scope>provided</scope>
        </dependency>
    
    </dependencies>
    
  3. 添加web支持

  4. 在web.xml中注册DispatcherServlet

    <!--配置SpringMVC的核心控制器:拦截所有的请求
       在启动时加载文件,需要提前配置load-on-startup(避免在页面访问时才报错)-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--加载配置文件:使用放在resources目录下,重新定义加载的路径-->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext-mvc.xml</param-value>
        </init-param>
        <!--servlet启动的优先级-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
            <!--拦截所有url为/开始的请求-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <!--项目启动的欢迎界面-->
    <welcome-file-list>
        <welcome-file>/jsp/index.jsp</welcome-file>
    </welcome-file-list>
    
  5. 根据web.xml设置的配置文件路径,新建springmvc-servlet.xml(classpath是指经过编译之后classes的文件夹)

    <?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">
        <!--SpringMVC不用注解方式:-->
        <!--handler映射器 -->
        <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
        <!--handler适配器-->
        <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
        
        <!--name:访问的映射路径,视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    
        <!--前缀-->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
        <bean id="/hello" class="fun.nsk666.controller.HelloController"/>
    </beans>
    
  6. 在java文件夹中新建controller包,再新建controller

    package fun.nsk666.controller;
    
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.Controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * @Author: nsk
     * @Description:
     * @Date: create in 2021/3/29 20:35
     */
    //使用Controller的类,使用HttpServletRequest和HttpServletResponse接收数据,
    //使用ModelAndView对象发送数据和制定要跳转的页面 
    //向index.jsp跳转,并且再index.jsp接收msg,因为在springmvc-servlet.xml中配置试图解析器,所以setViewName只写index即可
    public class HelloController implements Controller {
    
        public ModelAndView handleRequest(HttpServletRequest httpServletRequest,
         HttpServletResponse httpServletResponse) throws Exception {
            ModelAndView modelAndView = new ModelAndView();
            modelAndView.addObject("msg","hello,world");
            modelAndView.setViewName("index");
            return modelAndView;
        }
    }
    
  7. 根据springmvc-servlet.xml中的试图解析器的路径,新建index.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      <!--接收传过来的msg-->
      ${msg}
      </body>
    </html>
    

注解方式

  1. 前面步骤与非注解方式的1,2,3,4步骤一致

  2. 在springmvc-servlet.xml中配置注解的方式使用springmvc

    <?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">
       
        <!--使用注解方式-->
        <!--自动扫描包,让spring注解生效,由IOC容器统一管理 -->
        <context:component-scan base-package="fun.nsk666"/>
        <!--让springMVC不处理静态资源-->
        <mvc:default-servlet-handler/>
        <!--
            支持mvc注解驱动
            在spring中一般采用@ResquestMapping注解来完成映射url关系
            想要使@RequestMapping注解生效
            必须向上下文中注册DefaultAnnotationHandlerMapp
            和一个AnnotationMethodHandlerAdpater实例,这两个分别在类级别和方法级别处理
            而annotation-driven配置帮助我们自动完成上述两个实例注入
        -->
        <mvc:annotation-driven/>
    
        <!--name:访问的映射路径,视图解析器-->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    
        <!--前缀-->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
        <!--不使用注解则需要下面的bean注册才能找到对应的url请求地址-->
        <bean id="/hello" class="fun.nsk666.controller.HelloController"/>
    </beans
    
  3. 在对应的包名下新建Controller类

  4. 类名前使用@Controller注解可以返回视图,类上使用@RequestMapping,方法使用@RequestMapping,链接RestFul风格使用请看下文

    package fun.nsk666.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.support.RedirectAttributes;
    
    @Controller    //使用此注解是可以返回视图的
    @RequestMapping("hello") //使用此注解:如果想请求下面的方法,则先加hello,比如请求helloAnnotation,则地址为
    //Project/hello/helloAnnotation
    public class HelloAnnotationController {
        @RequestMapping("helloAnnotation")  //此注解是url能匹配到这个方法的注解
        public String hello(Model model){
            model.addAttribute("msg","helloAnnotation");
            return "index";
        }
        @RequestMapping("helloJson/{a}") //RestFul风格,使用@PathVariable注解,参数按照RequestMapping的要求填入
        public String helloJson(@PathVariable int a,Model model){
            model.addAttribute("msg","helloAnnotation"+a);
            return "index";
        }
        @RequestMapping("view")
        public String view( Model model, RedirectAttributes attributes){
            model.addAttribute("msg","a+b=");
            attributes.addAttribute("msg","redirect:a+b=");
            return "redirect:/test.jsp";             //return的时候 Model对象默认使用的是转发,如果加了
            //redirect,则为重定向,注意在WEB-INF文件夹下的jsp页面无法直接访问
        }
    }
    
  5. 类名前使用@RestController时,此类中的方法返回的都是字符串,无页面跳转,不会被视图解析

  6. RestFul风格说明

  7. 使用此风格是可以在url中省略参数的‘?’可以用/替代,改变url风格,实现的功能相同

    @RequestMapping("hello")
    public String hello(int a,int b,Model model){
        model.addAttribute("msg","helloAnnotation"+(a+b));
        return "index";
    }
    //使用上面的方法要想用a和b参数,url要写成/hello?a=1&b=2才可,相对数据不安全
    @RequestMapping("hello/{a}/{b}")
    public String helloJson(@PathVariable int a,@PathVariable int b,Model model){
        model.addAttribute("msg","helloAnnotation"+(a+b));
        return "index";
    }
    //使用上面的方法url要写成/hello/1/2即可
    
  8. @RequestMapping中的参数

  9. @RequestMapping(value=“请求的地址”)所有请求方式都行

  10. @RequestMapping(value=“请求的地址”,method=RequestMethod.POST)

  11. @RequestMapping(value=“请求的地址”,method={RequestMethod.POST,RequestMethod.GET})

  12. 可用不同的提交方式,同一个请求的url实现不同返回结果

  13. @RequestMapping 如果固定了请求方法可以使用@GetMapping,@PostMapping等

  14. 接收前端的参数

  15. public String helloJson(@RequestParam(nameuser) String name,Model model)  前端的input签或者参数key的名字只能用nameuser,然后接收后给形参name,否则报错

  16. public String helloJson(User user,Model model)   可以从前端或者参数中接收与User类中相同的属性,若属性名能对上,则能接收此数据

  17. 数据发送到前端,一般可用ModelAndView、ModelMap、Model,常用Model

@RequestMapping("/random")
public String random(Model model){
    Articles a = articleService.getArticleRandom();
    System.out.println(a);
    model.addAttribute("article",a);
    model.addAttribute("msg","test");
    return "index";
}