OA项目(SSH框架搭建)

一、项目前准备工作

1)创建Maven web项目工程,命名为oa,并导入相应jar包

pom.xml 内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.lcy</groupId>
	<artifactId>oa</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
		</plugins>
	</build>

	<dependencies>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.4</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.0</version>
			<scope>provided</scope>
		</dependency>


		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>2.1.8.1</version>
			<exclusions>
				<exclusion>
					<groupId>junit</groupId>
					<artifactId>junit</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.6</version>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>3.0.5.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>3.0.5.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>3.0.5.RELEASE</version>
		</dependency>


		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-spring-plugin</artifactId>
			<version>2.1.8.1</version>
		</dependency>


		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>3.6.10.Final</version>
			<exclusions>
				<exclusion>
					<groupId>org.slf4j</groupId>
					<artifactId>slf4j-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.47</version>
		</dependency>

		<dependency>
			<groupId>cglib</groupId>
			<artifactId>cglib-nodep</artifactId>
			<version>2.1_3</version>
		</dependency>


		<dependency>
			<groupId>com.mchange</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.5.2</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.5.8</version>
			<scope>compile</scope>
		</dependency>



	</dependencies>

</project>

2)创建项目包结构

src/main/java    (源码包)

                     cn.oa.action

                     cn.oa.dao

                     cn.oa.dao.impl

                     cn.oa.model

                     cn.oa.service

                     cn.oa.service.impl

                     cn.oa.util

src/test/java      (测试代码)

                   cn.oa.test


二、Hibernate + Spring 整合

1)创建 hibernate 的主配置文件 --- hibernate.cfg.xml

在 src/main/resources  中创建 hibernate.cfg.xml 文件,内容如下:

<!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>
	
	<!-- 此处不写数据库连接的基本信息, 数据库连接的基本信息在 spring的主配置文件中写 -->
	
	<!-- 配置 hibernate 方言 -->
	<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
	
	<!-- 是否显示 SQL 语句 -->
	<property name="show_sql">true</property>
	<!-- 是否格式化 SQL 语句 -->
	<property name="format_sql">true</property>
	<!-- 自动创建表的策略 -->
	<property name="hbm2ddl.auto">update</property>


</session-factory>
</hibernate-configuration>

2)创建 spring的主配置文件 -- applicationContext.xml

在 src/main/resources  中创建 applicationContext.xml 文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<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-3.0.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">


	<!-- 自动扫描与装配bean -->
	<context:component-scan base-package="cn.oa"></context:component-scan>


	<!-- 加载外部的properties配置文件 -->
	<context:property-placeholder location="classpath:jdbc.properties" />


	<!-- 配置数据库连接池(c3p0) -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<!-- 基本信息 -->
		<property name="jdbcUrl" value="${jdbcUrl}"></property>
		<property name="driverClass" value="${driverClass}"></property>
		<property name="user" value="${username}"></property>
		<property name="password" value="${password}"></property>
		<!-- 其他配置 -->
		<!--初始化时获取三个连接,取值应在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>


	<!-- 配置SessionFactory -->
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
	</bean>


	<!-- 配置声明式的事务管理(采用基于注解的方式) -->
	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	<tx:annotation-driven transaction-manager="transactionManager" />

</beans>

PS:①、spring的主配置文件,主要配置了 包扫描,加载外部配置文件(jdbc.properties), datasource 数据源、 sessionFactory 、使用声明式事务管理 sessionFacory

3)创建外部配置文件 --- jdbc.properties

在 src/main/resources  中创建 jdbc.properties 文件,内容如下:

jdbcUrl		= jdbc:mysql:///oa
driverClass	= com.mysql.jdbc.Driver
username	= root
password	= 123456

4)在mysql 数据库中创建 oa 的数据库,数据库使用 UTF-8字符编码

create database oa default character set utf8;

5)编写 实体类 与 映射描述文件

创建 User 类,内容如下:

package cn.oa.model;

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"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="cn.oa.model">

	<class name="User" table="t_user">
		<id name="id">
            <generator class="native"/>
		</id>
		<property name="name"></property>
		
	</class>
	
</hibernate-mapping>

将 映射描述文件 加入到 hibernate.cfg.xml 主配置文件中

在 hibernate.cfg.xml 中添加

<mapping resource="cn/oa/model/User.hbm.xml" />

6)编写测试代码

编写 Service 类用于测试 事务是否生效

代码如下:

package cn.oa.test;

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.oa.model.User;

@Service
public class ServiceTest {
	@Resource
	private SessionFactory sessionFactory;
	
	@Transactional
	public void saveTwoUsers(){
		Session session = sessionFactory.getCurrentSession();
		session.save(new User());
		session.save(new User());
	}
	
	
}

代码如下:

package cn.oa.test;

