简介
今天整理的是一个结合Struts2做的一个人员查询管理系统。开发历程没有写太多。整体项目开发比较简单,基于模版进行修改页面,编写action类
开发前奏
开发前奏 1. 导入人员管理项目 2. 建立数据库、表 drop databse if exists struts; create database alice; create user alice@localhost identified by '123'; //添加用户 grant all on struts.* to alice@localhost//授权 oracle一个数据代表一个服务,在这个库中有很多用户,每个用户有个表空间 set character_set_client = gbk; # 用户表 CREATE TABLE S_User( userID INT NOT NULL AUTO_INCREMENT, #主键ID userName VARCHAR(50) NULL, #用户姓名 logonName VARCHAR(50) NULL, #登录名 logonPwd VARCHAR(50) NULL, #密码# sex VARCHAR(10) NULL, #性别(例如:男,女) birthday VARCHAR(50) NULL, #出生日期 education VARCHAR(20) NULL, #学历(例如:研究生、本科、专科、高中) telephone VARCHAR(50) NULL, #电话 interest VARCHAR(20) NULL, #兴趣爱好(例如:体育、旅游、逛街) path VARCHAR(500) NULL, #上传路径(path路径) filename VARCHAR(100) NULL, #上传文件名称(文件名) remark VARCHAR(500) NULL, #备注 PRIMARY KEY (userID) ) 目标功能: 搭建开发环境 struts2+javabean+DAO+DBCP+DBUtils+Mysql 导入jar包和配置文件 web.xml index.jsp/index.html; <filter>加入核心控制器StrutsPrepareAndExecuteFilter struts.xml dbcpconfig.properties
SERVICE层/DAO层实现
1. 定义业务接口(根据功能需求来做)
BusinessService
User login(String logonName, String logonPwd);
List<User> findAllUsers();
List<User> findUsersByCondition(String userName, String sex,String education,String filename);
void addUser(User user);
void editUser(User user);
User findUserById(Integer userId);
void delUser(User user);
2. 后台业务代码实现、测试
UserDao
void save(User user);
void del(User user);
void update(User user);
List<User> findUserByCoditions(Integer userID,String logonName,String logonPwd,String sex,String education, String filename);
User findUserByUsernamePassword(String logonName, String logonPwd);
List<User> findAllUsers();
List<User> findUsersByCondition(String userName, String sex,String education,String filename);
User findUserById(Integer userId);
3. 添加实现类UserDaoMysqlImpl
1). 删除/更新用户判断传入的用户和用户id是否为空,如果为空抛出无效参数异常
2). List<User> findUserByCoditions(Integer userID,String userName,String sex,String education, String filename);
判断传入的参数是否为空,如果全部为空代表查询全部
至少一个参数不为空
List<Object> parameters = new ArrayList<Object>();
if(userId != null) {
sb.append("and userID=? ")
}
if(StringUtils.isNotBlank(username)) {
sb.apppend("and userName like ? ")
}
if(StringUtils.isNotBlank(filename)) {
if("true".equals(filename)) {
sb.append("and filename is not null");
} else {
sb.append("and filename is null");
}
}
4. 业务实现类
BusinessServiceImpl
private UserDao dao = new UserDaoMysqlImpl();
5. 测试业务实现类
功能实现
一、 登录功能
1. 改造登录页面login.jsp
# 修改主题:struts.ui.theme=simple
<s:form action="userLogin">
logonName/logonPwd/submit/reset
2. struts-user.xml
<action name="userLogin">重定向到登录之后转向的页面home.jsp,错误转到login.jsp
3. UserAction类
1). 使用ModelDrivern进行封装User数据
2). 在applicationContext.xml中配置Spring容器进行注入业务实现类
3). 建立用户登录方法
调用业务方法获取用户,如果为空添加错误动作消息,返回input视图
否则设置session域中,返回success
4. top.jsp,修改用户名:<s:property value="#session.user.usernaName">
二、 查询所有用户
1. 改造left.jsp
<s:url action="findAllUser" namespace="/user" var="findAllUserUrl">
2. 添加<action anem="findAllUser"> 节点
<result>转到list.jsp
3. 改造list.jsp
<s:iterator value="users" var="user">
/用户名/性别/电话/学历
4. 查询用户改造,建立一个findUserByUsernamePassword();
三、 按条件查询
1. list.jsp-->
<s:form action="listByCondition" namespace="/user">
<s:textfield>用户姓名/性别<s:select list="#{}" headerkey=""
学历/是否上传学历
submit
2. struts-user.xml配置文件
<action name="listByCondition">
3. 改造UserAction
listByCondition();
四、 添加用户
1. list.jsp修改提交
<s:submit type="button" >
2. add.jsp修改
导入struts标签库
<s:form action="addUser" enctype="">
登录名/密码/用户姓名/性别<s:radio list="#{}" value={'male'}>
学历/出生日期/电话/兴趣爱好<s:checkboxlist list="{''}"/
简历资料<s:file>
3. 添加<action>节点,重定向动作到redirectAction --->findAllUser
4. UserAction---addUser()
isUpload/interests[]/upload/uploadFileName/
1). 数据已经封装到了User对象中,除了爱好和简历存放路径
2). 判断interests不为空并且长度大于0,
遍历interest,拼接爱好,隔开。拼接后的字符串设置到user中
3). 得到真实路径,将路径设置到user中
4). 利用TokenHelper.generateGUID()生成新文件名称,设置到user中
5). FileUtils拷贝到目的FileUtils拷贝到目的地
6). 调用业务方法,将user对象添加到数据库中
五、 编辑功能
1. list.jsp
<s:a namespace="/user" action="findOneUser">
<s:param name="userID" value="<s:property value="#user.userID">
2. 添加action节点 name="findOneUser"
3. UserAction---->findOneUser()
调用业务方法findOneUser();
将user压入栈顶
return SUCCESS;
4. edit.jsp页面
兴趣爱好value="%{interest.split(',')}"
简历资料
下载
重新上传
5. <action>中添加download动作
<result type="stream">
<param name="inputName">
<param name="contentType">application/octet-stream</param>
<param name="contentDisposition">attachment;filename=${}
6. 动作类中添加download方法
根据id查询用户
得到用户中的真实路径
关联该路径文件,创建流对象
7. action节点中t添加editUser动作
8. UserAction类中添加editUser()方法
如果upload不为空,重新上传
否则的话
用户没有选择重新上传,保持住原有的文件名和路径名
调用业务方法editUser()方法
9. 查看功能
list.jsp,<s:a namespace="/user" action="viewUser">
viewUser动作方法
view.jsp,改变为struts标签
10. 删除功能
list.jsp
11. 空指针异常的问题
如果文件不为空,才进行上传
六、 拦截器判断登录
LogonCheckInterceptor实现MethodFilterInterceptor
从session中获取user,判断是否为空,
定义<interceptors>
<interceptor name="logonCheckInterceptor">
<param name="excludeMethods">userLogin</param>
</interceptor>
<interceptor-stack name="mydefault">
defaultStack
logonCheckInterceptor
<global-results>