一、MVC的引入
1.1 什么是MVC
- MVC是模型(Model 用于封装数据)、视图(View 渲染数据与跳转页面)、 控制器(Controller 表现层中的资源)的简写,是一种软件设计规范。
- 是将业务逻辑、数据、显示分离的方法来组织代码。
- MVC主要作用是降低了视图与业务逻辑间的双向偶合。
- MVC不是种设计模式,MVC是一种架构模式,不同的MVC存在差异。
- Model (模型) :数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在般 都分离开来: Value Objeat (数据Dao)和服务层 (行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
- View (视图)负贡进行模型的展示,一般就是我们见到的用户界面。客户想看到的东西。
- Controller (控制器) :按收用户请求,委托给模型进行处理(状态改变),处理完华后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作
1.2 SpringMVC
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级 Web框架:
Spring MVC的特点:
- 1.轻量级,简单易学。
- 2.高效,基于请求响应的MVC框架
- Spring兼容性好,无缝结合
- 4.约定优于配置
- 5.功能强大: RESTful. 数据验证、格式化、本地化、上题等
- 6.简法灵活
1.3 DispatcherServlet
- Spring的web框架围绕DispatcherServlet调度
Servlet设计。
DispatcherServlet的作用定将请求分发到不同的处理器。从Spring 2.5开始,使用Java 5或者以上
版本的用户可以采用基于注解形式进行开发
二、MVC的应用
2.1 导入支持jar包
2.2 Controller测试
2.2.1 配置xml文件 添加约束
在配置xml文件时需要注意
- 注册controller组件时,需要注意注册资源id不能与controller组件重名。
- 由于我们需要在controllerTest中访问jsp,需要让服务器找到这个jsp文件,所以需要一个视图解析器进行解析以及前后缀的添加。
学习要点:配置视图解析器
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--注册资源路径,id通常都是一个资源路径,controller通常视为资源,class为全类名-->
<bean id="/controller1" class="com.SpringMVC.ControllerTest"></bean>
<!--注册controller组件-->
<!--配置视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--设置视图的前缀-->
<property name="prefix" value="/jsp/"></property>
<!--设置视图的后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
2.2.2 controllerTest类
学习要点:controller组件的写法:
public class ControllerTest implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//创建一个实例
ModelAndView modelAndView = new ModelAndView();
//封装数据
modelAndView.addObject("message","hello mvc");
//设置视图名称(就是test.jsp)
modelAndView.setViewName("test");
return modelAndView;
}
}
2.2.3 配置web.xml文件
dispatcherServlet的配置
<?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">
<!--配置前端总控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--绑定spring核心配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:xml/springmvc.xml</param-value>
</init-param>
<!--设置启动级别:希望在tomcat服务器启动的时候就去加载核心容器对象-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--拦截客户端所有的请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
三、MVC的执行流程
- 客户端会给服务端发送请求,springMVC会通过DispatcherServlet来进行资源的拦截 http://loca1host:8080/web/ controller1
- DispatcherServlet拦截到请求之后,会调用一个处理映射器handlerMapping来解析地址,将解析的结果告知DispatcherServlet
- DispatcherServlet会调用一个处理适配器handlerAdapter从容器中心配到对应的资源(根据资源路径来匹配具体的资源)
- 匹配的资源之后,会将结果告知DispatcherServlet,然后再去执行具体的Controller
- 封装数据、处理数据,将数据封装到model中,设置视图名称返@model和view给DispatcherServlet
- DispatcherServlet会调用视图解析器来解析view中的视图,然后在将结果告DispatcherServlet
- DispatcherServlet会根招解析好的视图来进行视图页面的跳转,然后渲染数据。
四、mvc基于注解的方式进行开发
流程 :
- 配置xml 文件,(添加依赖、开启扫描包、过滤、视图解析器)
- 配置web.xml文件:配置前端总控制器、绑定spring核心配置文件、设置启动级别、拦截客户端所有的请求
4.1 xml核心文件配置
一、根据使用来确定依赖:基本是根据mvc的依赖再结合context的依赖组合而成的。
<!--开启扫描包-->
<context:component-scan base-package="com.SpringMVC"></context:component-scan>
<!--过滤静态资源-->
<mvc:default-servlet-handler></mvc:default-servlet-handler>
<!--开启mvc注解支持-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--配置视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--设置前缀-->
<property name="prefix" value="/jsp/"></property>
<!--设置后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
4.2 web.xml的配置
注意前端总控制器的DispatcherServlet,配置时使用的名字为dispatcherServlet,以及注意核心配置文件的路径修改。
<?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">
<!--配置前端总控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--绑定spring核心配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:xml/springmvc02.xml</param-value>
</init-param>
<!--设置启动级别:希望在tomcat服务器启动的时候就去加载核心容器对象-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!--拦截客户端所有的请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
4.3 controller层的配置,
- 不需要使用
public class ControllerTest implements Controller { @Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {return null}
- 直接添加注解
- 使用@Controller注解的类是不需要在xml文件中进行注册的。
- @RequestMapping(“/user”) 用于声明资源路径 ,用于地址的映射。
- @ResponBody 可以直接返回一个字符串给客户端
@Controller 可以让当前类的实例交由spring容器管理,该类下的方法返回值如果是String类型的,那么该返回值将会看成是视图,并且会通过视图解析器进行解析,然后跳转到具体的视图。
@Controller
//配置一个资源路径
@RequestMapping("/user")
public class UserContorller {
//model是一个域对象 底层是一个request域
@RequestMapping("/test01")
public String getTest01(Model model){
model.addAttribute("message","hello SpringMVC");
return "test1";//转发到test1.jsp下
}
}
4.4 访问测试:
根据我们的两次@RequestMapping("/user")、@RequestMapping("/test01")使用的位置路径,需要注意我们的访问路径为:[http://localhost:8080/web/user/test01](http://localhost:8080/web/user/test01)
五、基于MVC的前端数据的回传
5.1 参数回传
@RequestMapping("/test02")
public void getTest02(int i,String name) {
System.out.println(i);
System.out.println(name);
}
访问如下:对数据进行赋值,即可实现数据回传。
http://localhost:8080/web/user/test02?i=10&name=jack
5.2 视图失效
@ResponseBody 让当前方法的视图失效,然后可以直接返回数据给客户端
@RequestMapping("/test04")
@ResponseBody
public String getTest04(MvcVo mvcVo){
return "hello";
}
使得数据失效,return “hello”;直接向客户端(网页)传递字符串,而不是跳转视图。