编写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>
效果:
添加员工
添加员工,指定添加部门,跳转到添加员工显示页面…
@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>
- 提供修改界面【其实就是回显数据】
/*为修改提供页面,其实就是回显数据*/ 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"; }
- 效果:
删除员工
/*删除员工*/ public String delete() { userService.deleteUser(user.getId()); //修改完,返回展示列表 return "listPage"; }
- 测试:
管理员模块
- 注册
- 登陆
注册
- 提供注册的超链接
<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"; }
- 效果: