Spring入门-MVC了解

MVC是一种分层的思想,Spring已经写好了MVC的结构供使用,这里简单了解一下。

MVC

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。--来自百度

SpringMVC,是Spring框架里用来简化基于MVC架构的web应用程序开发的框架控制器C做两件事情,一是接受请求,根据请求调用相应模型M来处理请求,第二是依据模型M返回的结果调用视图V。为了实现控制器的上述功能,需要在xml文件中来配置完成。

SpringMVC五大组件

SpringMVC有五大组件,其组成了一个MVC的结构。

(1)DispatcherServlet

DispatcherServlet:前端控制器,接受Web端请求

(2)HandlerMapping

HandlerMapping:映射处理器,告诉前端控制器请求应该交给哪个处理器M来处理

(3)Controller

Controller:处理器,负责执行具体的任务,可调用DAO等组件,编写时需要实现Controller接口及约定方法处理器将处理结果封装成一个对象,处理成ModelAndView对象返回给前端控制器

(4)ModelAndView

ModelAndView:处理结果和视图名,视图名是一列字符串,会发送给前端控制器,比如视图名可能是hello.jsp,也可能是freemarker或者velocity类型,不一定是用jsp一种视图技术

(5)ViewResolver

ViewResolver:视图解析器,会解析前端控制器发给它的视图名字符串做出处理,可能是处理jsp,也可能是freemarker或者velocity等,解析完成后,前端控制器发送页面给浏览器

简单来说,DispatcherServlet和HandlerMapping配合使用进行请求分发,因此对应就是C结构Controller对分发的请求进行处理,并返回一个包含数据和视图名的ModelAndView对象给前端控制器DispatcherServlet,因此其就是M结构前端控制器DispatcherServlet将ModelAndView对象交给视图解析器ViewResolver来处理,视图解析器将页面渲染后发送浏览器,其就是V结构

SpringMVC如何使用

按照如下步骤来,可以实现一个简单的SpringMVC结构。

step1.导包 spring-webmvc,pom.xml中配置

1   <dependency>
2   <groupId>org.springframework</groupId>
3   <artifactId>spring-webmvc</artifactId>
4   <version>4.2.3.RELEASE</version>
5   </dependency>

step2.添加配置文件spring-mvc.xml,暂时为默认文件无任何添加配置信息

step3.配置前端控制器DispatcherServlet,在web.xml中配置,由前端控制器来启动spring容器

 1  <!-- 配置DispatcherServlet -->
 2   <servlet>
 3     <servlet-name>springmvc</servlet-name>
 4     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 5     <!-- DispatcherServlet的初始化方法会启动spring容器,contextConfigLocation用来指定spring配置文件的位置 -->
 6     <!-- 初始化参数,配置spring容器启动读取配置文件的路径 -->
 7     <init-param>
 8       <param-name>contextConfigLocation</param-name>
 9       <param-value>classpath:spring-mvc.xml</param-value>
10     </init-param>
11     <!-- 设置tomcat启动就创建spring容器 -->
12     <load-on-startup>1</load-on-startup>
13   </servlet>
14   <servlet-mapping>
15     <servlet-name>springmvc</servlet-name>
16     <url-pattern>*.do</url-pattern>
17   </servlet-mapping>

step4.写Controller

 1 package Controller;
 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接口
11  * @author yangchaolin
12  *
13  */
14 public class helloController implements Controller{
15     /**
16      * handleRequest方法名固定,返回值类型ModelAndView也固定,后续有其他方式可以更改
17      */
18     public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
19         System.out.println("handleRequest");
20         /**
21          * ModelAndView有两个常用的构造器
22          * ModelAndView(String viewName)
23          * ModelAndView(String viewName,Map data) 
24          * viewName就是视图名,Map就是处理结果
25          */
26         return new ModelAndView("hello");//返回视图名hello
27     }
28 }

step5.写jsp

在WEB-INF下添加hello.jsp用于测试

1 <h1>hello springmvc</h1>

step6.配置HandlerMapping和viewResolver

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util"  
 4     xmlns:jee="http://www.springframework.org /schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
 5     xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:mvc="http://www.springframework.org/schema/mvc"
 6     xsi:schemaLocation="
 7         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
 8         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
 9         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
10         http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
11         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
12         http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
13         http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">    
14         
15         <!-- 配置HandlerMapping,使用HandlerMapping接口下的实现类SimpleUrlHanderMapping -->
16         <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
17           <property name="mappings">
18             <props>
19               <prop key="/hello.do">helloController</prop>
20               <!-- 当地址为/hello.do时,会根据它的value:helloController,去寻找bean id为helloController的对象 -->
21               <!-- Mapping中存入的是properties对象,key为url,value为控制器的id -->
22             </props>
23           </property>
24         </bean>
25         
26         <!-- HandlerMapping会根据设置的mapping,根据url去寻找对应的bean id,然后启动对应的Controller -->
27         <!-- 配置Controller -->
28         <bean id="helloController" class="Controller.helloController">
29         
30         </bean>
31         
32         <!-- 配置视图解析器viewResolver -->
33         <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
34            <property name="prefix" value="/WEB-INF/" />
35            <property name="suffix" value=".jsp" />
36            <!-- 前缀和后缀配置,视图名hello通过上面的配置可以映射到/WEB-INF/hello.jsp -->
37         </bean>
38       
39 </beans>

配置视图解析器需要根据使用的实际情况来配置,如果是jsp,可以使用InternalResourceViewResolver如果是velocity,使用VelocityViewResolver如果是freemarker,使用FreeMarkerViewResolver

测试访问结果

结论

SpringMVC的出现可以简化开发,以前写的一个项目使用Servlet+JSP,需要写一个servlet类(相当如C)来专门处理请求,在重写的service方法里写业务逻辑(相当如M)和需要返回的视图(相当如V),这样代码不够好维护,SpringMVC的出现可以解决这个问题,并且让代码具有可扩展性。

参考博客

(1)https://www.cnblogs.com/youngchaolin/p/10549020.html

原文地址:https://www.cnblogs.com/youngchaolin/p/11347771.html