【JAVA秒会技术之秒杀面试官】JavaEE常见面试题(四)

来源:互联网 发布:一洋淘宝助手破解版 编辑:程序博客网 时间:2024/05/01 04:37

【前言】别人都在你看不到的地方暗自努力,在你看得到的地方,他们也和你一样显得游手好闲,和你一样会抱怨,而只有你自己相信这些都是真的,最后,也只有你一个人继续不思进取 ……  

【下载】个人结合诸多资料,总结的一些JavaEE常见面试题,主要针对初/中级程序员想要word完整版下载的,评论里留言留下你的邮箱!

46.Request对象的主要方法?

答:(1setAttribute(String name,Object):设置名字为namerequest的参数值

2getAttribute(String name):返回由name指定的属性值

3getAttributeNames():返回request对象所有属性的名字集合,结果是一个枚举的实例

4getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组

5getCharacterEncoding():返回请求中的字符编码方式

6getContentLength():返回请求的Body的长度

7getHeader(String name):获得HTTP协议定义的文件头信息

8getHeaders(String name):返回指定名字的request Header的所有值,结果是一个枚举的实例

9getHeaderNames():返回所以request Header的名字,结果是一个枚举的实例

10getInputStream():返回请求的输入流,用于获得请求中的数据

11getMethod():获得客户端向服务器端传送数据的方法

12getParameter(String name):获得客户端传送给服务器端的有name指定的参数值

13getParameterNames():获得客户端传送给服务器端的所有参数的名字,结果是一个枚举的实例

14getParametervalues(String name):获得有name指定的参数的所有值

15getProtocol():获取客户端向服务器端传送数据所依据的协议名称

16getQueryString():获得查询字符串

17getRequestURI():获取发出请求字符串的客户端地址

18getRemoteAddr():获取客户端的IP地址

19getRemoteHost():获取客户端的名字

20getSession([Boolean create]):返回和请求相关Session

21getServerName():获取服务器的名字

22getServletPath():获取客户端所请求的脚本文件的路径

23getServerPort():获取服务器的端口号

24removeAttribute(String name):删除请求中的一个属性

47.谈一谈你对Struts的理解?

答:Struts是一个按MVC模式设计的Web层框架,其实它就是一个大大的servlet,这个servlet名为Action

Servlet,或是ActionServlet的子类。我们可以在web,xml文件中将符合某种特征的所有请求交给Servlet处理,这个Servlet再参照文件(通长为/WEB-INF/struts.cfg.xml)将各个请求分别分配给不同的action去处理;(一个扩展知识点:Struts的配置文件可以有多个,可以按照模块配置各自的配置文件,这样可以防止配置文件的过渡膨胀)

ActionServlet把请求交给action去处理之前,会将参数封装到一个formbean对象(就是一个java类,这个类中每个属性对应一个请求参数),封装成一个什么样的formbean对象呢?看配置文件。

③要说明的是,ActionServletformbean对象传递给actionexecute方法之前,可能会调用formbeanvalidate方法进行校验,只有校验通过后,才会将这个formbean对象传递给actionexecute方法,否则,它将返回一个错误页面,这个错误页面有input属性指定,(看配置文件)作者为什么将这里命名为input属性,而不是error属性呢?

action执行完成后,要返回结果视图,这个结果视图是用一个ActionForward对象看来表示的,actionforward对象通过struts-config.xml配置文件中配置关联到某个jsp页面,因为程序中使用的是在struts-config.xml配置文件,为jsp页面设置的逻辑名,这样可以实现action程序代码与返回的jsp页面名称的解耦。

48谈一谈你对Hibernate的理解?

答:①概述:它是一个持久层的ORM(对象关系型映射)框架,使用Hibernate框架,不用写JDBC代码,仅仅是调用一个save方法,就可以将对象保存到关系数据库中;仅仅是调用一个get方法,就可以从数据库中加载出一个对象。

②使用Hibernate的基本流程:配置Configuration对象、产生SessionFactory、创建session对象,开启事务,完成CRUD操作,提交事务,关闭session

③配置文件:使用Hibernate时,先要配置hibernate.cfg.xml文件。其中配置数据连接信息和方言等,还要为每个实体配置相应的hbm.xml文件,然后在hibernate.cfg.xml文件中引入;

④关联关系映射:

a)一对多:

()一方:需要加入一个包含多方的set集合,注意必须要new

()多方:添加一方的bean对象,注意不用new

()注意:只配置一方即可正常维护运行。一般一方会放弃外键维护。

b)多对多:多对多保存中,有一方必须放弃维护中间表"inverse=ture"

⑤级联关系:cascade6种取值

none —— 不使用级联

save-update —— 保存或修改

delete —— 删除

delete-orphan —— 孤儿删除(只有一对多才有!)

all —— 除了孤儿删除,其他的所有

