目录
5.3 配置web.xml 和上面一样,略----------
11.2 通过 SpringMVC 的静态资源映射器处理静态资源
1 什么是 SpringMVC
SpringMVC
是一个基于
MVC
模式的
Web
框架,是
Spring
框架的一个模块 。它以
SpringIOC容器为基础,并利用容器的特性来简化它的配置,所以 SpringMVC
和
Spring
可直接整合使,SpringMVC
对
MVC
流程进行了封装,屏蔽掉很多底层代码,让开发者可以更加轻松快
捷的完成基于
MVC
模式的
Web
开发。
2 SpringMVC 中重要的组件
DispatcherServlet
:前端控制器,接受所有请求。
HandlerMapping
:处理器映射器,根据配置的映射规则,找到对应的处理器。
HandlerAdapter
:处理器适配器,执行处理器中处理请求的方法。
ViewResolver
:视图解析器,定位视图。
3 Spring MVC 工作流程
Spring MVC
的工作流程如下:
客户端请求提交到 DispatcherServlet
。
由 DispatcherServlet
控制器通过
HandlerMapping
,找到处理请求的
Controller
。
DispatcherServlet 将请求提交到
Controller
。
Controller 调用业务逻辑处理后返回 ModelAndView。
DispatcherServlet 通过
ViewResolver 视图解析器,找到 ModelAndView
指定的视图。
视图负责渲染并将结果显示到客户端。
4 SpringMVC 的基本使用
4.1配置前端控制器
<?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"> <!--配置SpringMVC的前端控制器--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--如果未指定springMVC配置文件的路径以及名称,那么前端控制器默认 会去WEB/INF目录中查找一个名称为'springmvc'-servlet.xml--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.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> |
4.2 配置controller
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--配置Controller--> <bean id="/demo" class="com.web.controller.DemoController"/> </beans> |
5 SpringMVC 基于注解的使用方式
在
SpringMVC
的基本使用中我们是以传统方式创建的控制器,它需要实现
Controller
接 口。传统风格的控制器不仅需要在配置文件中配置映射,而且只能编写一个处理方法,不够灵活。
使用基于注解的控制器具有以下两个优点:
在基于注解的控制器类中可以编写多个处理方法,进而可以处理多个请求,这就允许将
相关的操作编写在同一个控制器类中,从而减少控制器类的数量,方便以后的维护。
基于注解的控制器不需要在配置文件中部署映射,仅需要使用 @RequestMapping
注解
就可以将一个
URI
绑定到类或方法上。
5.1 @Controller
@Controller
注解用于指定
Bean
对象为控制器。
5.2 @RequestMapping
@RequestMapping
用于将一个
URI
绑定到类上或类的方法中。
5.3 配置web.xml 和上面一样,略----------
5.4 配置注解扫描和注解驱动
<?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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.web.controller"/> <!-- 配置注解驱动--> <mvc:annotation-driven/> </beans> |
注意:配置注解驱动的话需要添加mvc命名空间
xmlns:
mvc
="http://www.springframework.org/schema/mvc"
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
在基于注解方式开发控制器时,需要添加
<mvc:annotation-driven/>
标签,它是启用
MVC
注解的钥匙。如果没有使用这个标签,而仅仅是使用
<context:component-scan/>
标签扫描并
注册了相关的控制器,那么仅是
@Controller @RequestMapping
基本功能的注解可以使用除
此以外的相关的注解并不能使用。 <mvc:annotation-driven/>的作用是提供扩展功能的。
它的处理类
AnnotationDrivenBeanDefinitionParser
会注册很多基于注解开发时所用到的 Bean 对 象 到 容 器 中 。 其 中 包 含 RequestMappingHandlerMapping
、 RequestMappingHandlerAdapter 与 ExceptionHandlerExceptionResolver
三个
bean
。
6 获取请求参数
在
Servlet
中我们通过 request.getParameter(name)方法获取请求参数。该方式存在
两个问题:
请求参数较多时会出现代码冗余的显现。
与容器紧耦合。 在 SpringMVC
中可以使用
HttpServletRequest
对象获取请求数据,同时还提供了参数注
入的方式用于获取请求数据。
SpringMVC
参数注入的优点:
简化参数接收形式(不需要调用任何方法。需要什么参数, 就在控制器方法中提供
什么参数)。
参数类型不需要自己转换了。如果类型不符会抛出 400 异常。
可将参数自动封装为对象。
如果没有该参数对应的数据,可为该参数指定默认值。
6.1 @RequestParam 注解
@RequestParam
:将请求参数绑定到控制器的方法参数上。
value
:参数名
required
:是否包含该参数,默认为
true
,表示该请求路径中必须包含该参数,如果不
包含就报错。
defaultValue
:默认参数值,如果设置了该值,
required=true
将失效,自动为
false,
如果没有传该参数,就使用默认值
这个注解对大家来说都是小儿科
/**
*
@RequestParam
使用
*
@param
username
*
@param
userage
*
@return
*/
@RequestMapping
(
"/addUsers2"
)
public
ModelAndView addUsers2(
@RequestParam
(value =
"name"
,required
=
true
,defaultValue =
"oldlu"
) String username,
@RequestParam
(
"age"
)
int
userage){
ModelAndView modelAndView =
new
ModelAndView();
modelAndView.setViewName(
"/index.jsp"
);
modelAndView.addObject(
"name"
,username);
modelAndView.addObject(
"age"
,userage);
return
modelAndView;
}
|
6.11 注入集合参数
在
SpringMVC
请求参数注入中,如果有多请求参数的
name
相同,那么可以使用
String[] 或 List
集合来接收请求参数。如果使用的
List
类型需要在该参数前添加
@RequestParam
注 解,String[]
则不需要
6.12 注入对象参数
在
SpringMVC
的请求参数注入中,可以使用注入
POJO
方式来接收请求参数。要求:请 求参数的 name
必须与
POJO
的属性名相同。
6.13 注入关联对象
SpringMVC
可以根据对象的关联关系实现请求参数的注入。
6.14 向集合中注入对象
在
SpringMVC
中可以向一个集合属性中注入对象。
7 关于乱码问题
7.1 字符编码过滤器
在请求参数中如果含有中文,会出现乱码现象。
7.2 Get 请求含有中文乱码解决方案
修改
Tomcat
的
server.xml
配置文件
7.3 Post 请求含有中文乱码解决方案
修改web.xml
<!--Spring
中提供的字符编码过滤器
-->
<
filter
>
<
filter-name
>encFilter</
filter-name
>
<
filter-class
>org.springframework.web.filter.CharacterEncodingFilter</
filter-class
>
<
init-param
>
<
param-name
>encoding</
param-name
>
<
param-value
>utf-8</
param-value
>
</
init-param
>
</
filter
>
<
filter-mapping
>
<
filter-name
>encFilter</
filter-name
>
<
url-pattern
>/*</
url-pattern
>
</
filter-mapping
>
|
8 指定处理请求类型
8.1 @RequestMapping
在
@RequestMapping
注解中如果并未指定处理请求类型,那么含有该注解的方法既可以 处理 GET
类型请求也可以处理
POST 类型的请求。如果需要指定只能处理某种类型的请求,可以通过
method
属性指定请求类型。
8.2 @GetMapping
@GetMapping
注解表示只能处理
Get
类型请求。
8.3 @PostMapping
@PostMapping
注解表示只能处理
Post
类型请求
9 SpringMVC 处理响应
9.1 配置视图解析器
在
SpringMVC
中提供了
13
个视图解析器,用于支持不同的视图技术。视图解析器最大
的特点是可以将控制器中处理请求的逻辑和视图中渲染实现解耦。
InternalResourceViewResolver
是
SpringMVC
中默认的视图解析器,用来解析
JSP
视图。
能将视图名映射为
JSP
文件。
<!--
配置视图解析器
-->
<
bean
id
="viewResolver"
class
="org.springframework.web.servlet.view.InternalResourceViewR
esolver"
>
<
property
name
="prefix"
value
="/WEB-INF/jsp/"
/>
<
property
name
="suffix"
value
=".jsp"
/>
</
bean
>
|
9.2 SpringMVC 作用域传值
作用域:“数据共享的范围”,也就是说数据能够在多大的范围内有效。
9.21 Request 作用域传值
1 使用原生的
HttpServletRequest
@RequestMapping
(
"/login"
)
public
String showLogin(HttpServletRequest request){
request.setAttribute(
"msg"
,
"Hello Oldlu"
);
return
"login"
;
}
2 使用
Map
集合
SpringMVC
会为
Map
接口注入
BindingAwareModelMap
对象。该对象是由
Spring
提供的
一个实现了
Map
接口的对象。
SpringMVC
会把该对象中的数据放入到
HttpServletRequest
对
象中,其目的是为了解除控制器与容器的耦合
@RequestMapping
(
"/login"
)
public
String showLogin(HttpServletRequest
request,
Map<String,String> map){
map.put(
"msg"
,
"Hello Bjsxt"
);
return
"login"
;
}
3
使用
Model
接口
在
SpringMVC
中提供了一个
Model
类型的接口,该接口定义了传递数据的基本行为。
如果 在处 理请求 的方 法中指 定了
Model
类型 的参 数,那 么
SpringMVC
会注 入一个
BindingAwareModelMap
对象,并通过该对象把数据放入到
HttpServletRequest
对象中。
9.22 Session 作用域传值
Session
作用域表示在当前会话中有效。在
SpringMVC
中对于
Session
作用域传值,只能 使用 HttpSession
对象来实现。对于
HttpSession
对象的获取方式有两种:
通过参数注入方式获取 HttpSession
对象。
通过注入 HttpServletRequest
对象,并通过该对象获取
HttpSession
。
@RequestMapping
(
"/login"
)
public
String showLogin(HttpServletRequest request,
Map<String,String> map, Model model,HttpSession session){
//HttpSession session = request.getSession();
session.setAttribute(
"msg"
,
"Hello Bjsxt"
);
return
"login"
;
}
9.23 Application 作用域传值
Application
作用域表示在整个应用范围都有效。在
SpringMVC
中对于
Application
作用域 传值,只能使用 ServletContext
对象来实现。但是对于该对象的获取方式不能直接向方法中 注入。需要通过 HttpServletRequest
或者
HttpSession
对象获取
@RequestMapping
(
"/login"
)
public
String showLogin(HttpServletRequest request,
Map<String,String> map, Model model,HttpSession session){
//ServletContext servletContext =
request.getSession().getServletContext();
ServletContext servletContext = session.getServletContext();
servletContext.setAttribute(
"msg"
,
"Hello Bjsxt"
);
return
"login"
;
}
10 SpringMVC 的响应方式
10.1 请求转发
10.12 使用 Servlet API
request.getRequestDispatcher(
"/WEB-INF/jsp/login.jsp"
).forward(re
quest,response);
10.13 使用 Forward 关键字实现请求转发跳转
如果使用
forward
关键字实现请求转发跳转时,是通过
SpringMVC
的 DispatcherServlet
组件来完成的。不会执行视图解析器,所以需要指定请求跳转页面的完整
URI
。
return
"forward:/WEB-INF/jsp/login.jsp"
;
10.14 使用视图解析器实现请求转发
在
SpringMVC
的视图解析器中使用的是请求转发方式来实现页面跳转。可以在配置视图
解析器时指定视图的前置与后缀。
<!--
配置视图解析器
-->
<
bean
id
="viewResolver"
class
="org.springframework.web.servlet.view.InternalResourceViewR
esolver"
>
<
property
name
="prefix"
value
="/WEB-INF/jsp/"
/>
<
property
name
="suffix"
value
=".jsp"
/>
</
bean
>
10.2 重定向
在
SpringMVC
需要使用
redirect
关键字实现重定向的跳转。在重定向跳转中是不经过视
图解析器的。
return
"redirect:/page/login4"
;
11 静态资源映射
当在
DispatcherServlet
的
<url-pattern>
中配置拦截
“/”
时,除了
*.jsp
不会拦截以外,其
他所有的请求都会经过前端控制器进行匹配,此时静态资源,例如
*.css
、
*.js
、
*.jpg……
就
会被前端控制器拦截,导致不能访问,出现
404
问题。
11.1 通过 DefaultServlet 处理静态资源
修改
web.xml
<
servlet-mapping
>
<
servlet-name
>default</
servlet-name
>
<
url-pattern
>*.jpg</
url-pattern
>
</
servlet-mapping
>
<
servlet-mapping
>
<
servlet-name
>default</
servlet-name
>
<
url-pattern
>*.css</
url-pattern
>
</
servlet-mapping
>
<
servlet-mapping
>
<
servlet-name
>default</
servlet-name
>
<
url-pattern
>*.js</
url-pattern
>
</
servlet-mapping
>
<
servlet-mapping
>
<
servlet-name
>default</
servlet-name
>
<
url-pattern
>*.png</
url-pattern
>
</
servlet-mapping
>
11.2 通过 SpringMVC 的静态资源映射器处理静态资源
在
spring3.0.4
以后的
SpringMVC
模块提供了静态资源映射器组件。通过
mvc:resources
标签配置静态资源映射器
修改
SpringMVC
配置文件
<!--
配置静态资源映射器
-->
<!-- mapping:
配置请求的
URL
location:
配置映射路径
-->
<
mvc
:resources
mapping
="/img/**"
location
="/img/"
/>
<
mvc
:resources
mapping
="/js/**"
location
="/WEB-INF/js/"
/>
11.3 通过<mvc:default-servlet-handler />处理静态资源
在
SpringMVC
的配置文件中配置
<mvc:default-servlet-handler />
后,会在
Spring MVC
上
下文中定义一个
org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler
,
它会像一个检查员,对进入
DispatcherServlet
的
URL
进行筛查,如果发现是静态资源的请求,
就将该请求转由
Web
应用服务器默认的
Servlet
处理,如果不是静态资源的请求,才由 DispatcherServlet 继续处理。
修改 SpringMVC 配置文件
<mvc:default-servlet-handler/>
12 SpringMVC 常用注解
1
@Controller
@Controller
用于标记在一个类上,使用它标记的类就是一个
SpringMVC Controller
对象。
2
@RequestMapping
@RequestMapping
是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,
表示类中的所有处理请求的方法都是以该地址作为父路径。
value
:指定请求的实际地址;
method
:指定请求的
method
类型,
GET
、
POST
、
PUT
、
DELETE
等;
produces:
指定返回的内容类型;
3 @GetMapping
@GetMapping
是用来指定处理
Get
请求类型的注解。表示该方法只能处理
Get
类型的
请求。
value
:指定请求的实际地址;
4 @PostMapping
@PostMapping
是用来指定处理
Post
请求类型的注解。表示该方法只能处理
Post
类型请 求。
value
:指定请求的实际地址;
5 @PathVariable
@PathVariable
用于将请求
URL
中的模板变量映射到功能处理方法的参数上,即取出
uri
模板中的变量作为参数。
name
:指定
uri
模板中的标识名称;
6
@RequestParam
@RequestParam
用于在控制器方法中获取请求参数;
defaultValue
: 表示设置默认值;
required
:设置是否是必须要传入的参数,类型为
boolean
;
name
:指定请求参数名称;
7
@RequestBody
@RequestBody
将请求中的
JSON
格式数据转换为
Java
对象;
8
@ResponseBody
@ResponseBody
将响应的对象转换为
JSON
格式数据;
9
@RequestHeader
@RequestHeader
将请求头的数据,映射到处理请求的方法参数上。
name
:指定请求头
name
;
10
@CookieValue
@CookieValue
注解主要是将请求的
Cookie
数据,映射到处理请求的方法参数上。
name
:指定
CookieName
;
11 @CrossOrigin
@CrossOrigin
注解用于处理跨域请求访问。