这是我的第一篇OA总结博客,介绍了的是第一天的学习,第1集到第10集.学习的内容,就是了解什么是OA,以及开始做OA的项目,首先是搭环境,用的开发环境是MyEclipse,数据库是MySQL,框架采用的SSH.搭环境主要做的就是,建立数据库,并将SSH搭建起来,做法是先将struts2,hibernate和spring的jar包和配置文件都准备好,然后先分别测试这struts2和spring单独都是可用的;然后整合,测试也是可用的,并且说明与spring整合的好处.最后,就是将hibernate给整合进来,这样整个SSH就搭起来了.
其中,对OA的了解,什么是OA?OA就是办公自动化OfficeAutomation的缩写,利用电脑进行全自动办公,使用这个,可以提高办公的效率.
然后就是写OA项目,先是搭OA环境,过程就和上面描述的差不多。
建立数据库
首先,在mysql中创建数据库,名为itcast0720.创建的数据库的语句为,并默认设置为utf-8编码,但是数据库中是写utf8,不带"-".
create database itcast0720 default character set utf8;
查看创建的数据库的是:
show create databaseitcast0720;
效果就是这样的.
OA项目
然后是建立MyEclipse项目.在MyEclipse中创建web项目,“ItcastOA”,并且设置编码为utf-8,之后建立的jsp页面也要改为utf-8,用于防止乱码.
JUnit
然后第一步是将struts2搭起来,而由于由于最开始需要进行单元测试来测试struts是否真的可以用.所以需要添加JUnit,而MyEclipse只需要在项目右击BuildPath(构建路径)-->Add Libraries..(添加库)-->JUnit-->JUnit4(因为JUnit4是支持注解的),这样就能使用JUnit了.
添加Struts2
然后添加struts2(struts2的版本是struts-2.1.8.1)需要引入jar包和struts.xml和web.xml文件.
找jar包的话,可以通过找struts2提供的任意一个示例war,里面的jar就可以符合要求.
而jar包包含:commons-fileupload文件上传下载,commons-io,文件输入输出;freemarker,模板引擎,ognl:struts2默认使用的表达式语言,还有就是必不可以少的核心包:struts2-core,以及xwork-core,struts2是在xwork的基础上开发的.这篇文章说明了【struts2】五大核心jar包和作用,和这个引用的jar略有不同.
然后在示例的中可以找到web.xml文件,以及src下找到struts.xml.将struts.xml拷贝到ItcastOA的src下,而web.xml则放在WEB-INF下.
对于web.xml,最开始的时候的配置是这些,这个不用记,只要会拷贝就行.
其中需要配置了struts2的过滤器,这样/*的配置,表示所有的请求过来,都需要被StrutsPrepareAndExecuteFilter过滤器处理.
<?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">
<!-- 配置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>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
而struts.xml则需要将devMode配置为开发模式,还有将扩展名配置为action,以及将主题配置为simple.而这些配置在struts2-core包的default.properties资源文件中都能找到.然后是一个空的package,可以配置action。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<!-- 配置为开发模式 -->
<constant name="struts.devMode" value="true" />
<!-- 把扩展名配置为action -->
<constant name="struts.action.extension" value="action" />
<!-- 把主题配置为simple -->
<constant name="struts.ui.theme" value="simple" />
<package name="default" namespace="/" extends="struts-default">
</package>
<!-- Add packages here -->
</struts>
添加Hibernate
添加完了struts2,接下来添加Hibernate,过程也是一样,先添加jar包,然后添加配置文件hibernate.cfg.xml,以及映射文件*.hbm.xml(若用注解,则不用),顺便拷贝了log4j.properties的资源文件.
其中Hibernate需要的jar包为:Hibernate的核心包,hibernate3.jar,以及在hibernate的lib下的required下的所有jar包,包括antlr,commons-collections,dom4j,javassist,jta和slf4j,还有lib下的jpa下的hibernate-jpa,以及lib下的optional下的c3p0数据库连接池,以及mysql的驱动,mysql-connector-java.一共10个jar包.
拷完jar之后,拷配置文件,找到将log4j.properties,hibernate.cfg.xml,以及User.hbm.xml(映射文件找到任意一个就可以了)放到src下.
然后开始配置hibernate.cfg.xml文件,在hibernate中配置方言为mysql,数据库连接itcastoa0720,用户名和密码为对应的,以及配置显示sql语句,和配置为自动更新表.
<!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.url">jdbc:mysql://localhost:3306/itcastoa0720</property>
<property name="connection.driver_class">com.jdbc.mysql.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!-- 其他配置 -->
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!-- 导入映射文件 -->
<mapping resource="cn/itcast/oa/domain/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
hibernate.cfg.xml配置好了,User.hbm.xml先不管,log4j.properties也先不配置.
添加Spring
最后就是添加spring了,还是jar包和配置文件applicationContext.xml
先是jar包:spring核心包,spring.jar,以及spring的lib下的aspectj的切面jar包,aspectjrt和aspectjweaver,以及lib下的动态代理cglib,cglib-nodep包,和lib下的jakarta-commons的日志commons-logging包.一共5个jar包.
而配置文件applicationContext.xml,最开始只需要配置一下自动扫描的包,包含他的子包,所以该包以及其子包下的类都会被扫描到,只要在类上写了交由容器管理的注解,就能自动装配成bean.
<?xml version="1.0" encoding="UTF-8"?>
<!--
- Middle tier application context definition for the image database.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
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">
<!-- 自动扫描与装配bean -->
<context:component-scan base-package="cn.itcast.oa"></context:component-scan>
</beans>
测试struts2可用
测试struts2可用,因为测试struts2,需要启动tomcat,让请求经过过滤器的过滤.所以建立Action类,TestAction,继承ActionSupport,写上执行方法,返回"success"字符串.
package cn.itcast.oa.test;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
@Override
public String execute() throws Exception {
System.out.println("-->TestAction:execute()");
return "success";
}
}
然后建立一个test.jsp页面,在里面写上一句"struts2添加成功!".
然后,配置struts.xml文件,添加一个action,写上name为test,写全类名,因为没有整合spring.然后接收到result为success,会跳转到test.jsp页面上.就可以看到"struts2添加成功!".
<package name="default" namespace="/" extends="struts-default">
<!-- 配置测试用的Action(未与spring整合,class属性写类的全名) -->
<action name="test" class="cn.itcast.oa.test.TestAction" >
<result name="success">/test.jsp</result>
</action>
</package>
最后,配置好Tomcat,启动测试.效果如下图.路径写的test.action,经过了容器的过滤器,在struts.xml的action配置中找到了TestAction,执行了方法,返回了"success",action又接收了result,跳转到了test.jsp页面.所以测试struts2是可用的.
测试Spring可用
测试Spring的效果就不用启动tomcat了.可以写一个测试类SpringTest,测试spring是否可用.spring需要读取他自己的配置文件applicationContext.xml,扫描包.将他们声明为bean,然后可以使用.
public class SpringTest {
private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
@Test
public void testBean() throws Exception {
TestAction testAction =(TestAction) ac.getBean("testAction");
System.out.println(testAction);
}
}
在这段代码中将刚刚的testAction,放到容器中,然后就可以拿到,但是需要将TestAction写上注解,表示要把他放到容器中,交由容器管理,然后才可以拿到.
@Controller
public class TestAction extends ActionSupport {
}
其中,这4个注解的作用都是声明一个bean.@Controller,@Component,@Service和@Repository.他们可以写成@Controller("testAction")这种,不写默认也是这种类名首字母小写的.
最后效果是这样的.打印了该类出来,说明通过ac拿到了该对象,Spring也是可用的.
整合Struts2和Spring
现在证明这两个都是可用的了,可以将他们整合了.整合的步骤为2个,在(struts的)web.xml中配置Spring的监听器,这样在web容器启动的时候,就会自动装配ApplicationContext的配置信息,就可以将bean放到spring容器中了.以及要加一个spring和struts整合的插件jar.
在web.xml文件中,加上这一段.需要配置listener-class,以及在配置context-param,这种参数是存放在servletcontext中,范围是application的.这样配置完了,就会加载根目录下的applicationContext*.xml文件了.
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</context-param>
而jar包是在struts的lib中,struts2-spring-plugin包,这个插件包就是将spring和struts2整合的.
然后测试效果,不要忘了,将test的class改为testAction,这个就是在spring容器中的TestAction的beanName.
<!-- 配置测试用的Action(未与spring整合,class属性写类的全名) -->
<!-- <action name="test" class="cn.itcast.oa.test.TestAction" > -->
<!-- 当struts和spring整合后,class属性可以写bean的名称 -->
<action name="test" class="testAction" >
<result name="success">/test.jsp</result>
</action>
这样Spring和struts就整合完毕了.在test.jsp中,再添加一句"struts2与spring整合成功!".
启动tomcat之后,效果为下图,说明整合成功了.因为通过testAction,找到TestAction,就能说明Spring成功了.
为什么要整合Spring和Struts.因为Spring提供IoC,依赖注入可以用来管理对象,就不用自己new了,Spring就可以注入了.还有AOP,面向切面编程,可以管理事务和日志.这样,结合之后,struts就能更好的做自己的事情.
而Hibernate与Spring整合,就可以让容器管理单例的SessionFactory,并且让Spring来管理事务,就不用管事务的开关和commit和回滚了.
Spring与Hibernate整合
Spring与hibernate整合,就需要配置比较多的东西了。需要在spring的配置文件applicationContext.xml中配置sessionFactory.并且在sessionFactory中配置了数据源,而原本配置Hibernate中的数据源,则注释掉.
在applicationContext.xml添加如下配置.其中因为数据源配置,导入了外部的properties资源文件.并且配置了configLocation会去找hiberante.cfg.xml.而数据源的配置,加了很多优化性能的配置(这个我还不会,只会拷贝).
<!-- 导入外部的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="jdbcUrl" value="${jdbcUrl}"></property>
<property name="driverClass" value="${driverClass}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<!-- 其他配置 -->
<!-- 初始化时获取三个连接,取值应在minPoolSize和maxPollSze之间.Default:3 -->
<property name="initialPoolSize" value="3"></property>
<!-- 连接池中保留的最小的连接数.Default:3 -->
<property name="minPoolSize" value="3"></property>
<!-- 连接池中保留的最小的连接数.Default:15 -->
<property name="maxPoolSize" value="15"></property>
<!-- 当l连接池中的连接耗尽的时候c3p0一次同时获取的连接数.Default:3 -->
<property name="acquireIncrement" value="3"></property>
<!-- 控制数据源内加载的PreparedStatements数量.如果maxStatements与maxStatementPerConnection均为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>
而且为了数据源为了更好配置,采用了资源文件配置.建立了数据库配置的资源文件,jdbc.properties.
这样就配置好了SessionFactory了,测试是否可用.在SpringTest的测试类中,再加一个方法,只要注入了sessionFactory,就是配置好了sessionFactory了.
@Test
public void testSessionFactory() throws Exception {
SessionFactory sessionFactory = (SessionFactory) ac.getBean("sessionFactory");
System.out.println(sessionFactory);
}
然后继续配置事务
,
在
applicationContext
.xml
添加最后一段代码
,
配置声明式事务管理
,
并且是采用注解的
.<!-- 配置声明式事务管理(采用注解的方式) -->
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<tx:annotation-driven transaction-manager="txManager" />
最后测试事务,如何测试.就是往数据库中写入2条记录,若是一条有效一条无效时,因为事务,回滚,不写入记录;若是2条有效时,才写入2条记录.所以要写入数据库中,要建立实体.并且要写一个Service方法,在里面写上保存2条记录的方法.
先建立最简单的实体User和写他的映射文件.
public class User {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
User.hbm.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="cn.itcast.oa.domain">
<class name="User" table="itcast_user">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
</class>
</hibernate-mapping>
最后在hibernate.cfg.xml将映射文件,添加进去,其实我在上面已经写好了.
<mappingresource="cn/itcast/oa/domain/User.hbm.xml" />
接着是写TestService类,@Service表示放到容器中,并且注入sessionFactory,获取到当前的session,用session来保存对象,其中添加一句int a=1/0,除0的会抛异常的代码,开了事务之后,抛异常就会回滚,不能写入数据库中.
@Service
public class TestService {
@Resource
private SessionFactory sessionFactory;
@Transactional
public void saveTwoUsers() {
Session session = sessionFactory.getCurrentSession();
session.save(new User());
//int a= 1/0;
session.save(new User());
}
}
最后SpringTest的测试事务的方法,从容器中获取TestService对象,并执行他的saveTwoUsers的方法.(若不明白为什么做上面的操作,从这往上看可能更好懂)
@Test
public void testTransaction() throws Exception {
TestService testService = (TestService) ac.getBean("testService");
testService.saveTwoUsers();
}
最后效果,表明事务成功.其中1不在就是因为保存1的时候是成功了的,但是因为异常导致回滚,没有写入数据库中.所以1被占掉了,下次成功的2,3就进入了数据库中了.
SSH整合
其实上面已经说明整合好了,因为Spring和Hibernate已经整合的,可以写入数据库中了.但是还是在进行一次大整合.在TestAction中,调用testService的saveTwoUsers方法,若能写入数据,就表示SSH整合完成了
@Controller
public class TestAction extends ActionSupport {
@Resource
private TestService testService;
@Override
public String execute() throws Exception {
System.out.println("-->TestAction:execute()");
testService.saveTwoUsers();
return "success";
}
}
在
test
.jsp
写上
,
"
struts2
与
spring
与
hibernate
整合成功!
".
最后效果,显示SSH整合成功,并且数据插入数据库了.
将资源文件进行分类
建立源文件test,将所有的测试类放入;建立源文件config,将所有的配置文件放入;将实体和映射文件放到domain包中;将Service的接口放到service包中,奖Service的实现放到service的impl中;将action放到view中;还有dao和dao的impl以及util的工具类.
还有在WebRoot中建立script,style文件夹,并且将images也放到style文件中,图片也是一种样式,将所有的js脚本文件放到script中,将所有样式css和图片都放到style文件中.而jsp放在WEB-INF下的jsp文件夹中,这样外面不通过Action转发就无法直接访问jsp.在jsp文件夹中每个Action就建立一个文件夹.
这样就可以将文件更有条理的管理好了.
以上就是OA第一集到第10集的内容.不整理不知道,一整理吓一跳,这也太多了,我是不是应该删减点.不过相信有了这篇文章,我以后建立SSH框架,应该是分分钟的事吧.缺点就是太多,太啰嗦了.
所以总结一下:里面的知识点就是,搭建SSH框架,需要导入struts2,spring,hibernate各自的jar包,以及他们的配置文件.
以及他们的测试:测试stuts需要启动tomcat(服务器);测试spring用可以从applicationContext中根据beanName获取到bean,所以不用启动tomcat;测试hibernate需要将数据写入数据库中;测试事务,需要写入数据库中,做2次,有问题就回滚,没问题就都写入数据库中。
以上是我第一天的学习总结,内容有些长,不过,相信之后的总结,会短些的。