系统初步认识

1,对于web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
  
	<display-name>广告管理系统</display-name>
	
	<!-- 在web.xml中 首先配置的是对spring进行配置 -->
	
	<!-- Spring核心配置文件 -->
	<context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>/WEB-INF/spring-context/applicationContext.xml</param-value>
  	</context-param>
  	
	<!--由Sprng载入的Log4j配置文件位置-->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>/WEB-INF/classes/log4j.properties</param-value>
	</context-param>
	
	
	<!--Spring刷新Log4j配置文件的间隔,单位为millisecond-->
 	<context-param>
  		<param-name>log4jRefreshInterval</param-name>
  		<param-value>60000</param-value>
 	</context-param>
 	
 	
  	<!--如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的"webapp.root"-->
	<context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>admanager.root</param-value>
    </context-param>
	
	
	<!-- 这个是自己写的一个过滤器,将所有的编码全部统一到utf-8编码格式 -->
	<filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>com.kemp.servlet.SetCharacterEncodingFilter</filter-class>
        <!-- 变量设置,将SetCharacterEncodingFilter类中的变量进行设置,系统将自动将变量赋值 -->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<filter>
    	<filter-name>OpenSessionInViewFilter</filter-name>
    	<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  	</filter>
  	<filter-mapping>
    	<filter-name>OpenSessionInViewFilter</filter-name>
    	<url-pattern>/*</url-pattern>
  	</filter-mapping>
  	
  	
  	
  	<!-- 配置Struts2核心控制器 -->
	<filter>
		<!-- 配置filter名字 -->
        <filter-name>struts2</filter-name>
        <!-- 配置filter实现类 -->
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
    <!-- 配置filter拦截的URL -->
    <filter-mapping>
    <!-- 配置Struts2核心控制器拦截所有用户请求 -->
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
	<filter>
  		<filter-name>struts-cleanup</filter-name>
  		<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>
  	</filter>
  	<!-- 配置filter拦截的URL -->
  	<filter-mapping>
  	<!-- 拦载所有用户请求 -->
    	<filter-name>struts-cleanup</filter-name>
    	<url-pattern>/*</url-pattern>
  	</filter-mapping>
    
		
	
	<!-- 用于初始化Spring的Listener,这个监听器主要是用来自动加载applicationContext.xml的 -->
  	<listener>
    	<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  	</listener>
	<!-- 设置Spring的log4j监听器 -->
  	<listener>
    	<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  	</listener>

 
   	<welcome-file-list>
    	<welcome-file>index.jsp</welcome-file>
  	</welcome-file-list>
  	<session-config>  
        <session-timeout>10</session-timeout>  
 	</session-config>   
    <!-- 
    一般来说,这个配置不是必需的,因为标签库已经被包括在struts2-core-2.0.11.jar中了。
    如果您真的需要在web.xml中配置标签库,可以把/META-INF/taglib.tld文件复制到您的应用程序的WEB-INF目录下,
    命名为struts-tags.tld 
    -->
 	<jsp-config>
    	<taglib>
      		<taglib-uri>/WEB-INF/struts-tags.tld</taglib-uri>
     		<taglib-location>/WEB-INF/struts-tags.tld</taglib-location>
    	</taglib>
  	</jsp-config>
	
</web-app>

2  因为在系统中应用了spring,所以spring的applicationContext.xml组要的好好的研究一下,即依赖注入之间的关系。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 
<beans>

	<!-- 引入init.properties中属性 -->
	<bean id="placeholderConfig"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location">
			<value>classpath:init.properties</value>
		</property>
	</bean>
	
	
	<!-- 配置数据源,连接池使用c3p0 -->
	<bean id="dataSource"
			class="com.mchange.v2.c3p0.ComboPooledDataSource"
			destroy-method="close" dependency-check="none">
		<property name="driverClass">
			<value>${datasource.driverClassName}</value>
		</property>
		<property name="jdbcUrl">
			<value>${datasource.url}</value>
		</property>
		<property name="user">
			<value>${datasource.username}</value>
		</property>
		<property name="password">
			<value>${datasource.password}</value>
		</property>
		<property name="acquireIncrement">
			<value>${c3p0.acquireIncrement}</value>
		</property>
		<property name="initialPoolSize">
			<value>${c3p0.initialPoolSize}</value>
		</property>
		<property name="minPoolSize">
			<value>${c3p0.minPoolSize}</value>
		</property>
		<property name="maxPoolSize">
			<value>${c3p0.maxPoolSize}</value>
		</property>
		<property name="maxIdleTime">
			<value>${c3p0.maxIdleTime}</value>
		</property>
		<property name="idleConnectionTestPeriod">
			<value>${c3p0.idleConnectionTestPeriod}</value>
		</property>
		<property name="maxStatements">
			<value>${c3p0.maxStatements}</value>
		</property>
		<property name="numHelperThreads">
			<value>${c3p0.numHelperThreads}</value>
		</property>
	</bean>
	
	
	<!-- 配置Hibernate中的SessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<!-- 引入数据源 -->
		<property name="dataSource">
			<ref local="dataSource" />
		</property>
		
		
		<!-- 配置Hibernate对应的映射资源 -->
		<property name="mappingResources">
			<list>
			<!-- 
			<value>com/kemp/video/dept/Dept.hbm.xml</value>
			 -->
				<value>com/kemp/video/dept/Dept.hbm.xml</value>
				<value>com/kemp/video/role/Role.hbm.xml</value>
				<value>com/kemp/video/users/Users.hbm.xml</value>
				<value>com/kemp/video/dictionary/Dictionary.hbm.xml</value>
				<value>com/kemp/video/subdictionary/SubDictionary.hbm.xml</value>
				<value>com/kemp/video/hotel/Hotel.hbm.xml</value>
				<value>com/kemp/video/advertiser/Advertiser.hbm.xml</value>
				<value>com/kemp/video/advertisement/Advertisment.hbm.xml</value>
				<value>com/kemp/video/adbanner/AdBanner.hbm.xml</value>
			</list>
		</property>
		
		
		
		<!-- 配置Hibernate的属性,包括断言,show_sql等 -->
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					${hibernate.dialect}
				</prop>
				<prop key="hibernate.show_sql">
					${hibernate.show_sql}
				</prop>
				<prop key="hibernate.jdbc.fetch_size">
					${hibernate.jdbc.fetch_size}
				</prop>
				<prop key="hibernate.jdbc.batch_size">
					${hibernate.jdbc.batch_size}
				</prop>
				<prop key="hibernate.connection.release_mode">
					${hibernate.connection.release_mode}
				</prop>
			</props>
		</property>
	</bean>
	
	<!-- 配置事务管理器bean  -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
	<!-- 为事务管理器注入sessionFactory" -->
	  <property name="sessionFactory">
	    <ref bean="sessionFactory"/>
	  </property>
	</bean>
	<!-- 事务控制代理抽象定义  -->
	<bean id="transactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" abstract="true">
	<!-- 为事务代理bean注入一个事物管理器 -->
	  <property name="transactionManager">
        <ref bean="transactionManager"/>	  
	  </property>
	  <property name="transactionAttributes">
	  <!-- 定义事务传播属性 -->
	    <props>
	      <prop key="add*">PROPAGATION_REQUIRED</prop>
	      <prop key="delete*">PROPAGATION_REQUIRED</prop>
	      <prop key="update*">PROPAGATION_REQUIRED</prop>
	      <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
	      <prop key="release*">PROPAGATION_REQUIRED</prop>
	      <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
	    </props>
	  </property>
	</bean>
	
	<!-- DAO -->
	<bean id="deptdao" class="com.kemp.video.dept.DeptDao">
		<property name="sessionFactory">
			<ref bean="sessionFactory"/>
		</property>
	</bean>
	<bean id="roledao" class="com.kemp.video.role.RoleDao">
		<property name="sessionFactory">
			<ref bean="sessionFactory"/>
		</property>
	</bean>
	<bean id="usersdao" class="com.kemp.video.users.UsersDao">
		<property name="sessionFactory">
			<ref bean="sessionFactory"/>
		</property>
	</bean>
	<bean id="dictionaryDao" class="com.kemp.video.dictionary.DictionaryDao">
		<property name="sessionFactory">
			<ref bean="sessionFactory"/>
		</property>
	</bean>
	<bean id="subDictionaryDao" class="com.kemp.video.subdictionary.SubDictionaryDao">
		<property name="sessionFactory">
			<ref bean="sessionFactory"/>
		</property>
	</bean>
	<bean id="hotelDao" class="com.kemp.video.hotel.HotelDao">
		<property name="sessionFactory">
			<ref bean="sessionFactory"/>
		</property>
	</bean>
	<!-- 配置系统的DAO组件 -->
	<bean id="advertiserDao" class="com.kemp.video.advertiser.AdvertiserDao">
		<!-- 依赖注入SessionFactory引用 -->
		<property name="sessionFactory">
			<ref bean="sessionFactory"/>
		</property>
	</bean>
	<bean id="advertismentdao" class="com.kemp.video.advertisement.AdvertismentDao">
		<property name="sessionFactory">
			<ref bean="sessionFactory"/>
		</property>
	</bean>
	<bean id="adBannerDao" class="com.kemp.video.adbanner.AdBannerDao">
		<property name="sessionFactory">
			<ref bean="sessionFactory"/>
		</property>
	</bean>
	
	<!-- Target -->
	<bean id="deptTarget" class="com.kemp.video.dept.DeptService">
		<property name="deptdao">
			<ref bean="deptdao"/>
		</property>
	</bean>
	<bean id="roleTarget" class="com.kemp.video.role.RoleService">
		<property name="roledao">
			<ref bean="roledao"/>
		</property>
	</bean>
	<bean id="usersTarget" class="com.kemp.video.users.UsersService">
		<property name="usersdao">
			<ref bean="usersdao"/>
		</property>
	</bean>
	<bean id="dictionaryTarget" class="com.kemp.video.dictionary.DictionaryService">
		<property name="dictionaryDao">
			<ref bean="dictionaryDao"/>
		</property>
	</bean>
	<bean id="subDictionaryTarget" class="com.kemp.video.subdictionary.SubDictionaryService">
		<property name="subDictionaryDao">
			<ref bean="subDictionaryDao"/>
		</property>
	</bean>
	<bean id="hotelTarget" class="com.kemp.video.hotel.HotelService">
		<property name="hotelDao">
			<ref bean="hotelDao"/>
		</property>
	</bean>
	
	
	<!-- 配置业务逻辑服务类 -->
	<bean id="advertiserTarget" class="com.kemp.video.advertiser.AdvertiserService">
		<!-- 依赖注入DAO引用 -->
		<property name="advertiserDao">
			<ref bean="advertiserDao"/>
		</property>
	</bean>
	<bean id="advertismenterTarget" class="com.kemp.video.advertisement.AdvertismentService">
		<property name="advertismentdao">
			<ref bean="advertismentdao"/>
		</property>
		<property name="adBannerDao">
			<ref bean="adBannerDao"/>
		</property>
	</bean>
	<bean id="adBannerTarget" class="com.kemp.video.adbanner.AdBannerService">
		<property name="adBannerDao">
			<ref bean="adBannerDao"/>
		</property>
		<property name="hotelDao">
			<ref bean="hotelDao"/>
		</property>
	</bean>
	
	
	
	<!-- Services -->
    <bean id="deptservice" parent="transactionProxy">
      <property name="target">
        <ref bean="deptTarget"/>
      </property>
    </bean>
    <bean id="roleservice" parent="transactionProxy">
      <property name="target">
        <ref bean="roleTarget"/>
      </property>
    </bean>
    <bean id="usersservice" parent="transactionProxy">
      <property name="target">
        <ref bean="usersTarget"/>
      </property>
    </bean>
    <bean id="dictionaryService" parent="transactionProxy">
      <property name="target">
        <ref bean="dictionaryTarget"/>
      </property>
    </bean>
	<bean id="subDictionaryService" parent="transactionProxy">
      <property name="target">
        <ref bean="subDictionaryTarget"/>
      </property>
    </bean>
    <bean id="hotelService" parent="transactionProxy">
		<property name="target">
			<ref bean="hotelTarget"/>
		</property>
	</bean>
	
	
	<!-- 继承抽象事务代理 -->
	<bean id="advertiserService" parent="transactionProxy">
		<!-- 依赖注入业务逻辑组件引用 -->
		<property name="target">
			<ref bean="advertiserTarget"/>
		</property>
	</bean>
	<bean id="advertismentservice" parent="transactionProxy">
		<property name="target">
			<ref bean="advertismenterTarget"/>
		</property>
	</bean>
	<bean id="adBannerService" parent="transactionProxy">
		<property name="target">
			<ref bean="adBannerTarget"/>
		</property>
	</bean>
	
	<!-- view -->
	<bean id="deptAction" class="com.kemp.web.actions.DeptAction" singleton="false">
		<property name="deptservice">
			<ref bean="deptservice"/>
		</property>
		<property name="usersservice">
			<ref bean="usersservice"/>
		</property>
	</bean>
	<bean id="roleAction" class="com.kemp.web.actions.RoleAction" singleton="false">
		<property name="roleservice">
			<ref bean="roleservice"/>
		</property>
		<property name="usersservice">
			<ref bean="usersservice"/>
		</property>
	</bean>
	<bean id="usersAction" class="com.kemp.web.actions.UsersAction" singleton="false">
		<property name="usersservice">
			<ref bean="usersservice"/>
		</property>
		<property name="deptservice">
			<ref bean="deptservice"/>
		</property>
		<property name="roleservice">
			<ref bean="roleservice"/>
		</property>
	</bean>
	<bean id="dictionaryAction" class="com.kemp.web.actions.DictionaryAction" singleton="false">
		<property name="dictionaryService">
			<ref bean="dictionaryService"/>
		</property>
	</bean> 
	<bean id="subDictionaryAction" class="com.kemp.web.actions.SubDictionaryAction" singleton="false">
		<property name="subDictionaryService">
			<ref bean="subDictionaryService"/>
		</property>
		<property name="dictionaryService">
			<ref bean="dictionaryService"/>
		</property>
	</bean>
	<bean id="hotelAction" class="com.kemp.web.actions.HotelAction" singleton="false">
		<property name="hotelService">
			<ref bean="hotelService"/>
		</property>
		<property name="adBannerService">
			<ref bean="adBannerService"/>
		</property>
	</bean>
	<!-- 配置系统的Action组件 -->
	<bean id="advertiserAction" class="com.kemp.web.actions.AdvertiserAction" singleton="false">
		<!-- 依赖注入业务逻辑组件引用 -->
		<property name="advertiserService">
			<ref bean="advertiserService"/>
		</property>
		<property name="advertismentservice">
			<ref bean="advertismentservice"/>
		</property>
	</bean>
	<bean id="AdvertismentAction" class="com.kemp.web.actions.AdvertismentAction" singleton="false">
		<property name="advertismentservice">
			<ref bean="advertismentservice"/>
		</property>
		<property name="advertiserService">
			<ref bean="advertiserService"/>
		</property>
		<property name="subDictionaryService">
			<ref bean="subDictionaryService"/>
		</property>
		<property name="hotelService">
			<ref bean="hotelService"/>
		</property>
		<property name="adBannerService">
			<ref bean="adBannerService"/>
		</property>
	</bean>
	
	<!-- 将struts的事务交给spring,同时通过依赖注入,将三个service依次注入到Action中 -->
	<bean id="adBannerAction" class="com.kemp.web.actions.AdbannerAction" singleton="false">
		<property name="adBannerService">
			<ref bean="adBannerService"/>
		</property>
		<property name="subDictionaryService">
			<ref bean="subDictionaryService"/>
		</property>
		<property name="hotelService">
			<ref bean="hotelService"/>
		</property>
		<property name="advertismentservice">
			<ref bean="advertismentservice"/>
		</property>
	</bean>
</beans>
 

在上面的applicationContext.xml 的配置文件中,特别是注意一下之间的依赖注入的关系。

题目说的是对系统的一些看法,但是却罗列了applicationContext.xml和web.xml。

这次说一下DAO吧

1)系统中DAO的设计

DAO大家都明白,这个是最底层(当然是相对的最底层~~),是直接与数据库打交道的,包括对数据库的增删修等操作。

很多的时候,我们是需要写一个操作基类(BaseDAO),然后所有的其他的类继承这个基类进行操作,如果基类的方法不够,则可以进行相应的扩展(即再写一下自己的方法,完善对应模块的基类)

在这儿写一下一个自己不熟悉的一种基类的方式(或者说是一种思路)

1)首先,先写一个基类的接口

public interface IGenericDAO<T, PK extends Serializable> {
	public abstract void save(T entity);
	public abstract void update(T entity);
	public abstract void delete(T entity);
	public abstract void deleteById(PK id);
	public void deleteAll(List<T> list) ;
	public abstract void saveOrUpdate(T entity);

	public abstract T findById(PK id) ;
	public List<T> findByExample(T exampleInstance) ;
	public List<T> findByExample(T exampleInstance, String[] excludeProperty) ;
	public List<T> findByProperty(String propertyName,final Object value) ;
	public List<T> findByProperty(String propertyName,final Object value, String orderBy, boolean isAsc) ;
	public List<T> findByTimeAndOther(String timeProperty,String sTime,String eTime,String [] propertyName,Object... values) ;
	public List<T> findByPropertys(String[] propertyNames, final Object[] values, int [] rowStartIdxAndCount, String orderType,String connType,boolean isPrecise) ;
	public abstract List<T> findAll() ;
	public  List<T> findAll( String orderBy, boolean isAsc) ;
	public List<T> findByTime(String propertyName,final String startValue,final String endValue);
	public List<T> findByTime(String propertyName, final String startValue,
			final String endValue ,String orderProperty, boolean isDesc) ;
	public  List<T> findByMax(String propertyName);
	public List<T> findByCriteria(Criterion... criterion) ;
	public List<T> findByCriteria(String orderBy, boolean isAsc,Criterion... criterion) ;
	public List<T> find(String hql, Object... values) ;
	public PaginationSupport findPageByPropertys(String[] propertyNames, final Object[] values, int [] rowStartIdxAndCount, String orderType,String connType,boolean isPrecise,int pageIndexCount) ;
	public void updateByHql(String hqlUpdate);
	
	public int searchCountsByHql(String hql, Object... values);
	
	public List<T> getEntityBySql(String sql) ;
	
	public List<T> searchBySql(String sql);
	public void deleteOrUpdateBySql(String sql);
	public int searchCountsBySql(String sql);
	public int findPageSize(String sql);
	public List<T> findBysqls(String sql, int[] rowStartIdxAndCount) ;
	public List<T> getFixedResultsBySql(String sql,int[] indexAndCount);

	public int updateByProcedure(String tableName, String value,String oldValue, String startTime,String endTime);
	
	public List<T> getLatestResult(String propertyName,final Object value, String orderBy, boolean isAsc,int[] indexAndCount);
}

2)写完这个基类的接口,则必须要写相应的实现类

public class GenericDAO<T, PK extends Serializable> extends HibernateDaoSupport
		implements IGenericDAO<T, PK> {
	private Class<T> entityClass;

	private String className;

	protected QueryTool queryTool;
	protected CalculateTool calculateTool;

	// private static final Logger logger = Logger.getAnonymousLogger() ;
	@SuppressWarnings("unchecked")
	public GenericDAO() {
		// 通过范型反射,取得子类中定义的entityClass.
		this.entityClass = (Class<T>) ((ParameterizedType) getClass()
				.getGenericSuperclass()).getActualTypeArguments()[0];
		className = entityClass.getSimpleName();
		queryTool = new QueryTool(entityClass, className);
		calculateTool = new CalculateTool(entityClass, className);
	}

	public GenericDAO(Class<T> class1, SessionFactory sessionFactory) {
		this.entityClass = class1;
		className = entityClass.getSimpleName();
		this.setSessionFactory(sessionFactory);
		queryTool = new QueryTool(entityClass, className);
		calculateTool = new CalculateTool(entityClass, className);
	}


	public void save(T entity) throws DataAccessException {
		super.getHibernateTemplate().save(entity);
	}


	public void update(T entity) throws DataAccessException {
		Assert.notNull(entity);
		super.getHibernateTemplate().update(entity);
	}


	public void saveOrUpdate(T entity) throws DataAccessException {
		Assert.notNull(entity);
		super.getHibernateTemplate().saveOrUpdate(entity);
	}


	public void delete(T entity) throws DataAccessException {
		Assert.notNull(entity);
		super.getHibernateTemplate().delete(entity);
		getHibernateTemplate().flush();
	}

	
	@SuppressWarnings("unchecked")
	public void deleteById(PK id) throws DataAccessException {
		super.getHibernateTemplate().delete(
				getHibernateTemplate().load(entityClass, id));
	}


	@SuppressWarnings("unchecked")
	public void deleteAll(List<T> list) throws DataAccessException {
		super.getHibernateTemplate().deleteAll(list);
	}
 

(当然还有很多方法的实现,但是在这儿就不写了)

这样一个基类就写完了,以后要做的就是继承它了,别忘了用接口哟~~~

猜你喜欢

转载自zlbcdn.iteye.com/blog/1126712