SpringMVC 入门使用

it2023-09-02  69

一、SpringMVC的使用介绍

1、SpringMVC的运行原理

https://www.cnblogs.com/wangjiming/p/10487832.html:针对于组件中详请介绍

客户端请求经过前端控制器,前端控制器解析分发到映射器中,映射器中进一步解析显示到设配器,而设配器经过到controller,而Controller 调用ModelAndView 返回一个handle,再接下来就是经过视图解析器,把数据访问回到前端页面中渲染

2、核心组件介绍

DispatcherServlet组件 前端控制器 此组件是整个SpringMVC最核心的组件作用 接受客户端请求,委派HandlerMapping、HandlerAdpater处理,将数据模型(Model)转发到View组件 HandlerMapping组件 处理器映射器 作用 根据客户端的请求uri,获取的目标Handler举例 客户端输入:http://xxxxx/shoplistHandlerMapping根据“/shoplist”去找目标的组件(handler) HandlerAdapater组件 处理器适配器 作用 是否适合运行目标Handler举例 看一部3D电影 Handler 目标handler 作用:后端目标组件(客户端最终访问的目标组件) ModelAndView 简介 ModelAndView:描述模型与视图组件 ViewResolver 视图解释器 将视图的逻辑地址解释成视图的物理地址

3、 组件在上述中 代码的配置(前端控制器配置)

基于文件中较流行使用的方式 <!--配置注解的映射文件--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <!--配置注解的设配器--> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> <!--视图解释器--> <!--<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"/>--> <!--视图解析器的第二种--> <bean id="resourceView" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前缀--> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <!-- 后缀 --> <property name="suffix"> <value>.jsp</value> </property> </bean>

4、配置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"> <!-- 定义Spring MVC的前端控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <!-- 让Spring MVC的前端控制器拦截所有请求 /:只匹配所有的请求,不会去匹配jsp页面 /* :匹配所有的请求,包括sp页面 --> <!-- 让Spring MVC的前端控制器拦截所有请求 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>

5、maven中需要导入的库

<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.9.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.2.9.RELEASE</version> </dependency> </dependencies>

二、原生使用springmvc的实例

配置的xml文件,也是不需要配置映射器,设配器,解析器并且是每生成一个控制器,都需要配置一个注解和一个 modleAndView,造成代码很臃肿 <bean name="/hello" class="com.cn.home.controller.HelloController"/> 调用java层的代码 package com.cn.home.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 Lin_Home * @Date 2020/10/19 11:20 * @Version 1.0 */ //实现的是servlet下组件 public class HelloController implements Controller{ @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //数据加载到ModelAndView ModelAndView modelAndView = new ModelAndView(); //类似servlet中的request的setAbrite(); modelAndView.addObject("username","root"); //类似 转发 modelAndView.setViewName("/WEB-INF/jsp/hello.jsp"); return modelAndView; } }

三、使用注解版实例

文件配置 <?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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd"> <!-- 支持mvc注解驱动 在:spring中一般采用@RequestMapping注解来完成映射关系 要想使@RequestMapping注解生效 必须向上下文中注册 DefaultAnnotationHandlerMapping 和一AnnotationMethodHandlerAdapter实例 这两个实例分别在类级别和方法级别处理。 而annotation-driven配置帮助我们自动完成上述两个实例的注入。--> <context:component-scan base-package="com.cn.lin"/> <!-- 1、注解映射器及适配器的实现2、消息转换器的配置实现(默认jackson)3、数据转换 4、数据格式化处理--> <mvc:annotation-driven/> <!--使用纯注解的方式实现--> <!--让springMvc不处理静态资源 .css .js .html .mp4--> <mvc:default-servlet-handler/> <!--但是视图还是要配置--> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 前缀 --> <property name="prefix"> <value>/WEB-INF/jsp/</value> </property> <!-- 后缀 --> <property name="suffix"> <value>.jsp</value> </property> </bean> </beans> java生成代码部分 第一种方式 @Controller public class HelloController { @ResponseBody @RequestMapping("/abc.action") public String HelloTest(@RequestBody Book book){ System.out.println("你好。。。。"); System.out.println(book); book.setAuto("罗总"); return "hello"; } 第二种方式 @ResponseBody @RequestMapping("/adb.action") public Book HelloTe(@RequestBody Book book){ System.out.println("你好。。。。"); System.out.println(book); book.setAuto("罗总"); return book; }

四、处理器、设配器的其他方式

1、映射器分类

BeanNameUrlHandlerMapping :通过对比url和bean的name找到对应的对象SimpleUrlHandlerMapping :也是直接配置url和对应bean,比BeanNameUrlHandlerMapping功能更多。ControllerClassNameHandlerMapping :这个实际上是去掉控制器中的Controller后,将剩余的部分跟URL匹配DefaultAnnotationHandlerMapping:在spring3.1版本之前用的针对注解配置,针对@RequestMapping 生效RequestMappingHandlerMapping :针对注解配置@RequestMapping起作用

2、设配器分类

HttpRequestHandlerAdapter:要求handler实现HttpRequestHandler接口SimpleControllerHandlerAdapter:要求handler实现Controller接口AnnotationMethodHandlerAdapter:是在spring3.1版本之前用的,针对@RequestMapping 生效RequestMappingHandlerAdapter:针对@RequestMapping 生效

3、较老的搭配方式

映射器 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> 设配器 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!--配置处理器映射器第二种方式 也是直接配置url和对应bean,比BeanNameUrlHandlerMapping功能更多--> <!--这个方式过时了--> <bean id="hello2" class="com.cn.home.controller.HelloController2"/> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/hello">hello2</prop> </props> </property> </bean> <!--第二种处理器设配器的使用--> <bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>

五、SpringMVC中的注解方式

1、@RequestMapping

简介 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径

2、@RequestParam

简介 注解用于绑定请求中的参数到处理方法的参数中

3、@RequestHeader

简介 用于将请求的头信息区数据映射到功能处理方法的参数上

4、@CookieValue

简介 用于将请求的Cookie数据映射到功能处理方法的参数上。

5、@PathVariable

简介 带占位符的URL是Spring3.0新增的功能,通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx”) 绑定到操作方法的入参中。

6、Model和ModelMap

简介

ModelMap对象主要用于传递控制方法处理数据到结果页面,也就是说我们把结果页面上需要的数据放到ModelMap对象中即可,他的作用类似于request对象的setAttribute方法的作用,用来在一个请求过程中传递处理的数据。通过以下方法向页面传递参数:

如何使用

可以直接定义到方法参数

7、@SessionAttributes

