【SSH测试整合Demo】企业人事管理系统(二)

简介: 前面我们已经学习了怎么整合SSH框架了。是时候拿一个小项目来练练手了….我们现在要设计一个企业人事管理系统…

编写Service

UserService

@Transactional
@Service
public class UserService {
    @Autowired
    private UserDao userDao;
    /**
     * 1.添加员工--->add()
     * 2.修改员工--->find()
     * 3.删除员工--->delete()
     * 4.得到所有员工-->getAll()
     * 5.根据id得到员工-->find()
     */
    public void addUser(User user) {
        userDao.add(user);
    }
    public void updateUser(User user) {
        userDao.update(user);
    }
    public void deleteUser(String id) {
        userDao.delete(id);
    }
    public List<User> getAllUsers() {
        return userDao.getAll();
    }
    public User findUserById(String id) {
        return userDao.find(id);
    }
}

编写AdminService

@Transactional
@Service
public class AdminService {
    @Autowired
    private AdminDao adminDao;
    /**
     * 1.保存管理员【注册】--->save()
     * 2.查找管理员【登陆】--->login()
     */
    public void register(Admin admin) {
        adminDao.add(admin);
    }
    public Admin login(Admin admin) {
        return adminDao.login(admin);
    }
}

编写DeptService

@Transactional
@Service
public class DeptService {
    @Autowired
    private DeptDao deptDao;
    /**
     * 1.查找所有的部门【在添加员工、修改员工时需要用】-->getAll()
     * 2.通过id查找所在的部门信息--->find()
     */
    public List<Dept> getAllDept() {
        return deptDao.getAll();
    }
    public Dept findDeptById(String id) {
        return deptDao.find(id);
    }
}

员工模块

到目前为止,我们已经把后台的逻辑已经写完了,接下来就是写Action和前台的页面数据了。首先来写员工模块吧。

  • 1) 添加一个员工, 指定添加的部门
  • 2) 对指定的员工信息修改
  • 3) 删除选择员工
  • 4) 列表展示

列表展示

  • UserAction
package zhongfucheng.action;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.RequestAware;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import zhongfucheng.entity.User;
import zhongfucheng.service.UserService;
import java.util.List;
import java.util.Map;
/**
 * Created by ozc on 2017/5/15.
 */
@Controller
@Scope("prototype")
public class UserAction extends ActionSupport implements RequestAware{
    @Autowired
    private UserService userService;
    //因为多处用到request对象,那就直接实现接口,来得到request对象就行了
    private Map<String, Object> request;
    @Override
    public void setRequest(Map<String, Object> map) {
        this.request = map;
    }
    /*列表展示*/
    public String list() {
        List<User> list = userService.getAllUsers();
        System.out.println(list);
        //把数据封装到request对象上
        request.put("list", list);
        return "list";
    }
}

Struts配置文件

<action name="user_*" class="userAction" method="{1}">
            <!--列表展示-->
            <result name="list">/list.jsp</result>
        </action>

list.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>列表展示</title>
</head>
<body>
<s:if test="#request.list != null">
    <table align="center" border="1">
        <tr>
            <td>员工编号</td>
            <td>员工姓名</td>
            <td>员工部门编号</td>
            <td>操作</td>
        </tr>
        <s:iterator var="user" value="#request.list" status="st">
            <tr>
                <td><s:property value="#user.id"/></td>
                <td><s:property value="#user.username"/></td>
                <td><s:property value="#user.dept.id"/> </td>
                <td><s:a href="#"> 修改,删除</s:a></td>
            </tr>
        </s:iterator>
    </table>
</s:if>
<s:else>对不起,还没有员工的信息,请录入</s:else>
</body>
</html>

效果:

微信图片_20220411192655.jpg

添加员工

添加员工,指定添加部门,跳转到添加员工显示页面…

@Autowired
    private DeptService deptService;
    /*添加员工...给出添加的JSP页面*/
    public String viewAdd() {
        //在添加员工的时候需要得到所有的部门信息
        List<Dept> deptList = deptService.getAllDept();
        //封装到request域对象中
        request.put("deptList", deptList);
        return "viewAdd";
    }
<!--给出添加员工的界面-->
            <result name="viewAdd">/viewAdd.jsp</result>

显示添加员工界面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>添加员工界面</title>
</head>
<body>
<s:form method="POST" action="user_addUser.action" theme="simple">
    <table align="center" border="1">
        <tr>
            <td>员工名称</td>
            <td><s:textfield name="username" id="username" value=""/></td>
        </tr>
        <tr>
            <td>员工部门</td>
            <!--
        Struts下拉列表标签:
            name="deptId"  下拉列表标签的名称(服务器根据这个名称获取选择的项的实际的值value值)
            headerKey   默认选择项的实际的值
            headerValue  默认下拉列表显示的内容
            list      下拉列表显示数据的集合
            listKey    集合对象的哪个属性作为下拉列表的实例的值,即value值
            listValue  集合对象的哪个属性作为下拉列表显示的值
            value      默认选择的项的设置
        -->
            <td><s:select list="#request.deptList" headerKey="-1" headerValue="请选择" listKey="id" listValue="name" name="deptId"/></td>
        </tr>
        <tr>
            <td colspan="2"><s:submit value="添加员工"/></td>
        </tr>
    </table>
</s:form>
</body>
</html>
  • 在Action中使用模型驱动和数据自动封装来获取JSP页面带过来的数据:
//模型驱动
    User user = new User();
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    @Override
    public Object getModel() {
        return user;
    }
    //自动封装deptId
    private int deptId;
    public int getDeptId() {
        return deptId;
    }
    public void setDeptId(int deptId) {
        this.deptId = deptId;
    }
  • 找到要添加员工的部门,设置员工与部门的关系。添加到数据库中:
/*添加员工*/
    public String addUser() {
        //根据部门id查找部门对象
        Dept dept = deptService.findDeptById(deptId);
        //设置部门与员工的关系
        user.setDept(dept);
        userService.addUser(user);
        //返回列表展示
        return "listPage";
    }
  • 返回到列表展示页面
<!--返回列表展示页面-->
            <result name="listPage" type="redirectAction">user_list</result>

修改员工

  • 修改与删除的超链接:指明要修改用户的id【不然服务器哪知道你点击了哪一个用户】
<td>
                    <s:a href="user_viewUpdate?id=%{#user.id}">修改</s:a>
                    <s:a href="user_delete?id=%{#user.id}"> 删除</s:a>
                </td>

微信图片_20220411192742.jpg

  • 提供修改界面【其实就是回显数据】
/*为修改提供页面,其实就是回显数据*/
    public String viewUpdate() {
        //得到user
        User user = userService.findUserById(this.user.getId());
        //得到所有的部门
        List<Dept> deptList = deptService.getAllDept();
        request.put("deptList", deptList);
        //使用Struts2的回显技术
        ValueStack valueStack = ActionContext.getContext().getValueStack();
        valueStack.pop();
        valueStack.push(user);
        return "viewUpdate";
    }
<!--提供修改页面-->
            <result name="viewUpdate">/viewUpdate.jsp</result>
  • 修改页面JSP
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>修改员工界面</title>
</head>
<body>
<s:form method="POST" action="user_updateUser.action" theme="simple">
    <table align="center" border="1">
        <%--这里要把id通过隐藏域带过去--%>
        <s:hidden name="id" id="id" value="%{id}"/>
        <tr>
            <td>员工名称</td>
            <td><s:textfield name="username" id="username"/></td>
        </tr>
        <tr>
            <td>员工部门</td>
            <td>
                <s:select name="deptId"
                          list="#request.deptList"
                          listKey="id"
                          listValue="name"
                          value="dept.id"/>
            </td>
        </tr>
        <tr>
            <td colspan="2"><s:submit value="修改员工"/></td>
        </tr>
    </table>
</s:form>
</body>
</html>
  • 因为使用了模型驱动,那么Action会把JSP带过来的数据直接封装到user对象中,我们直接使用即可
/*确认修改员工,模型驱动会把数据直接封装到user对象中*/
    public String updateUser() {
        //得到部门
        Dept dept = deptService.findDeptById(deptId);
        //设置员工与部门的关系
        user.setDept(dept);
        userService.updateUser(user);
        //修改完,返回展示列表
        return "listPage";
    }
  • 效果:

微信图片_20220411192803.gif


删除员工

/*删除员工*/
    public String delete() {
        userService.deleteUser(user.getId());
        //修改完,返回展示列表
        return "listPage";
    }
  • 测试:

微信图片_20220411192808.gif


管理员模块

  • 注册
  • 登陆

注册

  • 提供注册的超链接
<s:a href="register.jsp">注册</s:a>
  • Admin.action
package zhongfucheng.action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import zhongfucheng.entity.Admin;
import zhongfucheng.service.AdminService;
/**
 * Created by ozc on 2017/5/15.
 */
@Controller
@Scope("prototype")
public class AdminAction extends ActionSupport implements ModelDriven<Admin>{
    /**********调用service**************/
    @Autowired
    private AdminService adminService;
    /**************使用模型驱动******************/
    Admin admin = new Admin();
    public Admin getAdmin() {
        return admin;
    }
    public void setAdmin(Admin admin) {
        this.admin = admin;
    }
    @Override
    public Admin getModel() {
        return admin;
    }
}
  • 配置信息
<!--############管理员模块#################-->
        <action name="admin_*" class="adminAction" method="{1}">
        </action>
  • JSP页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册界面</title>
</head>
<body>
<s:form action="admin_register" method="POST" theme="simple">
    <table border="1" align="center">
        <tr>
            <td>管理员账号:</td>
            <td><s:textfield name="username"/></td>
        </tr>
        <tr>
            <td>管理员密码:</td>
            <td><s:textfield name="password"/></td>
        </tr>
        <tr>
            <td colspan="2"><s:submit value="注册"/> </td>
        </tr>
    </table>
</s:form>
</body>
</html>
  • Action实现
/*得到JSP页面带过来的数据、完成注册*/
    public String register() {
        adminService.register(admin);
        return "listPage";
    }
  • 效果:

微信图片_20220411192947.gif


目录
相关文章
|
2月前
|
机器学习/深度学习 人工智能 测试技术
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
EdgeMark是一个面向嵌入式AI的自动化部署与基准测试系统,支持TensorFlow Lite Micro、Edge Impulse等主流工具,通过模块化架构实现模型生成、优化、转换与部署全流程自动化,并提供跨平台性能对比,助力开发者在资源受限设备上高效选择与部署AI模型。
266 9
EdgeMark:嵌入式人工智能工具的自动化与基准测试系统——论文阅读
|
6月前
|
数据采集 算法 数据管理
频标频稳比对测试系统重新定义测量边界
在上海张江实验室的超净间里,一束激光正以每秒 30 万公里的速度穿越真空腔,与原子跃迁频率进行着纳米级的较量。而在千里之外的西安高新区,一台黑色金属机箱内,SYN5609A 型频标比对测量系统正以同样的精度,为这场量子级的时间竞赛提供着基准坐标。这台看似普通的仪器,正在用双混频时差技术,将人类对时间的掌控精度推向新的维度。
|
5月前
|
人工智能 缓存 自然语言处理
别再手搓测试数据了!AE测试数据智造系统揭秘
本文介绍如何通过构建基于大语言模型的测试数据智造Agent,解决AliExpress跨境电商测试中数据构造复杂、低效的问题,推动测试效率提升与智能化转型。
别再手搓测试数据了!AE测试数据智造系统揭秘
|
3月前
|
安全 网络安全 数据安全/隐私保护
解决SSH测试连接GitHub时出现“connection closed by remote host”的问题。
然后使用 `ssh -T git@ssh.github.com`来测试连接。
401 0
|
6月前
|
监控 安全 测试技术
【01】卓伊凡收到冒充税务机关的诈骗程序-决定在沙盒Sandbox环境中运行测试下-广大企业同胞们注意防诈骗
【01】卓伊凡收到冒充税务机关的诈骗程序-决定在沙盒Sandbox环境中运行测试下-广大企业同胞们注意防诈骗
182 14
【01】卓伊凡收到冒充税务机关的诈骗程序-决定在沙盒Sandbox环境中运行测试下-广大企业同胞们注意防诈骗
|
7月前
|
jenkins 测试技术 Shell
利用Apipost轻松实现用户充值系统的API自动化测试
API在现代软件开发中扮演着连接不同系统与模块的关键角色,其测试的重要性日益凸显。传统API测试面临效率低、覆盖率不足及难以融入自动化工作流等问题。Apipost提供了一站式API自动化测试解决方案,支持零代码拖拽编排、全场景覆盖,并可无缝集成CI/CD流程。通过可视化界面,研发与测试人员可基于同一数据源协作,大幅提升效率。同时,Apipost支持动态数据提取、性能压测等功能,满足复杂测试需求。文档还以用户充值系统为例,详细介绍了从创建测试用例到生成报告的全流程,帮助用户快速上手并提升测试质量。
|
9月前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
443 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
11月前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
295 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
10月前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生体质测试管理系统设计与实现(系统源码+文档+数据库+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
监控 测试技术
如何进行系统压力测试?
【10月更文挑战第11天】如何进行系统压力测试?
729 34