JAVA简答(四)

  1. springmvc 和 struts 的区别是什么
  • 拦截机制的不同
    Struts2是类级别的拦截,每次请求就会创建一个Action。和Spring整合时ActionBean注入作用域是prototype;
    SpringMVC是方法级别的拦截,方法基本上是独立的。在Spring整合时,Controller Bean默认单例模式Singleton。
    所以,SpringMVC开发效率和性能高于Struts2。
  • 底层框架的不同:Struts2采用Filter实现,SpringMVC则采用Servlet实现。
  • 配置方面:spring MVC和Spring是无缝的。

39.如何避免 sql 注入?

  • 什么是sql注入
    客户端用户输入的变量或URL传递的参数是组成SQL语句的一部分,通过SQL语句,实现无账号登录,甚至篡改数据库。
    如对语句select id, password from user where username=${username},如果传入的username值是;drop table user;,则解析成的sql为select id, password from user where username=;drop table user;,这会导致数据库被恶意篡改。
  • 如何避免sql注入
    ① PreparedStatement(采用预编译,简单又有效的方法)
    ② 使用正则表达式过滤传入的参数(是否包含特殊字符)
    ③ 检查变量数据类型和格式
  • 什么是sql预编译
    但是很多情况,一条sql语句可能会反复执行,或者每次执行的时候只有个别的值不同。对于这类情况,可以将sql语句模板化或者说参数化,将值用占位符替代,这就是预编译。预编译能够一次编译、多次运行,此外还能防止sql注入。
    简单总结,参数化能防注入的原因在于,语句是语句,参数是参数,参数的值并不是语句的一部分,数据库只按语句的语义跑。PreparedStatementmybatis都是采用预编译功能避免sql注入。
  • mybatis中的$#
    #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号,而$将传入的数据直接显示生成在sql中,因此#方式能够很大程度防止sql注入。所以在编写MyBatis的映射语句时,尽量采用#{xxx}这样的格式。若不得不使用${xxx}这样的参数,要手工地做好过滤工作。
  1. spring 事务实现方式有哪些?
  • 编程式事务管理,需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法。对基于 POJO 的应用来说是唯一选择。
  • 基于 TransactionProxyFactoryBean 的声明式事务管理
  • 基于 @Transactional 的声明式事务管理
  • 基于 Aspectj AOP 配置事务
  1. 什么是SpringMVC
  • SpringMVC的核心组件
    DispatcherServlet:中央控制器,把请求给转发到具体的控制类
    Controller:具体处理请求的控制器
    HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略
    ModelAndView:服务层返回的数据和视图层的封装类
    ViewResolver:视图解析器,解析具体的视图
    Interceptors:拦截器,负责拦截我们定义的请求然后做处理工作
  • SpringMVC运行流程
    SpringMVC运行流程图

    ①用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获;
    DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象,最后以HandlerExecutionChain对象的形式返回;
    DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter
    ④提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)
    Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象;
    ⑥根据返回的ModelAndView,选择一个适合的ViewResolver返回给DispatcherServlet
    ViewResolver 结合ModelView,来渲染视图;
    ⑧将渲染结果返回给客户端。
  • @RequestMapping
    RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。RequestMapping注解有六个属性:
    value:指定请求的实际地址,指定的地址可以是URI Template 模式;
    method:指定请求的method类型, GET、POST、PUT、DELETE等;
    consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html
    produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
    params: 指定request中必须包含某些参数值是,才让该方法处理。
    headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
  1. 什么是SpringBoot?
    SpringBoot是一个框架,一种全新的编程规范,简化了Spring众多框架中所需的大量且繁琐的配置文件。所以 SpringBoot是一个服务于框架的框架,服务范围是简化配置文件,使编码变简单、配置变简单、部署变简单、监控变简单。
    Spring Boot提供了两种常用的配置文件,分别是properties文件yml文件
  2. 什么是 SpringCloud
    Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具,例如
  • 服务发现——Netflix Eureka
    一个RESTful服务,用来定位运行在AWS地区的中间层服务。由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。
  • 客服端负载均衡——Netflix Ribbon
    主要提供客户侧的软件负载均衡算法。Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件。
  • 断路器——Netflix Hystrix
    断路器可以防止一个应用程序多次试图执行一个操作,即很可能失败,允许它继续而不等待故障恢复或者浪费 CPU 周期,而它确定该故障是持久的。断路器模式也使应用程序能够检测故障是否已经解决。如果问题似乎已经得到纠正,应用程序可以尝试调用操作。
  • 服务网关——Netflix Zuul
    类似nginx,反向代理的功能,不过netflix自己增加了一些配合其他组件的特性。
  • 分布式配置——Spring Cloud Config
    这个还是静态的,得配合Spring Cloud Bus实现动态的配置更新。
  1. Mybatisf分页方式和延迟加载
  • #{}${}的区别
    #{}是预编译处理,调用PreparedStatementset方法来赋值,将sql中的#{}替换为?号。可以有效的防止SQL注入,提高系统安全性。
    ${}是字符串替换,就是把${}替换成变量的值;
  • 几种分页方式
    ①数组分页:查询出全部数据,然后再list中截取需要的部分
    ②sql分页:在查询sql中利用limit等方式限制返回条数
    ③拦截器分页:创建拦截器,拦截特定条件的语句。适合大数据量拦截。
    RowBounds分页:mybatis接口加入RowBounds参数。适合小数据量拦截。
  • 延迟加载
    Mybatis仅支持一对一一对多关联集合对象的延迟加载。在Mybatis配置文件中,lazyLoadingEnabled=true|false配置是否启用延迟加载。
    以用户订单(一对多)为例:

