知识点总结: Java 面试宝典 2013版(超长版) - Java Web 部分

1. Servlet 生命周期

Servlet 有良好的生存期的定义,包括加载,实例化,初始化,处理请求以及服务结束。
这个生存期由javax.servlet.Servlet 接口的init,service和destroy方法表达。
- Servlet被服务器实例化后,容器运行其init方法;
- 请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX 方法(doPost,doGet)等;
- 当服务器决定将实例销毁时调用destroy方法

2. Servlet 基本架构

public class ServletName extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //do something
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException {
        //do something
    }
}

3. Servlet API 中forward() 和 redirect()

  • forward() : 仅仅是容器中控制权的转向,是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来再发送给浏览器,浏览器根本就不知道发送的内容是从哪里来的。在客户端浏览器地址栏中还是原来的地址,不会显示转向后的地址;比较高效,推荐使用。
  • redirect() : 是完全的跳转,是浏览器根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址。浏览器会得到跳转的地址,用刚才请求的所有参数重新发送请求,所以session,request参数都可以获取。可以看到地址栏中跳转的地址。有时需要跳转到另一个服务器时必须使用sendRedirect().

4. request.getAttribute() 和 request.getParameter()

方法名 返回值
getAttribute 返回的是Object 获取Session的值 服务器重定向forward,接收setAttribute传过来的值
getParameter 返回的是String 获取Post/Get传递的参数值 客户端重定向redirect,点击链接或提交,接收表单或url重定向传值

5. JSP 九大内置对象:

  • request : 用户端请求,此请求包含来自GET/POST请求的参数,可以获取cookie,header和session等数据;
  • response: 网页传回用户端的响应,可以设置送回浏览器的参数,如cookie,header等;
  • pageContext: 网页的属性管理,方便存取各种范围的名字空间、servlet相关对象的API,以及包装了servlet相关功能的方法。
  • session: 与请求有关的会话期,存贮用户的状态信息;
  • application servlet: 正在执行的内容,有助于查找有关servlet引擎和sevlet环境的信息;
  • out: 用来传送的响应的输出,是javax.jsp.Jspwriter的一个实例,用于向浏览器会送输出结果。
  • config: Servlet的架构部件,javax.servlet.ServeletConfig 对象,存取servlet实例的初始化参数。
  • page: JSP网页本身 ,表示从该页面产生的一个servlet实例。
  • exception:错误的网页

6. JSP中include 动态&静态

  • 动态include:<jsp:include page=index.jsp flush=true>总是会检查所含文件中的变化,适用于包含动态页面,并且可以带参数.
  • 静态include: %@include file=index.html % 用伪代码实现,不会检查所含文件的变化,适用于包含静态页面

7. 页面间传递对象的方法:

  • request
  • session
  • application
  • cookie

8. JSP 和 Servlet 异同

Jsp 是Servlet技术的扩展,本质是Servlet的简易方法,更强调应用的外表表达。
Servlet 与 Jsp最大的不同是,Servlet的应用逻辑是在Java文件中,并且完全从表示层的HTML分离出来,侧重于控制逻辑;
而JSP是Java 和 Html 可以组合成一个jsp文件,侧重于视图。

9. MVC 技术实现

  • Model 应用的业务逻辑,通过JavaBean,EJB组件实现;
  • View 应用的表示层,由JSP页面产生
  • Controller 提供应用的处理过程控制,一般是Servlet

10. 数据连接池的工作机制

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。
客户端需要连接时,池驱动就会返回一个未使用的池连接并将其标记为忙。
如果当前没有空闲连接,池驱动程序就会新建一定数量的连接,数目由配置参数决定。
当使用的池连接调用完成后,池驱动程序就可以将其标记为闲,下次就可以继续使用。
实现方法: 返回的connection是原始的connection的代理,代理connection的close方法不是真正的关闭连接,而是把代理的connection对象还回到连接池中。

11. Struts 框架

Strust 是一个按照MVC模式设计的Web层框架,其实本质上就是一个大大的Servlet,名为ActionServlet 以及其子类。
在web.xml 文件中将符合某种特征的所有请求交给这个Servlet处理,Servlet再参照另外一个配置文件(一般是 /WEB_INF/strust-config.xml)将各个请求分别分配给不同的action处理。分配到action之前,ActionServlet将请求参数封装成formBean对象。 action处理完后,返回显示的结果视图,用ActionForward对象表示,这个对象通过strust-config.xml配置文件关联到某个jsp页面。