all-delte-orphan —— 包含孤儿删除所有的。

⑥延迟加载:

底层:动态代理技术

第一次查询时 ====> 至查询ID值,生成代理对象(只含ID)

         =====> 继续操作,如打印某属性  ==发送sql语句==> 返回查询值

类级别的延迟加载:查询的是某一个对象

session.get()不延迟加载

session.load()延迟加载

两者区别

关联级别的延迟加载

     fetch="select" lazy="true"  延迟加载(默认)

     fetch="select" lazy="false" 不延迟加载

     fetch="select" lazy="extra" 极其延迟加载

⑦Hibernate三种检索方式:

QBC(Query By Criteria)

HQL(Hibernate Query Language)

SQL(基本不用)

⑧缓存:

缓存概念

     缓存是内存中开辟的一块空间,用来保存数据

     实质是:一些集合设计

一级缓存:Session

        自带的,不能卸载。一定存在的,与Session生命周期一样长

二级缓存:

        默认没有开启,只提供了相关的策略,需第三方插件,常用EHCache。

快照机制(SnapShot)

        持久态对象,在获取的时候,会保存两份:一份在缓存区,一份在快照区;

        在事务提交之前,会自动对比缓存区和快照区的数据,

        如果不一致,会自动修改缓存和快照区数据;

49.谈一谈你对Spring的理解?

①Spring是一个开源的业务层框架,分模块,一站式框架,它能够整合各种其他主流框架;

②Spring的实质就是一个实现了工厂模式的工厂类,在其配置文件中,通过添加<bean>标签,来创建实例对象;

③Spring的核心——IoC/DI;

a)IoC(Inverse of Control)控制反转,将对象的创建全交给Spring去管理,然后Spring容易通过依赖注入的方式,注入给调用者。这样做的好处是,让bean与bean之间以配置文件的形式组织在一起,而不是以硬编码的方式耦合在一起。

b)依赖注入的方式有三种:接口注入、Setter方法注入(使用<property name="" value或者ref="">)、构造注入;

c)IoC的注解方式:

(Ⅰ)在applicationContext.xml配置文件中开启组件扫描

<context:component-scan base-package="com.itheima"/>

(Ⅱ)在实现类上添加注解:@Component(value="id值")

@Component的三个衍生注解(功能一样)

* @Controller -- 作用在WEB层

* @Service -- 作用在业务层

* @Repository -- 作用在持久层

Ⅲ)3.属性注入的注解(说明:使用注解注入的方式,可以不用提供set方法)

* @Value -- 用于注入普通类型

* @Autowired -- 默认按类型进行自动装配

* @Qualifier -- 强制使用名称注入

* @Resource -- 相当于@Autowired和@Qualifier一起使用,强调:Java提供的注解,属性使用name属性

④Spring的核心——AOP;

a)AOP(面向切面编程),可以在不修改源代码的前提下,对程序进行增强,例如,加入日志,加入权限判断,加入异常处理等;

b)AOP底层使用的是代理技术,分为JDK动态代理(面向接口)和CGLIB动态代理(没接口的,产生子类代理);

c)使用步骤:

(Ⅰ)编写切面类==>在IoC中配置切面类的bean标签==>配置aop相关

<aop:config>

<!-- 配置切面类 -->

<aop:aspect ref="切面类">

<!-- 通知类:前置通知,还需要配置切入点表达式 ) -->

<aop:before method="增强方法" pointcut="切入点表达式"/>

</aop:aspect>

</aop:config>

(Ⅱ)切入点表达式:execution([修饰符] 返回值类型 包名.类名.方法名(参数))

一般简写为:execution(* com.*.*.*DaoImpl.save*(..))

(Ⅲ)通知类型

前置通知:<aop:after method="before" pointcut-ref="myPointcut3"/>

最终通知:如果程序出现了异常,最终通知也会执行。

  <aop:after method="after" pointcut-ref="myPointcut3"/>

后置通知:<aop:after-returning method="afterReturning" pointcut-ref="myPointcut2"/>

异常抛出通知:<aop:after-throwing method="afterThorwing" pointcut-ref="myPointcut3"/>

环绕通知:<aop:around method="around" pointcut-ref="myPointcut2"/>

* 要注意:目标的方法默认不执行,需要使用ProceedingJoinPoint对来让目标对象的方法执行。

50.JDBCibatis(mybatis)Hibernate有什么不同?

答:①JDBC编程流程固定,同时将sql语句和java代码混在了一起,经常需要拼凑sql语句,细节很繁琐;

②ibatis(mybatis)它不完全是一个ORM框架,因为MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。但是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。

③Hibernate对象/关系映射能力强,数据库无关性好,因为hibernate自动生成sql语句,我们无法控制该语句,我们就无法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了,这时候用ibatis就是不错的选择,因为ibatis还是由我们自己写sql语句。

0 0
原创粉丝点击