java中web开发面试题比较重要的点

一、Web的MVC设计理念和MVC框架:

1.MVC,全称Model View Controller,即模型-视图-控制器;

1). Model(模型):
是Web应用中用于处理数据逻辑的部分,包括Service层和Dao层;
Service层用于和数据库联动,放置业务逻辑代码,处理数据库的增删改查,
Dao层用于放各种接口,以备调用;

2). View(视图):
是Web应用中处理响应给客户的页面的部分,例如我们写的html静态页面,jsp动态页面,这些最终响应给浏览器的页面都是视图;
通常视图是依据模型数据来创建的;

3). Controller(控制器):
在Web应用中,简而言之,就是Servlet,或者SpringMVC框架中加了注解@Controller的方法(实际上一个方法就相当于一个对应的Servlet);

首先,浏览器发送请求,JSP页面响应给客户,客户点击JSP页面上的内容,再次提交请求;
这一次,请求到Controller控制器模块,也就是Servlet服务器中,
Servlet服务器通过分析请求,判断客户的需求,
然后调用Model模型,用Service层处理数据库的增删改查,用Dao层提供接口支持,
然后Servlet将数据驱动到View视图层也就是JSP页面中,
将JSP页面响应给浏览器,客户看到动态的内容。

在这个过程中,最典型的的MVC模型就是 JavaBean + JSP + Servlet的模式,各司其职,分工合作;这种设计理念可以把html代码块和业务逻辑代码块分开,让代码更清晰,便于开发。

而依据MVC设计模式,来搭建的MVC框架,则是该设计模式思想的具体实现,它强制性的使应用程序输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。它们各自处理自己的任务。

2.Web经典三层架构是指:
1). 表现层,UI,User Interface:
主要接受用户的请求和把相应的页面响应给用户浏览器;
其中aspx页面,对应MVC中的视图(View),即JSP页面;
而aspx.cs页面,对应MVC中的控制器(Controller),即Servlet服务器;

2). 业务逻辑层,BLL,Business Logic Layer:
对应MVC中模型(Model)中的Service层,与数据库联动处理增删改查;

3). 数据访问层/持久层,DAL,Data Access Layer:
对应MVC中模型(Model)中的Dao层,提供接口支持;

其余的文件,例如JavaBean作为原材料被三层架构调用,贯彻三层接口;xml配置文件给三层架构提供良好的配置环境。
借用一张网上的图来展示:

这种分层式结构,可以降低各层之间的依赖,降低耦合,是一种弱耦合结构。

3、Web的五大主流框架(简介)

1). Spring框架
核心是DI(Dependency Injection)(依赖注入)和IOC(Inversion of Control)(反转控制);
(1)Spring框架对Web的支持是,SpringMVC框架
(2)Spring框架对持久层的支持是,JDBCTemplate

2). SpringMVC框架
优势是优化了B/S结构(浏览器-服务器),简化了Servlet的创建

在其他框架中,一个url请求需要new一个新的Servlet与之相对应,
在SpringMVC框架中,由于DispatcherServlet的存在,任何的url(除了jsp外)它都能处理,然后依据映射找到一个对应的@Controller的注解类,就相当于一个Servlet;

相当于把Servlet转变成了注解类,多个注解类可以写在同一个java文件中,代码方式简洁、优雅;

补充一下maven仓库的作用:
maven仓库可以通过<denpendency 标签,由GAV信息导入所需要的jar包,不同的jar包GAV代码在官网可直接查找,导入jar包的方式简单方便。
3). Mybatis框架
它的作用是可以与数据库进行联动,在其中写sql语句,进行数据库的增删改查;

4). Hibernate框架

5). Struts2框架

二.反射相关:
要想理解反射的原理,首先要了解什么是类型信息。Java让我们在运行时识别对象和类的信息,主要有两种方式:一种是传统的RTTI(Run-Time Type Identification),它假定我们在编译时已经知道了所有的类型信息;另一种是反射机制,它允许我们在运行时发现和使用类的信息。
使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)
1、反射的概述
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法。所以先要获取到每一个字节码文件对应的Class类型的对象.。
反射就是把Java类中的各种成分映射成一个个的Java对象。
例如:
一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。
(其实:一个类中这些成员方法、构造方法,在加入类中都有一个类来描述)
如图是类的正常加载过程:反射的原理在于class对象。
熟悉一下加载的时候:Class对象的由来是将class文件读入内存,并为之创建一个Class对象。

类的正常加载过程
2、反射的理解
反射之中包含了一个「反」字,所以想要解释反射就必须先从「正」开始解释。
一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。

所以说什么是反射?反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。
一般情况下我们使用反射获取一个对象的步骤:
//获取类的 Class 对象实例
//获取方法的 Method 对象

