简介
今天整理的是一个结合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>