SpringMVC

1、MVC简介

  • 表现层:

    ​ 也就是我们尝说的web层。它负责接收客户端请求,向客户端响应结果,通常客户端使用http协议请求web层,web需要接收http请求,完成http响应。表现层的设计一般都使用MVC模型。(MVC是表现层的设计模型,和其他层没有关系)

  • 业务层:

    ​ 也就是我们常说的service层。它负责业务逻辑处理,和我们开发项目的需求息息相关。web层依赖业务层,但是业务层不依赖web层。业务层在业务处理时可能会依赖持久层,如果要对数据持久化需要保证事务一致性。(也就是我们说的,事务应该放到业务层来控制)

  • 持久层:

    ​ 也就是我们常说的dao层。负责数据持久化,包括数据层即数据库和数据访问层,数据库是对数据进行持久化的载体,数据访问层是业务层和持久层交互的接口,业务层需要通过数据访问层将数据持久化到数据库中。通俗的讲,持久层就是和数据库交互,对数据库表进行增删改查的。

MVC模型

  • MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种用于设计创建 Web 应用程序表现层的模式。MVC 中每个部分各司其职:
  • Model (模型) :
    通常指的就是我们的数据模型。作用一般情况下用于封装数据。
  • View (视图) :
    通常指的就是我们的 jsp 或者 html。作用一般就是展示数据的。通常视图是依据模型数据创建的。
  • Controller (控制器) :
    是应用程序中处理用户交互的部分。作用一般就是处理程序逻辑的。

SpringMVC简介

​ SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于 Spring FrameWork 的后续产品,已经融合在 Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用 Spring 进行 WEB 开发时,可以选择使用 Spring的 Spring MVC 框架或集成其他 MVC 开发框架,如 Struts1(现在一般不用),Struts2 等。
​ SpringMVC 已经成为目前最主流的 MVC 框架之一,并且随着 Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。
​ 它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful 编程风格的请求。

2、SpringMVC执行流程

流程说明:

1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用处理器映射器HandlerMapping
3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器),并返回给DispatcherServlet
4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
5.执行处理器Handler(Controller,也叫页面控制器)
6.Handler执行完成返回ModelAndView
7.HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9.ViewReslover解析后返回具体View
10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)
11.DispatcherServlet响应用户

3、SpringMVC注解

  • @Controller:注解类型声明某类的实例是一个控制器
  • @RestController:Controller +ResponseBody的组合
  • @RequestMapping
    • 作用:用于建立请求URL和处理请求方法之间的对应关系。
    • 属性:
      • value:用于指定请求的URL。它和path属性的作用是一样的。
      • method:用于指定请求的方式。
      • params:用于指定限制请求参数的条件。
      • headers:用于指定限制请求消息头的条件。
  • @PathVariable
    • 作用:用于绑定url中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
    • 属性:
      • value:用于指定url中占位符名称。
      • required:是否必须提供占位符。
  • @RequestParam
    • 作用:把请求中指定名称的参数给控制器中的形参赋值。
    • 属性:
      • value:请求参数中的名称。
      • required:请求参数中是否必须提供此参数。默认值:true,表示必须提供。
  • @RequestBody
    • 作用:用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。get 请求方式不适用。(JSON格式数据)
    • 属性:required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值为 false,get 请求得到是 null。
  • @ResponseBody
    • 作用:该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。一般转换成json格式的数据返回;当未配置此注解时,底层会将方法的返回值封装为ModelAndView对象。

4、SpringMVC异常处理

异常处理思路:

系统中异常包括两类:预期异常和运行时异常 RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。系统的 dao、service、controller 出现都通过 throws Exception 向上抛出,最后由 springmvc 前端控制器交由异常处理器进行异常处理,如下图

Spring MVC 统一异常处理有以下 3 种方式:

使用 Spring MVC 提供的简单异常处理器 SimpleMappingExceptionResolver。
实现 Spring 的异常处理接口 HandlerExceptionResolver 自定义自己的异常处理器。
使用 @ExceptionHandler 注解实现异常处理

全局异常处理

使用@ControllerAdvice实现全局异常处理,只需要定义类,添加该注解即可定义。

5、SpringMVC线程问题

1,Spring MVC默认情况下线程是否安全?

2,Struts2为什么不会有线程安全问题?

3,Spring MVC什么情况下会出现线程安全问题?

4,有什么方式可以保证线程安全?

思路一下。。。。。。。。。。。

