Spring 学习小记 (十一)

67 篇文章 0 订阅
Spring MVC介绍
 
本小记学习目标
    1.Spring MVC相关工作原理理解
    2.入门Spring MVC应用开发
 
说到Spring MVC必须先简单地说一下MVC的概念
       MVC的思想是把一个应用分成三个基本部分,M(Model)模型、V(View)视图、C(Controller)控制器,使这三个基本部分以最低的耦合进行协同工作,从而提高应用的可扩展性和可维护性。
       Spring MVC它是一个框架,它应用了MVC的思想,它就是Spring提供的一个实现了Web MVC设计模式的轻量级Web框架
 
一、Spring MVC相关工作原理理解
在说Spring MVC工作原理之前我们先说说MVC模式。
1.MVC的概念
它就是Model,View,Controller的三个首字母缩写,分别代表了Web应用中的3种基本职责划分。
Model:模型,用来存储数据,处理用户请求的业务逻辑
View:视图,向控制器提交数据,显示模型中的数据
Controller:控制器,连接视图与模型,视图有请求来了后,判断把这个请求交由哪个模型来处理,模型处理完成后的结果由它判断交由哪个视图来做显示
 
2.基于Servlet的MVC模式
基于Servlet的MVC模式是Web开发过程中常用的模式,它具体的内容如下
Model:模型,一个或多个JavaBean对象,它分为实体模型(JavaBean类创建)和业务模型(一般的Java类创建)
View:视图,一个或多个JSP页面,它主要是向控制器提交数据和为模型提供数据的显示
Controller:控制器,一个或多个Servlet对象,根据视图提交的请求进行判断,把请求转发给处理业务逻辑的JavaBean,并把处理结果存放在实体JavaBean模型中输出给到视图展示
基于Servlet的MVC模式的流程如下图所示
 
3.Spring MVC工作原理
Spring MVC是一个MVC的应用框架,它主要由DispatcherServlet、处理映射器、控制器、视图解析器、视图组成
Spring MVC的工作流程主要如下
  1. 客户端(浏览器)的请求提交到DispatcherServlet
  2. 由DispatcherServlet寻找一个或多个HandlerMapping,找到处理请求的Controller
  3. DispatcherServlet把请求提交到Controller
  4. Controller调用业务逻辑处理后返回ModelAndView
  5. DispatcherServlet寻找一个或多个ViewResolver视图解析器,找到ModelAndView指定的视图
  6. 视图把结果显示到客户端
Spring MVC工作原理图
 
上图中蓝色标识的四个块为Spring MVC接口,它们分别是
DispatcherServlet
HandlerMapping
Controller
ViewResolver
 
DispatcherServlet:所有的请求由它来统一分发,在它把请求分发给到Controller前需要借助于HandlerMapping定位到具体的Controller
HandlerMapping:负责完成客户请求到Controller映射
Controller:处理用户请求,当它处理完用户请求后会返回ModelAndView对象给到DispatcherServlet前端控制器,这里的ModelAndView从名称可以看得出来它包含了Model和View
ViewResolver:它是一个视图解析器,它负责找到View对象,从而把相应的结果渲染给客户
注意:这里重点的说明一下,DispatcherServlet是一个前端控制器,它是整个Web应用程序的控制器,而Controller则是单个请求处理过程中的控制器
 
二、入门Spring MVC应用开发
 
Spring入门程序的配置及部署
新增一个Maven的 war工程,在pom中新增如下jar包的依赖
< dependencies >
       <!-- context -->
       < dependency >
             < groupId >org.springframework </ groupId >
             < artifactId >spring-context </ artifactId >
             < version >5.0.2.RELEASE </ version >
       </ dependency >
    <!-- Spring MVC -->
    < dependency >
       < groupId >org.springframework </ groupId >
       < artifactId >spring- webmvc </ artifactId >
       < version >5.0.2.RELEASE </ version >
    </ dependency >
   
    <!-- Spring web -->
    < dependency >
       < groupId >org.springframework </ groupId >
       < artifactId >spring-web </ artifactId >
       < version >5.0.2.RELEASE </ version >
       </ dependency >
   
    <!-- commons-logging -->
    < dependency >
       < groupId >commons-logging </ groupId >
       < artifactId >commons-logging </ artifactId >
       < version >1.2 </ version >
    </ dependency >
   
    <!-- spring- aop -->
    < dependency >
       < groupId >org.springframework </ groupId >
       < artifactId >spring- aop </ artifactId >
       < version >5.0.2.RELEASE </ version >
    </ dependency >
  </ dependencies >
注意:在新增war工程后在Eclipse中对应的项目上会有一个红色的小叉,这个是由于动态web工程相关的目录结构未正常创建出来,处理方法如下
在工程名上右键--->properties
选择Project Facets
去掉Dynamic Web Module选项,点击Apply
再勾选上上面去掉的这个选项,点击Apply and Close
 
