问题盘点:

1.HTTP请求的方法(get和post的区别)

http请求的方法有很多种,get、post、head、trace、options等,但是get和post是两个最常用的方法。

其中,get是最简单的一种请求方法,主要功能是从服务器端获取用户所需的资源,并且将它作为响应返回给客户端,这些资源可以是HTML页面、图片、文档等内容中的任何一种,但是需要注意的是,GET方法的作用是用来获取服务器端资源信息,就如同在数据库中查询操作一样,不会影响到资源自身的状态,例如删除、修改或新增资源都是不允许的。而POST方法提供了比GET方法更强大的功能,它除了能够从服务器端获取资源以外,同时还可以向服务器端上传数据。

 

虽然GET方法主要用来从服务器上获取数据,也可以向服务器上传数据,但是一般不建议采用GET方法来向服务器上传数据,而是推荐用POST方法实现该功能。具体而言有以下两个原因:

(1)采用GET方法向服务器上传数据时,一般将数据添加到URL后面,并且二者用“?”来连接,各个变量之间用“&”连接,由于URL对长度存在限制,因此采用这种方法能上传的数据量非常小,通常在1024Byte左右。而POST方法传递数据是通过HTTP请求的附件来进行的,传送的数据量更大一些,一般认为是不受限制的。

(2)由于GET方法上传数据在URL中,因此上传的数据被彻底暴露出来,本身存在安全隐患,尤其是当用户需要向服务器提交一些敏感信息时,用户信息或许会直接显示在URL中。而POST方法向服务器提交的内容在URL中不会明文显示,对用户是不可见的,安全性更好。

GET和POST的区别:

(1)传送方式:GET是通过地址栏传送,POST是通过报文传输。

(2)传送长度:GET参数有长度限制,通常是1024Byte,POST无限制。

(3)安全性:GET通过地址栏明文传输,安全性低,POST在HTTP报文中传输,对用户不可见,安全性高。

(4)适用场景:GET适用于数据查询,POST一般用于用户数据添加、删除、修改。

2.解析MVC三层架构的工作原理和优缺点

(1)原理

MVC是一种程序开发设计模式,它实现了显示模块与功能模块的分离,提高了程序的可维护性、可移植性、可扩展性,降低了程序的开发难度。它主要分为模型(Model),视图(View),控制器(Controller)三层。

①模型(Model):是应用程序的主体部分,主要包括业务逻辑模块(DAO等)和数据模块(POJO类)。模型与数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需要写一次就可以被多个视图重用,所以减少了代码的重复性。

②视图(View):用户与之交互的界面,在web中视图通常是html,jsp等组成。

③控制器(Controller):接受来自于界面的请求,并且模型进行处理,在这个过程中控制器不做任何处理知识起到了一个连接的作用。

(2)优点

①可以为一个模型在运行时同时建立和使用多个视图,变化-传播机制可以确保所有相关的视图及时得到模型数据变化,从而使所有关联的视图和控制器做到行为同步。(变化-传播机制又是啥???。。。)

②视图与控制的可接插性,允许更换视图和控制器对象而且可以根据需求动态的打开或关闭、甚至在运行期间进行对象替换。

③模型的可移植性。因为模型是独立于视图的,所以可以把一个模型独立地移植到新的平台工作。需要做的只是在新平台上对视图和控制器进行新的修改。

④潜在的框架结构,可以基于此模型建立应用程序框架,不仅仅是用在设计界面的设计中。

(3)MVC的不足之处

①如果只是简单的界面,严格遵循MVC使M V C分离,反而增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。

②视图和控制器看似分离,但是实际上关系紧密,如果视图没有控制器的存在,控制器的应用是很有限的,反之亦然。

③视图对模型数据的低效率访问,视图可能要多次调用才能获得足够的数据用来显示一个界面。

④MVC的使用还需要一定支撑,现在高级的界面工具或构造器不支持模式,MVC使用还有一定困难。

3.cookie和session有什么区别

cookie是web服务器保存在用户浏览器端的一个小文件,可以包含有关用户的信息(如身份识别号码,密码等信息)。session是指用来在客户端和服务器端之间保持状态的解决方案以及存储结构。

二者都可以进行信息存储,但是有如下区别:

(1)cookie机制采用的是在客户端保持状态的方案,即数据存放在客户的浏览器上,而session机制采用的是在服务器端保持状态的方案,即数据存放在服务器上。

(2)cookie安全性不够。由于cookie信息存放在客户端,其他人可以很容易地得到存放在本地的cookie,并进行cookie欺骗,而session信息存放在服务器端,因此较为安全。

(3)cookie的性能会高一点,由于session会在一定时间内保存在服务器上,因此当访问量增多时,会降低服务器的性能。

