菜鸟之路——Spring MVC(十)配置文件

  一、web.xml文件



  
    index.jsp
  

  
  
    contextConfigLocation
    classpath*:applicationContext-*.xml
  

  
  
    org.springframework.web.context.ContextLoaderListener
  

  
  
    
      org.springframework.web.context.request.RequestContextListener
    
  

  
    characterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
      encoding
      UTF-8
    
    
      forceEncoding
      true
    
  
  
    characterEncodingFilter
    /*
  
  
  
  
    DruidWebStatFilter
    com.alibaba.druid.support.http.WebStatFilter
    
      exclusions
      *.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*
    
  
  
    DruidWebStatFilter
    /*
  

  
    DruidStatView
    com.alibaba.druid.support.http.StatViewServlet
  
  
    DruidStatView
    /druid/*
  

  
  
    mvc-dispatcher
    org.springframework.web.servlet.DispatcherServlet
    
    
      contextConfigLocation
      classpath*:mvc-dispatcher-servlet.xml
    
    1
  

  
  
    mvc-dispatcher
    
    /
  

  
  
  
    hibernateFilter
    org.springframework.orm.hibernate4.support.OpenSessionInViewFilter
    
       
      singleSession
      true     
    
        
     
       sessionFactoryBean 
       sessionFactory 
    
    
      flushMode
      AUTO
    
  
  
    hibernateFilter
    /*
  

 
   

  配置org.springframework.web.context.request.RequestContextListener

  是为了使Spring支持request与session的scope,如:

  request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前 HTTP request内有效,配置实例: request、session、global session使用的时候首先要在初始化web的web.xml中做如下配置:如果使用的是Servlet2.4及以上的web容器,那么需要在web应用的XML声明文件 web.xml中增加这个listener。

  配置了上述这个listener之后,还能用于在SpringMVC中获取request对象。配置之后,在程序里可以用:

HttpServletRequest request = 
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest(); 
     不过为了获取request对象,更简单的方式是用注解法:

@Autowired
private  HttpServletRequest request;
  或更直接的方法是:
public String hello(HttpServletRequest request,HttpServletResponse response) 
     配置org.springframework.web.filter.CharacterEncodingFilter:
     是为了处理当前台JSP页面和JAVA代码中使用了不同的字符集进行编码的时候出现的表单提交的数据或者上传/下载中文名称文件出现乱码的问题,为其设置字符集。设置forceEncoding:当request中已经被指定了一个字符集的时候是否再将用endcoding对应的字符集设置到request中去。默认为false,意思是当request中指定了编码方式,则不适用用encoding指定的编码方式。注意,这个应该配置在ContextLoaderListener之后。

  配置org.springframework.orm.hibernate4.support.OpenSessionInViewFilter:
  Spring 为我们提供了一个叫做 OpenSessionInViewFilter 的过滤器,他是标准的 Servlet Filter 所以我们把它按照规范配置到 web.xml 中方可使用。使用中我们必须配合使用 Spring 的 HibernateDaoSupport 来进行开发,也就是说,我们的dao层的类都要继承于 HibernateDaoSupport,从中由 Spring 来控制 Hibernate 的 Session 在请求来的时候开启,走的时候关闭,保证了我们访问数据对象时的稳定性。OpenSessionInViewFilter的主要功能是用来把一个Hibernate Session和一次完整的请求过程对应的线程相绑定。Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${ company.employees }。当View 层逻辑完成后,才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。在项目中使用Spring+Hibernate的时候,会开启OpenSessionInViewFilter来阻止延迟加载的错误,但是在我们开启OpenSessionInViewFilter这个过滤器的时候FlushMode就已经被默认设置为了MANUAL,如果FlushMode是MANUAL或NEVEL,在操作过程中 hibernate会将事务设置为readonly,所以在增加、删除或修改操作过程中要将flushMode设置为AUTO。

  如果使用了OpenSessionInView模式,那么Spring会帮助你管理Session的开和关,从而你在你的DAO中通过HibernateDaoSupport拿到的getSession()方法,都是绑定到当前线程的线程安全的Session,即拿即用,最后会由Filter统一关闭。但由于拿到的Hibernate的Session被设置了session.setFlushMode(FlushMode.NEVER); 所以,除非直接调用session.flush(),否则Hibernate session无论何时也不会flush任何的状态变化到数据库。因此,数据库事务的配置非常重要。(我们知道,在调用org.hibernate.Transaction.commit()的时候会触发session.flush())我曾经见过很多人在使用OpenSessionInView模式时,都因为没有正确配置事务,导致了底层会抛出有关FlushMode.NEVER的异常。

  二、applicationContext.xml文件




	
	

	
		
		
		
		

		
		
		
		

		
		

		
		

		
		

		
		
		
		

		
		
		

		
		
	

	
	
		
		
		
		
		
		    
			  
			  org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
			  true
			  true

			  org.hibernate.dialect.MySQL5Dialect
			  update
			  true
			  true
			  true 1, false 0, yes 'Y', no 'N'
		    
		
	

	
	
		
	

        
	

	
	
		
			
			
			
			
			
			
			
		
	

	
	
		
		
	

	
	
         
	
	
	
	
	
		
	

 
    

  三、mvc-dispatcher-servlet.xml配置(名字自定)




    
    

    
    
        
    

    
    
    

    

    
 
    
        
    

    
        
    

    
    

    
    
    
    
        
            
                
            
        
    

  四、database.properties

db.driverClassName =com.mysql.jdbc.Driver
db.url      = jdbc:mysql://localhost:3306/项目名?useUnicode=true&characterEncoding=UTF-8
db.user     = ***
db.password = ***

  五、后记

  applicationContext.xml 和 dispatch-servlet.xml形成了两个父子关系的上下文。
  1) 一个bean如果在两个文件中都被定义了(比如两个文件中都定义了component scan扫描相同的package), spring会在application context和 servlet context中都生成一个实例,他们处于不同的上下文空间中,他们的行为方式是有可能不一样的。
  2) 如果在application context和 servlet context中都存在同一个 @Service 的实例, controller(在servlet context中) 通过 @Resource引用时, 会优先选择servlet context中的实例。
 不过最好的方法是:在applicationContext和dispatcher-servlet定义的bean最好不要重复, dispatcher-servlet最好只是定义controller类型的bean。
  applicationContext.xml 是spring 全局配置文件,用来控制spring 特性。
  dispatcher-servlet.xml 是spring mvc里面的,控制器、拦截uri转发view。


你可能感兴趣的:(JAVA,WEB)