jsp面试题

来源:互联网 发布:大数据研发工程师招聘 编辑:程序博客网 时间:2024/05/22 06:37

1)doPost()与doGet()的区别

首先这两种方法有本质的区别,get只有一个流,参数附加在url后(就是把数据放置在HTTP协议头中),大小个数有严格限制且只能是字符串。。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII.post的参数是通过另外的流传递的,post是通过HTTP post机制,将表单内各个字段与其内容放置在HTTP包的body中,户看不到这个过程,也可以传递二进制数据,如文件的上传。

  在servlet开发中,以doGet()和doPost()分别处理get和post方法。  另外还有一个doService(),  它是一个调度方法,当一个请求发生时,首先执行doService(),不管是get还是post。在HttpServlet这个基类中实现了一个角度,首先判断是请求时get还是post,如果是get就调用doGet(),  如果是post就调用doPost()。

为了理解两者在传输过程中的不同,我们先看一下HTTP协议的格式:     
HTTP请求:
 <request line>
 <headers> 
<blank line>
 <request-body>]
在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。
GET与POST方法实例:
  GET /books/?sex=man&name=Professional HTTP/1.1 
  Host: www.wrox.com 
  User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
   Gecko/20050225 Firefox/1.0.1 
   Connection: Keep-Alive 
 POST / HTTP/1.1
 Host: www.wrox.com 
 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
 Gecko/20050225 Firefox/1.0.1
  Content-Type: application/x-www-form-urlencoded 
Content-Length: 40
 Connection: Keep-Alive
(----此处空一行----)
   name=Professional%20Ajax&publisher=Wiley
GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;POST提交:把提交的数据放置在是HTTP包的包体中。上文示例中绿色字体标明的就是实际的传输数据

其次是get方法提交的页面能够通过history.back()回退,但post的数据就不能,回退时告诉已经过期,应为你已经post出去了,就不能取回来了。简单的说,get是通过http header来传输数据,有数量限制,而post则是通过http body来传输数据(数据放到了http的Content),没有数量限制。参考链接 参考链接2

2)history.back(-1)与history.go(-1)区别

history.back(-1):直接返回当前页的上一页,数据全部丢失,是个新页面
而history.go(-1):也是返回当前页的上一页,不过表单里的数据全部还在

3)什么是Sprng Ioc & AOP 的作用?

Spring 的AOP和IOC都是为了解决系统代码耦合度过高的问题。使代码重用度高、易于维护。
IOC(Inversion of Control):控制反转,是一种设计模式。一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制;通常,应用代码需要告知容器或框架,让它们找到自身所需要的类,然后再由应用代码创建待使用的对象实例。因此,应用代码在使用实例之前,需要创建对象实例。然而,IoC模式中,创建对象实例的任务交给IoC容器或框架(实现了IoC设计模式的框架也被称为IoC容器),使得应用代码只需要直接使用实例,这就是IoC。相对IoC 而言,“依赖注入”的确更加准确的描述了这种设计理念。所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。
第二层是依赖注入(Dependency Injection):将相互依赖的对象分离,在spring配置文件中描述他们的依赖关系。他们的依赖关系只在使用的时候才建立。简单来说就是不需要NEW一个对象了。
AOP:面向切面,是一种编程思想,OOP的延续。将系统中非核心的业务提取出来,进行单独处理。比如事务、日志和安全等。这个简单来说就是可以在一段程序之前或者之后做一些事。spring就是依赖注入的原理首先是面向接口编程,提供service业务组件接口层和dao组件接口,当action实现一个业务的时候只需要调用service组件接口和dao组件接口,那么这些接口怎么实例化呢?早期有使用工厂设计模式来实例化接口,spring出现之后是提供一个xml的配置文件将接口实现类的路径和接口对象以bean的形式配入,可以通过propertity或者contruct的形式注入其他的实例(比如service的bean中注入dao的bean),最后在action和service的实现类添加set方法或者带参构造方法,这样ation层和service层和dao层就完全分离了实现了高度解耦,而在以往单独使用Struts框架的时候,所有的业务方法类的生命周期,甚至是一些业务流程都是由Action来控制的。层与层之间耦合性太紧密了,既降低了数据访问的效率又使业务逻辑看起来很复杂,代码量也很多。在spring容器启动时来实例化引用,降低了程序的依赖性,如果某个业务逻辑发生变化,可以重新写一个新的业务逻辑实现类,修改spring的配置文件即可,不用每个action代码中去改new的对象,这就是依赖注入。
其实这种思想是spring用到的另一种设计模式叫做桥接模式,主要思想是指当将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化,就好像service组件和dao组件,早期没有用mvc框架思想的时候就是实现一个service组件就会将需要调用的dao组件绑定,这就需要将这种多维度的变化分开使它们独立的变化,spring就很好的使用了该设计模式达到解耦代码简易的效果可扩展性强。参考链接,参考链接2