回顾MVC
MCV是模型(Modle)、控制器(Controller)、视图(View)的简写,是一种软件的设计规范。MVC不是设计模式,而是架构模式,它能够降低试图和业务逻辑之间的双向耦合,是将业务逻辑、数据、显示分离的方法来组织代码。
Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或 JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao)和业务层(行为Service),也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示,控制器做了调度员的工作。
最典型的MVC就是jsp+servlet+javabean模式:
JavaBean作为模型,既可以作为数据模型来封装业务数据,又可以作为业务逻辑模型来包含应用的业务操作。其中,数据模型用来存储或传递业务数据,而业务逻辑模型接收到控制器传过来的模型更新请求后,执行特定的业务逻辑处理,然后返回相应的执行结果。
JSP作为视图层,负责提供页面为用户展示数据,提供相应的表单(Form)来用于用户的请求,并在适当的时候(点击按钮)向控制器发出请求来请求模型进行更新。
Serlvet作为控制器,用来接收用户提交的请求,然后获取请求中的数据,将之转换为业务模型需要的数据模型,然后调用业务模型相应的业务方法进行更新,同时根据业务执行结果来选择要返回的视图。
Spring MVC介绍
Spring MVC是Spring FrameWork的一部分,是基于Java实现的轻量级Web框架,Spring MVC具有很多优点:
轻量级,简单易学;
高效 , 基于请求响应的MVC框架;
与Spring兼容性好,无缝结合;
约定优于配置;
功能强大:RESTful、数据验证、格式化、本地化、主题等;
简洁灵活;
Spring MVC天生和Spring无缝集成(使用SpringIoC和Aop) , 使用约定优于配置 ,能够进行简单的junit测试 、支持Restful风格、异常处理、本地化、国际化、数据验证、类型转换、拦截器……
Spring MVC的配置和第一个Spring MVC程序
首先需要导入Spring MVC需要的依赖:
<!--spring系列--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.3.24.RELEASE</version></dependency><!--servlet--><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version></dependency>
然后需要一个springmvc-servlet.xml配置文件来注册Spring MVC的一些核心类:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!--配置处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--配置处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--配置视图解析器:DispatcherServlet给他的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<!--前缀,这里说明视图层放jsp文件夹下面-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀,这里说明视图层是jsp-->
<property name="suffix" value=".jsp"/>
</bean>
<!--Handler,由程序员编写的实现Controller接口的类,每次编写一个都需要注册一次-->
<bean id="/hello" class="com.wjh.controller.HelloController"/>
</beans>
配置web.xml:
<?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">
<!--注册DispatcherServlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联一个springmvc的配置文件:springmvc-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动级别-1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--使用“/”: 匹配所有的请求;(不包括xxx.jsp页面,一般都是使用“/”-->
<!--使用”/*“: 匹配所有的请求;(包括xxx.jsp页面)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
编写Hander和视图层:
package com.wjh.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author wjh
* @date 2021/7/20 12:45
* @Package com.wjh.controller
*/
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//ModelAndView 模型和视图,做为返回值返回
ModelAndView mv = new ModelAndView();
//封装对象,放在ModelAndView--->Model
mv.addObject("msg","Hello SpringMVC!");
//封装要跳转的视图,放在ModelAndView中--->View:/WEB-INF/jsp/hello.jsp
mv.setViewName("hello");
return mv;
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>
SpringMVC
</title>
</head>
<body>
${msg}
</body>
</html>
在浏览器访问
