Java教程

个人随笔1

本文主要是介绍个人随笔1,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
  1. SpringMVC 的执行流程

1.用户发送请求如果匹配到前端控制器 DispatcherServlet 的请求映射路径(在
web.xml 中指定), WEB 容器将该请求转交给前端控制器处理
2.它接收到请求后, 将请求信息交给处理器映射器(HandlerMapping)
3.处理器映射器(HandlerMapping)会根据用户的 url 请求 查找匹配该 url 的 Handler
(处理器),并返回一个执行链
4.DispatcherServlet 再请求 处理器适配器(HandlerAdapter) 调用相应的 Handler进行处理并返回 ModelAndView 给 DispatcherServlet
5.DispatcherServlet 将 ModelAndView 请求 ViewReslover(视图解析器)解析,返回具体 View
6.DispatcherServlet 对 View 进行渲染视图(即将模型数据填充至视图中)最后 DispatcherServlet 将页面响应给用户。

  1. SpringMVC 如何解决中文乱码问题

(1)解决 post 请求乱码问题:
在 web.xml 中配置一个 CharacterEncodingFilter 过滤器,设置成 utf-8;
encher xxx.CharacterEncodingFilter

encoding UTF-8



encher
url-pattern>/*

(2)get 请求中文参数出现乱码解决方法有两个:
①修改 tomcat 配置文件添加编码与工程编码一致,如下:
<ConnectorURIEncoding=“utf-8” connectionTimeout=“20000” port=“8080”
protocol=“HTTP/1.1” redirectPort=“8443”/>
②另外一种方法对参数进行重新编码:
String userName = new String(request.getParamter(“userName”).getBytes(“ISO8859-1”),“utf-8”) ISO8859-1 是 tomcat 默认编码,需要将 tomcat 编码后的内容按 utf-8 编码。

  1. MyBatis 里面的动态 Sql 是怎么设定的?用什么语法?

Mybatis 动态 sql 可以在 Xml 映射文件内,以标签的形式编写动态 sql,执行原理是根据表达式的值 完成逻辑判断并动态拼接 sql 的功能。Mybatis 提供了多种 种动态 sql 标签:
trim | where | set | foreach | if | choose| when | otherwise | bind 。

  1. Ioc,DI,Aop 的理解

IoC 叫控制反转,DI(Dependency Injection)叫依赖注入,AOP 叫面向切面编程
控制反转是把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。
依赖注入即由容器动态的将某种依赖关系注入到组件之中。
依赖注入可以通过 setter 方法注入(设值注入)、构造器注入和基于注解的注入三种方式来实现
面向切面编程是一种关注点分离的技术,用于处理系统中分布的各个模块的横切关注点,比如说事务管理、日志记录、异常处理等。它是使用动态代理实现的,在内存中临时为

方法生成一个 AOP 对象,这个对象包含目标对象的所有方法,在特定的切点做了增强处
理,并回调原来的方法,使用 AOP 能让我们更加专注于业务代码的开发
它是把我们重复的代码抽取出来,在需要执行的时候,使用动态代理技术,在不修改源码的基础上,对我们已有的方法进行增强。使用 aop 的话可以让我们更加专注于业务代码的开发

  1. SpringAOP 的实现原理

Spring AOP 实现是采用动态代理方式实现的,主要有 JDK 动态代理和 cglib 动态代理。
默认策略是如果目标类实现了接口,则用 jdk 动态代理技术,否则用 cglib 来实现
JDK 动态代理通过反射来接收被代理的类,但是被代理的类必须实现接口,核心是 InvocationHandler [ˌɪnvəˈkeʃən]和 Proxy [ˈprɑksi]类。
而 cglib 是一个代码生成的类库,可以在运行时动态生成某个类的子类,所以,cglib 是通过继承的方式做的动态代理,因此如果某个类被标记为 final,那么它是无法使用 CGLIB 做动态代理的。

  1. 过滤器、拦截器、监听器的介绍及区别

(1)过滤器是基于函数的回调,拦截器是基于 Java 的反射机制
(2)过滤器依赖于 servlet 容器,拦截器不依赖 servlet 容器
(3)过滤器可以对所有请求起作用,拦截器只对 action 请求起作用
(4)过滤器不能访问 action 上下文、值栈里的对象。拦截器可以
(5)在 action 生命周期中,过滤器只能在容器初始化时调用一次,而拦截器可以多次被调用

  1. MyBatis 中使用#和$书写占位符有什么区别?

这两个都可以用来传递变量。区别在于 mybatics 在处理#时,会变成占位符"?",可
防止 sql 注入, 提高系统安全性。 是 简 单 的 值 传 递 , 是 啥 填 啥 。 用 到 o r d e r b y 子 句 的 时 候 应 该 用 是简单的值传递,是啥填啥。 用到 order by 子句的时候应该用 是简单的值传递,是啥填啥。用到orderby子句的时候应该用而不是#

10.MyBatis 的缓存

MyBatis 有一级缓存和二级缓存,默认支持一级缓存
一级缓存是 SqlSession 级别的缓存,在操作数据库时,会构造一个 SqlSession 对象,对象中有一个 HashMap 用于存储缓存数据。不同的 SqlSession 之间的缓存数据区域是互相不影响的。当在同一个 SqlSession 中执行两次相同的 sql 语句时,第一次执行完毕会将数据写到内存中,第二次查询不执行 sql 直接从内存中获取,从而提高查询效率,如果 SqlSession执行了增删改操作,Mybatis 则会清空 SqlSession 的一级缓存,避免出现脏读现象
二级缓存是 Mapper 级别的缓存,多个 SqlSession 类的实例对象操作同一个 Mapper 配

置文件中的 sql 语句,多个 SqlSession 类的实例对象可以共用二级缓存,二级缓存是跨SqlSession 的。要开启二级缓存需要在配置文件中设置 cacheEnabled 属性为 true。

11.MyBatis 实现一对多有几种方式,怎么操作的?

2 种,有联合查询和嵌套查询的方式,
联合查询是几个表联合查询,只查询一次,通过在 resultMap 里面配置 collection 节点配置一对多的类就可以完成;
嵌套查询是先查一个表,根据这个表里面结果的外键 id,去再另外一个表里面查询数据,也是通过配置 collection,但另外一个表的 查询通过 select 节点配置。

12.解释一下 MyBatis 中命名空间(namespace)的作用。

用于绑定 DAO 接口,在绑定接口后,可以不用写接口实现类,mybatis 可以通过该绑
定自动帮你找到对应要执行的 SQL 语句。

13.Spring 通知有哪些类型

(1)前置通知(Before advice):在某连接点(join point)之前执行的通知,但这个通知不能阻止连接点前的执行(除非它抛出一个异常)。
(2)后置通知(After returning advice):在某连接点(join point)正常完成后执行的通知:例如,一个方法没有抛出任何异常,正常返回。
(3)抛出异常后通知(After throwing advice):在方法抛出异常退出时执行的通知。
(4)最终通知(After (finally) advice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
(5)环绕通知(Around Advice):包围一个连接点(join point)的通知,可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。环绕通知是最常用的一种通知类型。大部分基于拦截的 AOP 框架,例如 Nanning 和 JBoss4,都只提供环绕通知

14.Spring 事务的传播机制

required [rɪ’kwaɪrd:需要] --支持当前事务,如果当前没有事务,就新建一个事务。这是
最常见的选择。
supports [sə’pɔts:支持] --支持当前事务,如果当前没有事务,就以非事务方式执行。mandatory [ˈmændəˌtɔri:强制] --支持当前事务,如果当前没有事务,就抛出异常。not_supported–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起,在执
行完当前逻辑后恢复上下文的事务。
never–以非事务方式执行,如果当前存在事务,则抛出异常。
requires_new --新建事务,如果当前存在事务,则把当前事务挂起,执行当前新建事务,完成后当前逻辑后恢复上下文事务

使用如:
<tx:method

name=“get*”

propagation=“SUPPORTS”/>

<tx:method name=“add*” propagation=“REQUIRED”/>

15.介绍一下 spring 的事务管理

spring 中使用事务有两种方式,一种是编程式事务,一种是声明式事务。
编程式事务指的是通过编码方式,类似于 JDBC 编程实现事务管理。它是使用TransactionTemplate[trænˈsækʃ(ə)n] 或者直接使用底层的 PlatformTransactionManager 实现的,它能提供极大的灵活性,但维护起来比较困难
声明式事务使用的是 AOP 原理。其本质是对方法前后进行拦截,然后目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。它仅使用注解(@Transactional) 或基于 xml 的配置来管理事务。这正是 Spring 倡导的非侵入式的开发方式
大多数用户选择声明式事务管理,因为它对应用代码的影响最小,因此更符合一个无侵入的轻量级容器的思想。声明式事务管理要优于编程式事务管理,虽然比编程式事务管理(这种方式允许你通过代码控制事务)少了一点

16.说出 Servlet 的生命周期,并说出 Servlet 和 CGI 的区别

Servlet 被服务器实例化后,容器运行其 init 方法
请求到达时运行其 service 方法 service 方法自动派遣运行与请求对应的 doXXX 方法(doGet,doPost)等,
当服务器决定将实例销毁的时候调用其 destroy 方法。
与 cgi 的区别在于 servlet 处于服务器进程中,它通过多线程方式运行其 service 方法,一个实例可以服务于多个请求,并且其实例一般不会销毁,而 CGI 对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于 servlet。

17.Request 和 Response 的区别

Request 和 Response 对象起到了服务器与客户机之间的信息传递作用。Request 对象用于接收客户端浏览器提交的数据,而 Response 对象的功能则是将服务器端的数据发送到客户端浏览器。
这里再说一下 jsp 的请求和转发:
转发:request.getRequestDispatcher(String path).forward(Request,Response)重定向:response.sendRedirect(String path);

18.内存的性能问题优化

1、物理对象(如 Connection 或 IO 等对象)在用好后应当立即被释放,一般在 finally

块中关闭这些对象
2、使用完某个对象后,应及时把它设置成 null,这样就能撤销该引用对象上的强引用,从而提升该对象的回收时间
3、不应频繁的操作 String 对象,它属于不可变类,频繁操作会产生大量内存碎片,从
而加重内存的负担
4、集合对象在用好后,应当及时 clear
5、合理使用弱引用和软引用,减少对象上的强引用个数,从而能让该对象被回收的时
间提前。

19.get 和 post 的区别

GET 请求在 URL 中传送的参数是有长度限制的,而 POST 么有。
GET 的参数会显示在 URL 上,POST 放在 Request body 中。
对参数的数据类型,GET 只接受 ASCII 字符,而 POST 没有限制。
GET 在浏览器回退时是无害的,而 POST 会再次提交请求。GET 请求只能进行 url 编码,而 POST 支持多种编码方式。
GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。

20.进程以及线程

进程是系统运行程序的基本单元、线程是进程中执行运算的最小单位
进程是程序的一次动态执行过程,它对应了从代码加载,执行至执行完毕的一个完整
过程。
而线程是进程中执行运行的最小单位,可完成一个独立的顺序控制流程,每个进程中必须至少建立一个线程来作为这个程序运行的入口点,如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程”
线程有创建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)五种状

创建:生成线程对象,还未调用 start 方法。
就绪:调用线程对象的 start 方法后,进入就绪状态
运行:运行状态,开始运行 run 函数当中的代码
阻塞:被暂停、一般是执行了 sleep,wait 等方法都会导致线程阻塞死亡:run 方法执行结束或租调用 stop 方法后,该线程就会死亡

这篇关于个人随笔1的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!