基于Struts2的人员管理系统

一、 项目本地导入
MyEclipse 新建 web project , 覆盖对应 src 和 WebRoot 
Eclipse 新建 Dynamic web project , 覆盖src , 将WebRoot 中内容复制 WebContent 目录


JavaEE 企业级应用软件,布局经常采用 Frameset , 左侧菜单树使用Dztree js组件制作的 


目标功能 :
1、 登陆
2、 添加用户 (简历上传)
3、 组合条件 员工信息列表查询 
4、 员工信息详情查看(简历下载)
5、 员工信息删除
6、 员工信息编辑
7. 异常处理
8.  登录校验
--------------------------------------------------------------
二、 数据库设计 
#新建数据库
create database struts2exec;


#创建用户 
create user struts2@localhost identified by 'struts2';
#授权
grant all on struts2exec.* to struts2@localhost;


***** Oracle和MySQL 作为应用数据库区别
mysql存在数据库概念,在企业开发中,针对一个项目创建一个单独数据库,创建单独用户, 为用户授予数据库权限 ,
oracle 一个数据库就是一个服务,在这个库中可以存在很多用户,每个用户有单独表空间 ,针对一个项目,只需要创建一个用户


#用户表
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)
);


#初始化数据:默认用户名和密码是admin
INSERT INTO s_user (userID,userName,logonName,logonPwd) VALUES (1,'超级管理员','admin','admin');
---------------------------------------------------------------------------------------
三、 搭建开发环境 
struts2 + javabean + DAO + C3P0 + DBUtils + MySQL 
导入jar包 和 配置文件 


创建包结构
cn.itcast.user.domain
cn.itcast.user.dao
cn.itcast.user.service
cn.itcast.user.web.action
cn.itcast.user.utils
===============================================================================================
功能实现:
1.登录操作
1.使用struts2提供的表单标签来改造页面。
WebRoot/login/login.jsp

<form>-------------------<s:form>
<input type="text">------<s:textfield>
<input type="password">---<s:password>
<input type="submit">-----<s:submit>
<input type="reset">------<s:reset>

在struts2的doc下有一个tag-reference.html.

1.改造form
<s:form id="loginAction_home" name="form1" action="user_login" namespace="/" target="_parent" method="post">
2.改造登录名
<s:textfield name="logonName" value="" id="logonName" cssClass="text" cssStyle="width: 160px;"/>
3.改造登录密码
<s:password  name="logonPwd" id="logonPwd" cssClass="text" cssStyle="width: 160px;"/>
密码框默认不回显示.需要设置属性showPassword="true"
4.<s:submit name="submit" value="登录" cssClass="buttoninput"/>
5.<s:reset name="reset" value="取消" cssClass="buttoninput"/>

注意:struts2中的表单标签,有默认的主题xhtml.如果不想要添加任何修饰,只需要将主题修改为simple.
问题:怎样设置主题
1.全局
在struts.xml文件中配置一个常量 
<constant name="struts.ui.theme" value="simple"></constant>
2.局部
针对于某一个form.
<s:form theme="simple">
3.局部
可以给任意的表单组件去指定theme属性值。

2.需要使用xml配置方式对数据进行校验。
用户名 非空,3-12位
密码  非空 



1.在UserAction所在包下创建一个UserAction-validation.xml
2.在xml文件中添加dtd约束
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator 1.0.3//EN"
"http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
3.对属性进行校验
<field name="logonName">
<field-validator type="requiredstring">
<message>用户名不能为空</message>
</field-validator>


<field-validator type="stringlength">
<param name="maxLength">12</param>
<param name="minLength">3</param>
<message>用户名长度必须在${minLength}到${maxLength}之间</message>
</field-validator>
</field>
<field name="logonPwd">
<field-validator type="requiredstring">
<message>密码不能为空</message>
</field-validator>
</field>
在页面上通过<s:fielderror>


3.登录成功,将用户存储到session,在页面上显示用户。
top.jsp   ${user.userName } 显示当前登陆用户 
----------------------------------------------------------------------------------------
2.查询功能--查询全部


登录成功后,跳转到home.jsp页面。home.jsp页面使用了frameset布局。
它的左边(left.jsp)页面使用了dtree,来展示。有一个连接用户管理,
当点击它时,打开了list.jsp页面。

问题:点击用户管理,应该直接打开list.jsp页面?
当点击用户管理时,应该访问UserAction中的list方法,查询出所有的List<User>
在跳转到list.jsp页面,展示出所有用户。


实现:
1.修改left.jsp页面上的用户管理的连接。
原来:d.add(3,2,'用户管理','${pageContext.request.contextPath}/user/list.jsp','','mainFrame');
修改后
d.add(3,2,'用户管理','${pageContext.request.contextPath}/user_list','','mainFrame');

2.在list方法中调用service,dao完成查询操作
得到一个List<User> users;

我们将List<User> users声明成成员变量,提供get/set方法,
这样,集合就会自动的压入到valueStack中.

问题:
1.返回SUCCESS问题   因为我们的配置是使用了通配符,一个配置对应多个请求。
这时,有可能有多种情况都返回SUCCESS,所以我们修改.
登录成功返回  login_success   查询所有成功  list_success.
2.关于查询操作时,校验的配置文件会执行。
原因:我们之前配置文件名称叫  UserAction-validation.xml,它会对UserAction下所有方法校验。
解决:将其修改为   UserAction-user_login-validation.xml 这就只会对user_login进行校验。

3.查询成功跳转到了 list.jsp,在页面上展示信息.
------------------------------------------------------------------------------------------------------
3.添加员工
1.对add.jsp页面上html标签修改----struts2的表单标签
1.性别
原标签
<input type="radio" name="sex" id="sex男" value="男"/><label for="sex男">男</label>
<input type="radio" name="sex" id="sex女" value="女"/><label for="sex女">女</label>
struts2标签:
<s:radio list="{'男','女'}" name="sex" id="sex" value="%{'男'}"/>

2.学历
原标签:
<select name="education" id="education">
<option value=""
selected="selected"
>--选择学历--</option>
<option value="博士">博士</option>
<option value="硕士">硕士</option>
<option value="研究生">研究生</option>
<option value="本科">本科</option>
<option value="专科">专科</option>
<option value="高中">高中</option>
</select>
struts2标签
<s:select list="{'博士','硕士','研究生','本科','专科','高中'}" name="education" id="education" headerKey="" headerValue="--选择学历--"></s:select>
3.兴趣爱好
<s:checkboxlist list="{'看电影','旅游','健身','购物','睡觉'}" name="interest"/>

4.上传
<s:file name="upload" size="30" value="" id="userAction_save_do_upload"/>

5.文本域
<s:textarea name="remark" cols="30" rows="3" id="userAction_save_do_remark" cssStyle="WIDTH: 96%"/>


2.添加数据的校验
在UserAction类所在包下创建一个 UserAction-user_add-validation.xml



3.完成添加操作(上传)

问题:怎样将要添加的信息在action中获取到?

在UserAction类中有一个  private User user=new User();
我们又声明了
private File upload;
private String uploadContentType;
private String uploadFileName;

添加的用户信息,除了上传文件的信息,其它的都封装到了user对象中。
而上传文件信息在三个属性上封装。


对于我们添加用户还需要有下列信息:
userID----->自动增长
path------->人为指定。

简历不允许被浏览器端直接访问。
d:/upload下.
上传简历,保存时的重名问题.
d:/upload/随机名.
filename=真实名

对于我们上面操作,因为多个action在同一个配置中(使用了通配符).
多个请求操作时,可能都需要跳转到input视图。但是它们跳转的页面
不一样,怎样处理?

可以 通过 @InputConfig注解,改为校验失败后 跳转视图 
------------------------------------------------------------------------------------
4.条件查询
1.在list.jsp页面修改查询组件

是否上传简历
<s:select list="#{'1':'有','2':'无'}" name="isUpload" id="isUpload" headerKey="0" headerValue="--请选择--"></s:select>




2.添加校验


3.完成条件查询操作
问题:是否上传简历,怎样在action中获取?

需要在User中添加一个属性  String isUpload

在dao中怎样根据条件查询?
1.sql语句生成

2.参数怎样传递?
创建一个List<Object>,在每一次判断时,直接将参数添加到集合中,
最后将集合转换成Object[],做为参数传递到query方法中。

String sql = "select * from s_user where 1=1 ";
List<Object> params=new ArrayList<Object>();
String username = user.getUserName();
if (username != null && username.trim().length() > 0) {
sql += " and userName like ?";
params.add("%"+username+"%");
}
String sex = user.getSex();
if (sex != null && sex.trim().length() > 0) {
sql += " and sex=?";
params.add(sex);
}
String education = user.getEducation();
if (education != null && education.trim().length() > 0) {
sql += " and education=?";
params.add(education);
}


String isupload = user.getIsUpload();
if ("1".equals(isupload)) {
sql += " and filename is not null";
} else if ("2".equals(isupload)) {
sql += " and filename is null";
}


QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());


return runner.query(sql, new BeanListHandler<User>(User.class),params.toArray());
--------------------------------------------------------------------------------------------------
5.员工删除
在list.jsp页面上有删除链接,我们只需要将当前用户的id传递到服务器端
    在服务器端根据id删除用户信息。删除完成,在查询一次。

1.修改list.jsp页面上删除连接
原标签:
<a href="${pageContext.request.contextPath}/user/list.jsp?userID=15">
<img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
</a>
使用struts2标签修改
第一种方式
<s:a href="路径">
第二种方式
<s:a action="" namespace="">
<s:param name="" value="">
</s:a>
第三种方式:
<s:url>标签来定义一个路径
<s:a href="url">来导入url值。


<s:url namespace="/" action="user_del" var="delUrl">
<s:param name="id" value="%{#u.userID}"/>
</s:url>

<s:a href="%{#delUrl}">
<img src="${pageContext.request.contextPath}/images/i_del.gif" width="16" height="16" border="0" style="CURSOR: hand">
</s:a>


2.完成删除操作


问题:如果用户有简历,删除用户时,也要将简历删除。
1.先查询出用户。
2.判断user.getPath()!=null
new File(user.getPath()).delete();

---------------------------------------------------------------------------------------
6.员工详细信息查看

在list.jsp页面,有查看客户详细信息连接。
<s:url namespace="/" action="user_findById" var="findByIdUrl">
<s:param name="userID" value="%{#u.userID}"/>
</s:url>
<s:a href="%{#findByIdUrl}">
<img src="${pageContext.request.contextPath}/images/button_view.gif" border="0" style="CURSOR: hand">
</s:a>

查询出用户信息(user),需要在view.jsp页面展示

在页面上展示时,我们不能使用valueStack栈顶的user对象,而要
使用压入的action的getModel方法,重新得到user对象去获取信息。

-----------------------------------------------------------------------------------------
7.员工简历下载(作业)
在view.jsp页面上展示的员工信息包含了简历,它是一个连接,点击它,实现员工简历下载。

在<result name="download_success" type="stream">
<param name="contentType">${contentType}</param>
<param name="contentDisposition">attachment;filename=${downloadFilename}</param>
<param name="inputStream">${inputStream}</param>
 </result>

-----------------------------------------------------------------------------------------
8.员工信息修改
1.查询
<a href="${pageContext.request.contextPath}/user/edit.jsp?userID=15">
<img src="${pageContext.request.contextPath}/images/i_edit.gif" border="0" style="CURSOR: hand">
</a>
<s:url namespace="/" action="user_updateForFind" var="editUrl">
<s:param name="userID" value="%{#u.userID}"/>
</s:url>

<s:a href="%{#editUrl}">
<img src="${pageContext.request.contextPath}/images/i_edit.gif" border="0" style="CURSOR: hand">
</s:a>

查询出user对象,跳转到edit.jsp页面,展示用户信息。

2.修改
修改就是一个上传操作:
问题:在修改时,关于用户简历的处理?
1.原来没有  修改也没有。---不管
2.原来没有  修改有了    ----处理
3.原来有    修改没有了 -----不管
4.原来有    修改也有.  -----处理(将旧的删除)

修改前必须先查询出用户。

==================================================================================
9.登陆校验拦截器
功能:用户只有登录成功后,才可以进行操作.


做一个Interceptor.判断用户是否登录了。(登录标志session中有user)

自定义Interceptor步骤:
1.创建一个类,实现Interceptor接口
2.重写方法完成功能
3.在struts.xml文件注册
4.在action中引入



=================================================================================
10.struts2 提供的异常处理


对于action中的操作,出现问题,直接抛出自定义异常。
在struts.xml文件中
<global-exception-mappings>
<exception-mapping result="login"
exception="cn.itcast.user.exception.FindByIdException"></exception-mapping>
</global-exception-mappings>
这就可以让特定的异常,跳转到自定的页面。




原理:
struts2,默认加载的18个拦截器的第一个是exception这个拦截器,它没有做任何操作,
直接放行,,只是它将 invocation.invoke()操作使用try-catch进行了处理。

其它的拦截器,或是action只要向外抛出异常,exception拦截器就会将其捕获。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值