当前位置:   article > 正文

Spring MVC 快速入门之 入门基础_requestmapping作用于

requestmapping作用于

目录

一:基本概念

二:Spring MVC 工作原理

   基本步骤:

三:SpringMVC核心开发步骤

四:SpringMVC的组件

五:如何在项目中添加Spring MVC

1.添加相关依赖

2.实现SSM集成

3:输出第一个springMVC程序:千古一帝----秦始皇

       HelloController层:

六:常用注解讲解

1.RequestMapping

作用概述:

        1.作用于方法上,代表请求处理方法        2.作用于类上,代表窄化路径

属性:value

属性:method

2.Controller

七: 请求处理方法的参数传递

       ①:String类型的参数传递

②:八大基础类型参数

③:对象类型参数

④:注解@RequestParam传参

⑤:传递Ruquest/Response/Session

⑥:传递集合类型的参数

1.Map类型的参数必须使用@RequestParam方式接收

2.使用@RquestBody方式传递List或者Map类型的参数,但必须是JSON格式

八:返回值

①:String

②:ModelAndView

③:String+Model

九:跳转方式

①:forward 转发,forward:path

②:redirect 重定向,redirect:path

注意事项:

这两种跳转方式将会绕开视图解析器的前缀和后缀

    还有就是如果是在同一controller中则不用使用"/"从根目录开始,而如果是在不同的controller则一定要从根目录开始

转发和重定向的路径,不是逻辑视图名,而是请求方法名

如果在本Controller里面跳转,不需要使用"/"开头

     如果在不同的Controller里面跳转,则需要使用"/"开头,并且是窄化路径+请求路径

十:配置静态资源访问


一:基本概念

          Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。

          经典MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。其中,View的定义比较清晰,就是用户界面

          MVC指MVC模式的某种框架,它强制性地使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。最典型的MVC就是JSP + servlet + javabean的模式。

         视图是用户看到并与之交互的界面。对老式的Web应用程序来说,视图就是由HTML元素组成的界面,在新式的Web应用程序中,HTML依旧在视图中扮演着重要的角色,但一些新的技术已层出不穷,它们包括Adobe Flash和像XHTMLXML/XSL,WML等一些标识语言和Web services.

MVC好处是它能为应用程序处理很多不同的视图。在视图中其实没有真正的处理发生,不管这些数据是联机存储的还是一个雇员列表,作为视图来讲,它只是作为一种输出数据并允许用户操纵的方式。 

         模型表示企业数据和业务规则。在MVC的三个部件中,模型拥有最多的处理任务。例如它可能用像EJBs和ColdFusion Components这样的构件对象来处理数据库,被模型返回的数据是中立的,就是说模型与数据格式无关,这样一个模型能为多个视图提供数据,由于应用于模型的代码只需写一次就可以被多个视图重用,所以减少了代码的重复性。 

         控制器接受用户的输入并调用模型和视图去完成用户的需求,所以当单击Web页面中的超链接和发送HTML表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后再确定用哪个视图来显示返回的数据。

二:Spring MVC 工作原理

   基本步骤:

  1.用户发送请求至前端控制器DispatcherServlet(也叫中央处理器).
  2.DispatcherServlet收到请求调用HandlerMappering处理器映射器
  3.处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处       理器拦截器(如果有则生成)一并返回给DispatcherServlet.
  4.DispatcherServlet调用HandlerAdapter处理器适配器。
  5.HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
  6.Controller执行完成返回ModelAndView.
  7.HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet.
  8.DisPatcherServlet将ModelAndView传给ViewReslover视图解析器。
  9.ViewReslover解析后返回具体View.
 10.DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
 11.DispatcherServlet响应用户

三:SpringMVC核心开发步骤

  1.DispatcherServlet在web.xml中的部署描述,从而拦截请求到springMVC
  2. HandlerMapping的配置,从而将请求映射到处理器
  3. HandlerAdapter的配置,从而支持多种类型的处理器
  4. 处理器(页面控制器)的配置,从而刊行功能处理
  5. ViewResolver的配置,从而将逻辑视图名解析为具体的视图技术