import org.hibernate.SessionFactory;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {
	
	private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	
	/**
	 *  测试是否能获取 SessionFactory 对象
	 * @throws Exception
	 */
	@Test
	public void testSessionFactory() throws Exception {
		SessionFactory sessionFactory = (SessionFactory)ac.getBean("sessionFactory");
		System.out.println(sessionFactory);
	}
	
	/**
	 *  测试是否能获取 SessionFactory 对象
	 * @throws Exception
	 */
	@Test
	public void testTransaction() throws Exception {
		ServiceTest serviceTest = ac.getBean("serviceTest", ServiceTest.class);
		serviceTest.saveTwoUsers();
	}
	
}

PS:①、testSessionFactory 测试方法如果能打印出 SessionFactory 对象, 则说明 dataSource 与 sessionFactory 都没有问题

        ②、testTransaction 测试方法做两次,第一次是正常的情况,数据正常插入,第二次在方法执行过程中 抛出异常,观察事物是否回滚。

数据插入成功的截图:

数据插入失败的截图:


三、添加 日志功能

1)导入 jar包,由于在步骤 一中的 pox.xml 文件中已经导入这里就不再重复

2)在 src/main/resources  下,新建  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

### direct messages to file hibernate.log ###
#log4j.appender.file=org.apache.log4j.FileAppender
#log4j.appender.file.File=hibernate.log
#log4j.appender.file.layout=org.apache.log4j.PatternLayout
#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=warn, stdout

#log4j.logger.org.hibernate=info
#log4j.logger.org.hibernate=debug

### log HQL query parser activity
#log4j.logger.org.hibernate.hql.ast.AST=debug

### log just the SQL
log4j.logger.org.hibernate.SQL=debug

### log JDBC bind parameters ###
#log4j.logger.org.hibernate.type=info
#log4j.logger.org.hibernate.type=debug

### log schema export/update ###
#log4j.logger.org.hibernate.tool.hbm2ddl=debug

### log HQL parse trees
#log4j.logger.org.hibernate.hql=debug

### log cache activity ###
#log4j.logger.org.hibernate.cache=debug

### log transaction activity
#log4j.logger.org.hibernate.transaction=debug

### log JDBC resource acquisition
#log4j.logger.org.hibernate.jdbc=debug

### enable the following line if you want to track down connection ###
### leakages when using DriverManagerConnectionProvider ###
#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace

四、Hibernate + Spring + Struts2

1)在 web.xml 中, 添加 Struts2的主过滤器, 配置 Spring 监听器

<!-- 配置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>

<!-- 配置Spring的监听器,用于初始化ApplicationContext对象 -->
	<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>

PS:Struts2的主过滤器 拦截所有请求

2)添加 Struts2的主配置文件

在 src/main/resources 下,新建 struts.xml ,内容如下:

<?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" />

    <package name="default" namespace="/" extends="struts-default">
		
    </package>

</struts>

3)新建 action 类做为 测试Action,内容如下:

package cn.oa.test;

import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionSupport;


@Controller
@Scope("prototype")
public class ActionTest extends ActionSupport{
	@Resource
	private ServiceTest serviceTest;
	
	@Override
	public String execute() throws Exception {
		System.out.println("ActionTest.execute()...");
		serviceTest.saveTwoUsers();
		return SUCCESS;
	}
	
}

4)将 action 添加到 struts.xml 中

<package name="default" namespace="/" extends="struts-default">
	<action name="testaction" class="actionTest">
		<result type="dispatcher">/test.jsp</result>
	</action>
</package>

ps: ①、struts2 与 spring 整合需要添加 jar,步骤一已经添加了,相应的pom.xml 内容为:

<dependency>
	<groupId>org.apache.struts</groupId>
	<artifactId>struts2-spring-plugin</artifactId>
	<version>2.1.8.1</version>
</dependency>

     ②、有了这个 jar包后,action 中的class 类就无需写全类名了

5)创建 test.jsp 文件,内容如下:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>    
    <title>SSH2整合</title>
  </head>
  
  <body>
    SSH2
  </body>
</html>

五、测试

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一,集成 Spring 与 Hibernate 1,配置SessionFactory 1,配置 ---------------------- applicationContext.xml ------------------------ <!-- 配置SessionFactory(整合Hibernate) --> <context:property-placeholder location="classpath:jdbc.properties" /> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <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="${username}"></property> <property name="password" value="${password}"></property> <!-- 其他配置 --> <property name="initialPoolSize" value="3"></property> <property name="maxPoolSize" value="5"></property> <property name="minPoolSize" value="3"></property> <property name="acquireIncrement" value="2"></property> <property name="maxStatements" value="8"></property> <property name="maxStatementsPerConnection" value="5"></property> <property name="maxIdleTime" value="20"></property> </bean> </property> <!-- 指定hibernate的配置文件的位置 --> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> </bean> ---------------------- jdbc.properties ------------------------ jdbcUrl = jdbc:mysql:///itcastoa driverClass = com.mysql.jdbc.Driver username = root password = 1234 2,测试代码 @Test// 测试 SessionFactory 的配置 public void testSessionFactory(){ SessionFactory sessionFactory = (SessionFactory) ac.getBean("sessionFactory"); Assert.assertNotNull(sessionFactory.openSession()); } 2,配置声明式事务(使用基于注解的方式) 1,配置 <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <!-- 配置基于注解的事务支持--> <tx:annotation-driven transaction-manager="transactionManager"/> 2,测试代码 1,Service类 @Service public class InsertUserService { @Resource private SessionFactory sessionFactory; @Transactional public void addUsers() { sessionFactory.getCurrentSession().save(new User()); // int a = 1 / 0; // 这行会抛异常 sessionFactory.getCurrentSession().save(new User()); } } 2,单元测试 @Test // 测试声明式事务 public void testTransaction() { InsertUserService service = (InsertUserService) ac.getBean("insertUserService"); service.addUsers(); } 3,在web.xml中配置 spring 的 OpenSessionInView 过滤器(解决抛LazyInitializationException的问题) 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>*.do</url-pattern> </filter-mapping> 2,LazyInitializationException异常说明 1,对于集合属性,默认是lazy="true"的,在第一次使用时才加载。 2,但在加载时,如果Session已经关掉了就会抛LazyInitializationException异常 二,集成 Spring 与 Struts2.1.8.1 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,在struts-config.xml中配置controller(Spring Reference 15.4.1.1. DelegatingRequestProcessor) <!-- 集成Spring --> <controller> <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor" /> </controller> 3,测试 1,写Action类与Service类 @Controller("testAction") @Scope("prototype") public class TestAction extends ActionSupport { @Resource private TestService testService; @Override public String execute(){ testService.saveTwoUser(); return SUCCESS; } } @Service public class TestService { @Resource private SessionFactory sessionFactory; @Transactional public void saveTwoUser() { sessionFactory.getCurrentSession().save(new User()); // int a = 1 / 0; // 这行会抛异常 sessionFactory.getCurrentSession().save(new User()); } } 2,在struts.xml中配置Action <!-- 测试 --> <action name="test" class="testAction"> <result>/test.jsp</result> </action> 3,部署到Tomcat中并访问测试。 4,说明: 1,在写Action时要指定 @Controller 与 @Scope("prototype") 2,在struts.xml中配置action时,在class属性中写bean的名称
OA办公系统的九大设计原则: 1.整体性 系统整体设计能有效的实现后台一体化管理,前端满足用户个性化需求,系统标准化程度高。 2.先进性 软件采用的技术,将在相当长的时间内保证技术的发展能力,应具有良好便捷的升级能力,选用的硬件设备及操作系统、数据库产品、应用软件均具有先进性及成熟的技术与产品。 3.规范性 遵循统一的国家规范公文格式和交换接口标准。 4.高效性 系统提供对各类事务处理的高效性。使对大容量数据的查询和更新等操作也在较短的时间内迅速完成。对于大数据量的处理,也能高效地完成。 5.安全可靠性 采用最成熟和应用最广泛的技术平台,支持身份认证技术、安全加密技术;数据在传输过程和数据库中采用高加密技术,保证数据的安全性。分不同的角色控制信息数据,采用横向和纵向结合的矩阵权限控制模式,保证企业的各种信息安全。 6.扩展性 由于计算机和网络等领域技术发展十分迅速,应用环境,系统硬件及系统软件都会不可避免将被更新,系统的可扩充性及版本的兼容性,直接影响着应用系统和用户需求的发展和功能的提升。因此,OA系统十分重视扩展性,能很容易地适应调整,扩充和删减;另一方面,它还具有与其它系统的接口能力,利用各系统功能之长,进行优势互补。 7.适应性和灵活性 在日常工作中,不可避免地需要进行机构及人员的调整,OA系统能提供充分的变更与扩展能力,适用机构及人员的调整。OA系统还具有图形化工作流定义工具,系统管理员可在浏览器环境下任意调整或定义工作流程。系统具有灵活的信息发布系统,用户可根据需要定制发布需要的新闻、通知。 8.易用性 系统的设计尤其重视用户界面的友好性。简洁大方、功能齐备、美观实用、提示准确。 9.健壮性 OA办公系统的开发设计应该支持应用和数据库等多重负载均衡能力,支持附件服务器和数据库服务器分离技术,从而支持数万用户同时在线和同时操作的能力,不会因为用户数的增长或者信息量的增长,而导致系统响应能力下降。 如何分辨OA办公系统的优劣?设计原则是一个重要的评判标准。优秀的设计原则能让OA办公系统脱颖而出,实现系统整体的高性能、高可用、可扩展,发挥出更强的协同办公能力。而OA办公系统设计的九大原则,基本上包括了OA办公系统的性能指标,给项目开发和用户选型提供了有益的借鉴,对于中国OA办公系统的整体水平也能起到提升作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值