配置动态web工程的web.xml,这里主要是配置DispatcherServlet
配置DispatcherServlet的快捷方式,可以按Alt+/选择倒数第二项(Dispatcherservetl - DispatcherServlet declaration)
<!-- DispatcherServlet配置 -->
< servlet >
       < servlet-name > springmvc </ servlet-name >
       < servlet-class >org.springframework.web.servlet.DispatcherServlet </ servlet-class >
       <!-- 加载spring mvc 的配置文件 -->
       < init-param >
                   < param-name >contextConfigLocation </ param-name >
                   <!-- 配置SpringMVC配置文件的路径 -->
                   < param-value >classpath:springmvc.xml </ param-value >
       </ init-param >
       <!-- tomcat 容器在启动时加载 servlet -->
       < load-on-startup >1 </ load-on-startup >
</ servlet >
< servlet-mapping >
       < servlet-name > springmvc </ servlet-name >
       <!-- servlet 处理请求地址,这里/表示所有 url -->
       < url-pattern >/ </ url-pattern >
</ servlet-mapping >
 
在src/main/resources下新增springmvc.xml,也就是上面配置中要加载的springMVC的配置文件
注意上面init-param中的配置写法,classpath:springmvc.xml,表示在类路径下查找springmvc.xml
 
 
在WebContent目录下新增jsp页面:index.jsp
<%@ page language= "java" contentType= "text/html; charset=UTF-8"
    pageEncoding= "UTF-8" %>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
< html >
< head >
< meta http-equiv= "Content-Type" content= "text/html; charset=UTF-8" >
< title >Insert title here </ title >
</ head >
< body >
      未注册用户,请 < a href= "${pageContext.request.contextPath } /register" >注册 </ a >< br />
      已注册用户,请 < a href= "${pageContext.request.contextPath } /login" >登录 </ a >
</ body >
</ html >
注意:在新增完jsp页面后可能会出现一个红叉,这个是由于没有引入web容器的运行环境
处理方式如下
右键点击项目--->Build Path--->Configure Build Path...
选择Add Library...
选择Server Runtime,点击Next
选择相应的Tomcat运行环境即可
 
新增controller类com.xiaoxie.controller.RegisterController、com.xiaoxie.controller.LoginController
package com.xiaoxie.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class RegisterController implements Controller{
       @Override
       public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
             return new ModelAndView( "/WEB-INF/jsp/register.jsp");
      }
}
 
package com.xiaoxie.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class LoginController implements Controller{
       @Override
       public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
             return new ModelAndView( "/WEB-INF/jsp/login.jsp");
      }
}
 
新增上面指定要跳转到的视图jsp文件register.jsp、login.jsp,它们创建在WebContent/WEB-INF/jsp下
register.jsp
<%@ page language= "java" contentType= "text/html; charset=UTF-8"
    pageEncoding= "UTF-8" %>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
< html >
< head >
< meta http-equiv= "Content-Type" content= "text/html; charset=UTF-8" >
< title >Insert title here </ title >
</ head >
< body >
      注册页面!
</ body >
</ html >
 
login.jsp
<%@ page language= "java" contentType= "text/html; charset=UTF-8"
    pageEncoding= "UTF-8" %>
<! DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" >
< html >
< head >
< meta http-equiv= "Content-Type" content= "text/html; charset=UTF-8" >
< title >Insert title here </ title >
</ head >
< body >
      恭喜您,登录成功!
</ body>
</ html >
 
配置springmvc.xml这个配置文件
它的配置主要是把Controller类映射到哪个url请求
<? xml version= "1.0" encoding= "UTF-8" ?>
       xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
       <!-- 把LoginController映射到 /login -->
       < bean name= "/login" class= "com.xiaoxie.controller.LoginController" />
       <!-- 把RegisterController映射到 /register -->
       < bean name= "/register" class= "com.xiaoxie.controller.RegisterController" />
</ beans >
 
运行项目
在项目名上右键--->Run As--->Run on Server
直接下一步,完成即可,Tomcat启动后会打开浏览器访问应用的主页面index.jsp
 
点击“注册”请求/register,跳转到register.jsp
 
点击“登录”,请求/login,跳转到login.jsp
 
在上面我们的应用中Controller中跳转的视图需要写全,这个比较麻烦,我们可以使用视图解析器来把公用的部分做为配置配置好,那么到时候则只需要在Controller中写变化的部分,SpringMVC会自动帮忙去拼接
在springmvc.xml配置文件中添加视图解析器
<!-- 配置视图解析器 -->
       < bean class= "org.springframework.web.servlet.view.InternalResourceViewResolver" id= "viewResolver" >
             <!-- 拼接前缀 -->
             < property name= " prefix" value= "/WEB-INF/jsp/" />
             <!-- 拼接后缀 -->
             < property name= " suffix" value= ".jsp" />
       </ bean >
 
这个时候我们Controller中返回的视图只需要写上变化的部分如下
在LoginController中返回的只需要写上login就可以了
return new ModelAndView( "login");    它会根据视图解析器拼接为“/WEB-INF/jsp/login.jsp”
在RegisterController中返回的只需要写上register就可以
return new ModelAndView( "register");    它会根据视图解析器拼接为“/WEB-INF/jsp/register.jsp”
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值