四:SpringMVC的组件

  1. 前端控制器(DispatcherServlet):接收请求,响应结果,相当于转发器,中央处理器
  2.请求到处理器映射(HandlerMapping):根据配置或者注解找到最终要执行的Handler
  3. 处理器适配器(HandlerAdapter):按照特定规则(HandlerAdapter要求的规则)去执行Handler
  4. 视图解析器(ViewResolver):进行视图解析,根据逻辑视图名解析成真正的视图(view)
  5. 处理器或页面控制器(Controller):执行具体的用户请求
  6. 验证器(Validator)
  7. 命令对象(Command 请求参数绑定到的对象就叫命令对象)
  8. 表单对象(Form Object提供给表单展示和提交到的对象就叫表单对象)
 

五:如何在项目中添加Spring MVC

      前提:要先有一个Maven项目

1.添加相关依赖

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-webmvc</artifactId>
  4. <version>${spring.version}</version>
  5. </dependency>

         注意:需要添加JSTL依赖,否则缺少这两个jar包会报java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config,是因为org.springframework.web.servlet.view.JstlView在视图解析时需要这二个jar包

  1. <dependency>
  2. <groupId>jstl</groupId>
  3. <artifactId>jstl</artifactId>
  4. <version>1.2</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>taglibs</groupId>
  8. <artifactId>standard</artifactId>
  9. <version>1.1.2</version>
  10. </dependency>

2.实现SSM集成

①.在WEB-INF下添加spring-mvc.xml

  • 开启注解扫描

 <context:component-scan base-package="com.tangyuan"/>

      这样配置会与之前的spring-mybatis.xml中的注解扫描一样,产生重复扫描,所以我们要采用其它的方法来解决这个问题,因为Controller注解只作用于Controller层,可以采用排除法

             在spring-mybatis.xml中添加以下代码,来防止重复扫描,重复装配

  1. <!-- 用注解方式注入bean,并指定查找范围:com.tangyuan及子子孙孙包-->
  2. <context:component-scan base-package="com.tangyuan" use-default-filters="true">
  3. <!--除了Controller层以外,其他层均由此处来完成扫描工作-->
  4. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  5. </context:component-scan>

    对spring-mvc.xml的注解扫描进行完善,因为spring-mybatis.xml中的use-default-filters="true",所以我们要在spring-mvc.xml的注解扫描中添加use-default-filters="false"

  1. <context:component-scan base-package="com.tangyuan" use-default-filters="false">
  2. <!--此处只负责扫描Controller中的任务-->
  3. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  4. </context:component-scan>

  • 注册HandlerMapping和HandlerAdapter

     ps:   

         1.HandlerMapping:处理器映射器,根据配置或者注解找到具体的Handler(不执行)

         2.HandlerAdapter:处理器适配器,根据Handler处理器规则执行不同的Handler

  1. <!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
  2. <!--两个bean,这两个bean是spring MVC为@Controllers分发请求所必须的。并提供了数据绑定支持,-->
  3. <!--@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)-->
  4. <mvc:annotation-driven/>

  • 配置视图解析器ViewResolver
  1. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  2. <!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
  3. <property name="viewClass"
  4. value="org.springframework.web.servlet.view.JstlView"></property>
  5. <property name="prefix" value="/WEB-INF/jsp/"/>
  6. <property name="suffix" value=".jsp"/>
  7. </bean>

  • 配置静态资源访问
  1. <mvc:resources location="/css/" mapping="/css/**"/>
  2. <mvc:resources location="/images/" mapping="/img/**"/>
  3. <mvc:resources location="/WEB-INF/images/" mapping="/images/**"/>

完整代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  8. <!--开启注解扫描-->
  9. <!--1) use-dafault-filters="false"的情况下,根据表达式包含(include-filter)或排除(exclude-filter)指定包-->
  10. <context:component-scan base-package="com.tangyuan" use-default-filters="false">
  11. <!--此处只负责扫描Controller中的任务-->
  12. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  13. </context:component-scan>
  14. <!--2) 此标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
  15. <!--两个bean,这两个bean是spring MVC为@Controllers分发请求所必须的。并提供了数据绑定支持,-->
  16. <!--@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)-->
  17. <mvc:annotation-driven/>
  18. <!--3) ViewResolver -->
  19. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  20. <!-- viewClass需要在pom中引入两个包:standard.jar and jstl.jar -->
  21. <property name="viewClass"
  22. value="org.springframework.web.servlet.view.JstlView"></property>
  23. <property name="prefix" value="/WEB-INF/jsp/"/>
  24. <property name="suffix" value=".jsp"/>
  25. </bean>
  26. <!--4) 单独处理图片、样式、js等资源 -->
  27. <mvc:resources location="/css/" mapping="/css/**"/>
  28. <mvc:resources location="/images/" mapping="/img/**"/>
  29. <mvc:resources location="/WEB-INF/images/" mapping="/images/**"/>
  30. </beans>