1,Spring MVC默认是Singleton的,Controller、Service、Dao都是单例,所以在使用不当存在一定的安全隐患;单例的优势:提高性能,不用每次创

Controller实例,减少了对象创建和垃圾收集的时间

2,Struts2默认的实现是Prototype模式,每次请求新建一个action,不会存在线程安全问题

3,Spring MVC什么情况下会出现线程安全问题?

有状态bean

成员变量( 实例变量)

4,有什么方式可以保证线程安全?

  • 使用ThreadLocal设置
  • 多例模式scope="prototype"
  • 不使用成员变量

Spring中的并发访问题:

  • Spring并不保证线程安全,需要使用者自行保证。
  • 无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean声明为singleton作用域。那么对于有状态的bean呢?Spring对一些(如RequestContextHolder、TransactionSynchronizationManager等)中非线程安全状态的bean采用ThreadLocal进行处理,让它们也成为线程安全的状态,因此有状态的Bean就可以在多线程中共享了。

6、Spring常用注解

声明bean的注解

@Component 组件,没有明确的角色

@Service 在业务逻辑层使用(service层)

@Repository 在数据访问层使用(dao层)

@Controller 在展现层使用,控制器的声明(C)

注入bean的注解

@Autowired:由Spring提供,默认按byType匹配的方式,可配合@Qualifier注解使用(限定Bean名称)

@Inject:由JSR-330提供

@Resource:由JSR-250提供,默认按照byName方式进行bean匹配

都可以注解在set方法和属性上,推荐注解在属性上(一目了然,少写代码)

Java配置类相关注解

@Configuration 声明当前类为配置类(类上)

@Bean 注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式(方法上)

@Configuration 声明当前类为配置类,其中内部组合了@Component注解,表明这个类是一个bean(类上)

@ComponentScan 用于对Component进行扫描(类上)

@WishlyConfiguration 为@Configuration与@ComponentScan的组合注解,可以替代这两个注解

切面(AOP)相关注解

Spring支持AspectJ的注解式切面编程。

@Aspect 声明一个切面(类上),使用@After、@Before、@Around定义建言(advice),可直接将拦截规则(切点)作为参数。

@After 在方法执行之后执行(方法上)

@Before 在方法执行之前执行(方法上)

@Around 在方法执行之前与之后执行(方法上)

@PointCut 声明切点

@EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持(类上)

@Bean的属性支持

@Scope 设置Spring容器如何新建Bean实例(方法上,得有@Bean)

其设置类型包括:

Singleton (单例,一个Spring容器中只有一个bean实例,默认模式),

Protetype (每次调用新建一个bean),

Request (web项目中,给每个http request新建一个bean),

Session (web项目中,给每个http session新建一个bean),

GlobalSession(给每一个 global http session新建一个Bean实例)

@PostConstruct 由JSR-250提供,在构造函数执行完之后执行,等价于xml配置文件中bean的initMethod

@PreDestory 由JSR-250提供,在Bean销毁之前执行,等价于xml配置文件中bean的destroyMethod

环境切换

@Profile 通过设定Environment的ActiveProfiles来设定当前context需要使用的配置环境。(类或方法上)

@Conditional Spring4中可以使用此注解定义条件话的bean,通过实现Condition接口,并重写matches方法,从而决定该bean是否被实例化。(方法上)

异步相关

@EnableAsync 配置类中,通过此注解开启对异步任务的支持,叙事性AsyncConfigurer接口(类上)

@Async 在实际执行的bean方法使用该注解来申明其是一个异步任务(方法上或类上所有的方法都将异步,需要@EnableAsync开启异步任务)

定时任务相关

@EnableScheduling 在配置类上使用,开启计划任务的支持(类上)

@Scheduled 来申明这是一个任务,包括cron,fixDelay,fixRate等类型(方法上,需先开启计划任务的支持)

@Enable*注解说明

这些注解主要用来开启对xxx的支持。

@EnableAspectJAutoProxy 开启对AspectJ自动代理的支持@EnableAsync 开启异步方法的支持

@EnableScheduling 开启计划任务的支持

@EnableWebMvc 开启Web MVC的配置支持

@EnableConfigurationProperties 开启对@ConfigurationProperties注解配置Bean的支持

@EnableJpaRepositories 开启对SpringData JPA Repository的支持

@EnableTransactionManagement 开启注解式事务的支持

@EnableCaching 开启注解式的缓存支持

原文地址:https://www.cnblogs.com/xiaopanjava/p/14432160.html