SpringMVC

SpringMVC

一、概述

1.MVC概述

1)MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。

2)模型(dao,service)、视图(jsp)、控制器(servlet)

3)是将业务逻辑、数据、显示分离的方法来组织代码。

4)MVC主要作用是降低了视图与业务逻辑间的双向偶合。

5)MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。

2.Spring MVC概述

1)Spring 为展现层提供的基于 MVC 设计理念的优秀的 Web 框架,是目前最主流的MVC 框架之一

2)Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,而无须实现任何接口。

3)一种轻量级的、基于 MVC 的 Web 层应用框架。偏前端而不是基于业务逻辑层。Spring框架的一个后续产品。

3.SpringMVC 怎么用
1) 将 Web 层进行了职责解耦,基于请求-响应模型

以请求为驱动 , 围绕一个中心Servlet分派请求及提供其他功能,DispatcherServlet是一个实际的Servlet (它继承自HttpServlet 基类)。

2) 常用主要组件

**1.Controller:**处理器/页面控制器,做的是 MVC 中的 C 的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理

作用:把不同的数据(Model),显示在不同的视图(View)上,
	 Servlet扮演的就是这样的角色

**2.DispatcherServlet:**前端控制器;

作用:将请求分发到不同的处理器

3.HandlerMapping: 请求映射
到处理器,找谁来处理,如果映射成功返回一个HandlerExecutionChain 对象(包含一个 Handler 处理器(页面控制器)对象、多个 HandlerInterceptor 拦截器对象)

4.View Resolver : 视图解析器,找谁来处理返回的页面。把逻辑视图解析为具体的 View,进行这种策略模式,很容易更换其他视图技术;

3)SpringMVC详细运行流程图

在这里插入图片描述

Springmvc架构原理解析

发起请求到前端控制器(DispatcherServlet)
前端控制器请求HandlerMapping查找 Handler,可以根据xml配置、注解进行查找
处理器映射器HandlerMapping向前端控制器返回Handler
前端控制器调用处理器适配器去执行Handler
处理器适配器去执行Handler
Handler执行完成给适配器返回ModelAndView
处理器适配器向前端控制器返回ModelAndView,ModelAndView是springmvc框架的一个底层对象,包括 Model和view
前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp)
视图解析器向前端控制器返回View
前端控制器进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域
前端控制器向用户响应结果
各种 ‘ 器 ’

DispatcherServlet:前端控制器

HandlAdapter:处理器适配器

ViewResolver:视图解析器

HandlerMapping:处理器映射器

Filter 过滤器

Listener 监听器

Handler 控制器

interceptor 拦截器

二、视图解析

不论控制器返回一个 String,ModelAndView,View 都会转换为 ModelAndView 对象,由视图解析器解析视图,然后,进行页面的跳转。

1.ModelAndView

ModelAndView: 处理方法返回值类型为 ModelAndView 时, 方法体即可通过该对象添加模型数据。

1) 控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息,也包含模型数据信息。

2)添加模型数据:

MoelAndView addObject(String attributeName, Object attributeValue)

ModelAndView addAllObject(Map<String, ?> modelMap)

3)设置视图:

void setView(View view)

void setViewName(String viewName)

2.视图和视图解析器

​ 1) 请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView对象,它包含了逻辑名和模型对象的视图

​ 2) Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 JSP ,也可能是 Excel、JFreeChart 等各种表现形式的视图

​ 3) 对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现 MVC 的充分解耦

3.视图

1) 视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给户。

2) 为了实现视图模型和具体实现技术的解耦,Spring 在 org.springframework.web.servlet包中定义了一个高度抽象的 View 接口:

3) 视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题

三、REST

1.REST:即 Representational State Transfer。

2.Rest架构的主要原则

1.网络上的所有事物都被抽象为资源

2.每个资源都有一个唯一的资源标识符

3.同一个资源具有多种表现形式(xml,json等

4.对资源的各种操作不会改变资源标识符

5.所有的操作都是无状态的

6.符合REST原则的架构方式即可称为RESTful

3.Restful

符合REST约束风格和原则的应用程序或设计就是RESTful

从此请求再也不止get和post

4.RESTFul风格的SringMVC

RestController代码

@Controller
@RequestMapping("/rest")
public class RestController {
    @RequestMapping(value="/user/{id}",method=RequestMethod.GET)
    public String get(@PathVariable("id") Integer id){
        System.out.println("get"+id);
        return "/hello";
    }
}

前台代码

<form action="rest/user/1" method="post">
    <input type="hidden" name="_method" value="PUT">
    <input type="submit" value="put">
</form>

四、@RequestMapping 注解

1.为控制器指定可以处理哪些 URL 请求

2.在控制器的类定义及方法定义处都可标注 @RequestMapping

​ 1 )标记在类上:提供初步的请求映射信息。相对于 WEB 应用的根目录

​ 2 )标记在方法上:提供进一步的细分映射信息。相对于标记在类上的 URL。

3.若类上未标注 @RequestMapping,则方法处标记的 URL 相对于 WEB 应用的根目录

4.作用:

DispatcherServlet 截获请求后,就通过控制器上 @RequestMapping 提供的映射信息确定请求所对应的处理方法。

5.PathVariable 注解

请求占位符

通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过 @PathVariable(“xxx”) 绑定到操作方法的入参中。

五、使用Ajax调用

@RequestMapping("/getPerson")
public void getPerson(String name,PrintWriter pw){
    pw.write("hello,"+name);        
}
@RequestMapping("/name")
public String sayHello(){
    return "name";
}

前台用下面的Jquery代码调用

  $(function(){
      $("#btn").click(function(){
          $.post("mvc/getPerson",{name:$("#name").val()},function(data){
              alert(data);
          });
      });
  })

六、返回json格式的字符串

使用 @ResponseBody注解

@Controller
@RequestMapping("/add")
public class jsonController {
    @ResponseBody
    @RequestMapping("/user")
    public  User get(){
        User u = new User();
        u.setId(1);
        u.setName("zhangsan");
        u.setBirth(new Date());
        return u;
    }
}
重定向:redirect:/hellomvc.jsp
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值