②:编写web.xml

  • 实现Spring与web项目集成
  1. <!-- spring上下文配置文件 -->
  2. <context-param>
  3. <param-name>contextConfigLocation</param-name>
  4. <param-value>classpath:spring.xml</param-value>
  5. </context-param>
  6. <!-- 读取Spring上下文的监听器 -->
  7. <listener>
  8. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  9. </listener>

  • 基于SpringMVC过滤器配置中文乱码过滤器
  1. <filter>
  2. <filter-name>encodingFilter</filter-name>
  3. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  4. <async-supported>true</async-supported>
  5. <init-param>
  6. <param-name>encoding</param-name>
  7. <param-value>UTF-8</param-value>
  8. </init-param>
  9. </filter>
  10. <filter-mapping>
  11. <filter-name>encodingFilter</filter-name>
  12. <url-pattern>/*</url-pattern>
  13. </filter-mapping>

  • 配置SpringMVC核心控制器DispatcherServlet
  1. <servlet>
  2. <servlet-name>SpringMVC</servlet-name>
  3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  4. <!--此参数可以不配置,默认值为:/WEB-INF/springmvc-servlet.xml-->
  5. <init-param>
  6. <param-name>contextConfigLocation</param-name>
  7. <param-value>/WEB-INF/spring-mvc.xml</param-value>
  8. </init-param>
  9. <load-on-startup>1</load-on-startup>
  10. <!--web.xml 3.0的新特性,是否支持异步-->
  11. <async-supported>true</async-supported>
  12. </servlet>
  13. <servlet-mapping>
  14. <servlet-name>SpringMVC</servlet-name>
  15. <url-pattern>/</url-pattern>
  16. </servlet-mapping>

3:输出第一个springMVC程序:千古一帝----秦始皇

①:编写Controller层

       HelloController层:

  1. package com.tangyuan.Controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. /**
  5. * @author 唐渊
  6. * @create  2022-07-27 15:58
  7. */
  8. @Controller
  9. @RequestMapping("/hello")
  10. public class HelloController {
  11. @RequestMapping("/toHello")
  12. public String toHello(){
  13. System.out.println("正在进入Hello欢迎页面");
  14. return "hello";
  15. }
  16. }

②:配置Tomcat服务器

 

 

 

 

 

 

 

③:启动项目,测试结果

ok,nice,继续往下面浏览知识点

六:常用注解讲解

1.RequestMapping

  •       请求到处理器功能方法的映射规则,可定义到类和方法,可将@RequestMapping标签定义到类名处窄化路径
  •      常用参数:value、method

             将请求和处理请求的控制器方法关联起来,建立映射关系,SpringMVC接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。 

  • 作用概述:

        1.作用于方法上,代表请求处理方法
        2.作用于类上,代表窄化路径

在方法上的演示:

  1. package com.tangyuan.Controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. /**
  5. * @author 唐渊
  6. * @create  2022-07-27 15:58
  7. */
  8. @Controller
  9. /**
  10. * @RequestMapping
  11. * 1.作用于方法上,代表请求处理方法
  12. * 2.作用于类上,代表窄化路径
  13. */
  14. public class HelloController {
  15. @RequestMapping("/toHello")
  16. public String toHello(){
  17. System.out.println("正在进入Hello欢迎页面");
  18. return "hello"; //逻辑视图名
  19. }
  20. }

   

          路径为:http://localhost:8080/ssm/toHello     

       从路径中,可以清楚地看到@RequestMapping在方法上的作用,它作用于方法上,代表着该方法为请求处理方法,通过该注解配置的路径可以设置映射请求请求路径的具体信息

在类上的演示:

  1. package com.tangyuan.Controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. /**
  5. * @author 唐渊
  6. * @create  2022-07-27 15:58
  7. */
  8. @Controller
  9. @RequestMapping("/hello")
  10. /**
  11. * @RequestMapping
  12. * 1.作用于方法上,代表请求处理方法
  13. * 2.作用于类上,代表窄化路径
  14. */
  15. public class HelloController {
  16. @RequestMapping("/toHello")
  17. public String toHello(){
  18. System.out.println("正在进入Hello欢迎页面");
  19. return "hello"; //逻辑视图名
  20. }
  21. }

       

        路径为:http://localhost:8080/ssm/hello/toHello

       从路径中,可以清楚地看到@RequestMapping在类上的作用,它作用于类上,为窄化路径,通过该注解配置的路径可以  设置映射请求请求路径的初始信息(通常用于表示某个模块的信息),可以方便区分不同模块的相同方法

属性:value

  1. //
  2. // Source code recreated from a .class file by IntelliJ IDEA
  3. // (powered by Fernflower decompiler)
  4. //
  5. package org.springframework.web.bind.annotation;
  6. import java.lang.annotation.Documented;
  7. import java.lang.annotation.ElementType;
  8. import java.lang.annotation.Retention;
  9. import java.lang.annotation.RetentionPolicy;
  10. import java.lang.annotation.Target;
  11. import org.springframework.core.annotation.AliasFor;
  12. @Target({ElementType.METHOD, ElementType.TYPE})
  13. @Retention(RetentionPolicy.RUNTIME)
  14. @Documented
  15. @Mapping
  16. public @interface RequestMapping {
  17. String name() default "";
  18. @AliasFor("path")
  19. String[] value() default {};
  20. @AliasFor("value")
  21. String[] path() default {};
  22. RequestMethod[] method() default {};
  23. String[] params() default {};
  24. String[] headers() default {};
  25. String[] consumes() default {};
  26. String[] produces() default {};
  27. }

      通过源码可以看出value可以单独使用,当只有一个参数时,value可以省略不写,默认存在,当有两个参数时,会自动显示出来,来区分不同的参数

  

属性:method

  •   通常用来代表请求方式,是get请求,还是post请求
  •   默认为所有的请求方式都可以接收,进行方法和路径的跳转

   属性演示:

  -------------------------------------------- post请求方式演示--------------------------------------------------------

  1. package com.tangyuan.Controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RequestMethod;
  5. /**
  6. * @author 唐渊
  7. * @create  2022-07-27 15:58
  8. */
  9. @Controller
  10. @RequestMapping("/hello")
  11. /**
  12. * @RequestMapping
  13. * 1.作用于方法上,代表请求处理方法
  14. * 2.作用于类上,代表窄化路径
  15. */
  16. public class HelloController {
  17. @RequestMapping(value = "/toHello",method = {RequestMethod.POST})
  18. public String toHello(){
  19. System.out.println("正在进入Hello欢迎页面");
  20. return "hello"; //逻辑视图名
  21. }
  22. }

     因为地址栏回车是get请求,与我们所定义的method属性的post请求不符合,所以显示405错误

    可以在后面再嵌套get请求方式,用逗号隔开,就可以接收get和post请求方式

    @RequestMapping(value = "/toHello",method = {RequestMethod.POST,RequestMethod.GET})

2.Controller

     用于标识处理器类,将Controller类注入到spring上下文中,通常只作用于Controller层

七: 请求处理方法的参数传递

       ①:String类型的参数传递

  1. @RequestMapping("home")
  2. public String home(String bname){
  3. System.out.println(bname);
  4. return "index";
  5. }

地址栏路径:

测试结果:

②:八大基础类型参数

  1. @RequestMapping("home")
  2. public String home(String bname,Integer bprice){
  3. System.out.println(bname);
  4. System.out.println(bprice);
  5. return "index";
  6. }

地址栏路径:

测试结果:

③:对象类型参数

  1. @RequestMapping("home")
  2. public String home(Book book){
  3. System.out.println(book);
  4. return "index";
  5. }

地址栏路径:

测试结果:

④:注解@RequestParam传参

  1. /**
  2. * 注解@RequestParam传参
  3. * @param bname
  4. * @param bprice
  5. * @return
  6. */
  7. @RequestMapping("home")
  8. public String home(@RequestParam("bName") String bname,
  9. @RequestParam("bPrice") Integer bprice){
  10. System.out.println(bname);
  11. System.out.println(bprice);
  12. return "index";
  13. //bName--->参数
  14. //bname---->变量名
  15. }

地址栏路径:

 测试结果:

        原因:使用注解方式进行传参,地址栏中的参数属性必须与注解方式定义的一致,否则会报错

    正确方式:

  测试结果:

 

⑤:传递Ruquest/Response/Session

  1. /**
  2. * 传递Ruquest/Response/Session
  3. * @param request
  4. * @param session
  5. * @return
  6. */
  7. @RequestMapping("home")
  8. public String home(HttpServletRequest request,HttpSession session ){
  9. System.out.println(request.getRequestURI());
  10. System.out.println(session.getId());
  11. return "index";
  12. }

测试结果:

⑥:传递集合类型的参数

  1. /**
  2. * 集合类型参数
  3. * @param params
  4. * @return
  5. */
  6. @RequestMapping("home")
  7. public String home(Map<String,Object> params ){
  8. System.out.println(params);
  9. return "index";
  10. }

   地址栏路径:

   测试结果:

 

解决办法:

  1. /**
  2. * 集合类型参数
  3. * @param params
  4. * @return
  5. */
  6. @RequestMapping("home")
  7. public String home(@RequestParam Map<String,Object> params ){
  8. System.out.println(params);
  9. return "index";
  10. }

测试结果:

ps:

1.Map类型的参数必须使用@RequestParam方式接收

2.使用@RquestBody方式传递List或者Map类型的参数,但必须是JSON格式

八:返回值

①:String

  1. @RequestMapping(value = "/toHello")
  2. public String toHello(){
  3. System.out.println("正在进入Hello欢迎页面");
  4. return "hello"; //逻辑视图名
  5. }

②:ModelAndView

  1. @RequestMapping(value = "/toHello")
  2. public ModelAndView toHello(String bname){
  3. System.out.println("正在进入Hello欢迎页面");
  4. ModelAndView mv=new ModelAndView();
  5. mv.setViewName("hello");
  6. mv.addObject("bname",bname);
  7. return mv;
  8. }

③:String+Model

  1. @RequestMapping(value = "/toHello")
  2. public String toHello(String bname, Model model){
  3. System.out.println("正在进入Hello欢迎页面");
  4. model.addAttribute("bname",bname);
  5. return "hello"; //逻辑视图名
  6. }

   ps:这三种方式都属于需要跳转到视图解析器中进行视图解析操作

九:跳转方式

①:forward 转发,forward:path

  1. @RequestMapping(value = "/toAddBook")
  2. public String toAddBook(){
  3. System.out.println("进入书本新增页面");
  4. return "forward:toBookList";
  5. }
  6. @RequestMapping("/toBookList")
  7. public String toBookList(){
  8. return "book/bookList"; //逻辑视图名
  9. }

②:redirect 重定向,redirect:path

  1. @RequestMapping(value = "/toAddBook")
  2. public String toAddBook(){
  3. System.out.println("进入书本新增页面");
  4. return "redirect:toBookList";
  5. }
  6. @RequestMapping("/toBookList")
  7. public String toBookList(){
  8. return "book/bookList"; //逻辑视图名
  9. }

注意事项:

  • 这两种跳转方式将会绕开视图解析器的前缀和后缀

  •     还有就是如果是在同一controller中则不用使用"/"从根目录开始,而如果是在不同的controller则一定要从根目录开始

  • 转发和重定向的路径,不是逻辑视图名,而是请求方法名

  • 如果在本Controller里面跳转,不需要使用"/"开头

  •      如果在不同的Controller里面跳转,则需要使用"/"开头,并且是窄化路径+请求路径

十:配置静态资源访问

   在spring-mvc.xml文件中配置以下代码即可单独处理图片、样式、js等资源

  1. <mvc:resources location="/css/" mapping="/css/**"/>
  2. <mvc:resources location="/images/" mapping="/img/**"/>
  3. <mvc:resources location="/WEB-INF/images/" mapping="/images/**"/>

 效果展示:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/586125
推荐阅读
相关标签
  

闽ICP备14008679号