概述

mvc框架由model,view,controller组成,执行流程一般是:在controller访问model获取数据,通过view渲染页面。

mvc模式是web开发中的基础模式,采用的是分层设计,各层之间职责分明。然而事与愿违,当我们日积月累的基于mvc模式开发之后,会逐渐的感受到层与层之间存在粘连和职责模棱两可的地方,这就是service层出现的重要原因。

问题是什么?

问题的本质是:业务逻辑粘连了C层和M层,应该从C层&M层解耦出来,成为独立的Service层。 
在C层直接实现业务逻辑,缺点: 
1. 不同的controller之间,无法共享通用的业务逻辑,比如:折扣计算。

  1. 业务逻辑升级,需直接在原代码上做修改兼容,导致controller代码不断膨胀复杂。

service层的作用:

service是业务层,是使用一个或多个模型执行操作的方法。 
1. 封装通用的业务逻辑,操作。 
如一些数据的检验,可以通用处理。 
2. 与数据层的交互。 
3. 其他请求:如远程服务获取数据,如第三方api等。

补充:

  1. Model和Service验证方面 
    Model校验:某些字段不能为空等数据层的校验 
    Service验证:逻辑层的校验,避免一些不合理的出现,尤其是调用多个模型

DAO层、ENTITY层、SERVICE层、CONTROLLER层

1、DAO层: 持久层  主要与数据库进行交互

DAO层主要是做数据持久层的工作,主要与数据库进行交互。DAO层首先会创建DAO接口,然后会在配置文件中定义该接口的实现类,
   接着就可以在模块中就可以调用DAO 的接口进行数据业务的而处理,并且不用关注此接口的具体实现类是哪一个类。DAO 层的数据源和数据库连接的参数数都是在配置文件中进行配置的。
   
2、Entity层(domain层) 实体层   数据库在项目中的类

3、Service层(biz):业务层  控制业务

Service层主要负责业务模块的逻辑应用设计。和DAO层一样都是先设计接口,再创建要实现的类,然后在配置文件中进行配置其实现的关联。接下来就可以在service层调用接口进行业务逻辑应用的处理。
   封装Service层的业务逻辑有利于业务逻辑的独立性和重复利用性。

4、Controller层:(action层) 控制层  控制业务逻辑

Controller层负责具体的业务模块流程的控制,controller层主要调用Service层里面的接口控制具体的业务流程,控制的配置也需要在配置文件中进行。

5、View层 此层与控制层结合比较紧密,需要二者结合起来协同工发。View层主要负责前台jsp页面的表示,

Conroller层和Service层的区别是:Controlle层负责具体的业务模块流程的控制;Service层负责业务模块的逻辑应用设计;
   
总结:在具体的项目中,其流程为:Controller层调用Service层的方法,Service层调用Dao层中的方法,其中调用的参数是使用Entity层进行传递的。

Spring MVC默认是单例模式,Controller、Service、Dao都是单例所以在使用不当存在一定的安全隐患。Controller单例模式的好处在与: 
1. 提高性能,不用每次创建Controller实例,减少了对象创建和垃圾收集的时间 
2. 没多例的必要 
由于只有一个Controller的实例,当多个线程同时调用它的时候,它的成员变量就不是线程安全的。 
当然在大多数情况下,我们根本不需要Controller考虑线程安全的问题,除非在类中声明了成员变量。因此Spring MVC的Contrller在编码时,尽量避免使用实例变量。如果一定要使用实例变量,则可以改用以下方式: 
1. Controller中声明 scope=”prototype”,即设置为多例模式 
2.在Controller中使用ThreadLocal变量,如:private ThreadLocal<Integer> count = new ThreadLocal<Integer>();

使用Spring MVC有一段时间了,之前一直使用Struts2,在struts2中action都是原型(prototype)的, 说是因为线程安全问题,对于Spring MVC中bean默认都是(singleton)单例的,那么用@Controller注解标签注入的Controller类是单例实现的?

测试结果发现spring3中的controller默认是单例的,若是某个controller中有一个私有的变量i,所有请求到同一个controller时,使用的i变量是共用的,即若是某个请求中修改了这个变量a,则,在别的请求中能够读到这个修改的内容。 若是在@Controller之前增加@Scope(“prototype”),就可以改变单例模式为多例模式

以下是测试步骤,代码与结果.

1. 如果是单例类型类的,那么在Controller类中的类变量应该是共享的,如果不共享,就说明Controller类不是单例。以下是测试代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

@Controller

public class ExampleAction {

    private int singletonInt=1;

     @RequestMapping(value = "/test")

     @ResponseBody

     public String singleton(HttpServletRequest request,

             HttpServletResponse response) throws Exception {

         String data=request.getParameter("data");

         if(data!=null&&data.length()>0){

             try{

              int paramInt= Integer.parseInt(data);

             singletonInt = singletonInt + paramInt;

             }

             catch(Exception ex){

                 singletonInt+=10;

             }

         }else{

             singletonInt+=1000;

         }

         return String.valueOf(singletonInt);

    }

}

分别三次请求: http://localhost:8080/example/test.do?data=15

得到的返回结果如下。

第一次: singletonInt=15

第二次: singletonInt=30

第三次: singletonInt=45

从以上结果可以得知,singletonInt的状态是共享的,因此Controller是单例的。

2. 如果Controller类是单例,那么多个线程请求同一个Controller类中的同一个方法,线程是否会堵塞

1

2

3

4

5

6

7

8

9

10

11

12

13

@RequestMapping(value = "/sleepdata")

@ResponseBody

public String switcher(HttpServletRequest request

     , HttpServletResponse response)

           throws Exception {

  String sleep = request.getParameter("sleep");

  if (sleep.equals("on")) {

      Thread.currentThread().sleep(100000);

       return "sleep on";

   else {

       return sleep;

  }

验证方法:分别发送两个请求,

第一个请求:http://localhost:8080/coreplat/sleepdata.do?sleep=on

第二个请求:http://localhost:8080/coreplat/sleepdata.do?sleep=test

验证结果:第一个请求发出去以后,本地服务器等待100s,然后返回结果”sleep on”,在本地服务器等待的者100s当中,发送第二个请求,直接返回结果”test”。说明之间的线程是不互相影响的。

MVC中的service controller 有状态,无状态Bean线程安全相关推荐

  1. ASP.NET MVC中ApiController与Controller的区别

    本文翻译自:Difference between ApiController and Controller in ASP.NET MVC I've been playing around with A ...

  2. mysql有状态无状态_有状态和无状态的对象区别

    每次的总结,都是一种进步,把自己理解的东西记录下来不容易,让别人看懂更不容易. 第一:基本概念: 1.有状态就是有数据存储功能.有状态对象(Stateful Bean),就是有实例变量的对象,可以保存 ...

  3. 有状态,无状态对象是什么概念

    基本概念: 有状态就是有数据存储功能.有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的.在不同方法调用间不保留任何状态. 无状态就是一次操作,不能保存数据 ...

  4. mysql有状态无状态_k8s statefulSet 有状态应用和无状态应用区别

    一.定义: 无状态服务:就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息) 有状态服务 ...

  5. k8s应用管理——有状态无状态

    背景 由于ReplicaSet.ReplicationController.Deployment等这些控制器都是无状态的,但是我们想要使用k8s来编排有状态的服务如数据库等,但因为有状态服务的复杂性, ...

  6. 八十、React中的容器组件和无状态组件

    2020/11/20. 周五.今天又是奋斗的一天. @Author:Runsen React,也有了自己去构建一些应用的信心,那会是一种非常棒的感觉. 容器组件和无状态组件 React类组件是在Jav ...

  7. ASP.NET MVC中controller和view相互传值的方式

    ASP.NET MVC中Controller向view传值的方式: ViewBag.ViewData.TempData 单个值的传递 Json 匿名类型 ExpandoObject Cookie Vi ...

  8. [转载]Asp.net MVC中Controller返回值类型

    Asp.net MVC中Controller返回值类型 在mvc中所有的controller类都必须使用"Controller"后缀来命名 并且对Action也有一定的要求: 必须 ...

  9. 浅析权限认证中的有状态和无状态

    转自:https://www.cnblogs.com/shiyajian/p/10672908.html 前言 我们在设计构建一个系统的时候,权限管理和用户认证是最基本功能,其中关于用户认证这块是一个 ...

  10. 分布式系统中的“无状态”和“有状态”详解

    「数据一致性」和「高可用」其实本质是一个通过提升复杂度让整体更完善的方式. 本文主要讲一些让系统更简单,更容易维护的东西--「易伸缩」,首当其冲的主题就是「stateless」,也叫「无状态」. 服务 ...

最新文章

  1. python简单爬虫程序分析_[Python专题学习]-python开发简单爬虫
  2. Angular 依赖注入里factory函数的调用时机
  3. 码农与UI沟通的日常
  4. 国防科大JAVA工程师笔试题_国防科大人工智能考博题答案
  5. Python url编码、url解码
  6. pandas—总结(2) 数据读写 (更新中)
  7. 解决Python开发中,Pycharm中无法使用中文输入法问题
  8. mysql备份和还原
  9. 3PHP如何用PDO的连接方式方式导出mysql数据
  10. 限时下载 | 132G编程资料:Python、JAVA、C,C++、机器人编程、PLC,入门到精通~
  11. cdlinux 无线网密码破解
  12. Android系统webView下载不动,Android WebView下载无法正常工作
  13. iOS集成OpenCV,并实现图片马赛克
  14. 12套员工激励方法和108个技巧
  15. 半自动安装jieba分词库
  16. 【PTA题目】7-4 计算物体自由下落的距离 (5 分)
  17. 张一鸣:年轻人一定要懂得延迟满足
  18. Excel文档误删的4种恢复方法,1秒就可以还原所有内容,你用过吗
  19. Just do it and never give up,then you will find that things become better
  20. Nexus私服的下载、安装、启动、配置教程

热门文章

  1. Mac那些你不知道的 :自带计算器的隐藏功能
  2. 3D几何图形PS笔刷下载安装
  3. Vue指令之v-if
  4. 苹果发布会新品曝光 这款软件肯定用得上
  5. 数据科学家为什要用Git?怎么用? 1
  6. NO5 grep-head-tail命令
  7. 物联网在发展上,特别是消费性产品,为何进展如此缓慢?
  8. 《3D数学基础》1.9 向量空间
  9. poj 3080 Blue Jeans kmp+枚举
  10. 在 Mac 上的 Keynote 讲演中如何自动替换文本?