(4)cookie存放的数据不能超过4kb,并且很多浏览器都限制一个站点最多保存20条cookie,session不存在此问题。

一般情况下,将用户登录信息等重要信息存放在session中,而其他需要保留的信息可以放在cookie中。

4.web服务器和web应用服务器

(这个真第一次看到,我直接抄了(其实其他也是抄的(但是是先看了一遍再抄的。。。)))

Web服务器是可以向发出请求的浏览器提供文档的程序。其主要功能是提供网上信息浏览服务;即接收浏览器的请求并把处理结果传回浏览器进行显示。以HTTP的方式来访问,当Web服务器接收到一个HTTP请求时,它同样会以HTTP格式返回一个响应,常见的Web服务器有IIS和Apache。

应用服务器提供访问业务逻辑的途径以供客户端应用程序使用。具体而言,它通过HTTP、TCP/IP、IIOP、JRMP等协议来提供业务逻辑借口。为了系统的可靠性,同样使用了一些可扩展性和容错机制。除此外,它还为应用的开发提供了许多服务。Jboss啊 tomcat啥的

大概而言吧:Web服务器一般是通用的(浏览器向Web服务器发出请求,然后以HTTP的方式来响应这种),而应用服务器一般是专用的(像是专业人员为了开发所用的一些服务器等)。二者是并列关系,不存在包容关系。如果访问的页面只有HTML,用Web服务器就够了,但是如果是JSP,此时就需要应用服务器了,因为只有应用服务器才能解析JSP里的java代码,并将解析结果以HTML的格式返回给用户。

5.常见的中间件(又到了盲区。。。)

小项目、个人项目开发:tomcat

大项目或者商业的一般采用:weblogic/webshare

其他的还有jboss,glassfish等,一些示例项目或者小项目常采用jetty

6.Spring IoC、AOP的理解以及实现的原理

(1)Spring IoC

IoC叫控制反转,是Inversion of Control的缩写,DI(Dependency Injection)叫依赖注入,是对IoC更简单的诠释,控制反转是把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”就是对组件对象控制权的转移,从程序代码本身转移到了外部容器,由容器来创建对象并管理对象之间的依赖关系。DI是对IoC更准确的描述,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。

举例:一个类A需要用到接口B中的方法,那就需要为类A和接口B建立关联或依赖关系,最原始的方法是在类A中创建一个接口B的实现类C的实例,但这种方法需要开发人员自行维护二者的依赖关系,也就是说当依赖关系发生变动的时候需要修改代码并且重新构建整个系统。如果通过一个容器来管理这些对象以及对象的依赖关系,则只需要在类A中定义好用于关联接口B的方法,(构造器或是Setter方法),将类A和接口B的实现类C放入容器中,通过对容器的配置来实现二者的关联。

Spring IoC的实现原理:

通过反射创建实例:获取需要注入的接口实现类并将其赋值给该接口。

IoC容器的加载过程:

①创建IoC配置文件的抽象资源

②创建一个BeanFactory

③把读取配置信息的BeanDefinitionReader,这里是XmlBeanDefinitionReader配置给BeanFactory

④从定义好的资源位置读入配置信息,具体的解析过程由XmlBeanDefinitionReader来完成,这样完成整个载入bean定义的过程

优点:1.通过IoC容器,开发人员不需要关注对象是如何被创建的,同时增加新类也非常方便,只需要修改配置文件即可实现对象的“热插拔”;2。IoC容器可以通过配置文件来确定需要注入的实例化对象,因此非常便于进行单元测试

缺点:1.对象是通过反射机制实例化出来的,因此汇兑系统性能有一定影响;2.创建对象的流程变得比较复杂。

(2)AOP

AOP(Aspect-Oriented Programming)是一种程序设计范形,该范形以一种称为切面的语言构造为基础,切面是一种新的模块化机制,用来描述分散在对象、类或方法中的横切关注点(Crosscutting Concern)。

“横切关注”是会影响到整个应用程序的关注功能。它跟正常的业务逻辑是正交的,没有必然的联系,但是几乎所有的业务逻辑都会涉及到这些关注功能。通常,事务、日志、安全性等关注就是应用中的横切关注功能。

实现原理:

①动态代理(利用反射和动态编译将代理模式变为动态的)

②JDK得动态代理(接口):JDKProxy返回动态代理类,是目标类所实现接口的另一个实现版本,它实现了对目标类的代理(如同UserDAOProxy与UserDAOImp的关系)。

③cglib动态代理(类):CGLibProxy反悔的动态代理类,则是目标代理类的一个子类(代理类扩展了UserDaoImpl类)。

7.反射机制

Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖采用的就是Class类中的方法。所以先要获取到每一个字节码文件对应的Class类型的对象。例如:一个类有:成员变量、方法、构造方法、包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。