3、反射的常用API
在 JDK 中,反射相关的 API 可以分为下面几个方面:获取反射的 Class 对象、通过反射创建类对象、通过反射获取类属性方法及构造器。
反射常用API:
1).获取反射中的Class对象
在反射中,要获取一个类或调用一个类的方法,我们首先需要获取到该类的 Class 对象。
在 Java API 中,获取 Class 类对象有三种方法:

一.使用 Class.forName 静态方法。当知道某类的全路径名时,可以使用此方法获取 Class 类对象。用的最多,但可能抛出 ClassNotFoundException 异常。
Class c1 = Class.forName(“java.lang.String”);
二.直接通过 类名.class 的方式得到,该方法最为安全可靠,程序性能更高。这说明任何一个类都有一个隐含的静态成员变量 class。这种方法只适合在编译前就知道操作的 Class。
Class c2 = String.class;
三.通过对象调用 getClass() 方法来获取,通常应用在:比如你传过来一个 Object类型的对象,而我不知道你具体是什么类,用这种方法。
String str = new String(“Hello”);
Class c3 = str.getClass();

需要注意的是:一个类在 JVM 中只会有一个 Class 实例,即我们对上面获取的 c1、c2和c3进行 equals 比较,发现都是true。
2).通过反射创建类对象
通过反射创建类对象主要有两种方式:
一.通过 Class 对象的 newInstance() 方法、
Class clz = Phone.class;
Phone phone = (Phone)clz.newInstance();

二.通过 Constructor 对象的 newInstance() 方法。
Class clz = Phone.class;
Constructor constructor = clz.getConstructor();
Phone phone= (Phone)constructor.newInstance();

通过 Constructor 对象创建类对象可以选择特定构造方法,而通过 Class 对象则只能使用默认的无参数构造方法。

3.通过反射获取类属性、方法、构造器
我们通过 Class 对象的 getFields() 方法可以获取 Class 类的属性,但无法获取私有属性。

而如果使用 Class 对象的 getDeclaredFields() 方法则可以获取包括私有属性在内的所有属性:
与获取类属性一样,当我们去获取类方法、类构造器时,如果要获取私有方法或私有构造器,则必须使用有 declared 关键字的方法。
附:查阅 API 可以看到 Class 有很多方法:
  getName():获得类的完整名字。
  getFields():获得类的public类型的属性。
  getDeclaredFields():获得类的所有属性。包括private 声明的和继承类
  getMethods():获得类的public类型的方法。
  getDeclaredMethods():获得类的所有方法。包括private 声明的和继承类
  getMethod(String name, Class[] parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型。
  getConstructors():获得类的public类型的构造方法。
  getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes 参数指定构造方法的参数类型。
  newInstance():通过类的不带参数的构造方法创建这个类的一个对象。
4、反射源码解析
当我们在 XML 文件中配置了上面这段配置之后,Spring 便会在启动的时候利用反射去加载对应的 Phone类。而当 Apple 类不存在或发生启发异常时,异常堆栈便会将异常指向调用的 invoke 方法。
从这里可以看出,我们平常很多框架都使用了反射,而反射中最重要的就是 Method 类的 invoke 方法了。
5、反射总结
我们知道反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,包括包括其modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变fields内容或调用methods。那么我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现;JDBC原生代码注册驱动;hibernate 的实体类;Spring的AOP等等。但是凡事都有两面性,反射使用不当会造成很高的资源消耗!
6、new对象和反射得到对象的区别
1.在使用反射的时候,必须确保这个类已经加载并已经连接了。使用new的时候,这个类可以没有被加载,也可以已经被加载。
2.new关键字可以调用任何public构造方法,而反射只能调用无参构造方法。
3.new关键字是强类型的,效率相对较高。 反射是弱类型的,效率低。
4.反射提供了一种更加灵活的方式创建对象,得到对象的信息。如Spring 中AOP等的使用,动态代理的使用,都是基于反射的。解耦。

三.Spring 的理解
spring 是一个开源框架,Spring 为简化企业级应用开发而生,使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能。Spring 是一个 IOC 和 AOP 容器框架。 Spring 主要核心是:
(1)控制反转(IOC):传统的 java 开发模式中,当需要一个对象时,我们会自己创建一个对象,而在 Spring 开发模式中,Spring 容器使用了工厂模式为我们创建了所需要的对象,我们直接调用 Spring 为我们提供的对象即可,这就是控制反转的思想。实例化一个 java 对象有三种方式:使用类构造器,使用静态工厂方法,使用实例工厂方法。当使用 spring 时我们不需要关心通过何种方式实例化一个对象,spring 通过控制反转机制自动为我们实例化一个对象。

(2)依赖注入(DI):Spring 使用 Java Bean 对象的 Set 方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程就是依赖注入的基本思想。

(3)面向切面编程(AOP):在面向对象编程(OOP)思想中,我们将事物纵向抽象成一个个的对象。而在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值