学习框架也有一段时间了,每天来来回回地也要在myeclipse或是eclipse上把三大框架整合几遍,今天做个小结,以方便以后复习。
昨天刚下载了MyEclipse 10.7版本的,今天就拿过来试试手吧。MyEclipse这个工具就我个人使用感觉吧,集成了很多插件和类库确实方便很多,但是性能太差。原本就对于eclipse启动服务器的速度颇有微词,用了MyEclipse后,嚯,启动一个tomcat的间隙我可以泡杯茶了。
开始。首先建好项目,建立一个数据连接,如果看不到DB Browser,可以在上面菜单栏window-->show view-->other-->MyEclipse Database-->选中DB Browser。然后new 一个数据库连接,这一步因人而异,你要选择什么数据库工具,添加对应的jar包,连接账号密码等等。
接着添加能力:右键-->MyEclipse-->Add * Capabilities,对于这一步,我习惯性的是先添加SpringCapabilities-->然后添加HibernateCapabilities-->接着从DB Browser里选中要使用的数据表reverse成POJO类-->最后添加StrutsCapabilities,这些过程要注意的有几点:允许使用全注解,hibernate配置交给spring管理,添加StrutsCapabilities时要remove掉一个会导致重复的包。
接下来重点在于几个配置文件的编写,下面我直接在代码段里解释说明:
首先是web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 <display-name></display-name> 8 9 <welcome-file-list> 10 <welcome-file>index.jsp</welcome-file> 11 </welcome-file-list> 12 13 <!-- 定义了要装入的 Spring 配置文件 --> 14 <context-param> 15 <param-name>contextConfigLocation</param-name> 16 <param-value>/WEB-INF/classes/applicationContext.xml</param-value> 17 </context-param> 18 19 <!-- 监听器 --> 20 <listener> 21 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 22 </listener> 23 24 <!-- 核心控制器 --> 25 <filter> 26 <filter-name>struts2</filter-name> 27 <filter-class> 28 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 29 </filter-class> 30 </filter> 31 <filter-mapping> 32 <filter-name>struts2</filter-name> 33 <url-pattern>/*</url-pattern> 34 </filter-mapping> 35 36 </web-app>
接下来是struts.xml的配置:
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> 3 <struts> 4 5 <!-- 默认所有的结果页面都存储在WEB-INF/content下 --> 6 <constant name="struts.convention.result.path" value="/" /> 7 8 <!-- 默认继承的包 --> 9 <constant name="struts.convention.default.parent.package" value="default-package" /> 10 11 <!-- 支持json,最近常用easyui,所以对json型返回结果的支持就必不可少了 --> 12 <package name="default-package" extends="json-default"> 13 <!-- 基于paramsPrepareParamsStack,增加store interceptor保证actionMessage在redirect后不会丢失 --> 14 <interceptors> 15 <interceptor-stack name="crudStack"> 16 <interceptor-ref name="store"> 17 <param name="operationMode">AUTOMATIC</param> 18 </interceptor-ref> 19 <interceptor-ref name="paramsPrepareParamsStack" /> 20 </interceptor-stack> 21 </interceptors> 22 23 <default-interceptor-ref name="crudStack" /> 24 </package> 25 26 </struts>
然后就是最重要也是最复杂的applicationContext.xml的配置:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans 3 xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:p="http://www.springframework.org/schema/p" 6 xmlns:context="http://www.springframework.org/schema/context" 7 xmlns:aop="http://www.springframework.org/schema/aop" 8 xmlns:tx="http://www.springframework.org/schema/tx" 9 10 xsi:schemaLocation=" 11 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 12 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 13 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 14 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 15 "> 16 17 <!-- 定义受环境影响易变的变量 --> 18 <bean 19 class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 20 <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 21 <property name="ignoreResourceNotFound" value="true" /> 22 <property name="locations"> 23 <list> 24 <!-- 标准配置 --> 25 <value>classpath*:/application.properties</value> 26 </list> 27 </property> 28 </bean> 29 30 31 <bean id="dataSource" 32 class="org.apache.commons.dbcp.BasicDataSource"> 33 <!-- 连接信息 --> 34 <property name="driverClassName" value="${jdbc.driver}" /> 35 <property name="url" value="${jdbc.url}" /> 36 <property name="username" value="${jdbc.username}" /> 37 <property name="password" value="${jdbc.password}" /> 38 39 <!-- 连接池信息 --> 40 <property name="maxIdle" value="${dbcp.maxIdle}" /> 41 <property name="maxActive" value="${dbcp.maxActive}" /> 42 <property name="defaultAutoCommit" value="false" /> 43 <property name="timeBetweenEvictionRunsMillis" value="3600000" /> 44 <property name="minEvictableIdleTimeMillis" value="3600000" /> 45 </bean> 46 47 </bean> 48 <bean id="sessionFactory" 49 class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 50 <property name="dataSource"><ref bean="dataSource" /></property> 51 <property name="hibernateProperties"> 52 <props> 53 <prop key="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</prop> 54 <prop key="hibernate.show_sql">true</prop> 55 <prop key="hibernate.hbm2ddl.auto">update</prop> 56 <prop key="hibernate.query.substitutions">true 1, false 0, yes ‘Y‘, no ‘N‘</prop> 57 </props> 58 </property> 59 60 <!-- 配置自动扫描包下的实体,也可使用annotatedClasses属性进行单个实体配置--> 61 <property name="packagesToScan" value="com.ssh.entity"></property> 62 63 </bean> 64 65 <!-- 配置事务管理器 --> 66 <bean id="transactionManager" 67 class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 68 <property name="sessionFactory" ref="sessionFactory"></property> 69 </bean> 70 71 <!--加载事务管理器 --> 72 <tx:annotation-driven transaction-manager="transactionManager"/> 73 74 <!-- 使Spring关注Annotation --> 75 <context:annotation-config /> 76 77 <!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 --> 78 <context:component-scan base-package="com.ssh.daoImpl,com.ssh.serviceImpl" /> 79 80 </beans>
还有就application.properties 和 log4j.properties 文件的配置,个人认为比较简单,代码就不贴了。
在开发过程中,我还习惯给dao层建立一个基类BaseHibernateDao.java,主要作用是来提供session对象,方便后面各种使用,代码贴出来:
1 public class BaseHibernateDao { 2 3 @Autowired 4 private SessionFactory sf; 5 6 public Session getSession(){ 7 8 return sf.getCurrentSession(); 9 } 10 }
除此之外,最近还学到了为控制层建立一个基类BaseAction.java,主要作用是来提供ServletContext,HttpServletRequest,HttpServletResponse,HttpSession 对象:
1 public class BaseAction extends ActionSupport implements ServletContextAware,ServletRequestAware,ServletResponseAware,SessionAware{ 2 3 private ServletContext servletContext; 4 private HttpServletRequest httpServletRequest; 5 private HttpServletResponse httpServletResponse; 6 private HttpSession httpSession; 7 private Map<String,Object> session; 8 9 public void setServletContext(ServletContext servletContext) { 10 // TODO Auto-generated method stub 11 this.servletContext = servletContext; 12 } 13 14 public void setServletRequest(HttpServletRequest httpServletRequest) { 15 // TODO Auto-generated method stub 16 this.httpServletRequest = httpServletRequest; 17 } 18 19 public void setServletResponse(HttpServletResponse httpServletResponse) { 20 // TODO Auto-generated method stub 21 this.httpServletResponse = httpServletResponse; 22 } 23 24 public void setSession(Map<String, Object> session) { 25 // TODO Auto-generated method stub 26 this.session = session; 27 } 28 }
代码多了看起来好烦躁, 虽然都是些简单的东西,但确实是这些天反复练习认真总结出来的。不管对自己还是对需要学习这些配置的人,总会有点用处吧。再附上一个容易让我自己混淆的问题:以前老是搞不清楚在service里注入一个dao,到底是注入dao接口还是dao实现类,只能一知半解地试。最近得到一个比较好的解答:Spring的注入基于接口实现,基于接口的方式一是可以使得各个组件松耦合,而且也可以轻松的替代某一组件。所以应该将组件引用改为接口方式。
明后两天准备研究一下Hibernate的主键生成策略,在这个问题上还有一些不能理解的东西,希望深入了解能够找到答案并在这里分享出来。