您的位置:首页 > 编程语言 > Java开发

一个关于freemarker+webwork+spring+ibatis的demo文档

2007-01-25 14:22 531 查看
1 任务
1.背景
利用所学框架完成以下系统:
我公司需要对所有固定资产(包括电脑、桌椅、书籍等办公设备)分门别类进行登记管理。系统涉及角色包括:
系统管理员,固定资产管理员,办公室主任,普通员工,中层管理人员,高层管理人员。
2.功能
系统完成功能包括固定资产清单管理(可以按公司、部门、个人查看),
固定资产出借管理(可以按公司、部门、个人查看),
3.规则
固定资产净值管理(固定资产分5年分摊,每年递减最初的20%),
资产额度大于10000的出借需要办公室主任批准,其他出借只需资产管理员登记即可。普通员工借用数量不能大于5件,中层管理人员不能大于10件,高层管理人员无限制。
此处件数为累积数量
2 使用框架和环境
工具:eclipse 3.2 + jdk 1.5 + Maven 2.0 + jetty-5.1 + Mysql 5.0
框架:freemaker + webwork + spring + ibatis
3 数据库
1.数据库使用规范 V0.1 001
1. 数据库定义中所有标识符必须标识符以英文字母开头,由一个或多个英文单词构成,单词构成为名词或动宾结构,每个单词之间必须以"_"分隔(数字除外)。
如 field_name col_name1
2. 每一个数据库字段必须定义缺省值(Blob等大字段除外)。
如 product_name [VARCHAR] (100) NULL default ''
product_type [INTEGER] NULL default 0,
product_date [DATETIME] NULL default sysdate,
3. 所有数据表中必须有id字段,id字段长度为10个字符(用户帐号表除外),id字段是该表的主键,且需要对id字段作索引。id字段内容由数字字母串构成,区分大小写。
4. 所有数据表中必须有flag字段,flag字段为integer型,flag取值含义:0表示该记录未经审核,1表示已经审核通过,2表示该记录已经被锁定(审核未通过),3表示该记录当前还没有被激活,10表示该记录已经被删除。
5. 所有实体表(如用户表、产品表等表示具体事务属性的表)中必须包含以下字段(关联表可以不包含):
modifier_id [varchar] (50) NULL default '',
modify_date [datetime] NULL default sysdate,
creator_id [varchar] (50) NULL default '',
create_date [datetime] NULL default sysdate,
6. 所有实体表前必须加前缀tbl_,关联表前必须加前缀jnt_,索引加后缀_ndx,存储过程为sp_projectname_
CREATE INDEX fzpl.User_Corp__Corp_ID__ndx
ON fzpl.Jnt_User_Corp(Corp_ID)
TABLESPACE indx;
2.数据库设计
Mysql 区分大小写
全部小写
Create database goods;
1. 固定资产 tbl_goods
Create table tbl_goods(
Goods_id varchar (20) NOT NULL default '',
Goods_name varchar (100) NOT NULL default '',
Goods_value long ,
Goods_date datetime,
Goods_number int default 1,
PRIMARY KEY (Goods_id)
)
2.物品分类 jnt_goods_type
Create table jnt_goods_type(
Goods_type varchar (100) NOT NULL default '',
Goods_id varchar (20) NOT NULL default '',
)

