MVC框架是什么
模型-视图-控制器(MVC)是一个众所周知的以设计界面应用程序为基础的设计模式。它主要通过分离模型、视图及控制器在应用程序中的角色将业务逻辑从界面中解耦。通常,模型负责封装应用程序数据在视图层展示。视图仅仅只是展示这些数据,不包含任何业务逻辑。控制器负责接收来自用户的请求,并调用后台服务(manager或者dao)来处理业务逻辑。处理后,后台业务层可能会返回了一些数据在视图层展示。控制器收集这些数据及准备模型在视图层展示。MVC模式的核心思想是将业务逻辑从界面中分离出来,允许它们单独改变而不会相互影响。
Contrller控制器层的写法
1 package com.platform.mvc.system.layer.controller.test;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.List;
6 import java.util.Map;
7 import javax.servlet.http.HttpServletRequest;
8 import org.apache.catalina.connector.Request;
9 import org.springframework.stereotype.Controller;
10 import org.springframework.ui.Model;
11 import org.springframework.web.bind.annotation.RequestMapping;
12 import org.springframework.web.bind.annotation.RequestMethod;
13 import org.springframework.web.bind.annotation.RequestParam;
14 import org.springframework.web.bind.annotation.ResponseBody;
15 import org.springframework.web.servlet.ModelAndView;
16
17 @Controller
18 @RequestMapping("/user")
19 public class userCtroller {
20
21 //方式一:String
22 @RequestMapping("test")
23 public String list(Map<String, Object> map){
24 map.put("name", "HelloKitty");
25 map.put("age", 1);
26 //返回视图
27 return "system/userList";
28 }
29
30
31 //方式二:ModelAndView
32 @RequestMapping(value="test2", method=RequestMethod.GET)
33 public ModelAndView list2(Model model){
34 //创建一个视图对象
35 ModelAndView view = new ModelAndView();
36 //绑定数据
37 model.addAttribute("name", "zhangsan");
38 //设置视图
39 view.setViewName("system/userList");
40 return view;
41 }
42
43
44 //方式三:AJAX
45 //接收参数:@RequestParam(value="username", required=true, defaultValue="hello") String username
46 @RequestMapping(value="/test3", method=RequestMethod.POST)
47 @ResponseBody
48 public Map<String, Object> list3(HttpServletRequest request,
49 @RequestParam(value="username", required=true, defaultValue="hello") String username){
50 Map<String, Object> map = new HashMap<>();
51 map.put("name", "zhangsan");
52 return map;
53 }
54
55 }
自从SpringBoot出来后很久都没有使用xml的方式配置SpringMvc了,今天从网上看到了一篇配置信息。将其摘抄下
1. web.xml添加拦截器,把所有的请求统一交给 org.springframework.web.servlet.DispatcherServlet 来处理。
1 <servlet>
2 <servlet-name>viewspace</servlet-name>
3 <servlet-class>
4 org.springframework.web.servlet.DispatcherServlet
5 </servlet-class>
6 <load-on-startup>1</load-on-startup>
7 </servlet>
8
9 <servlet-mapping>
10 <servlet-name>viewspace</servlet-name>
11 <url-pattern>/</url-pattern>
12 </servlet-mapping>
2. 根据 servlet-name,还得在web.xml 的同一目录里建一个 {servlet-name}-servlet.xml 的文件
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xsi:schemaLocation="
6 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
7 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
8
9 <!-- 扫描web包,应用Spring的注解 -->
10 <context:component-scan base-package="com.corp.chimera.web" />
11
12
13 <!-- HandlerMapping -->
14 <bean
15 class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
16
17 <!-- HandlerAdapter -->
18 <bean
19 class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
20
21
22 <bean id="defaultAnnotationHandlerMapping"
23 class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
24 <bean id="annotationMethodHandlerAdapter"
25 class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
26
27
28 <!-- ViewResolver 配置视图解析器,将ModelAndView及字符串解析为具体的页面 -->
29 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
30 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
31 <property name="prefix" value="/views/"/>
32 <property name="suffix" value=".jsp"/>
33 </bean>
34
35
36 <!--
37 <bean
38 class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
39 <property name="resourceLoaderPath" value="/views/" />
40 <property name="configLocation" value="classpath:common/velocity.properties" />
41 </bean>
42 <bean
43 class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
44 <property name="viewClass"
45 value="org.springframework.web.servlet.view.velocity.VelocityView" />
46 <property name="suffix" value=".html" />
47 </bean>
48 -->
49
50 <bean name="/index" class="com.corp.chimera.web.controllers.IndexController" />
51
52 </beans>
3. 首先开始编写Controller层,作为MVC的控制层,是最直接和用户交互的,也是最外面的一层。Controller这里有两种写法: 一种是基于配置的,一种是基于注解的。
- 基于配置
这个好像是Spring很早的版本之前的功能,所有的url都必须在配置文件里配置一下。配置其使用的HandlerMapping和HandlerAdapter以及,该URL对应的Controller类。并且该Controller类必须实现(implements)org.springframework.web.servlet.mvc.Controller 并重写其:ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception的方法。
首先看配置文件:viewspace-servlet.xml
1 <!-- HandlerMapping -->
2 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
3
4 <!-- HandlerAdapter -->
5 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
6
7 <bean name="/index" class="com.corp.chimera.web.controllers.IndexController" />
Controller类:IndexController.java
1 package com.corp.chimera.web.controllers;
2
3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletResponse;
5
6 import org.springframework.web.servlet.ModelAndView;
7 import org.springframework.web.servlet.mvc.Controller;
8
9 /**
10 * 基于配置的 Controller,Spring最原始的用法
11 * 必须实现 org.springframework.web.servlet.mvc.Controller 并重写handleRequest方法。
12 * 需要在 xxx-servlet.xml 里进行配置:<bean name="/index" class="com.corp.chimera.web.controllers.IndexController" />
13 * 并且对于HandlerMapping 需要使用 org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
14 * HandlerAdapter 需要配置 org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
15 *
16 * @author kevin
17 *
18 */
19 public class IndexController implements Controller {
20
21 @Override
22 public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
23 // 1、收集参数、验证参数
24 // 2、绑定参数到命令对象
25 // 3、将命令对象传入业务对象进行业务处理
26 // 4、选择下一个页面
27 ModelAndView mv = new ModelAndView();
28 // 添加模型数据 可以是任意的POJO对象
29 mv.addObject("message", "I am liuzk");
30 // 设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
31 mv.setViewName("index");
32 return mv;
33 }
34
35 }
这样启动tomcat就可以 访问了。。。
其HandlerMapping映射使用的是 BeanNameUrlHandlerMapping 和 SimpleControllerHandlerAdapter 并且使用 JSTLView 作为 ViewResolver视图解析器。。
这样写的一个缺点就是:
所有的url都得需要在文件里做配置。当系统庞大页面多的时候,这种效率上以及代码可读性上都大打折扣。于是,基于注解的方法就来了。。。
- 基于注解
1 <!-- 扫描web包,应用Spring的注解 -->
2 <context:component-scan base-package="com.corp.chimera.web" />
3
4 <bean id="defaultAnnotationHandlerMapping"
5 class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
6 <bean id="annotationMethodHandlerAdapter"
7 class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
8
9 <!-- ViewResolver 配置视图解析器,将ModelAndView及字符串解析为具体的页面 -->
10 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
11 <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
12 <property name="prefix" value="/views/"/>
13 <property name="suffix" value=".jsp"/>
14 </bean>
Controller类:ListController.java
1 package com.corp.chimera.web.controllers;
2
3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletResponse;
5
6 import org.springframework.stereotype.Controller;
7 import org.springframework.web.bind.annotation.RequestMapping;
8 import org.springframework.web.servlet.ModelAndView;
9
10 /**
11 * 基于注解的 Controller
12 * 和基于配置的Controller 不同的是,靠注解就可以实现所有Url,相比之下,基于注解的Controller 更方便,灵活
13 * 无需实现 和 继承任何类,只需要 @Controller 既可以标记该类位Controller
14 * @RequestMapping 注解 实现对于url的 path 进行注册
15 *
16 * 但是使用前仍然需要配置 Spring 的配置文件:
17 * HandlerMapping 使用的是 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
18 * HandlerAdapter 需要指定 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
19 *
20 * @author kevin
21 *
22 */
23 @Controller
24 @RequestMapping(value = "/list")
25 public class ListController{
26
27 @RequestMapping(value="/index")
28 public ModelAndView listIndex(HttpServletRequest request, HttpServletResponse response) throws Exception {
29 // 1、收集参数、验证参数
30 // 2、绑定参数到命令对象
31 // 3、将命令对象传入业务对象进行业务处理
32 // 4、选择下一个页面
33 ModelAndView mv = new ModelAndView();
34 // 添加模型数据 可以是任意的POJO对象
35 mv.addObject("message", "This is a Spring Constraint with annotation.<br/> @Controller <br/>@RequestMapping");
36 // 设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
37 mv.setViewName("list");
38 return mv;
39 }
40
41 }
看上面方式:一个@Controller 一个@RequestMapping 两个注解解决了所有的配置,但是前提是在配置文件里配置使用 DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter 作为 url映射控制器。
当然以上这两种方式在一个系统里也是可以一块是用的,