在查询用户时,要不要把关联的订单信息查询出来?
在查询订单时,要不要把关联的用户信息查询出来?

对于第一个问题,应该是需要订单信息的时候才查询,没必要每次查询用户信息都把订单信息也查询出来。这就是延迟加载,在真正的使用数据时才发起查询,不用的时候不查。按需加载(懒加载)。
对于第二个问题,我们就可以在查询订单信息的时候查询出关联的用户信息。这就是立即加载,不管用不用,只要一调用方法,马上发起查询。

  1. Mybatis缓存机制
    缓存机制减轻数据库压力,提高数据库性能,分为一级缓存和二级缓存
  • 一级缓存( sqlsesson 缓存)
    当第一次执行 select 完毕会将查到的数据写入 SqlSession 内的 HashMap 中缓存起来;第二次执行 select 的同传参数一样就会从缓存中查数据。
    注意:
    缓存的数据只在 SqlSession 内有效,当SqlSession 结束后那么他里面的一级缓存也就不存在了。
    HashMapSqlSession 会话对象用于存储缓存数据的,使用 [namespace:sql:参数] 作为 key,此 HashMap 是当前会话对象私有的。
    ③mybatis 默认开启一级缓存,不需要配置。
    ④如果 SqlSession 执行了 DML (insert、update、delete)操作并提交了,那么 mybatis 就会清空当前 SqlSession 缓存中的所有数据。
  • 二级缓存(mapper缓存)
    二级缓存与一级缓存其机制相同,默认也是采用 HashMap 存储,不同在于其存储作用域为 Mapper(Namespace)。当多个 SqlSession 使用同一个 Mapper 操作数据库的时候,得到的数据会缓存在同一个二级缓存区域。二级缓存默认是没有开启的,需要在 setting 全局参数中配置。
    流程:
    ①当一个 sqlseesion 执行了一次 select 后,在关闭此 session 的时候,会将查询结果缓存到二级缓存
    ②当另一个 sqlsession 执行 select 时,首先会在他自己的一级缓存中找,如果没找到,就回去二级缓存中找,找到了就返回,就不用去数据库了,从而减少了数据库压力提高了性能
  1. mybatis 执行器
    Mybatis有三种基本的执行器(Executor):
  • SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。
  • ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。
  • BatchExecutor:执行update,将所有sql都添加到批处理中,等待统一执行。它缓存了多个Statement对象,每个Statement对象都是addBatch()完毕后,等待逐一执行executeBatch()批处理
  1. mysql 常用的引擎
  • InnoDB 引擎
    ①提供了对数据库 acid 事务的支持
    ②提供了行级锁和外键的约束
    ③InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引
    ④不支持全文搜索,同时启动也比较的慢,不会保存表的行数
    ⑤适用于写多读少的情况
  • MyIASM 引擎
    ①不提供事务的支持
    ②不支持行级锁和外键,只有表锁
    ④保存了表的行数
    ⑤适用于读多写少的情况
  1. jvm 的主要组成部分?
  • 类加载器(ClassLoader):把 Java 代码转换成字节码
  • 运行时数据区(Runtime Data Area):把字节码加载到内存中
  • 执行引擎(Execution Engine):将字节码翻译成底层系统指令
  • 本地库接口(Native Interface):CPU 执行底层系统指令


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

推荐阅读更多精彩内容