zoukankan      html  css  js  c++  java
  • Struts2项目整合之人员管理系统(四)

    简介

    今天整理的是一个结合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>
  • 相关阅读:
    Comparison of MPTCP & CMT-SCTP
    Wireshark
    MPTCP协议相关分析
    抑郁
    MPTCP 源码分析(七) 拥塞控制
    MPTCP 源码分析(六) 数据重发
    MPTCP 源码分析(五) 接收端窗口值
    MPTCP 源码分析(四) 发送和接收数据
    MPTCP 源码分析(三) 子路径选择
    MPTCP 源码分析(二) 建立子路径
  • 原文地址:https://www.cnblogs.com/codingpark/p/4324572.html
Copyright © 2011-2022 走看看