简介
SpringMVC 是一种基于 Java 的实现 MVC 设计模型
的请求驱动类型的轻量级 Web 框架,属于 Spring
FrameWork 的后续产品,已经融合在 Spring Web
Flow 里面。Spring 框架提供了构建 Web 应用程序的
全功 能 MVC 模块。使用 Spring 可插入的 MVC 架
构,从而在使用 Spring 进行 WEB 开发时,可以选择
使用 Spring 的 Spring MVC 框架'
执行过程
1、服务器启动,应用被加载。读取到 web.xml 中的配
置创建 spring 容器并且初始化容器中的对象
2、浏览器发送请求,被 DispatherServlet 捕获,该 S
ervlet 并不处理请求,而是把请求转发出去。转发 的
路径是根据请求 URL,匹配@RequestMapping 中的
内容。
3、匹配到了后,执行对应方法。该方法有一个返回值。
4、根据方法的返回值,借助 InternalResourceViewR
esolver 找到对应的结果视图。
5、渲染结果视图,响应浏览器
spring组成部分
DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于 mvc 模式中的
c,dispatcherServlet 是整个流程控制的中心,由 它
调用其它组件处理用户的请求,dispatcherServlet 的
存在降低了组件之间的耦合性。
springMVC的三大组件
HandlerMapping:处理器映射器
HandlerMapping 负责根据用户请求找到 Handler 即
处理器,SpringMVC 提供了不同的映射器实现不同的
映射方式,例如:配置文件方式,实现接口方式,注
解方式等。
HandlAdapter:处理器适配器
通过 HandlerAdapter 对处理器进行执行,这是适配
器模式的应用,通过扩展适配器可以对更多类型的处理
器进行执行
View Resolver:视图解析器
View Resolver 负责将处理结果生成 View 视图,View
Resolver 首先根据逻辑视图名解析成物理视图名 即具
体的页面地址,再生成 View 视图对象,最后对 View
进行渲染将处理结果通过页面展示给用户。
重要注解
@RequestMapping
标注在方法上,该方法成为一个请求处理方法
标注到类所有方法都映射为相对于类级别的请求
用于建立请求 URL 和处理请求方法之间的对应关系。
属性:
value:用于指定请求的 URL。它和 path 属性的作用是一样的。
method:用于指定请求的方式。
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和 配置的一模一样。
@ RequestParam
作用: 把请求中指定名称的参数给控制器中的形参赋
值。 属性: value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:
true。表示必须提供,如果不提供将报错
例如
@RequestMapping("/useRequestParam")
public String useRequestParam(@RequestParam("name")String username,
@RequestBody
作用: 用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。
get 请求方式不适用。
属性: required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。
如果取值 为 false,get 请求得到是 null
@ PathVaribale
作用: 用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。
url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
属性: value:用于指定 url 中占位符名称。
required:是否必须提供占位符。
例如
<a href="springmvc/usePathVariable/100">pathVariable 注解</a>
@RequestMapping("/usePathVariable/{id}") public String usePathVariable(@PathVariable("id") Integer id){
.......
}
@ SessionAttribute(value = "a")
作用: 用于多次执行控制器方法间的参数共享。
属性: value:用于指定存入的属性名称
type:用于指定存入的数据类型。
例如
mod.addAttribute("a","相当于request域");
取出String a = (String) mod.get("a");
请求参数的绑定
如果是基本类型或者 String类型: 要求我们的参数名
称必须和控制器中方法的形参名称保持一致。(严格区
分大小写) 如果是 POJO类型,或者它的关联对象: 要
求表单中参数名称和 POJO 类的属性名称保持一致。
并且控制器方法的参数类型是 POJO 类型。 如果是集
合类型,有两种方式:
第一种: 要求集合类型的请求参数必须在 POJO
中。在表单中请求参数名称要和 POJO 中集合属性名
称相同。
给 List 集合中的元素赋值,使用下标。 给 Map 集
合中的元素赋值,使用键值对。 第二种: 接收的请
求参数是 json 格式数据。需要借助一个注解实现。
响应数据和结果视图
1响应之返回值是String类型
//存入到请求(request)域对象
model.addAttribute("user",user);
2.响应之返回值是void类型--转发
//转发
request.getRequestDispatcher("/WEB-INF/pages/succeed.jsp").forward(request,response);
3.响应之返回值是void类型---重定向
//3.1重定向(两次请求)
//response.sendRedirect(request.getContextPath()+"/index.jsp"); //请求不到web-inf下的文件
4.响应之返回值是void类型---model AND view
//实例化
ModelAndView m=new ModelAndView();
//模拟从数据库拿到数据
User user=new User();
user.setUsername("小李2232");
user.setPassword("121111113");
m.addObject("a",user);//存入a
m.setViewName("succeed");//跳转的jsp页面
return m;
5.响应之使用 SpringMVC框架提供forward和redirect进行页面跳转
// return "forward:/WEB-INF/pages/succeed.jsp";
return "redirect:/index.jsp";
6.响应json数据之过滤静态资源
@RequestMapping("/ajaxTests")
public @ResponseBody Person ajaxTest(@RequestBody Person person){ //RequestBody获取这个请求体的数据
//客户端发送ajax请求,传输的是json字符窜,后端把json字符串封装到user对象中
System.out.println(person+"执行了");
//模拟查询数据库
person.setUserName("响应");
person.setPassWord("12333");
return person;//user;拦截器
拦截器可以配置多个
springconfig.xml <!--2.配置拦截器--> <mvc:interceptors> <mvc:interceptor> <!-- 哪些方法进行拦截 --> <mvc:mapping path="/user/*"/> <!-- 哪些方法不进行拦截 <mvc:exclude-mapping path=""/> --> <!-- 注册拦截器对象 --> <bean class="controller.MyInterceptor"/><!--第一个拦截器--> </mvc:interceptor> </mvc:interceptors>
HandlerInterceptor 里面有三个实现方法
preHandle1.预处理方法---拦截1器执行了
postHandle2.后执行---拦截器1执行了
afterCompletion3.最后输出---拦截器1执行
配置文件
<mvc:mapping path="/**" /><!-- 用于指定对拦截的 url -->
<mvc:exclude-mapping path=""/><!-- 用于指定排除的 url-->