SSH(Struts2 + Hibernate + Spring)环境的搭建
2015-10-19 19:58
429 查看
SSH(Struts2 + Hibernate + Spring)环境的搭建 1、创建数据库,要注意编码 1,使用MySql数据库。 2,创建数据库时,要注意编码要支持中文。 3,建表语句如下: create database oa default character set utf8; show create database oa; 2、新建Web工程并进行配置 配置文件的默认编码: 1,设置工程的默认编码为UTF-8。 2,配置JSP的默认编码为utf-8 3、运行环境的搭建(ssh) (一)jar包: 1,环境为:jdk7.0、JavaEE_5.0 2,Struts-2.1.8.1 1,添加 ${Struts2_Home}/apps/struts2-blank-2.1.8.1.war/WEB-INF/lib/*.jar 2,添加struts2-spring整合插件的jar:${Struts2_Home}/lib/struts2-spring-plugin-2.1.8.1.jar 3,Hibernate-3.6 1,添加 ${HIBERNATE_HOME}/hibernate3.jar 2,添加 ${HIBERNATE_HOME}/lib/required/*.jar 3,添加 ${HIBERNATE_HOME}/lib/jpa/hibernate-jpa-2.0-api-1.0.0.Final.jar 4,Spring-2.5.6 1,添加 ${SPRING_HOME}/dist/spring.jar 2,添加 ${SPRING_HOME}/lib/aspectj/*.jar(共2个) 3,添加 ${SPRING_HOME}/lib/c3p0/c3p0-0.9.1.2.jar 4,添加 ${SPRING_HOME}/lib/cglib/cglib-nodep-2.1_3.jar 5,添加 ${SPRING_HOME}/lib/jakarta-commons/commons-logging.jar 5,Jdbc 1,添加 JDBC 驱动包,mysql-connector-java-5.1.5-bin.jar 6,日志 1,添加 slf4j-api-1.5.0.jar、slf4j-log4j12-1.5.0.jar、log4j-1.2.15.jar 7,Junit4 1,添加 junit.jar、org.hamcrest.core_1.1.0.v20090501071000.jar 8,MD5摘要 1,添加 ${SPRING_HOME}/lib/jakarta-commons/commons-codec.jar (二)配置文件: Struts-2.1.8.1: struts.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN" "http://struts.apache.org/dtds/struts-2.1.7.dtd"> <struts> <!-- 设置开发模式 --> <constant name="struts.devMode" value="true" /> <!-- 把action扩展名配置为action --> <constant name="struts.action.extension" value="action" /> <!-- 指定主题使用simple(默认值为xhtml) --> <constant name="struts.ui.theme" value="simple" /> <!-- 可以把相关的action都放在一个package中,以便于管理,形成模块 --> <package name="test" namespace="/" extends="struts-default"> <!-- 配置测试用的Action,未与Spring整合,class属性写类的全名 --> <action name="TestAction" class="com.jxn.oa.test.TestAction"> <result name="success">/WEB-INF/test/test.jsp</result> </action> <!-- 当Struts2与Spring整合后,class属性可以写bean的名称 --> <!-- <action name="TestAction" class="testAction"> <result name="success">/WEB-INF/test/test.jsp</result> </action> --> </package> </struts> hibernate3.6: hibernate.cfg.xml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 配置数据库信息 --> <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/test</property> <property name="connection.username">root</property> <property name="connection.password">root</property> <!-- 在创建SessionFactory的时候,如果表不存在,则创建新表 --> <property name="hbm2ddl.auto">update</property> <property name="show_sql">true</property> <mapping resource="com/jxn/oa/test/TestUser.hbm.xml" /> </session-factory> </hibernate-configuration> Spring2.5.6: applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> <!-- 自动扫描与装配bean --> <context:component-scan base-package="com.jxn.oa"></context:component-scan> <!-- 导入外部的properties文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- 配置SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!-- 指定hibernate的配置文件位置 --> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <!-- 配置c3p0数据库连接池 --> <property name="dataSource"> <bean class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 数据连接信息 --> <property name="driverClass" value="${jdbc.driverClassName}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- 其他配置 --> <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> <property name="initialPoolSize" value="3"></property> <!--连接池中保留的最小连接数。Default: 3 --> <property name="minPoolSize" value="3"></property> <!--连接池中保留的最大连接数。Default: 15 --> <property name="maxPoolSize" value="5"></property> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement" value="3"></property> <!-- 控制数据源内加载的PreparedStatements数量。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 --> <property name="maxStatements" value="8"></property> <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 --> <property name="maxStatementsPerConnection" value="5"></property> <!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> <property name="maxIdleTime" value="1800"></property> </bean> </property> </bean> <!-- 配置声明式事务管理器(采用注解的方式) --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 配置基于注解的事务支持--> <tx:annotation-driven transaction-manager="txManager"/> </beans> ---------------------- jdbc.properties配置文件的内容 ------------------------ jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/oa jdbc.username=root jdbc.password=root #jdbc.driverClassName=oracle.jdbc.OracleDriver #jdbc.url=jdbc:oracle:thin:@localhost:1521:oa #jdbc.username=scott #jdbc.password=tiger web.xml 配置struts2: <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 整合 Spring2.5.6 与 Struts2.1.8.1 1,在web.xml配置监听器 <!-- 配置Spring用于初始化容器对象的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 指定Spring的配置文件的位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext*.xml</param-value> </context-param> 2,拷贝一个用于整合的jar包(与Spring整合用的一个插件) struts-2.1.8.1/lib/struts2-spring-plugin-2.1.8.1.jar 配置 spring的OpenSessionInView过滤器(解决抛LazyInitializationException的问题,一定要配置到struts过滤器的前面) 1,配置 <!-- 配置 spring 的 OpenSessionInView 过滤器 --> <filter> <filter-name>OpenSessionInView</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInView</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> 2,LazyInitializationException异常说明 1,对于集合属性,默认是lazy="true"的,在第一次使用时才加载。 2,但在加载时,如果Session已经关掉了就会抛LazyInitializationException异常 web.xml: <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- 配置Spring的用于初始化容器对象的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 指定Spring的配置文件的位置 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext*.xml</param-value> </context-param> <!-- 配置Struts2的核心的过滤器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> 4、测试已搭建好的环境 单独测试struts2: 注:在spring和struts2整合前(即添加struts2-spring-plugin-2.1.8.1.jar包和配置Spring的用于初始化容器对象的监听器之前)测试 public class TestAction extends ActionSupport{ @Override public String execute() throws Exception { System.out.println("------->TestAction.execute()!"); return super.execute(); } } 在浏览器地址栏输入http://localhost:8080/OA/TestAction.action即可测试 单独测试hibernate: 注:当创建SessionFactory的时候,hibernate生成相应的数据库表 public class TestSessionFactory { @Test public void test() throws Exception { Configuration cfg = new Configuration().configure(); SessionFactory sessionFactory = cfg.buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); TestUser user = new TestUser(); session.save(user); tx.commit(); session.close(); } } 单独测试spring: 注:在applicationContext.xml文件中只添加<context:component-scan base-package="com.jxn.oa"></context:component-scan>,其他的不要写 在TestAction上添加@Controller和@Scope("prototype"), public class SpringTest { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); @Test public void testBean() throws Exception { TestAction testAction = (TestAction) ac.getBean("testAction"); System.out.println(testAction); } } 测试spring和struts2的整合: 1,在web.xml配置监听器(查文档:Spring Reference --> 15.2 Common configuration) <!-- 配置Spring的用于初始化容器对象的监听器 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext*.xml</param-value> </context-param> 2,拷贝一个用于整合的jar包(与Spring整合用的一个插件) struts-2.1.8.1/lib/struts2-spring-plugin-2.1.8.1.jar 3,测试 <!-- 当Struts2与Spring整合后,class属性可以写bean的名称 --> <action name="TestAction" class="testAction"> <result name="success">/WEB-INF/test/test.jsp</result> </action> 其它同单独测试struts2的方法一样,在浏览器地址栏输入http://localhost:8080/OA/TestAction.action即可测试 测试spring和hibernate的整合: 测试sessionFactory 1,在applicationContext.xml中配置SessionFactory: 第一:设置hibernate配置文件的位置configLocation 第二:设置数据库连接池dataSource 第三:导入外部的properties文件 <!-- 配置SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <!-- 指定hibernate的配置文件位置 --> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> <!-- 配置c3p0数据库连接池 --> <property name="dataSource"> <bean class="com.mchange.v2.c3p0.ComboPooledDataSource"> <!-- 数据连接信息 --> <property name="driverClass" value="${jdbc.driverClassName}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <!-- 其他配置 --> <property name="initialPoolSize" value="3"></property> <property name="minPoolSize" value="3"></property> <property name="maxPoolSize" value="5"></property> <property name="acquireIncrement" value="3"></property> <property name="maxStatements" value="8"></property> <property name="maxStatementsPerConnection" value="5"></property> <property name="maxIdleTime" value="1800"></property> </bean> </property> </bean> <!-- 导入外部的properties文件 --> <context:property-placeholder location="classpath:jdbc.properties"/> ---------------------- jdbc.properties配置文件的内容 ------------------------ jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/oa jdbc.username=root jdbc.password=root 2,测试 @Test public void testSessinFactory() { SessionFactory sessionFactory = (SessionFactory) ac.getBean("sessionFactory"); System.out.println(sessionFactory); } 测试transaction 1,在applicationContext.xml中配置事务管理器transactionManager,并且配置基于注解的事务支持 <!-- 配置声明式事务管理器(采用注解的形式) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 配置基于注解的事务支持 --> <tx:annotation-driven transaction-manager="transactionManager"/> 2,测试 @Test public void testTransaction() { TestService testService = (TestService) ac.getBean("testService"); testService.saveTwoUsers(); } @Service public class TestService { @Resource SessionFactory sessionFactory; @Transactional public void saveTwoUsers() { Session session = sessionFactory.getCurrentSession(); session.save(new User()); //int i = 1 / 0; //这里会抛异常 session.save(new User()); } } SSH整合测试: @Controller @Scope("prototype") public class TestAction extends ActionSupport{ @Resource TestService testService; @Override public String execute() throws Exception { System.out.println("------->TestAction.execute()!"); testService.saveTwoUsers(); return super.execute(); } } 5,关于日志 debug 调试信息 info 一般信息 warn 警告 error 错误 fatal 严重错误 log4j.properties: ### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels ### log4j.rootLogger=error, stdout #log4j.logger.org.hibernate=info log4j.logger.com.jxn.oa=debug
相关文章推荐
- Java中类的成员访问的四种控制方式总结
- java异常概述
- Java的序列化ID的作用
- [Eclipse]快捷键
- Java中子类是否可以继承父类的static变量和方法而呈现多态特性
- Mybatis系列之实战篇(中)
- struts2之ModelDriven
- MyEclipse利用自定义模板生成hibernate的dao或实体
- java基础学习笔记——集合框架
- spring-session实例
- java stack
- Java Enum(枚举类型)的几种使用方法
- 论C# java的基本类型
- Java垃圾回收机制
- JAVA - 多线程 - 生产者与消费者
- [leetcode-295]Find Median from Data Stream(java)
- 从JVM内存管理的角度谈谈静态方法和静态属性 和 java对象引用与JVM自动内存管理
- 使用Maven管理Spring (引用包介绍)
- String.format()使用方法
- Spring@Autowired注解与自动装配