简介 如果希望在多个请求之间公用某个模型属性数据,则可以在控制器类标注一,@SessionAttributes,SpringMVC会将模型中对应的属性暂存到HttpSerssion中 package com.cn.home; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpSession; import java.util.List; /** * @Author Lin_Home * @Date 2020/10/19 15:24 * @Version 1.0 */ //使用注解文件配置 @Controller public class AnnController { //这个得使用第一个解析器 // http://localhost:8080/hello?username //method这个条件指的是用post,如果是get请求的而不能访问,而默认是get params这个类似是key @RequestMapping(value = "/hello",method = {RequestMethod.GET},params = "username") public ModelAndView AnnConTest() { ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("username", "root"); modelAndView.setViewName("WEB-INF/jsp/hello.jsp"); return modelAndView; } //定义一个请求方法(第二种方式) //required当为false 意思是可以是为null的值 // http://localhost:8080/hello2?username=tom&age=20 @RequestMapping("/hello2" ) public ModelAndView doHello2(@RequestParam(name = "username",required = true) String username, @RequestParam(name = "age",required = false) Integer age) { System.out.println(username +"----"+age); //创建ModelAndView:定义一个数据模型及视图组件 ModelAndView modelAndView = new ModelAndView(); //以key value方式存储到request作用域 modelAndView.addObject("username", username); //将逻辑视图名----->解释------>/WEB-INF / jsp / hello.jsp modelAndView.setViewName("WEB-INF/jsp/hello.jsp"); return modelAndView; } // http://localhost:8080/hello3 //且应该是使用注解方式 @RequestMapping("/hello3" ) //获取的是请求头 public ModelAndView doHello3(@RequestHeader(value = "User-Agent") String name) { System.out.println("获取到的请求头"+name); //创建ModelAndView:定义一个数据模型及视图组件 ModelAndView modelAndView = new ModelAndView(); //以key value方式存储到request作用域 modelAndView.addObject("username", "gec"); //将逻辑视图名----->解释------>/WEB-INF / jsp / hello.jsp modelAndView.setViewName("hello"); return modelAndView; } @RequestMapping("/hello4" ) //获取的是请求头 //@RequestParam 这个指的是请求体自己赋值进去 //http://localhost:8080/hello4?funs=11&funs=22 funs 值是可以多个 public ModelAndView doHello4(@RequestParam(name = "funs") List<String> funs) { for (String fun : funs) { System.out.println(fun); } //创建ModelAndView:定义一个数据模型及视图组件 ModelAndView modelAndView = new ModelAndView(); //以key value方式存储到request作用域 modelAndView.addObject("username", "gec"); //将逻辑视图名----->解释------>/WEB-INF / jsp / hello.jsp modelAndView.setViewName("hello"); return modelAndView; } // 访问的链接 http://localhost:8080/hello5 @RequestMapping("/hello5" ) //获取的是会话Cookie public ModelAndView doHello5(@CookieValue(value = "JSESSIONID") String name) { System.out.println("获取到的Cookies内容"+name); //创建ModelAndView:定义一个数据模型及视图组件 ModelAndView modelAndView = new ModelAndView(); //以key value方式存储到request作用域 modelAndView.addObject("username", "gec"); //将逻辑视图名----->解释------>/WEB-INF / jsp / hello.jsp modelAndView.setViewName("hello"); return modelAndView; } // 访问的链接 http://localhost:8080/hello6/username=??? //类似自定义。但是他是根据rest风格 @RequestMapping("/hello6/{username}" ) public ModelAndView doHello6(@PathVariable(value = "username") String username) { System.out.println("获取到的Path"+username); //创建ModelAndView:定义一个数据模型及视图组件 ModelAndView modelAndView = new ModelAndView(); //以key value方式存储到request作用域 modelAndView.addObject("username", "gec"); //将逻辑视图名----->解释------>/WEB-INF / jsp / hello.jsp modelAndView.setViewName("hello"); return modelAndView; } // 访问的链接 http://localhost:8080/hello7?username=tom @RequestMapping("/hello7" ) public String doHello7(@RequestParam(value = "username") String username, Model model) { System.out.println("获取到的Model内容"+username); //等效于request.setAttribute(key,value); model.addAttribute("username",username); //将逻辑视图名----->解释------>/WEB-INF/jsp/success.jsp return "hello"; } // 访问的链接 http://localhost:8080/hello8?username=tom @RequestMapping("/hello8" ) public String doHello8(@RequestParam(value = "username") String username, ModelMap modelMap) { System.out.println("获取到的ModelMap内容"+username); //等效于request.setAttribute(key,value); modelMap.addAttribute("username",username); //将逻辑视图名----->解释------>/WEB-INF/jsp/success.jsp return "hello"; } // 访问的链接 http://localhost:8080/hello9 @RequestMapping("/hello9") public String doHello9(HttpSession session) { System.out.println("session会话打印的数据值"+session.getAttribute("username")); //将逻辑视图名----->解释------>/WEB-INF/jsp/success.jsp return "hello"; } // http://localhost:8080/hello10?username=100 @RequestMapping("/hello10") public ModelAndView dohello4(@RequestParam MultiValueMap<String,Object> usermap, Model model) { usermap.forEach((k,v)-> System.out.println("k="+k+" v="+v)); //创建ModelAndView:定义一个数据模型及视图组件 ModelAndView modelAndView=new ModelAndView(); //以key value方式存储到request作用域 modelAndView.addObject("username","root"); //将逻辑视图名----->解释------>/WEB-INF/jsp/success.jsp modelAndView.setViewName("hello"); return modelAndView; } }
最新回复(0)