spring mvc框架、mvc框架模式

框架与框架模式

框架模式:解决某一类问题的思维模式方法论
框架:在框架模式方法论之上实现的一套成熟的一组组件,供选用完成自己的系统

MVC:全称Model-View-Controller是模型-视图-控制器,MVC是一种框架模式,GOF把MVC看做三种设计模式:观察者模式、策略模式与组合模式

框架模式.jpg

比较常见的框架

  • C++:MFC、gtk
  • java: SSH、SSM、SpringMvc
  • python:django

MVC优点-缺点

  • 对于开发和维护来说成本低,易于维护与修改
  • 耦合性不高,层层之间相互分离各司其职,对开发来说便于扩展

MVC缺点

  • 层层严格分离对调试带来一定的困难
  • 对于特别小的项目,mvc反而会带来更大的工作量以及复杂性

SpringMVC框架

简介

springMVC框架是基于Java的实现了MVC框架模式的请求驱动类型的轻量级框架。

SpringMvc 请求大致流程图

image.png

spring mvc九大组件

  1. HandlerMappings URL和controller对应关系的保存
  2. HandlerAdapters 适配器参数转换
  3. HandlerExceptionResolvers 用来处理异常产生之后的转化器
  4. ViewResolvers 视图解析器
  5. RequestToViewNameTranslator 从request中获取viewName
  6. LocaleResolver 从request中解析出来的locale
  7. ThemeResolver 解析主题
  8. MultipartResolver 多组件文件上传
  9. FlashMapManager 闪存

Spring MVC执行时序图

https://www.processon.com/diagraming/5fc3306df346fb646a5cafe6

Spring Mvc常用注解

@Controller

控制器,负责处理由DispatcherServlet分发用户请求由HandlerMapping处理url与Controller中Method一一对应找到对应暴露出去的处理器方法,处理用户请求数据再经过业务处理层处理后封装返回一个Model,然后该Model返回相应的View进行显示

@RequestMapping

@RequestMapping是一个用来处理请求地址映射的注解,可以作用于类或者方法。该注解包含6个属性
value:指定请求的实际地址,指定的地址可以是URL Template模式;
method:指定请求的方法类型;
consumes:指定请求提交的内容类型(Content-Type),例如application/json,text/html;
produces:指定返回的内容类型,仅当请求头部中Accept包含指定类型时方法才进行处理;
params:请求中必须包含某些参数时,方法才进行处理;
headers:请求header中必须包含某些指定的header值,方法才进行处理;

@Resource和@Autowired

@Resource和@Autowired都是bean注入时使用,但是其实@Resource并不是spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入;
@Resource和@Autowired的共同点:两者都可以使用在字段或者setter方法上,如果使用在了字段上,那么就不再需要setter方法。

@Resource和@Autowired的不同点:

@Autowired注解是由spring提供的,需要导入org.springframework.beans.factory.annotation.Autowired,只按照byType进行注入。在默认情况下,它要求依赖的对象必须存在,如果允许null,可以通过属性required设置为false进行设置。如果我们需要辅助通过byName进行装配bean,我们可以结合@Qualifier注解一起使用。

@Resource注解默认是按照byName进行装配bean,由J2EE提供,需要导入javax.annotion.Resource。@Resource注解包含两个重要的属性: name和type,Spring将@Resource注解中的name属性解析为bean的名字,将type属性解析为bean的类型。
当@Resource注解的name属性时,Spring将按照byName方式进行bean注入,找不到将会抛出异常;
当使用type属性时,将按照byType方式进行bean注入,找不到或者找到多个将会抛出异常;
如果同时使用了这两个属性,那么将会从Spring上下文中查找指定类型指定名字bean进行装配,找不到将会抛出异常;
如果两个属性都没有使用,那么将会按照默认方式byName进行bean注入。

@ModelAttribute

@ModelAttribute注解有两种用法:一种是用在拥有返回值的方法上,方法的返回值将会作为Model中指定属性的值;另一种是用在请求处理方法参数上,方法参数将会从Model的属性列表中获取指定属性的值。通过@ModelAttribute(“xxxx”)可以指定属性的名称。在Controller的请求处理方法调用之前,@ModelAttribute注解的方法都会被首先执行。

@SessionAttributes

@SessionAttibutes注解只能用在类上,不能使用在方法上。该注解将Model属性列表中指定的一些属性保存到Session对象中

@PathVariable

该注解用于将请求URL的模板变量提取出来,应用到请求处理方法参数中

@RequestParam

@RequestParam主要用于SpringMVC后台请求处理方法中获取参数,类似与request.getParameter(“name”), 该注解包含三个属性:required, defaultValue, value,其中required表示请求中是否必须包含该参数,defaultValue表示请求中没有包含该参数时的默认值,value表示传入的参数的名称

@ResponseBody

该注解用于将Controller请求处理方法返回的对象,通过适当的HttpMessageConverter转换为指定的格式,保存到Response对象的body区

@Component

相当于通用的注解

@Repository

用于注解DAO层

一个简单的SpringMVC项目

项目结构图

image.png

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>springMVC1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  <servlet-name>springMVC</servlet-name>
  <!-- 请求触发器 -->
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:springMVC-servlet.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup><!-- 提前启动 -->
  </servlet>
  
  <servlet-mapping>
    <servlet-name>springMVC</servlet-name>
    <url-pattern>/</url-pattern>
    <!-- 或*.action -->
  </servlet-mapping>
  
  <!-- 解决springMVC的post乱码 -->
  <filter>  
        <filter-name>encodingFilter</filter-name>  
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>  
        <init-param>  
            <param-name>encoding</param-name>  
            <param-value>UTF-8</param-value>  
        </init-param>  
        <init-param>  
            <param-name>forceEncoding</param-name>  
            <param-value>true</param-value>  
        </init-param>  
    </filter>  
    <filter-mapping>  
        <filter-name>encodingFilter</filter-name>  
        <url-pattern>/*</url-pattern>  
    </filter-mapping>
  
</web-app>

springMVC-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
       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/context 
       http://www.springframework.org/schema/context/spring-context.xsd">
        
       <!--  配置controller层路径扫描  com.qfedu.springmvc.controller  -->
       <context:component-scan base-package="com.springmvc.controller"></context:component-scan>
       
       
       <!-- 视图解析器 -->
       <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀 -->
        <property name="prefix" value="/WEB-INF/jsp/" />
        <!-- 后缀 -->
        <property name="suffix" value=".jsp" />
       </bean>
</beans>

Controller

@Controller
public class HelloWorld {
    @Resource
    private ISysMonitorService sysMonitorService;
    @RequestMapping("/hello")
    public String helloworld() {
        return sysMonitorService.query();
    }
}

Service

public abstract interface ISysMonitorService {
  String query();
}
@Service
public abstract class SysMonitorServiceImpl implements ISysMonitorService {
  @Autowired
  private ISysMonitorDao iSysMonitorDao;
  public String query() {
    return iSysMonitorDao.query();
  }
}

Dao

public interface interface ISysMonitorDao{
  String query();
}
@Repository
public interface SysMonitorDaoImpl implements ISysMonitorDao{
  public String query() {
    // 数据库查询调用
    return "Hello World";
  }
}

springMVC mini版框架实现

https://github.com/vnsun/vnsun-spring-1.0.git

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容