JAVA WEB开发人员面试题与经验总结【持续更新】

很多程序员在进入正式工作之后越来越不注重基础和理论,我记得老师曾经说过:“基础好,样样通,理论强,处处用。”现在有时间了,正好整理一下理论和基础,一来自己复习,二来方便一下找工作的同仁参考。

Spring篇(基于3.X)

一般来说Spring的面试中的问题就是 AOP 和 IOC这两种,这是由于大连很多框架都是将spring用在管理代码上:


一.ioc技术:

①属性注入:

     

②构造函数注入:

   


而对于构造函数的注入:

我们可以通过配置索引的方式,消除歧义,比如:

    具体值


注意:索引是从0开始,配置之后我们的拦截器就会按照构造函数中参数的出现顺序对其赋值。


值注入陷阱:

如果:

那么:请问得到的值是什么?


错误回答:null

正确回答:是"",即空字符串,为什么?因为我们的spring会将这种值默认的变成 空字符串,那么,我想要null,该如何实现?

                    spring给我们提供了一个标签


如何注入 set map list?

spring 可以注入 set map list 等集合:


 

     

      值1

      值2

      值3

       

   

 

     

      值1

      值2

      值3

       

   

 

     

     

     键名

     值名 

     

       

   


二.AOP技术:

基于注解的实现:

第一,我们要明确的是,我们的切点类需要在配置文件中声明一个匿名类:

第二,就是注解,而对于注解很多人容易将他们的具体实现弄混杂,我们可以通过这张表,一目了然:

类别
函数
入参
说明
方法切点函数
execution()
方法
匹配模式串
表示满足某一匹配模式的所有目标类方法连接点。如execution(* greetTo(..))表示所有目标类中的greetTo()方法。
@annotation()
方法注
解类名
表示标注了特定注解的目标方法连接点。如@annotation(com.baobaotao.anno.NeedTest)表示任何标注了@NeedTest注解的目标类方法。
方法入参切点函数
args()
类名
通过判别目标类方法运行时入参对象的类型定义指定连接点。如args(com.baobaotao.Waiter)表示所有有且仅有一个按类型匹配于Waiter的入参的方法。
@args()
类型注
解类名
通过判别目标方法的运行时入参对象的类是否标注特定注解来指定连接点。如@args(com.baobaotao.Monitorable)表示任何这样的一个目标方法:它有一个入参且入参对象的类标注@Monitorable注解。
目标类切点函数
within()
类名匹配串
   表 示特定域下的所有连接点。如within(com.baobaotao.service.*)表示com.baobaotao.service包中的所有 连接点,也即包中所有类的所有方法,而within(com.baobaotao.service.*Service)表示在 com.baobaotao.service包中,所有以Service结尾的类的所有连接点。
target()
类名
   假如目标类按类型匹配于指定类,则目标类的所有连接点匹配这个切点。如通过target(com.baobaotao.Waiter)定义的切点,Waiter、以及Waiter实现类NaiveWaiter中所有连接点都匹配该切点。
@within()
类型注解类名
   假如目标类按类型匹配于某个类A,且类A标注了特定注解,则目标类的所有连接点匹配这个切点。
   如@within(com.baobaotao.Monitorable)定义的切点,假如Waiter类标注了@Monitorable注解,则Waiter以及Waiter实现类NaiveWaiter类的所有连接点都匹配。
@target()
类型注解类名
   目标类标注了特定注解,则目标类所有连接点匹配该切点。如@target(com.baobaotao.Monitorable),假如NaiveWaiter标注了@Monitorable,则NaiveWaiter所有连接点匹配切点。
代理类切点函数
this()
类名
 代理类按类型匹配于指定类,则被代理的目标类所有连接点匹配切点。这个函数比较难理解,这里暂不举例,留待后面详解。


这张表熟悉之后,基本上AOP技术就已经掌握了。


三.事物的配置:

第一步,我们要配置的是数据库,我们以mysql为例子,我们需要调用的类是:
org.springframework.jdbc.datasource.DriverManagerDataSource

第二步,是ibatis的配置,spring给我们提供了很好的整合类:

SqlMapClientFactoryBean

第三步,事务处理,我们用:

org.springframework.jdbc.datasource.DataSourceTransactionManager

来控制

第四步,配置AOP和事务


具体的代码可以参照下文的:



	
	
		
			classpath:spring/config.properties
		
	
	
	
	
	    
	    
	    
	    
	
	
	
	
	   
	   
	
	
		
			
		
	
	
	
	
		
			
			
			
			
			
		
	
	
	
	
       
    
    
    
    
    
	
		
		
	




插入一个知识点,如何配置文档xml所在的地方呢?

两种:在web.xml中:


contextConfigLocation
配置文件位置

在spring 相关的配置文件中:

class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

classpath:com/roiland/spring/config.properties



四,关于SPRING MVC

很多公司不喜欢用spring mvc可能是他在前后台获取数据上真的是没有struts2来的方便,但是我们既然用过了,就要把它当成我们的相关经验

至于controller这,我没有什么好说的,我们只需要明白,第一 spring mvc 中的modelandview 这个类中,不仅可以返回一个 jsp或是html页面(要加扩展名,还可以返回一个map的形式。在jsp中可以获取到.然后是如果我们想重定向就是newRedirecty就可以了。) 

我们要说的是怎么返回json?

可以参照:

http://blog.csdn.net/longxia1987/article/details/7732470  的文章,我认为在面试中答出需要用AnnotationMethodHandlerAdapter即可。

其他:

1.怎么监听request?说白了就是怎么样像struts那样获取 request呢?我们只需要给个监听:

   
org.springframework.web.context.request.RequestContextListener    
 

2.如何监听上下文?这是在整合框架中用到最多的方式:

  1.     
  2.   class>org.springframework.web.context.ContextLoaderListenerclass>    

3.spring的拦截器:

4.spring的rmi:

服务端:

        
        
                 
                 
                 
                 
                 
        

客户端:

        
                 
                 

              
         
            /view/front/index.jsp 


       

       
       
            /view/behind/login.jsp   
       



    
     
            /view/front/studentInfo.jsp
            /view/behind/userlogin.jsp
   

     
     
     
       
       
               
               stuDetailDao,stuDetail
               

       

        
     

插入一个概念多线程的问题:

synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法,有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。

再说说 两种实现多线程的区别:

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。

Start:

用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到spu时间片,就开始执行run()方法,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。

Run:

run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。

总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。


先写到这了,这文章我会不定期的持续更新的。


先写到这了,不得不说面试是个好事儿,可以让你把知识重新复习一遍。但是频繁跳槽是不可取的。同仁们加油吧!






     




你可能感兴趣的:(经验,面试题,JAVA,Android,SQL,HTML5,CSS,Spring,单点登录,Jquery,JavaScript,filter,web.xml,Struts2,JSON,servlet,正则,IBATIS)