1、Springmvc的运行原理
1. 客户端请求提交到DispatcherServlet 2. 由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller 3. DispatcherServlet将请求提交到Controller 4. Controller调用业务逻辑处理后,返回ModelAndView 5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图 6. 视图负责将结果显示到客户端 DispatcherServlet是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。
2、Struts2的运行原理 1、 在servlet容器启动时加载web.xml,通过核心控制器FilterDispatcher加载struts.xml文件并进行解析,将解析的信息封装在ActionMapper类中。
2、 客户端发送请求,请求被核心控制器FilterDispatcher进行拦截。
3、 FilterDispatcher通过ActionMapper找到对应的ActionForm和Action中的响应方法,在访问方法前先经过Struts2设置的17个默认拦截器,其中一个拦截器的功能是将请 求时的数据封装在ActionForm中,然后方法进行响应。
4、 方法处理完后返回一个字符串,通过sturts.xml配置文件中的<result />找到响应的请求路径。
3、Springmvc和struts的区别
1、springmvc基于方法开发的,struts2基于类开发的。
2、spring mvc的入口是servlet(前端控制器),而struts2是filter(核心过滤器),这样就导致了二者的机制不同。
3、 拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式。
4、struts2接受参数时是用类属性接受参数的,而springmvc用的是方法的形参。
5、struts2响应的数据存放在modelandview里,而struts2响应的参数仍然存放在类属性中,响应和接受的参数都放在类属性中会显得很乱。
6、 另外,springmvc的验证也是一个亮点,支持JSR303,处理ajax的请求更是方便,只需一个注解@ResponseBody ,然后直接返回响应文本即可。
4、什么是mvc
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
5、Springmvc和spring的区别
Spring是IOC和AOP的容器框架,SpringMVC是基于Spring功能之上添加的Web框架,想用SpringMVC必须先依赖Spring。 简单点的话可以将SpringMVC类比于Struts。 Spring是IOC和AOP的容器框架,SpringMVC是基于Spring功能之上添加的Web框架,想用SpringMVC必须先依赖Spring。 Spring可以说是一个管理bean的容器,也可以说是包括很多开源项目的总称,spring mvc是其中一个开源项目,所以简单走个流程的话,http请求一到,由容器(如:tomact)解析http搞成一个request,通过映射关系(路径,方法,参数啊)被spring mvc一个分发器去找到可以处理这个请求的bean,那tomcat里面就由spring管理bean的一个池子(bean容器)里面找到,处理完了就把响应返回回去。
SpringMVC是一个MVC模式的WEB开发框架;
Spring是一个通用解决方案, 最大的用处就是通过Ioc/AOP解耦, 降低软件复杂性, 所以Spring可以结合SpringMVC等很多其他解决方案一起使用, 不仅仅只适用于WEB开发
6、说下Spring的懒加载,为什么要用呢?
所谓懒加载(lazy)就是延时加载,延迟加载。 就是说是否在spring容器加载的时候将bean加载到容器中。在没有设置的情况下,默认是false的,就是说不使用懒加载模式。
至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限,为了减少并发量,减少系统资源的消耗, 我们让数据在需要的时候才进行加载,这时我们就用到了懒加载。
7、Spring的运行原理,
Spring的核心控制器是什么
DispatcherServlet
IOC和AOP的概念,
IOC:Inversion of Control控制反转,也叫(Dependency Injection)依赖注入,是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是通过容器生成,同时,要是产生的是单例的bean,他还可以给管理bean的生命周期。
AOP面向切面编程将程序中的交叉业务逻辑(比如安全,日志,事务),封装成一个切面,然后注入到目标业务逻辑中去
8、Spring是如何控制事务的
Spring事务管理主要包括3个接口,Spring的事务主要是由他们三个共同完成的。 1)PlatformTransactionManager:事务管理器--主要用于平台相关事务的管理 主要有三个方法:commit 事务提交; rollback 事务回滚; getTransaction 获取事务状态。 2)TransactionDefinition:事务定义信息--用来定义事务相关的属性,给事务管理器PlatformTransactionManager使用 这个接口有下面四个主要方法: getIsolationLevel:获取隔离级别; getPropagationBehavior:获取传播行为; getTimeout:获取超时时间; isReadOnly:是否只读(保存、更新、删除时属性变为false--可读写,查询时为true--只读) 事务管理器能够根据这个返回值进行优化,这些事务的配置信息,都可以通过配置文件进行配置。 3)TransactionStatus:事务具体运行状态--事务管理过程中,每个时间点事务的状态信息。 例如它的几个方法: hasSavepoint():返回这个事务内部是否包含一个保存点, isCompleted():返回该事务是否已完成,也就是说,是否已经提交或回滚 isNewTransaction():判断当前事务是否是一个新事务
9、有哪些不同类型的IOC(依赖注入)? 构造器依赖注入:构造器依赖注入在容器触发构造器的时候完成,该构造器有一系列的参数,每个参数代表注入的对象。 Setter方法依赖注入:首先容器会触发一个无参构造函数或无参静态工厂方法实例化对象,之后容器调用bean中的setter方法完成Setter方法依赖注入。 你推荐哪种依赖注入?构造器依赖注入还是Setter方法依赖注入? 你可以同时使用两种方式的依赖注入,最好的选择是使用构造器参数实现强制依赖注入,使用setter方法实现可选的依赖关系。
10、使用spring框架有什么好处? 使用spring框架可以很好的将控制层和持久层耦合到一起,并降低各个模块之间的耦合性,spring有两大核心IOC和AOP使用spring可以控制事务等。 11、Mybatis和hibernate的区别
(1)sql方面:mybaits通过mapper.xml维护映射结果,程序员手动编写sql相比hibernate自动生成hql(hibernate sql)更加灵活,sql调优更加容易hibernate的hql数据库移植性更好,体现在强壮性。hibernate在级联删除的时候效率低;数据量大, 表多的时候,基于关系操作会变得复杂。 (2)缓存方面:mybatis和hibernate都可以使用第三方缓存,而hibernate相比maybatis有更好的二级缓存机制。
12、说说Hibernate怎么使用分页
1.首先我们定义一个类,其将实体对象作为泛型接收参数,里面定义的属性包括总数及行的信息。 2. control层接收前台传递的参数(开始、结束、排序字段等信息),然后调用service的方法获得一个page对象。 3. service层的方法进行处理的时候,首先将查询的条件参数存放到Criterion的对象中,作为查询条件。 4. 同时将orders的map对象取出,根据升序降序的不同存放到Order的对象中,处理排序。 5. Criterion和Order作为函数的参数,hibernateDao继承了SimpleHibernateDao,其接收这几个参数,按照Criteria分页查询。 6. 我们前台使用datatables组件进行分页的处理,后台调用相关方法
13、说说Mybatis的懒加载,说明其作用
懒加载思想 (所谓懒加载(lazy)就是延时加载,延迟加载。) 简单的将就是拖到最后一刻,万不得已了,才加载,才开始占用资源。所谓懒加载,写的就是其getter方法。在开发中,当程序中需要利用的资源时,在程序启动的时候不加载,只有在运行当需要这些资源的时候再去加载这些资源。
作用 内存容量有限 ,为了减少并发量,减少系统资源的消耗, 我们让数据在需要的时候才进行加载,这时我们就用到了懒加载
14、Mybatis动态sql是什么意思?你用过哪些? 常用的动态sql : where if foreach when 1.对于一些复杂的查询,我们可能会指定多个查询条件,但是这些条件可能存在也可能不存在,例如在58同城上面找房子,我们可能会指定面积、楼层和所在位置来查找房源,也可能会指定面积、价格、户型和所在位置来查找房源,此时就需要根据用户指定的条件动态生成SQL语句。如果不使用持久层框架我们可能需要自己拼装SQL语句,还好MyBatis提供了动态SQL的功能来解决这个问题。 3. $和#号区别 : 动态 SQL 是 mybatis 的强大特性之一,也是它优于其他 ORM 框架的一个重要原因。mybatis 在对 sql 语句进行预编译之前,会对 sql 进行动态解析,解析为一个 BoundSql 对象,也是在此处对动态 SQL 进行处理的。在动态 SQL 解析阶段, #{ } 和 ${ } 会有不同的表现。 #{ }:解析为一个 JDBC 预编译语句(prepared statement)的参数标记符。
15、mybatis里的标签有哪些?并说明其作用。 16、简单的说一下MyBatis的一级缓存和二级缓存? Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象 Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。 17、手写Oracle使用分页和mysql使用分页,就查用户表吧
SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40) WHERE RN > 20
Mysql : select * from tableName limit m,n tableName表示要分页表名 , m从第几页开始 n 页要显示数据的数量
18、Maven是干什么的?
它是Apache的一个开源项目,主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。
19、说下maven的搭建使用流程
(1)新建maven项目:在file中选择new下的other,选择maven project,在create a simple project中打√, 此处可以选择workspace,可以使用eclipse中系统默认的workspace路径, 点击next,在弹出的groupID和artifact ID中输入人为提供的可以使用的ID (2)配置底层依赖文件:在pom中添加代码块,若不添加此底层依赖文件,则无法运行任何东西。
20、用过maven聚合项目吗?怎么用的?
父子项目 一个父级项目 多个子集项目 通过父级项目 的porm 把多个子集 联系起来 子级项目分别做自己的项目 21、Maven常用的命令
1.clean:Maven默认的编译后的文件都放在target目录,clean命名会去清理该目录 2.install:先执行package命令,然后将打包后的文件拷贝到本地Maven repository中 3.test:执行项目中的测试(默认是src/test/java下的测试类) 4.clean test -Dtest=Testclass:在项目开发过程中,我们可能经常会需要执行单个测试类,我们可以通过test命令带一个 test参数,来执行指定测试类的测试 5.clean install :先clean,再install 6.deploy:先执行install,再将打包的文件传到远程的仓库中,这个远程Maven repository需要在项目的POM文件中定义(distributionManagement节点),还需要配置帐号与密码(配置在本地Maven配置文件中,servers节点)。一般需要控制这种权限,这里不深入。
22、spring boot用过吗?说下你的理解
1.springboot是spring的一个升级,对开发者来说,熟悉springboot有助于快速开发javaweb项目. 2.springboot一个重要的概念就是自动配置,约定大于配置,使得开发者无须像之前做spring项目那样做大量的配置,有了springboot,比如我们要集成redis,如果你使用的是mavan来构建项目,只需要引入redis的依赖,然后在application.properties或者application.yml配置必要的东西就可以了.如果要覆盖默认配置,同样也在配置文件写就可以.也就是说,我们使用springboot,不仅仅可以享受快速开发,也可以很轻松的覆盖默认配置
23、说说maven和springboot的区别
maven是项目管理工具springboot是框架一个项目管理版本控制。一个让配置更简单
23、Spring Boot总结 SpringBoot核心功能 2.1、独立运行Spring项目 Spring boot可以以jar包形式独立运行,运行一个Spring Boot项目只需要通过java -jar xx.jar来运行。 2.2、内嵌servlet容器 Spring Boot可以选择内嵌Tomcat、jetty或者Undertow,这样我们无须以war包形式部署项目。 2.3、提供starter简化Maven配置 spring提供了一系列的start pom来简化Maven的依赖加载,例如,当你使用了spring-boot-starter-web,会自动加入如图5-1所示的依赖包。 2.4、自动装配Spring SpringBoot会根据在类路径中的jar包,类、为jar包里面的类自动配置Bean,这样会极大地减少我们要使用的配置。当然,SpringBoot只考虑大多数的开发场景,并不是所有的场景,若在实际开发中我们需要配置Bean,而SpringBoot灭有提供支持,则可以自定义自动配置。 2.5、准生产的应用监控 SpringBoot提供基于http ssh telnet对运行时的项目进行监控。 2.6、无代码生产和xml配置 SpringBoot不是借助与代码生成来实现的,而是通过条件注解来实现的,这是Spring4.x提供的新特性。 3、SpringBoot优缺点 优点: 3.1、快速构建项目。 3.2、对主流开发框架的无配置集成。 3.3、项目可独立运行,无须外部依赖Servlet容器。 3.4、提供运行时的应用监控。 3.5、极大的提高了开发、部署效率。 3.6、与云计算的天然集成。 缺点: 3.1、如果你不认同spring框架,也许这就是缺点。 4、SpringBoot特性 4.1、创建独立的Spring项目 4.2、内置Tomcat和Jetty容器 4.3、提供一个starter POMs来简化Maven配置 4.4、提供了一系列大型项目中常见的非功能性特性,如安全、指标,健康检测、外部配置等 4.5、完全没有代码生成和xml配置文件 6、SpringBoot CLI SpringBoot CLI是SpringBoot提供的控制台命令工具。 7、SpringBoot maven构建项目 spring-boot-starter-parent:是一个特殊Start,它用来提供相关的Maven依赖项,使用它之后,常用的包依赖可以省去version标签。 8、SpringBoot几个常用的注解 (1)@RestController和@Controller指定一个类,作为控制器的注解,并说明其区别 (2)@RequestMapping方法级别的映射注解,这一个用过Spring MVC的小伙伴相信都很熟悉 (3)@EnableAutoConfiguration和@SpringBootApplication是类级别的注解,根据maven依赖的jar来自动猜测完成正确的spring的对应配置,只要引入了spring-boot-starter-web的依赖,默认会自动配置Spring MVC和tomcat容器 (4)@Configuration类级别的注解,一般这个注解,我们用来标识main方法所在的类,完成元数据bean的初始化。 (5)@ComponentScan类级别的注解,自动扫描加载所有的Spring组件包括Bean注入,一般用在main方法所在的类上 (6)@ImportResource类级别注解,当我们必须使用一个xml的配置时,使用@ImportResource和@Configuration来标识这个文件资源的类。 (7)@Autowired注解,一般结合@ComponentScan注解,来自动注入一个Service或Dao级别的Bean (8)@Component类级别注解,用来标识一个组件,比如我自定了一个filter,则需要此注解标识之后,Spring Boot才会正确识别。 24、springboot是如何管理事务的?
直接写@transactional注解就行,在方法就是方法事务,类上就是类事务 24、介绍下dobbo框架,运行原理、在项目中的使用,你遇到过哪些问题?
运行原理 Dubbo是一种分布式服务框架。 Webservice也是一种服务框架,但是webservice并不是分布式的服务框架,他需要结合F5实现负载均衡。因此,dubbo除了可以提供服务之外,还可以实现软负载均衡。它还提供了两个功能Monitor 监控中心和调用中心。这两个是可选的,需要单独配置。
遇到过哪些问题? 1.同时配置了XML和properties文件,则properties中的配置无效 只有XML没有配置时,properties才生效 2.spring 2.x初始化死锁问题。在spring解析到dubbo:service时,就已经向外暴露了服务,而spring还在接着初始化其他bean,如果这时有请求进来,并且服务的实现类里有调用applicationContext.getBean()的用法。getBean线程和spring初始化线程的锁的顺序不一样,导致了线程死锁,不能提供服务,启动不了。 解决:不要在服务的实现类中使用applicationContext.getBean();如果不想依赖配置顺序,可以将dubbo:provider的deplay属性设置为-1,使dubbo在容器初始化完成后再暴露服务。
|