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执行时序图

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";
  }
}


学习更多JAVA知识与技巧,关注与私信博主(学习)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值