12. Hibernate 框架

面向对象的软件实际上就是处理对象,为了存储对象,可以将其保存在数据库中。
Java 用jdbc 来实现与数据库的交互,但是需要些大量重复性的代码来实现。
人们通多封装jdbc代码成ORM框架来实现这个这个映射关系。
Hibernate是一种流行的ORM(Object Relation Mapping)框架。使用Hibernate,不用写JDBC代码,仅仅是调用一个save方法,就可以将对象保存到数据库中,仅仅调用一个get方法就可以从数据库中加载出一个对象。
首先要配置hibernate.cfg.xml 文件,其中配置数据库连接信息,还要为每个实体配置相应的hbm.xml文件,并在hibernate.cfg.xml 文件中登记每一个hbm.xml文件。
Hibernate 基本流程:

  • 配置Configuration对象
  • 产生SessionFactory
  • 创建session对象
  • 启动事物
  • 完成CRUD操作
  • 提交事物
  • 关闭session

13. Spring 框架

Spring 实现了工厂模式的工厂类,类名是BeanFactory(实际上是一个接口)。在程序中通常是BeanFactory的子类ApplicationContext。
Spring相当于一个大工厂,在配置文件中通过 <bean> 来创建实例对象的类名和属性。
Spring 中提供了对AOP的良好封装。AOP是面向切面编程,就是系统中有很多不相干的类的方法,在众多方法中加入某种系统功能的代码,如加入日志,加入权限判断,加入异常处理,这些应用称为AOP。
实现AOP功采用的是代理技术。客户端不再调用目标类,而是调用代理类。代理类和目标类对外具有相同的方法声明。
只需在spring配置文件中配给这两个元素即可实现代理和AOP。

14. 、iBatis与Hibernate有什么不同?

相同点:屏蔽jdbc api的底层访问细节,使用我们不用与jdbc api打交道,就可以访问数据。
jdbc api编程流程固定,还将sql语句与java代码混杂在了一起,经常需要拼凑sql语句,细节很繁琐。

ibatis的好处:屏蔽jdbc api的底层访问细节;将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能,queryForList返回对象集合,用queryForObject返回单个对象;提供了自动将实体对象的属性传递给sql语句的参数。
Hibernate是一个全自动的orm映射工具,它可以自动生成sql语句,ibatis需要我们自己在xml配置文件中写sql语句,hibernate要比ibatis功能负责和强大很多。因为hibernate自动生成sql语句,我们无法控制该语句,我们就无法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate可以很好帮我们完成,但是,对于特别复杂的查询,hibernate就很难适应了,这时候用ibatis就是不错的选择,因为ibatis还是由我们自己写sql语句。

15.Hibernate的二级缓存

  • 缓存就是把以前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构通常是或类似Hashmap,当以后要使用某个对象时,先查询缓存中是否有这个对象,如果有则使用缓存中的对象,如果没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用
  • )Hibernate的Session就是一种缓存,我们通常将之称为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,Session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。由于Session代表一次会话过程,一个Session与一个数据库连接相关连,所以Session最好不要长时间保持打开,通常仅用于一个事务当中,在事务结束时就应关闭。并且Session是线程不安全的,被多个线程共享时容易出现问题。通常只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值.
  • 因此,Hibernate的Session这一级缓存的缓存作用并不明显,应用价值不大。Hibernate的二级缓存就是要为Hibernate配置一种全局缓存,让多个线程和多个事务都可以共享这个缓存。我们希望的是一个人使用过,其他人也可以使用,session没有这种效果.
  • 二级缓存是独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪个厂家的缓存产品,接着需要配置该缓存产品自己的配置文件,最后要配置Hibernate中的哪些实体对象要纳入到二级缓存的管理中。明白了二级缓存原理和有了这个思路后,很容易配置起Hibernate的二级缓存。

扩展知识:一个SessionFactory可以关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当使用Hibernate的二级缓存后,注意不要有其他的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致

16.J2EE

J2EE 是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese applicationmodel).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。所属层次包括客户层(clietn tier)组件,web层和组件,Business层和组件,企业信息系统(EIS)层。
J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。
J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。
J2EE 中常用的术语:
- web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等
- EJB容器:Enterprise java bean容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务
- JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
- JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。
- JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。
- JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。
- RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。

17.EJB与JAVA BEAN的区别?

Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章