Struts2
-
Struts2本质可以分为三个部分?
答:核心控制层(FilterDispatcher),业务控制层(Action)和用户实现企业业务逻辑组件。
-
Struts2的基本流程?
(1)客户端初始化一个指向Servlet容器的请求;(2)这个请求经过一系列过滤去(Filter);(3)接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;(4)如果要调用某个Action,FilterDispatcher就把请求的处理交给ActionProxy;(5)ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类;(6)ActionProxy创建一个ActionInvocation的实例;(7)ActionInvocation实例使用命名模式来调用,在调用Action的前后涉及到了拦截器(intercepter)的调用;(8)一点Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果;(9)相应的返回是通过我们在web.xml中配置的过滤器;(10)如果ActionContextCleanUp是当前使用,则FilterDispatcher不会清理sreadlocalActionContext,否则,则会清理sreadlocal;
-
拦截器和过滤器的区别?
答:(1)拦截器是基于java反射机制的,而过滤器是基于回调函数的;(2)拦截器不依赖servlet容器,过滤器依赖servlet容器;(3)拦截器只能对Action请求起作用,而过滤器可以几乎对所有的请求起作用。(4)拦截器可以访问Action上下文,值栈中的对象,而过滤器不能;(5)在Action的生命周期中,拦截器可以多次访问,而过滤器只能在容器初始化时被调用一次;
-
struts1与struts2的比较?
答:(1)Action类:struts1要求Action继承一个抽象基类,Struts1的一个普遍问题是使用抽象类编程而不是接口;Struts2可以实现Action接口,也可以实现其他接口,使可选和制定服务成为可能,它提供了一个ActionSupport基类去实现常用的接口,Action接口不是必须的,任何被execute修饰的POJO对象都可以Action对象。(2)线程模式:Struts1线程是单例模式并是线程安全的,因为仅有一个Action来处理当前的请求。Struts2为每个请求产生一个实例,因此没有线程安全问题。(3)Servlet依赖:Struts1依赖Servlet API,因为当一个Action被调用时,HttpServletRequset和HttpServletResponse被传递给execute方法,Struts2不依赖容器,运行Action脱离容器单独被测试。
-
Struts2的核心控制器是什么?它有什么作用?
答:Struts核心控制器是StrutsPrepareAndExcuteFileter。作用:负责拦截由<url-pattern>/*</url-pattern>指定的所有用户请求,当用户的请求到达时,该Filter就会过滤掉用户的请求。默认情况下,如果用户请求的路径不带后缀名或者是以".action"结尾,这时这个请求会被转入Struts2框架处理,否则,Struts2框架将略过这个请求的处理。
-
Struts2框架是如何管理Action的?这样管理方式有什么好处?
答:Struts2框架中使用包来管理Action,包的作用和java中类包作用基本类似,主要用于管理一组业务功能相关的Action。
-
struts2中的默认包struts-default有什么作用?
答:(1)struts-default是由struts内置的,它定义了struts2中的众多拦截器和Result类型,而Struts2中很多核心的内容都是通过这些内置的拦截器实现。(2)struts-default是在struts-default.xml中定义,struts-default.xml也是struts2的默认文件,struts2每次都会自动加载struts-default.xml文件。(3)通常每个包都应该继承struts-default包。
-
struts2如何对指定的方法进行验证?
答:(1)validate()会效验Action中说有与execute方法签名相同的方法;(2)要效验指定的方法要通过重写validateXxx()方法实现,validateXxx()只会效验方法名为Xxx()的方法。(3)当某个数据效验失败,调用addFieldError()方法往系统的fieldErrors添加效验失败信息。(4)在视图中可以通过<s:fielderror/>显示错误信息。(5)先执行validateXxx()->validate()->如果出错,会转发<result name="input">所指定的页面,如果不出错,那么直接执行Action::execute()方法。
-
值栈ValueStack的原理与生命周期?
答:(1)ValueStack贯穿整个Action的生命周期,保存在request域中,所有ValueStack的生命周期与request的生命周期一样,当struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action。然后把action存放到ValueStack中,所有action实例对象可以被OGNL访问。请求来的时候,action,ValueStack的生命开始,请求结束,action,ValueStack的生命结束。(2)action是多例的,和Servlet不一样,Servlet是单例的;(3)每个action都有一个对应的值栈,值栈存放的数据类型是该aciton的实例,以及该action的实例变量,action对象默认保存在栈顶;(4)ValueStack本质就是一个ArrayList;(5)使用OGNL访问值栈的内容时,不需要加#号,而访问request,session,application,attr时,需要加#号;(6)在Struts中,OGNL表达式需要配合struts标签来使用,例如<s:property value="name"/>。(7)在struts2的配置文件中引用OGNL表达式,引用值栈中的值,此时使用“$”,而不是“#”或者“%”;
-
ActionContext,ServletContext,pageContext的区别?
答:(1)ActionContext是当前Action的上下文环境,通过ActionContext可以获取到request,session,ServeltContext等于Action有关的对象的引用。(2)ServeltContext是域对象,一个web应用中只能有一个ServletContext,生命周期伴随web应用。(3)pageContext是jsp的一个重要内置对象,可以通过pageContext可以获取到其他域对象的应用,同时它是一个域对象,作用范围只针对当前页面,当前页面结束,pageContext销毁,生命周期是JSP四个对象中最小的。
Spirng
-
spring框架有哪些模块?
答:spring核心容器-IOC容器;spring AOP;spring MVC;spring DAO;spring ORM;spring WEB;spring 上下文(context)
-
为什么要使用spring框架,它有什么优点?
答:(1)轻量级框架;(2)非入侵性的;(3)可以整合其他框架,比如struts,Hibernate等;(4)可以提供事务管理;
-
Spring框架的工作机制是什么?
答:(1)Spring MVC将所有的请求都交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作。(2)DispatcherServlet请求一个或者多个HalderMapper,找到处理请求的Controller。(3)Controller进行业务逻辑处理后,会返回一个ModelAndView。(4)Dispatcher查询一个或者多个ViewResolver(视图解析器),找到ModelAndView对象指定的视图对象。(5)视图对象将结果返回给客户端。
-
怎么使用Spring事物?
答:Spring同时支持编程式事务策略和声明式事务策略,大部分都采用声明式事务策略。声明式事务策略有4种:(1)使用TransactionProxyFactoryBean为Bean生成事务代理的配置。(2)采用Bean继承的事务代理配置方式。(3)采用BeanNameAutoProxyCreator,根据Bean Name自动生成事务代理的方式。这是利用Spring的AOP框架配置事务代理的方式,需要对Spring的AOP有一定的理解。(4)采用DefaultAdvisorAutoProxyCreator,直接利用Spring的AOP框架配置事务代理的方式,效果非常不错,但是可读性不如前面的三个。
-
请谈谈SSH整合?
答:(1)struts(表现层)+Spring(业务层)+Hibernate(持久层)。(2)Struts:是一个表现层框架,主要用于页面显示,接受请求和分发请求;在MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发;view沿用JSP,HTTP等。(3)Spring:是一个业务层框架,是一个整合的框架,能够很好地粘合表现层和持久层。(4)Hibernate:是一个持久性框架,负责与关系数据库的操作。
-
在Spring框架中如何配置数据库驱动?
答:DriverManagerDataSource数据源来配置数据库驱动。
-
在Spring框架中applicationContext.xml文件能不能改成其他文件名?
答:ContextLoaderListener是一个ServletContextListener,在启动Tomcat服务器时,它会读取WEB-INF下的applicationContext.xml文件,初始化Spring配置。如果想要修改applicationContext.xml文件的文件名或者文件的存储位置,可以通过在WEB.xml文件中定义一个<context-param>元素来解决这个问题。
-
如何在WEB中配置Spring?
答:
-
Spring里如何定义Hibernate Mapping?
答:添加hibernate mapping文件到WEB-INF目录下applicationContext.xml文件中。
-
解释一下Dependency Injection(DI,依赖注入)和Inversion of Control(IOC,控制反转)?
答:依赖注入DI是一种设计模式,通常也称作控制反转,尽管在技术上讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另一个对象来提供一种特殊的能力。例如,把一个数据库连接以参数的形式传到一个对象的构造函数里面而不是在那个对象内部自动创建一个连接。依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是他们描述的角度不同,依赖注入是从应用程序的角度描述,应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,容器控制应用程序,由容器反向向应用程序注入应用程序所需要的外部资源。
-
Spring中BeanFactory与ApplicationContext的作用有哪些?
答:(1)BeanFactory负责读取Bean配置文档,管理Bean的加载和实例化,维护Bean之间的依赖关系,负责Bean的生命周期。(2)ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:a、国际化支持。b、访问资源:Resource rs=ctx.getResource("classpath:config.properties")。c、事件传递:通过实现ApplictionContextAware接口。(3)常用的获取ApplicationContext的方法:FileSystemXmlApplicationContext:从文件系统或者URL指定的XML配置文件创建,参数为配置文件名或者文件名数组。ClassPathXmlApplicationContext:从classpath的xml配置文件创建,可以从jar包中读取配合文件。WebApplicationContextUtils:从web应用的根目录读取配置文件,需要现在web.xml中配置,可以配置监听器或者Servlet来实现。
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>context</servlet-name> <servelt-class> org.springframework.web.context.ContextLoaderServlet </servelt-class> <load-on-startup>1</load-on-startup> </servlet>
-
如何在Spring中实现国际化?
答:在ApplicationContext.xml中配置一个Bean:
<bean id="messageSource" class=" org.spirngframework.context.support.ResourceMessageSource "> <property name="basename"> <value>message</value> </property> </bean>
在src目录下建立多个properties文件,其命名格式message_语言_国家。在页面中显示信息时,通过applicationContext.getMessage("键名","参数","区域")取出相关信息。
-
Spring核心类有哪些,各有什么作用?
答:BeanFactory:产生一个新的实例,可以实现单例模式;BeanWrapper:提供统一的get以及set方法;ApplicationContext:提供Spring框架的实现,包括BeanFactory的所有功能;
-
什么是AOP,AOP有什么作用?
答:面向切面编程(AOP)提供了另一种角度来思考程序结构,通过这种方式弥补了面向对象的不足。除了类以外,AOP提供了切面例如横切多个模型和对象的事务管理。Spirng的一个关键的组件就是AOP框架,可以自由的选择是否使用AOP,提供声明式企业服务,特别是为了替代EJB声明式服务,最重要的服务是声明式事务管理,这个服务是建立在Spring的抽象事务管理之上。允许用户可以自定义切面,用AOP来完善OOP的使用,可以把Spring AOP看做是对Spring的一种增强。
-
使用Spring有什么好处?
答:(1)Spring能有效地组织中间层对象,无论你是否选择使用EJB,如果使用了struts,spring关注了遗留问题。(2)Spring能消除在许多工程上对Singleton的过多使用。(3)Spring能消除使用各种格式的属性定制文件的需要,在整个工程中,可通过一种一致的方法进行配置。(4)能通过接口而不是类促进好的编程习惯,减少编程代价几乎为零。(5)Spring被设计为让使用它创建的应用尽可能少的依赖于它的APIs。在spring应用中的大多数业务对象没有依赖于spring。(6)使用Spring框架易于单元测试。(7)Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择,能选择用POJOs或local EJBs来实现业务接口,却不影响调试代码。(8)Spring能解决许多问题而不使用EJB,例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果仅仅是与单个数据打交道,甚至不需要JTA实现。(9)Spring为数据存储提供了统一的框架,不论是使用JDBC或者O/R Mapping产品。
-
什么是Spring?它有什么特点?
答:Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。(1)轻量:从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在大小为1M多的jar文件中发布,并且Spring的处理开销可以微不足道,此外,Spring是非侵入式的:典型的,Spring应用中的对象不依赖Spring的特定类。(2)控制反转:Spring通过控制反转来促进松耦合。当应用了IOC时,一个对象的其他依赖对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象,可以认为IOC与JNDI相反,不是对象从容器中查找依赖,而是容器在对象初始化时就不等对象请求就主动将依赖传递给它。(3)面向切面:Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑和系统级服务进行内聚性的开发。应用对象只要实现他们应该做的-完成业务逻辑-仅此而已。它们并不负责其他的系统级关注点,例如日志或者事务支持。(4)容器:Spring包含并管理应用对象的配置和生命周期,在这个意义上来说他是一种容器,可以配置每个Bean如何被创建-基于一个可配置原型(property),bean可以创建一个单独的实例或者每次需要时生成一个新的实例,以及他们如何相互关联,然而,Spring不应该被混同于传统的EJB容器,它们经常是庞大的笨拙的,难以使用。(5)框架:Spring可以将简单的组件组合,配置成为复杂的应用。在Spring中应用对象被声明式组合,典型的是在一个XML文件中,Spring提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的发开发留给开发者。
-
AOP中几个重要的名词解释?
答:(1)切面(aspect):一个关注点的模块化,这个关注点可能横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用通用类或者在普通类中以@Aspect注解来实现。(2)连接点(Joinpoint):在程序执行中某个特定的点,比如某个方法调用的时候或处理异常的时候。在spring AOP中,一个连接点就代表了一个方法的执行,通过声明一个org.aspectj.lang.JointPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。(3)通知(Advice)在切面的某个特定的连接点上执行的动作,通知有各种类型,其中包括“around”,“before”,“after”等通知,许多AOP模型,包括spring,都是通过拦截器来做通知模型,并维护一个以连接点为中心的拦截器链。(4)切入点(Pointcut):匹配连接点的断言,通知和一个切入点的表达式关联,并在满足这个切入点的连接点上运行。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。(5)引入(Introduction):也被称作内部类型声明。声明额外的方法或者某个类型的字段,Spring运行引入新的接口到任何被代理的对象,例如,可以使用一个bean实现IsModified接口,以便简化缓存机制。(6)目标对象(Target Object):被一个或者多个切面所通知的对象。也叫做被通知对象,既然Spring AOP是通过运行时代理实现的,这个对象永远是被代理的对象。(7)AOP代理:AOP框架创建的对象,用来实现切面契约。在Spring中,AOP代理可以是JDK动态代理或者GCLIB代理。(8)织入(Weaving):把切面连接到其他的应用程序类型或者对象上,并创建一个通知的对象。这些可以在编译时,类加载时和运行时完成。Spring和其他纯java AOP框架一样,在运行时完成织入。
-
比较Hibernate三种检索策略的优缺点?
答:(1)立即检索:优点:对应用程序完全透明,不管对象处于持久状态还是游离状态,应用程序都可以方便的从一个对象导航到与他关联的另一个对象。缺点:select语句太多,可能加载应用程序不需要访问的对象白白浪费许多内存空间。(2)延迟检索:优点:由应用程序决定需要加载哪些对象,可避免执行多个select语句,以及避免加载应用程序不需要访问的对象,因此提高检索性能,并且能节约内存空间。缺点:应用程序要访问游离状态代理类的实例,必须保证它在持久化状态时已经被初始化了。(3)迫切左外连接检索:优点:对应用程序完全透明,不管对象处于持久状态还是游离状态,应用程序都可以方便的从一个对象导航到与他关联的另一个对象,使用了外链接,select语句减少。缺点:可能加载应用程序不需要访问的对象,白白浪费许多内存,复杂的数据表连接也会影响检索性能。
-
hibernate里面的sorted collection和ordered collection有什么区别?
答:sorted collection是在内存中通过java比较器进行排序的;ordered conllection是在数据库中通过ordered by进行排序的。
-
Hiberante工作原理及为什么要用?
答:原理:读取并解析配置文件;读取并解析映射信息,创建SessionFactory;打开Session;创建事务Transation;持久化操作;提交事务;关闭Session;关闭SessionFactory;为什么:(1)对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码;(2)Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,很大程度的简化了DAO的编码工作;(3)Hibernate使用java反射机制,而不是字节码增强程序来实现透明性;(4)支持各种数据库关系,从一对一到多对多的各种复杂关系;
-
如何优化Hibernate?
答:(1)使用双向一对多关联,不使用单项一对多;(2)灵活使用单向一对多关联;(3)不用一对一,用多对一取代;(4)配置对象缓存,不使用集合缓存;(5)一对多集合使用Bag,多对多集合使用Set;(6)继承类使用显示多态;(7)表字段好少,表关联不要怕多,有二级缓存;
-
Hibernate有哪几种查询模式?
答:hql,条件查询(QBC),原生sql;
-
说说Hibernate中update()和saveOrUpdate()方法的区别?
答:saveOrUpdate方法可以实现update方法的功能,但是多些步骤,具体如下:如果对象在该session中已经被持久化,不进行操作;对象的标识符属性在数据库中不存在或者是个暂时的值,调用save()方法保存它;如果session中的对象有相同的标识符则抛出异常;以上皆不符合调用update方法。
-
session中get()和load()的区别?
答;如果未发现符合条件的记录,get方法返回null,而load方法会抛出一个异常ObjectNotFoundException;load方法可以返回实体的代理类实例,而get方法永远直接返回实体类;load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如果没有发现数据,将越过二级缓存,直接调用sql完成数据读取。
-
游离对象(Detached Object)有什么好处?
答:游离对象可以传递到任何层直到表现层而不是用任何DTO,然后你还可以把游离对象重新赋给另一个session。
原文地址:https://www.cnblogs.com/txdd-tg/p/8979665.html