3. 角色 tbl_role
Create table tbl_role(
role_id int //NOT NULL default 0,
role_name varchar (100) NOT NULL default '',
PRIMARY KEY (role_id)
)
[align=left]INSERT INTO tbl_role (role_id, role_name) VALUES [/align]
[align=left] (1,'系统管理员'),[/align]
[align=left] (2,’ 固定资产管理员'),[/align]
[align=left] (3,'办公室主任'),[/align]
[align=left] (4,'高层管理人员'),[/align]
[align=left](5,'中层管理人员'),[/align]
(6,'普通员工');
4.用户 tbl_user
Create table tbl_user(
User_id varchar (20) NOT NULL default '',
User_name varchar (20) NOT NULL default '',
PRIMARY KEY (`User_id`)
)
5.用户——角色 jnt_staff_manage
Create table jnt_staff_manage(
User_id varchar (20) NOT NULL default '',
role_id int NOT NULL default 6,
User_company varchar (100) NOT NULL default '',
User_ department varchar (100) NOT NULL default '',
)
6.规则 tbl_rule
Create table tbl_rule(
Rule_name varchar (50) NOT NULL default '',
Rule_value varchar (50) NOT NULL default ''
)
如:
固定资产净值管理(固定资产分5年分摊,每年递减最初的20%)
资产额度大于10000的出借需要办公室主任批准,其他出借只需资产管理员登记即可。
普通员工借用数量不能大于5件,中层管理人员不能大于10件,高层管理人员无限制。
7. 固定资产出借管理 jnt_goods_user
Create table jnt_goods_user (
Goods_id varchar (20) NOT NULL default '',
User_id varchar (20) NOT NULL default '',
Lend_time datetime,
Back_time datetime,
Plan_time datetime, //计划归还时间
Goods_number int default 1,
Back_number int , //default 0
Goods_status int //0:未归还 1:部分归还 2:全部归还 3:等待办公室主任批准
)
* 此表作为记录不能有删除动作!
7. 固定资产出借管理临时表 jnt_goods_user_wait
同jnt_goods_user ,作为临时记录使用

8.物品登记 jnt_goods_status (?)
Create table jnt_goods_status(
Goods_id varchar (20) NOT NULL default '',
Goods_status char NOT NULL default '0'
// Goods_status
//0 :没有借出
//1 :已全部借出
//2 :部分借出
)
9.固定资产所属(公司、部门、个人) jnt_goods_belong
Create table jnt_goods_belong(
Goods_id varchar (20) NOT NULL default '',
User_id varchar (20),
User_company varchar (100),
User_ department varchar (100),
)
//固定资产属于(公司、部门、个人),以最小单位记,
//如 个人优于部门,部门优于公司
10.部门tbl_department
Create table tbl_department(
//------联合主键
Department_name varchar (100) not null default ‘’,
Department_company varchar (100) not null default ‘’,
//other message
)
11.公司tbl_company
Create table tbl_company(
//------主键
Company_name varchar (100) not null default ‘’,
//other message
)

4 业务逻辑
1.资产登记:
所有固定资产(包括电脑、桌椅、书籍等办公设备)分门别类进行登记管理
逻辑
目标
优先级
查看
详细信息
1
增加
信息
2
修改
2
删除
信息
3
2.固定资产出借管理:
固定资产出借管理(可以按公司、部门、个人查看),
逻辑
目标
优先级
租借信息查看
详细信息
1

信息
2
归还
数量
2
规则限制的租借处理
3
5 设计(以主要业务逻辑为例)
1.资产登记
以GoodsService为主线
逻辑
方法
增加
GoodsDao
public void create(Goods goods)
创建一种物品(资产)信息
查看
GoodsDao
GoodsTypeDao
GoodsBelongDao
Public Collection findAll( )
查看所有种类物品(资产)信息
通过类型来查看此类物品(资产)中所有种类物品(资产)信息
public Collection findByType(GoodsType goodsType :GoodsTypeService
Public Goods getById(String id)
:GoodsService
Public Goods getById(String id)
查看一种物品(资产)信息
固定资产属于(公司、部门、个人)
多条件查询
public Collection findGoodsBelong(GoodsBelong goodsBelong:GoodsBelongService
Public Goods getById(String id)
:GoodsService
public User getById(String userid):UserService
修改
GoodsDao
GoodsTypeDao
Public void modifyById(Goods goods)
修改物品(资产)信息
publicvoid modifyTypeById(GoodsType goodsType): GoodsTypeService
修改物品(资产)所属的类型
删除
GoodsDao
GoodsTypeDao
GoodsBelongDao
GoodsStatusDao (?)
Public void remove(String id)
删除物品(资产)信息--à
删除所属类型中的关系
固定资产所属
删除物品登记的记录 (?)
Service
1. GoodsService
2. GoodsTypeService
3. GoodsBelongService
4. UserService
Dao
1. GoodsDao
2. GoodsTypeDao
3. GoodsStatusDao (?)
table
1. tbl_goods
2. jnt_goods_type
3. jnt_goods_status (?)
4. jnt_goods_belong
其他
*ConstantDefine
1. jnt_goods_type . goods_type 定义物品分类的类别常量
2. (?) goods_status //0 :没有借出 1 : 已借出 2 :部分借出
2.固定资产出借管理
以GoodsUserService为主线
逻辑
方法
查看
GoodsUserDao
GoodsDao
UserDao

根据条件查看所有物品(资产)的借用信息
(暂时先不支持时间的查询)
public Collection findGoodsUser(GoodsUser goodsUser):GoodsUserService
public Goods getById(String id):GoodsService
public User getById(String userid):UserService
借出(创建)
GoodsUserDao
RuleDao(?)
StaffManageDao
RoleDao(?)
Public void createAction(GoodsUser goodsUser )
创建借用行为:物品(资产)的借用记录
Lend_time = now()
Plan_time 可以为null

固定资产净值管理(固定资产分5年分摊,每年递减最初的20%)

资产额度大于10000的出借需要办公室主任批准,其他出借只需资产管理员登记即可。
普通员工借用数量不能大于5件,中层管理人员不能大于10件,高层管理人员无限制。

归还(修改)
GoodsUserDao
Public void removeAction(GoodsUser goodsUser )
取消借用行为:物品(资产)的归还记录
GoodsUser:goodsid + userid + backnumber
通过goodsid + userid查找对应信息
Lend_time 不能改变
Plan_time 不能改变
Back_time = now()
Back_number [1]+ Back_number[2]+….<= Goods_number
Service

Dao
1. GoodsUserDao
2. GoodsDao
3. RuleDao
4. StaffManageDao
5. RoleDao
table
1. jnt_goods_status
2. tbl_goods
3. jnt_staff_manage
4. tbl_role
5. tbl_rule
其他
*ContextDefine
1. tbl_role .role_name 定义角色的常量
[align=left] (1,'系统管理员'),[/align]
[align=left] (2,’固定资产管理员'),[/align]
[align=left] (3,'办公室主任'),[/align]
[align=left] (4,'高层管理人员'),[/align]
[align=left](5,'中层管理人员'),[/align]
(6,'普通员工')
2. tbl_rule (Rule_name , Rule_value)//定义规则常量
(‘固定资产净值’,0.2)
(‘资产额度’, 10000)
(‘普通员工’,5)
(‘中层管理人员’,10)
// (‘高层管理人员’,0) ----à 0 代表无穷大,即不做为限制规则
3. *其他
所有页面显示id 均由超链接处理
*日志
2007/1/8
数据库
项目框架
2007/1/9
行为
目标
Add
物品登记 table jnt_goods_status (?是否保留)
Update
出借管理 table jnt_goods_user
+ Back_number int //default 0
+ Plan_time datetime, //计划归还时间
Add
固定资产所属table jnt_goods_belong
Finish
Goods
Finish
GoodsType
Finish
GoodsBelong
Finish
User
2007/1/10
行为
目标
update
alter table jnt_goods_user drop column goods_number;
alter table jnt_goods_user add column goods_number int default 1;
2007/1/11
update
alter table tbl_goods drop column goods_date;
alter table tbl_goods add column goods_date datetime;
update
alter table jnt_goods_user drop column lend_time;
error:alter table jnt_goods_user add column lend_time datetime NULL default CURRENT_TIMESTAMP;
alter table jnt_goods_user add column lend_time datetime;
update
alter table tbl_goods drop column goods_number;
alter table tbl_goods add column goods_number int default 1;
2007/1/12
update
StaffManageDaoIbatis: getByUserId
[align=left]//数据库设计的缺陷:有多个值只取第一个[/align]
[align=left]//getSqlMapClientTemplate().queryForObject("StaffManage_getByUserId", userid);----old[/align]
[align=left]Collection col = getSqlMapClientTemplate().queryForList("StaffManage_getByUserId", userid);[/align]
[align=left] if(col!=null){[/align]
[align=left] return (StaffManage)col.iterator().next();[/align]
[align=left] }[/align]
returnnull;
update
alter table jnt_goods_user add column status int
delete
物品登记 jnt_goods_status
update
alter table jnt_goods_user drop column status;
alter table jnt_goods_user add column goods_status int
Finish
GoodsAction
Finish
GoodsUserAction
Finish
StaffAction
2007/1/15
2007/1/18
add
Create table tbl_department(
//------联合主键
Department_name varchar (100) not null default ‘’,
Department_company varchar (100) not null default ‘’,
//other message
)
add
Create table tbl_company(
//------主键
Company_name varchar (100) not null default ‘’,
//other message
)
2007/1/22
modify
注意数据库中关联表的设计:不能设置外界关系,当相关数据不存在时,作为已经有过的操作行为不应该被删除!!
2007/1/24
add
Table jnt_goods_user_wait
*问题解决方案
数据库连接
资源文件的格式问题——ctrl+shift+f : 格式化时可能导致错误
粘贴或手写不要使用快速格式化
时间
1>数据库:
Create table tbl_goods(
/..
Goods_date datetime,
/..
)

2>ModelGoods.java
private Date goodsdate;

3>goodsInsert.ftl
<@ww.head/>
<@ww.datepicker label="${action.getText('goods.date')}" name="model.goodsdate" showstime="true"/>

[align=left]4> java 文件中的测试[/align]
[align=left]Calendar c = Calendar.getInstance();[/align]
[align=left]Date init = goods.getGoodsdate();[/align]
Date now = c.getTime();

DateFormat df = DateFormat.getDateInstance();
[align=left]Calendar c2 = df.getCalendar();[/align]
[align=left]System.out.println("time:"+c2.getTime().toString()+"!");[/align]
System.out.println("time:"+df.format(now)+"!");
中文编码问题
l mysql
普通方式建立数据库时,采用的默认编码方式可能出现乱码
建立数据库和表时,设置编码方式
如:
[align=left]CREATE DATABASE goods[/align]
[align=left] CHARACTER SET 'utf8'[/align]
[align=left]COLLATE 'utf8_swedish_ci';[/align]
[align=left] [/align]
[align=left]CREATE TABLE tbl_user ([/align]
[align=left] user_id varchar(20) NOT NULL default '',[/align]
[align=left] user_name varchar(20) NOT NULL default '',[/align]
[align=left] PRIMARY KEY (`user_id`)[/align]
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

l 通过硬编码
中文编码: 8859_1
中文编码方式: GB2312
String newStr =
new String(oldStr.getBytes("GB2312"),"8859_1"); //存储

String newStr2=new String(oldStr.getBytes("8859_1"),"GB2312"); 显示

l jsp
1> request.setCharacterEncoding("GB2312")
2> <%@ page contentType="text/html;charset=gb2312" %>
3> <meta http-equiv="Content-Type" content="text/html; charset=gb2312">

l java
String name=java.net.URLEncoder.encode("21cn游戏频道说明文档.txt","utf-8")
l 修改web服务器的配置,以tomcat为例。
如果要求tomcat服务器识别中文的get参数,则需要修改conf/server.xml的文件配置。如下
<C port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" c
disableUploadTimeout="true" URIEncoding="GBK"/>
国际化
1、webwork.properties 框架文件
定义:
webwork.custom.i18n.resources=ApplicationContext

2、ApplicationContext 是资源文件
如:ApplicationContext.properties
定义:
system.title
=
/u56FA/u5B9A/u8D44/u4EA7/u7BA1/u7406/u7CFB/u7EDF
(system.title=固定资产管理系统)

3、页面中取得
如:页面login.ftl中
<h1>${action.getText('system.title')}</h1><br/>

4、
a>资源文件
ApplicationContext.properties
login = welcome {0} login in:
[align=left]b>页面 login.ftl[/align]
[align=left]<@ww.text name="${action.getText('login')}">[/align]
[align=left]<@ww.param>[/align]
[align=left]<fontcolor="red">[/align]
[align=left]${model.username}[/align]
[align=left]</font>[/align]
[align=left]</@ww.param>[/align]
/@ww.text
c>效果
welcome test_user login in:
错误提示
1、webwork.properties 框架文件
定义:
webwork.custom.i18n.resources=ApplicationContext

2、ApplicationContext 是资源文件
如:ApplicationContext.properties
定义:
error.password
= 。。。。。
(error.password=。。。。)
[align=left]3、应用如:[/align]
[align=left]代码中:addActionError(getText("error.password"));[/align]
[align=left]将错误信息放入错误栈中[/align]
[align=left] [/align]
[align=left]4、页面判断错误栈中是否有信息,有就显示[/align]
[align=left]<#if action.getActionErrors().size() != 0>[/align]
[align=left] <font color="red">[/align]
[align=left] ${action.getActionErrors()}[/align]
[align=left] </font>[/align]
</#if>

/**
[align=left]*this.addActionError("error:没有分配的对象!");[/align]
[align=left]*--this.addActionError(this.getText(aTextName));--[/align]
*/
ibatis 配置文件中 sql模糊查询
[align=left]e.g: file [Company.xml] [/align]
[align=left]<select id="Company_findCompany" parameterClass="Company"[/align]
[align=left] resultClass="Company">[/align]
[align=left] <![CDATA[[/align]
[align=left] select[/align]
[align=left] company_name as companyname[/align]
[align=left] from tbl_company [/align]
[align=left] ]]>[/align]
[align=left] <dynamic prepend="where">[/align]
[align=left] <isNotEmpty prepend="AND" property="companyname">[/align]
[align=left] company_name like '%$companyname$%'[/align]
[align=left] </isNotEmpty>[/align]
[align=left] </dynamic>[/align]
</select>
url传递中文问题 通过其他方法解决!!
在url中通过传递中文name来删除company 和 department 的问题没有解决!
通过form表单提交的方式来处理
如:
<input type="radion" name="model.companyname" value="${x.companyname?if_exists}"/>
注意:value="${x.companyname?if_exists}" 一定要带上“""” 不然会在返回值后自动加上“/”

在对department的删除过程中
<input type="radion" name="model.departmentcompany"
value="${x.departmentcompany?if_exists}/${x.departmentname?if_exists}"/>
将departmentcompany和departmentname组装到一个变量中进行提交,然后拆分:代码如下
String tempCAndD = department.getDepartmentcompany();
if(tempCAndD!=null){
String[] CAndD = tempCAndD.split("/");
department.setDepartmentcompany(CAndD[0]);
department.setDepartmentname(CAndD[1]);
departmentService.remove(department);
}else{
throw new Exception("notice the companyname and departmentname!!");
}
Webwork 中session的使用
e.g:
[align=left](代码中)java文件中:UserAction.java[/align]
[align=left]Map session = ActionContext.getContext().getSession();[/align]
session.put("username", temp.getUsername());

(应用)页面文件中:login.ftl
[align=left]<#if username?exists>[/align]
[align=left] 系统管理员[/align]
[align=left] <@ww.text name="${action.getText('login')}">[/align]
[align=left] <@ww.param><font color="red">${username}</font></@ww.param>[/align]
[align=left] </@ww.text> [/align]
[align=left] <#else>[/align]
[align=left] ${action.getText('system.welcome')}[/align]
</#if>
注意:
在联合使用freemaker(如上代码),
[login.ftl]username = [UserAction.java] session.get("username")
Freemarker数字问题
[align=left]Interpolation有两种类型:[/align]
[align=left]1. 通用Interpolation:${expr} [/align]
[align=left]2. 数字Interpolation:#{expr}或#{expr; format}[/align]
[align=left]注意:Interpolation只能用于文本部分[/align]
[align=left]n 通用Interpolation [/align]
[align=left]插入字符串值:直接输出表达式结果[/align]
[align=left]插入数字值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation,下面是一个例子:[/align]
[align=left]<#setting number_format="currency"/><#assign answer=42/>${answer}${answer?string} <#-- the same as ${answer} -->${answer?string.number}${answer?string.currency}${answer?string.percent} [/align]
[align=left]输出结果是:[/align]
[align=left]$42.00$42.0042$42.004,200%[/align]
[align=left]插入日期值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation,下面是一个使用格式模式的例子:[/align]
[align=left]${lastUpdated?string("yyyy-MM-dd HH:mm:ss zzzz")}${lastUpdated?string("EEE, MMM d, ''yy")}${lastUpdated?string("EEEE, MMMM dd, yyyy, hh:mm:ss a '('zzz')'")} [/align]
[align=left]输出的结果类似下面的格式:[/align]
[align=left]2003-04-08 21:24:44 Pacific Daylight TimeTue, Apr 8, '03Tuesday, April 08, 2003, 09:24:44 PM (PDT)[/align]
[align=left]插入布尔值:根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出;可以使用内建函数string格式化单个Interpolation,下面是一个例子:[/align]
[align=left]<#assign foo=true/>${foo?string("yes", "no")}[/align]
[align=left]输出结果是:[/align]
[align=left]yes[/align]
[align=left]· 数字Interpolation的#{expr; format}形式可以用来格式化数字,format可以是:[/align]
[align=left]mX:小数部分最小X位[/align]
[align=left]MX:小数部分最大X位[/align]
[align=left]例子:[/align]
[align=left]<#-- If the language is US English the output is: --><#assign x=2.582/><#assign y=4/>#{x; M2} <#-- 2.58 -->#{y; M2} <#-- 4 -->#{x; m1} <#-- 2.6 -->#{y; m1} <#-- 4.0 -->#{x; m1M2} <#-- 2.58 -->#{y; m1M2} <#-- 4.0 --> [/align]
*参考资料
1>MySQL中文参考手册 http://it.kuainiu.com/online/mysql/1/
2>JDK_API_1_5_zh_CN
3>WebWork http://wiki.javascud.org/display/ww2cndoc/WebWork
4> html语法 http://www.gzsums.edu.cn/webclass/html/html_design.html
5> WADS 0.5 安装使用指南.txt
6> WebWorkSession
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: