`

OA项目开发

阅读更多
准备环境

1,数据库
创建数据库
2,MyEclipse工程
1,新建Web Project
改工程的默认编码为UTF-8
改JSP的默认编码为UTF-8
Java代码与注释与Xml代码的行宽设为150个字符
(只打开当前的工程,其他的都关掉并隐藏)
2,添加框架环境(jar包与配置文件)
Junit4
Struts2
Hibernate
Spring

3,整合SSH2
首先整合Spring和Hibernate
在applicationContext.xml文件中配置
                    
<!-- 自动扫描和装配bean -->
	<context:component-scan base-package="cn.itcast.oa"></context:component-scan>
	
	<!-- 配置sessionFactory(整合hibernate) -->
	<context:property-placeholder location="classpath:jdbc.properties"/>
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<!-- 指定Hibernate配置文件的位置 -->
		<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
		<!-- 配置DataSource -->
		<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与maxPoolSize之间。Default: 3 -->
				<property name="initialPoolSize" value="3"></property>
				<!--连接池中保留的最小连接数。Default: 3 -->
				<property name="minPoolSize" value="3"></property>
				<!--连接池中保留的最大连接数。Default: 15 -->
				<property name="maxPoolSize" value="15"></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="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	<tx:annotation-driven transaction-manager="transactionManager"/>


1,了解功能,包括细节(要清楚需要做什么样的功能)。
2,设计实体/表
先设计实体,再生成表,叫正向工程(推荐)。
或先设计表,再生成实体,叫反向工程。
3,分析所有的功能到Action的方法的粒度(就是到每一个请求的粒度)
4,实现功能
1,写出Action类并定义出其中的方法,并确定每个Action方法要做什么事。
2,实现Action方法,确定出要使用的Service方法。
3,实现Service方法,确定出要使用的Dao方法。
4,实现Dao方法。
5,写JSP页面。
5,测试。



===================== 设计实体 ==========================
1,有几个实体?
2,实体之间有什么关系?
3,每个实体中都有什么属性?
1,主键
2,关联关系属性
一个关联关系是一条线,有两端,一端有一个表达这个关联关系的属性
3,一般的属性(在显示页面或表单页面等中需要显示或填写的信息)
4,特殊的属性(为解决某问题而设计的属性,如不要设计年龄字段,而是需要一个生日的字段)



===================== 映射实体 ==========================
1,写注释,格式为:什么属性,我与谁的什么关系。例:users属性,我与User的一对多。
2,拷模板
1,多对一的模板
<many-to-one name="" class="" column=""></many-to-one>
2,一对多(Set)
<set name="">
<key column=""></key>
<one-to-many class=""/>
</set>
3,多对多
<set name="" table="" inverse="">
        <key column=""></key>
        <many-to-many class="" column=""></many-to-many>
        </set>
需要某一边把inverse设为true。

3,填空


说明:
<key column=""/> 是指的引用当前对象表主键的那个外键列。



===================== 分析所有的功能到每一个请求的粒度 =========================
增删改查,共4个功能,需要6个请求,就是说需要6个Action方法。
把这个6个Action方法放到同一个Action中,其中的方法声明为:

功能 方法名 返回值 页面
-----------------------------------------------------
列表 list() list list.jsp, dispatcher
删除 delete() toList /xxAction_list.action, redirect
添加页面 addUI() addUI addUI.jsp
添加 add() toList
修改页面 editUI() editUI editUI.jsp
修改 edit() toList





使用了Struts2后,在JSP中写的EL表达式(${})查询变量的顺序为:
1,作用域
2,对象栈的属性
3,Map

Action中增删改查方法的模板为:
/** 列表 */
public String list(){ return "list"; }
/** 删除 */
public String delete(){ return "toList"; }
/** 添加页面 */
public String addUI(){ return "saveUI"; }
/** 添加 */
public String add(){ return "toList"; }
/** 修改页面 */
public String editUI(){ return "saveUI"; }
/** 修改 */
public String edit(){ return "toList"; }




View + Service + Dao --》 View + Service(原Service+原Dao)
注解@Transactional可以被继承,他就可以当前类与子类中的public方法进行事务控制,但对父类的声明的public方法不起作用,所以需要写到父类上,且写一次就可以。


使用Spring的OpenSessionInViewFilter过滤器解决Hibernate的懒加载异常。


部门管理中的小细节
1,转到新建页面时,应默认选中之前列表中显显的上级部门。
2,如果不是在顶级列表页面,则应显示"返回上一级"的按钮。
3,删除、添加、修改成功后转到原列表页面,而不是顶级列表页面(重要)。


========================= 完成一组功能(增删改查)的流程(已经分析完功能) ============================
一、准备Action相关
1,定义XxAction类,要继承BaseAction
2,定义Action中所有的方法(要有注释、方法名、返回值)
3,创建JSP页面
4,配置Action
1,(Spring)在XxAction上写注解:@Controller、@Scope("prototype")
2,(Struts2)在struts.xml中配置action
<action name="xxAction_*" class="xxAction" method="{1}">
<result name="list">/WEB-INF/jsp/xxAction/list.jsp</result>
<result name="saveUI">/WEB-INF/jsp/xxAction/saveUI.jsp</result>
<result name="toList" type="redirectAction">xxAction_list</result>
</action>

二、准备Service相关
1,创建XxService接口,要继承BaseDao
2,创建XxServiceImpl,要继承BaseDaoImpl
3,配置:在XxServiceImpl上写注解 @Service(交给Spring管理这个对象)
4,声明:在BaseAction中写 @Resource private XxService xxService;

三、填充代码
1,Action方法,如果用到了新的Service方法,则创建出来,并写好注释。
1,添加功能的代码步骤为
// 1,新建对象并设置属性(也可以使用model)
// 2,保存
2,修改功能的代码步骤为
// 1,从数据库中获取原对象
// 2,设置要修改的属性
// 3,更新
2,Service方法(主要是实现上一步创建出的新方法)
3,JSP页面
1,拷贝静态页面中的代码到JSP中
2,<%@ include file="/WEB-INF/jsp/public/common.jspf"%>
3,替换 "../" 为 "${pageContext.request.contextPath}/"
4,
1,列表页面
<s:iterator value="..">
<s:a action="..">
2,表单页面
<s:form action="..">
<s:hidden>
<s:textfield>
<s:textarea>
<s:select>
<s:radio>
...
3,公共的
<s:if>
<s:a>
...




Shift + Alt + A  进入或退出块操作模式
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics