简单理解SpringMVC的三层结构顺序MCV以及ModelAndView的使用

MVC三层结构 (M->C->V)


requset–>中心总控制器(DispatcherServlet)

中心控制器接收到用户请求后:将请求转发到HandlerMapping (方法映射/方法索引)


I. M 即HandlerMapping(方法映射)

找到处理请求对应方法controller的路径

  1. 根据请求的地址遍历注解 找到controller路径,返回给总控制器
  2. 总控制器根据路径,将请求参数转发给对应的HandlerAdapter(内容提供者)中对应的controller(控制器)

II.C 即Controller(控制器)和HandlerAdapter(内容适配器)

对请求的数据进行处理并告知需要使用的view视图

  1. 处理请求和数据,并将处理好的请求和数据封装到 ModelAndView中(模型和视图)类似于安卓中的ViewModel
  2. 将封装好的ModelAndView(视图和内容),返回给HandlerAdapter(内容适配器)
  3. HandlerAdapter(内容提供者)把处理好的数据返回给总控制器,并由总控制器传递给ViewResolver(视图解析者)

III.V 即ViewResolver(视图解析者)和View(视图层)

解析视图并渲染返回给中心总控制器(DispatcherServlet)

  1. 解析ModelAndView中的数据和视图信息
  2. 将解析好的信息返回给总控制器
  3. 调用View渲染JSP视图

Response–>中心总控制器(DispatcherServlet)

将视图和数据响应给请求的用户


可以看出:

  1. 中心控制器相互联系着每一个逻辑处理,因此冠名中心总控制器(DispatcherServlet)当之无愧
  2. MVC三层结构在数据处理中实际上是按照M-->C-->V的顺序。

如图所示:
MVC


注:Controller方法补充说明:

1. 构造器方法
  1. 定义公用构造器,参数为定义过Spring注解的对象
  2. spring框架会在启动控制器时,将对应对象生成并注入到构造器
  3. 通过构造器将地址赋值给当前类中的对象
    实例(以创建一个登录服务为例,相关服务引用的代码见最后,下同):
private final UserService service;
    public LoginController(UserService service) {
        this.service = service;
    }
2.@Autowired
  1. 可以替代构造器方法
  2. 直接在声明的对象上使用注解,控制器被创建时会自动注入
  3. 此方法不推荐使用
    实例(同样以创建一个登录服务为例):
   @Autowired
    private final UserInfoService service;
3.ModelAndView 模型和视图
  1. setViewName() 设置对应视图的名称,与视图层文件名一一对应
    1. 不需要后缀,直接写名称是转发
    2. 加上前缀 redirect: 为302重定向
  2. addObject(key,obj) 像解析器中传入以键值对方式的对象
    实例(以登录服务为例):
 @RequestMapping(path = "/dologin")
    public ModelAndView login(HttpServletRequest request, HttpServletResponse response, User user){
        User loginUser = service.login(user);
        ModelAndView modelAndView=new ModelAndView();
        if(loginUser!=null){
            request.getSession().setAttribute("user",loginUser);
            /* 不写 redirect: 表示请求转发   带上表示302重定向*/
            modelAndView.setViewName("/hello");
        }else {
            try {
                response.getWriter().write("<script>alert('登录失败');history.go(-1)</script>");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
        return modelAndView;
    }
4. ModelAndView 自动拆装
  1. 将返回对象设置为String,视图名,直接返回为字符串
  2. 添加数据等直接使用 request的域对象即可 例如addObject(key,obj) 对应 request.setAttribute(key,obj)
    实例(同样以登录服务为例):
   @RequestMapping(path = "/dologin")
    public String login(HttpServletRequest request, HttpServletResponse response, User user){
        User loginUser = service.login(user);
        if(loginUser!=null){
            request.getSession().setAttribute("user",loginUser);
            /* 不写 redirect: 表示请求转发   带上表示302重定向*/
            return  "redirect:/hello";
        }else {
            try {
                response.getWriter().write("<script>alert('登录失败');history.go(-1)</script>");
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

附:Service和Bean代码

  1. 在接口的实现类中使用注解@Service可以在控制层自动生成接口对象(参见上文Controller方法补充说明)
@Service
public class UserInfoServiceImpl implements UserService {
		//这里是实现类
}
  1. 在javaBean对象上添加注解@Component,Spring会自动注入对象(参见上文Controller方法补充说明)
@Component
public class User{
	//javaBean内容
}
  1. 在配置文件中配置context:component-scan和包名,Spring会自动扫描该包下带注解的对象
<context:component-scan base-package="cn.hll520.lpc">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值