一、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 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
;
public class HelloController implements Controller{
@Override
public ModelAndView
handleRequest(HttpServletRequest httpServletRequest
, HttpServletResponse httpServletResponse
) throws Exception
{
ModelAndView modelAndView
= new ModelAndView();
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">
<context:component-scan base-package="com.cn.lin"/>
<mvc:annotation-driven/>
<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"/>
<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
;
@Controller
public class AnnController {
@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
;
}
@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
= new ModelAndView();
modelAndView
.addObject("username", username
);
modelAndView
.setViewName("WEB-INF/jsp/hello.jsp");
return modelAndView
;
}
@RequestMapping("/hello3" )
public ModelAndView
doHello3(@RequestHeader(value
= "User-Agent") String name
) {
System
.out
.println("获取到的请求头"+name
);
ModelAndView modelAndView
= new ModelAndView();
modelAndView
.addObject("username", "gec");
modelAndView
.setViewName("hello");
return modelAndView
;
}
@RequestMapping("/hello4" )
public ModelAndView
doHello4(@RequestParam(name
= "funs") List
<String> funs
) {
for (String fun
: funs
) {
System
.out
.println(fun
);
}
ModelAndView modelAndView
= new ModelAndView();
modelAndView
.addObject("username", "gec");
modelAndView
.setViewName("hello");
return modelAndView
;
}
@RequestMapping("/hello5" )
public ModelAndView
doHello5(@CookieValue(value
= "JSESSIONID") String name
) {
System
.out
.println("获取到的Cookies内容"+name
);
ModelAndView modelAndView
= new ModelAndView();
modelAndView
.addObject("username", "gec");
modelAndView
.setViewName("hello");
return modelAndView
;
}
@RequestMapping("/hello6/{username}" )
public ModelAndView
doHello6(@PathVariable(value
= "username") String username
) {
System
.out
.println("获取到的Path"+username
);
ModelAndView modelAndView
= new ModelAndView();
modelAndView
.addObject("username", "gec");
modelAndView
.setViewName("hello");
return modelAndView
;
}
@RequestMapping("/hello7" )
public String
doHello7(@RequestParam(value
= "username") String username
, Model model
) {
System
.out
.println("获取到的Model内容"+username
);
model
.addAttribute("username",username
);
return "hello";
}
@RequestMapping("/hello8" )
public String
doHello8(@RequestParam(value
= "username") String username
, ModelMap modelMap
) {
System
.out
.println("获取到的ModelMap内容"+username
);
modelMap
.addAttribute("username",username
);
return "hello";
}
@RequestMapping("/hello9")
public String
doHello9(HttpSession session
) {
System
.out
.println("session会话打印的数据值"+session
.getAttribute("username"));
return "hello";
}
@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
=new ModelAndView();
modelAndView
.addObject("username","root");
modelAndView
.setViewName("hello");
return modelAndView
;
}
}