1.
int 不能为空 integer 可以为空 数据库可能为空的时候用
2.
组合查询 拼sql语句
3.
模糊匹配查询
前 后 加%
real_name like ?;
例如like %张%
4.
dao
客户端验证
5.
TimeStamp数据库字段类型。时间的时分秒都有
java也可以用TimeStamp
例如:
private TimeStamp time ; //有时分秒
java.sql.Date()只有年月日
6
#session.costs
7.
标签和el表达式先解析,然后生成html,js才去执行
8.加个''避免空串
9.
用list的同一个字段组成下拉列表
action中:
public String toPage() throws Exception{
List<Cost> costs = costDao.findAll();
session.put("costs", costs);
return "success";
}
html中:
<s:select list="#session.costs" name="service.costId"
listKey="id" listValue="feeName">
</s:select>
注:service.costId是Cost的id
10.保存完后返回原页面显示提示信息
action中:
public String xxx() throws Exception {
String saveMsg = "";
try {
sdao.save(serviceBak);
saveMsg = "true";
} catch (Exception e) {
saveMsg = "false";
}
this.request.put("saveMsg", saveMsg);
return "success";
}
html中:
<body οnlοad="showsaveMsg();">
javascript中:
function showsaveMsg(){
var v='${saveMsg}';
if(v=="true"){
$("#save_result_info").attr("class","save_success");
$("#save_result_info").text("保存成功");
showResult();
}else if(v=="false"){
$("#save_result_info").attr("class","save_fail");
$("#save_result_info").text("保存失败");
showResult();
}
//如果为空没有操作没有响应
}
11.获得产生的id
public class UserDAO {
public int save(User user) throws Exception{
int id = -1;
Connection conn =
DBUtil.getConnection();
PreparedStatement prep =
conn.prepareStatement(
"insert into f_user" +
"(username,name,pwd,age,gender,phone,ask) " +
"values(?,?,?,?,?,?,?)",
java.sql.Statement.RETURN_GENERATED_KEYS);
prep.setString(1, user.getUsername());
prep.setString(2, user.getName());
prep.setString(3, user.getPwd());
prep.setInt(4, user.getAge());
prep.setString(5, user.getGender());
prep.setString(6, user.getPhone());
prep.setString(7, user.getAsk());
prep.executeUpdate();
ResultSet rst = prep.getGeneratedKeys();
if(rst.next()){
//rst.getInt("id"); error!
id = rst.getInt(1);
}
DBUtil.close(conn);
return id;
}
12.权限管理
难点:解析xml
13. 获取插入数据库的的列的值
//返回id
//conn.prepareStatement(sql,new String[]{"ID"});
=========================================================
老师的笔记
==================
1.项目需求
该系统为电信计费项目,用户为营业厅的营业员,部门经理等内部人员。不同用户可以有不同操作权限。
项目背景:电信公司有一批Unix服务器,对客户提供使用,该系统主要用于对这些服务收费和查询等。
2.一期开发功能如下
课堂案例:资费管理模块
该模块用于对收费标准进行管理,例如包月,套餐,计时等收费标准。
1)账务账号
当用户需要使用Unix服务时,首先需要开通一个账务账号,该账号与身份证对应。该模块用于对账务账号信息进行维护和管理。
2)业务账号
一个账务账号可以对应多个业务账号。不同业务账号对应不同服务。该模块对业务账号信息进行维护和管理。
3)角色管理
用于对角色信息进行维护和管理。可以指定某个角色可以做哪些操作。
4)管理员管理
用于对管理员用户信息进行维护和管理。
可以指定一个管理员可以拥有哪些角色。
3.开发技术架构
采用Struts2+JDBC+Ajax+jQuery等技术开发。项目整体基于MVC结构,主要分成以下部分:
控制层:采用Struts2控制器
视图层:采用JSP实现(ajax,jQuery)
模型层:采用DAO,实体对象(jdbc)
=======项目开发==========
4.项目开发步骤(账号检索)
1)通过TTS6查看功能的需求说明,搞清楚需求和要做的功能
2)看看HTML页面和数据表设计,搞清楚该功能与哪些数据表相关
3)设计一个请求到响应的处理流程
accountSearch.action(提交查询条件)
-->AccountSearchAction
-->AccountDAO(根据条件查询Account表)
-->account_list.jsp(将账号信息循环显示)
4)编写AccountDAO
--是否有Account实体类,没有添加
--定义AccountDAO接口方法
--编写AccountDAO实现类
5)编写AccountSearchAction
--定义输入和输出属性
--定义execute业务方法
6)配置Action,将请求和Action对应
7)编写account_list.jsp
添加标签和表达式,循环集合数据
8)测试界面功能
=========追加分页==========
1)修改AccountDAO的方法参数,追加page,pageSize
2)将sql语句改造成分页查询的sql
select * from (
select t1.*,rownum num from (
组合查询的SQL语句
) t1 where rownum < ?
)where num >= ?
3)为Action添加page属性,用于控制分页
4)修改account_list.jsp,添加分页按钮的处理.
当用户点击分页按钮时,触发一个goPageAction(要显示的page值)函数,
该函数利用js提交查询条件的Form表单和要显示的page值。
========================
5.业务账号查询
2)判断页面功能与哪些数据表相关
*OS 账号--Service
*服务器 IP
身份证--Account
*状态
*业务ID
*账务账号ID
姓名--Account
资费名--Cost
3)设计请求处理流程
serviceSearch.action
-->ServiceSearchAction
-->ServiceDAO(service,account,cost表)
-->service_list.jsp
4)编写ServiceDAO
--添加Service实例类
--定义ServiceDAO接口方法
--编写ServiceDAO实现类
=======添加操作表单========
身份证
账务账号名
---》*账务账号ID(表单追加一个hidden,采用ajax技术根据身份证或账务账号名生成账号ID,将来提交到表单)
*资费类型ID
*服务器 IP
*登录 OS 账号
*密码
重复密码(不用提交)
toAddService.action
-->AddServiceAction(提取资费信息)
-->CostDAO
-->service_add.jsp(利用标签动态生成资费选择列表)
addService.action
-->AddServiceAction(接收表单信息执行添加处理)
-->ServiceDAO
-->service_add.jsp(提示成功或失败)
=====业务更新操作========
该页面允许修改业务账号的资费类型,其它字段不允许修改。当用户修改后,将信息写入
SERVICE_UPDATE_BAK备份表。
将来我们通过一个PL/SQL程序将备份表记录取出,更新到SERVICE表。
--SERVICE_UPDATE_BAK表结构----
ID
SERVICE_ID
COST_ID
CREATE_DATE
==========权限模块===========
1.本系统权限部分相关概念
a.管理员--(公司员工)
指的是系统的使用者。不同管理员可以有不同的角色,一个管理员可以有多个角色
b.角色--(不同职位)
指的是一系列操作的集合。一个角色可以有一个或多个权限
数据涉及role和role_privilege表。
role用于存储角色基本信息.
role_privilege用于存储角色和权限关系信息
c.权限--(不同职位需要做的具体工作)
指的是具体一个或多个操作(请求)。
该数据采用了privileges.xml存储
2.本次任务完成以下功能
*1)角色管理功能
用于对角色信息进行增删改查。用于维护管理角色相关数据。
a.添加操作
--需要首先向role表insert
--然后向role_privilege表insert
b.更新操作
--首先更新role表update
--更新role_privilege表数据
先执行delete操作 by role_id
然后执行insert操作添加角色和权限
对应数据
c.角色删除操作
--首先删除role_privilege数据
--然后删除role数据
d.进入添加页面
/role/toAddRole.action
-->AddRoleAction(解析privileges.xml数据)
-->role_add.jsp(将解析的数据以checkbox展现)
*2)管理员功能
用于对管理员信息进行增删改查。用于维护管理员相关数据。
管理员模块涉及Admin_info和Admin_Role数据表。
Admin_info用于存储管理员基本信息。
Admin_Role用于存储管理员和角色对应关系
a.管理员添加
--首先向Admin_info表insert
--然后向Admin_Role表插入关系数据
(指定几个角色就插入几个记录)
==进入添加页面===
toAddAdmin.action
-->AddAdminAction(查询所有角色信息)
-->RoleDAO
-->admin_add.jsp(根据角色集合生成checkbox)
==添加管理员====
addAdmin.action
-->AddAdminAction(保存管理员信息)
-->AdminDAO(完成admin_info,admin_role记录添加)
-->admin_add.jsp(提示成功或失败)
b.管理员删除
--首先删除Admin_Role表的关系数据
(可以利用Admin_id当删除条件)
--然后删除Admin_info表的数据
c.管理员更新
--首先更新Admin_info表数据
--然后更新Admin_Role表的关系数据
(先清除原关系数据,然后从新insert 关系记录)
d.管理员查询
*管理员ID
*姓名
*登录名
*电话
*电子邮件
*授权日期 *-->Admin_Info
拥有角色-->Admin_Role-->Role
select a.*,r.name
from Admin_info a,Admin_Role ar,Role r
where a.id=ar.admin_id
and ar.role_id=r.id
3)权限检查部分(以后完成)
----------------------