【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


目录
相关文章
|
1月前
|
监控 测试技术
如何进行系统压力测试?
【10月更文挑战第11天】如何进行系统压力测试?
100 34
|
1月前
|
存储 监控 网络协议
服务器压力测试是一种评估系统在极端条件下的表现和稳定性的技术
【10月更文挑战第11天】服务器压力测试是一种评估系统在极端条件下的表现和稳定性的技术
109 32
|
10天前
|
缓存 监控 测试技术
全网最全压测指南!教你如何测试和优化系统极限性能
大家好,我是小米。本文将介绍如何在实际项目中进行性能压测和优化,包括单台服务器和集群压测、使用JMeter、监控CPU和内存使用率、优化Tomcat和数据库配置等方面的内容,帮助你在高并发场景下提升系统性能。希望这些实战经验能助你一臂之力!
25 3
|
1月前
|
安全 Java 数据库
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
这篇文章是关于Apache Shiro权限管理框架的详细学习指南,涵盖了Shiro的基本概念、认证与授权流程,并通过Spring Boot测试模块演示了Shiro在单应用环境下的使用,包括与IniRealm、JdbcRealm的集成以及自定义Realm的实现。
43 3
shiro学习一:了解shiro,学习执行shiro的流程。使用springboot的测试模块学习shiro单应用(demo 6个)
|
19天前
|
编解码 安全 Linux
网络空间安全之一个WH的超前沿全栈技术深入学习之路(10-2):保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali——Liinux-Debian:就怕你学成黑客啦!)作者——LJS
保姆级别教会你如何搭建白帽黑客渗透测试系统环境Kali以及常见的报错及对应解决方案、常用Kali功能简便化以及详解如何具体实现
|
2月前
|
Linux
kickstart自动安装系统 --DHCP 配置及测试
PXE+Kickstart自动安装系统需配置DHCP服务器分配IP。dhcpd.conf示例:设置更新样式、忽略客户端更新、指定下一服务器及启动文件。定义子网、网关、掩码、动态地址池并预留特定MAC地址。重启xinetd、NFS、DHCP服务,确保新服务器与Kickstart服务器在同一网络,避免误装其他机器。注意隔离测试网络以防干扰生产环境。
80 18
|
1月前
|
存储 Linux 网络安全
Kali 渗透测试:Meterpreter在Windows系统下的使用
Kali 渗透测试:Meterpreter在Windows系统下的使用
|
2月前
|
测试技术 UED 开发者
软件测试的艺术:从代码审查到用户反馈的全景探索在软件开发的宇宙中,测试是那颗确保星系正常运转的暗物质。它或许不总是站在聚光灯下,但无疑是支撑整个系统稳定性与可靠性的基石。《软件测试的艺术:从代码审查到用户反馈的全景探索》一文,旨在揭开软件测试这一神秘面纱,通过深入浅出的方式,引领读者穿梭于测试的各个环节,从细微处着眼,至宏观视角俯瞰,全方位解析如何打造无懈可击的软件产品。
本文以“软件测试的艺术”为核心,创新性地将技术深度与通俗易懂的语言风格相结合,绘制了一幅从代码审查到用户反馈全过程的测试蓝图。不同于常规摘要的枯燥概述,这里更像是一段旅程的预告片,承诺带领读者经历一场从微观世界到宏观视野的探索之旅,揭示每一个测试环节背后的哲学与实践智慧,让即便是非专业人士也能领略到软件测试的魅力所在,并从中获取实用的启示。
|
3月前
|
测试技术
探索软件测试的多维视角:从单元到系统,从静态到动态
【8月更文挑战第27天】本文将带领读者穿越软件测试的迷宫,从最微小的单元测试开始,逐步扩展到复杂的系统测试。我们将一起探索静态测试和动态测试的不同面貌,以及它们如何互补地确保软件质量。通过实际代码示例,我们将揭示测试用例的设计思路和执行过程,旨在为读者提供一个全面而深入的软件测试全景图。让我们开始这段旅程,解锁软件测试的秘密,确保我们的代码不仅能够运行,而且能够完美运行。
|
3月前
|
监控 网络协议 安全
在Linux中,如何进行系统性能的峰值测试?
在Linux中,如何进行系统性能的峰值测试?