1. 所有dao和daoimpl模块都不用, 加上 @Deprecated

2. 建立DaoSupport类和DaoSupportImpl类

DaoSupport.java

package cn.itcast.oa.base;
import java.util.List;
public interface DaoSupport<T> {void save(T entity);void delete(Long id);void update(T entity);T getById(Long id);List<T> getByIds(Long[] ids);List<T> findAll();
}

 DaoSupportImpl.java

package cn.itcast.oa.base;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import javax.annotation.Resource;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
@SuppressWarnings("unchecked")
public class DaoSupportImpl<T> implements DaoSupport<T> {@Resourceprivate SessionFactory sessionFactory;private Class<T> clazz = null;public DaoSupportImpl(){//使用反射技术得到T的真实类型ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass();//获取当前new的对象的泛型的父类类型this.clazz = (Class<T>)pt.getActualTypeArguments()[0];System.out.println("clazz===>"+clazz.getName());System.out.println("clazz===>"+clazz.getSimpleName());}protected Session getSession() {return sessionFactory.getCurrentSession();}public void save(T entity) {getSession().save(entity);}public void update(T entity) {getSession().update(entity);}public void delete(Long id) {Object obj = getById(id);if (obj != null) {getSession().delete(obj);}}public T getById(Long id) {if(id == null)return null;elsereturn (T) getSession().get(clazz, id);}public List<T> getByIds(Long[] ids) {return getSession().createQuery(//"FROM " + clazz.getSimpleName()+"WHERE id IN(:ids)")//.setParameterList("ids",ids).list();}public List<T> findAll() {return getSession().createQuery(//"FROM " + clazz.getSimpleName()).//list();}}

 3. 抽取BaseAction, 这样每个action都可以专注写自己的方法

package cn.itcast.oa.base;
import java.lang.reflect.ParameterizedType;
import javax.annotation.Resource;
import cn.itcast.oa.service.DepartmentService;
import cn.itcast.oa.service.RoleService;
import cn.itcast.oa.service.UserService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>{ protected T model ; public BaseAction(){        try {//通过反射活的model的真实类型ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();Class<T> clazz = (Class<T>)pt.getActualTypeArguments()[0];//通过反射创建model的实例model = clazz.newInstance();} catch (Exception e) {throw new RuntimeException();} }public T getModel() {      return model;}//******************service实例的声明******************@Resourceprotected RoleService roleService;@Resourceprotected DepartmentService departmentService;@Resourceprotected UserService userService;
}

整合完毕!!!

增加新模块的步骤: 

一. 创建Action的准备

1. 写新的action, UserAction.java,

1) extends BaseAction

2) @Controller  @Scope("prototype")

2. 定义出Action的方法, 写出方法名, 作用, 返回值

/** 列表 */public String list() throws Exception {return "list";}/** 删除 */public String delete() throws Exception {return "toList";}/** 添加页面 */public String addUI() throws Exception {return "saveUI";}/** 添加 */public String add() throws Exception {return "toList";}/** 修改页面 */public String editUI() throws Exception {return "saveUI";}/** 修改 */public String edit() throws Exception {return "toList";}/** 初始化密码1234 **/public String initPassword() throws Exception {return "toList";}

3. 创建所用到的jsp页面(list.jsp, saveUI.jsp)

4. struts.xml配置

<!-- 用户管理 -->
<action name="user_*" class="userAction" method="{1}"><result name="list">/WEB-INF/jsp/userAction/list.jsp</result><result name="saveUI">/WEB-INF/jsp/userAction/saveUI.jsp</result><result name="toList" type="redirectAction">user_list?parentId=${parentId}</result>
</action>

  

二. 准备service

1. 创建接口UserService.java,    extends DaoSupport<User>

package cn.itcast.oa.service;
import cn.itcast.oa.base.DaoSupport;
import cn.itcast.oa.domain.User;
public interface UserService  extends DaoSupport<User>{
}

2. 创建实现类 UserServiceImpl.java  ,  extends DaoSupportImpl<User> implements UserService

3. 配置: 在UserServiceImpl上写注解 @Service  @Transactional

package cn.itcast.oa.service.impl;import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import cn.itcast.oa.base.DaoSupportImpl;
import cn.itcast.oa.domain.User;
import cn.itcast.oa.service.UserService;@Service
@Transactional
public class UserServiceImpl extends DaoSupportImpl<User> implements UserService{}

4. BaseAction里写service的声明

package cn.itcast.oa.base;
import java.lang.reflect.ParameterizedType;
import javax.annotation.Resource;
import cn.itcast.oa.service.DepartmentService;
import cn.itcast.oa.service.RoleService;
import cn.itcast.oa.service.UserService;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;public abstract class BaseAction<T> extends ActionSupport implements ModelDriven<T>{ protected T model ; public BaseAction(){        try {//通过反射活的model的真实类型ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();Class<T> clazz = (Class<T>)pt.getActualTypeArguments()[0];//通过反射创建model的实例model = clazz.newInstance();} catch (Exception e) {throw new RuntimeException();} }public T getModel() {      return model;}//******************service实例的声明******************@Resourceprotected RoleService roleService;@Resourceprotected DepartmentService departmentService;@Resourceprotected UserService userService;
}

  

三. 填空

1. 写Action方法

UserAction.java

package cn.itcast.oa.view.action;import java.util.HashSet;
import java.util.List;import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;import cn.itcast.oa.base.BaseAction;
import cn.itcast.oa.domain.Department;
import cn.itcast.oa.domain.Role;
import cn.itcast.oa.domain.User;
import cn.itcast.oa.util.DepartmentUtils;import com.opensymphony.xwork2.ActionContext;@Controller
@Scope("prototype")
public class UserAction extends BaseAction<User> {private Long departmentId;private Long[] roleIds;/** 列表 */public String list() throws Exception {List<User> userList = userService.findAll();ActionContext.getContext().put("userList", userList);return "list";}/** 删除 */public String delete() throws Exception {userService.delete(model.getId());return "toList";}/** 添加页面 */public String addUI() throws Exception {// 准备数据departmentListList<Department> topList = departmentService.findTopList();List<Department> departmentList = DepartmentUtils.getAllDepartments(topList);ActionContext.getContext().put("departmentList", departmentList);// 准备岗位List<Role> roleList = roleService.findAll();ActionContext.getContext().put("roleList", roleList);return "saveUI";}/** 添加 */public String add() throws Exception {// 封装到对象中 (model是实体类型时, 可以使用model, 但要设置未封装的属性)model.setDepartment(departmentService.getById(departmentId));List<Role> roleList = roleService.getByIds(roleIds);model.setRoles(new HashSet<Role>(roleList));// 设置密码为1234, 要使用MD5摘要()String md5Digest = DigestUtils.md5Hex("1234");model.setPassword(md5Digest);// 保存到数据库userService.save(model);return "toList";}/** 修改页面 */public String editUI() throws Exception {// 准备数据departmentListList<Department> topList = departmentService.findTopList();List<Department> departmentList = DepartmentUtils.getAllDepartments(topList);ActionContext.getContext().put("departmentList", departmentList);// 准备岗位List<Role> roleList = roleService.findAll();ActionContext.getContext().put("roleList", roleList);// 准备回显的数据User user = userService.getById(model.getId());ActionContext.getContext().getValueStack().push(user);if (user.getDepartment() != null) {departmentId = user.getDepartment().getId();}if (user.getRoles() != null) {roleIds = new Long[user.getRoles().size()];int index = 0;for (Role role : user.getRoles()) {roleIds[index++] = role.getId();}}return "saveUI";}/** 修改 */public String edit() throws Exception {// 从数据库中取出原对象User user = userService.getById(model.getId());// 设置要修改的属性user.setLoginName(model.getLoginName());user.setName(model.getName());user.setGender(model.getGender());user.setPhoneNumber(model.getPhoneNumber());user.setEmail(model.getEmail());user.setDescription(model.getDescription());user.setDepartment(departmentService.getById(departmentId));List<Role> roleList = roleService.getByIds(roleIds);user.setRoles(new HashSet<Role>(roleList));// 更新到数据库userService.update(user);return "toList";}/** 初始化密码1234 **/public String initPassword() throws Exception {// 从数据库中取出原对象User user = userService.getById(model.getId());// 设置要修改的属性String md5Digest = DigestUtils.md5Hex("1234");user.setPassword(md5Digest);// 更新到数据库,使用MD5摘要userService.update(user);return "toList";}public Long getDepartmentId() {return departmentId;}public void setDepartmentId(Long departmentId) {this.departmentId = departmentId;}public Long[] getRoleIds() {return roleIds;}public void setRoleIds(Long[] roleIds) {this.roleIds = roleIds;}
}

  

2. 新增service方法

3. jsp页面内容

list.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%String path = request.getContextPath();%>
<html>
<head><title>用户列表</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script language="javascript" type="text/javascript" src=<%=path%>/script/jquery.js"></script><script language="javascript" type="text/javascript" src=<%=path%>/script/pageCommon.js"></script><script language="javascript" type="text/javascript" src=<%=path%>/script/PageUtils.js"></script><link type="text/css" rel="stylesheet" href="<%=path%>/style/blue/pageCommon.css"/><script type="text/javascript"></script>
</head>
<body><div id="Title_bar"><div id="Title_bar_Head"> <div id="Title_Head"></div><div id="Title"><!--页面标题--><img border="0" width="13" height="13" src="${pageContext.request.contextPath}/style/images/title_arrow.gif"/> 用户管理</div><div id="Title_End"></div></div>
</div><div id="MainArea"><table cellspacing="0" cellpadding="0" class="TableStyle"><!-- 表头--><thead><tr align=center valign=middle id=TableTitle><td width="100">登录名</td><td width="100">姓名</td><td width="100">所属部门</td><td width="200">岗位</td><td>备注</td><td>相关操作</td></tr></thead><!--显示数据列表--><tbody id="TableData" class="dataContainer" datakey="userList"><s:iterator value="#userList"><tr class="TableDetail1 template"><td>${loginName} </td><td>${name} </td><td>${department.name} </td><td><s:iterator value="roles">${name}</s:iterator></td><td>${description} </td><td><s:a action="user_delete?id=%{id}" οnclick="return delConfirm()">删除</s:a><s:a action="user_editUI?id=%{id}">修改</s:a><s:a action="user_initPassword?id=%{id}" οnclick="return window.confirm('您确定要初始化密码为1234吗?')">初始化密码</s:a></td></tr></s:iterator> </tbody></table><!-- 其他功能超链接 --><div id="TableTail"><div id="TableTail_inside"><s:a action="user_addUI"><img src="${pageContext.request.contextPath}/style/images/createNew.png" /></s:a></div></div>
</div></body>
</html>

  saveUI.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%String path = request.getContextPath();%>
<html>
<head><title>用户信息</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script language="javascript" type="text/javascript" src=<%=path%>/script/jquery.js"></script><script language="javascript" type="text/javascript" src=<%=path%>/script/pageCommon.js"></script><script language="javascript" type="text/javascript" src=<%=path%>/script/PageUtils.js"></script><link type="text/css" rel="stylesheet" href="<%=path%>/style/blue/pageCommon.css"/><script type="text/javascript"></script>
</head>
<body><!-- 标题显示 -->
<div id="Title_bar"><div id="Title_bar_Head"><div id="Title_Head"></div><div id="Title"><!--页面标题--><img border="0" width="13" height="13" src="<%=path%>/style/images/title_arrow.gif"/> 用户信息</div><div id="Title_End"></div></div>
</div><!--显示表单内容-->
<div id=MainArea><s:form action="user_%{id == null ? 'add' : 'edit'}"><s:hidden name="id"></s:hidden><div class="ItemBlock_Title1"><!-- 信息说明 --><div class="ItemBlock_Title1"><img border="0" width="4" height="7" src="<%=path%>/style/blue/images/item_point.gif" /> 用户信息 </div> </div><!-- 表单内容显示 --><div class="ItemBlockBorder"><div class="ItemBlock"><table cellpadding="0" cellspacing="0" class="mainForm"><tr><td width="100">所属部门</td><td><s:select name="departmentId" cssClass="SelectStyle"list="#departmentList" listKey="id" listValue="name"headerKey="" headerValue="==请选择部门=="/></td></tr><tr><td>登录名</td><td><s:textfield name="loginName" cssClass="InputStyle"/> *(登录名要唯一)</td></tr><tr><td>姓名</td><td><s:textfield name="name" cssClass="InputStyle"/> *</td></tr><tr><td>性别</td><td><%--<s:radio name="gender" list="%{ #{'男':'男', '女':'女'} }"></s:radio><s:radio name="gender" list="#{'男':'男', '女':'女'}"></s:radio>--%><s:radio name="gender" list="{'男', '女'}"></s:radio></td></tr><tr><td>联系电话</td><td><s:textfield name="phoneNumber" cssClass="InputStyle"/></td></tr><tr><td>E-mail</td><td><s:textfield name="email" cssClass="InputStyle"/></td></tr><tr><td>备注</td><td><s:textarea name="description" cssClass="TextareaStyle"></s:textarea></td></tr></table></div></div><div class="ItemBlock_Title1"><!-- 信息说明 --><div class="ItemBlock_Title1"><img border="0" width="4" height="7" src="<%=path%>/style/blue/images/item_point.gif" /> 岗位设置 </div> </div><!-- 表单内容显示 --><div class="ItemBlockBorder"><div class="ItemBlock"><table cellpadding="0" cellspacing="0" class="mainForm"><tr><td width="100">岗位</td><td><s:select name="roleIds" cssClass="SelectStyle"multiple="true" size="10" list="#roleList" listKey="id" listValue="name"/>按住Ctrl键可以多选或取消选择</td></tr></table></div></div>      <!-- 表单操作 --><div id="InputDetailBar"><input type="image" src="<%=path%>/style/images/save.png"/><a href="javascript:history.go(-1);"><img src="<%=path%>/style/images/goBack.png"/></a></div></s:form>
</div><div class="Description">说明:<br />1,用户的登录名要唯一,在填写时要同时检测是否可用。<br />2,新建用户后,密码被初始化为"1234"。<br />3,密码在数据库中存储的是MD5摘要(不是存储明文密码)。<br />4,用户登录系统后可以使用“个人设置→修改密码”功能修改密码。<br />5,新建用户后,会自动指定默认的头像。用户可以使用“个人设置→个人信息”功能修改自已的头像<br />6,修改用户信息时,登录名不可修改。
</div></body>
</html>

  

  

  

转载于:https://www.cnblogs.com/wujixing/p/5511045.html

实战3--设计管理模块,整合!!!相关推荐

  1. ASP.NET典型三层架构企业级医药行业ERP系统实战(8大模块22个子系统,价值3000万)

    ASP.NET典型三层架构企业级医药行业ERP系统实战(8大模块22个子系统,价值3000万) 课程讲师:Tiger     课程分类:.net         适合人群:高级       课时数量: ...

  2. Java微服务——SpringCloud实战篇2:整合Gateway、Config、Bus

    Java微服务--SpringCloud实战篇2:整合Gateway.Config.Bus 如果小伙伴在阅读下列内容时,对于编写SpringCloud项目是零基础,那么请先阅读小编的另一篇博文:&qu ...

  3. Elasticsearch实战篇——Spring Boot整合ElasticSearch

    2019独角兽企业重金招聘Python工程师标准>>> 当前Spring Boot很是流行,包括我自己,也是在用Spring Boot集成其他框架进行项目开发,所以这一节,我们一起来 ...

  4. ElasticSearch实战篇 - Spring Boot 整合 ElasticSearch

    点击上方 Java后端,选择 设为星标 优质文章,及时送达 作者:冯文议 链接:segmentfault.com/a/1190000018625101 当前Spring Boot很是流行,包括我自己, ...

  5. SpringSecurity权限管理系统实战—六、SpringSecurity整合JWT

    文章目录 系列目录 前言 一.无状态登录 二.JWT介绍 1.什么是jwt 头部(Header) 载荷(Payload) 签名(Signature) 2.JWT工作流程 3.简单实现 三.整合JWT ...

  6. SpringBoot 2.7.2 分模块整合 activiti 7.1.0.M6

    SpringBoot 2.7.2 分模块整合 activiti 7.1.0.M6 项目背景 项目架构 process-dao process-service process 版本一览 process- ...

  7. ASP.NET典型三层架构企业级医药行业ERP系统实战(8大模块22个子系统)

    课程学习地址:http://***/goods.php?id=180 课程说明: 国内首部完整讲述ERP系统架构.业务逻辑.开发的项目实战课程.考虑到本系统的庞大及复杂性.本课程购买学员每人赠送一个U ...

  8. ASP.NET典型三层架构企业级医药行业ERP系统实战(8大模块22个子系统,价值3000万)...

    课程讲师:Tiger     课程分类:.net         适合人群:高级       课时数量:192课时       更新程度:完毕 我这里有一套课程和大家分享,我的qq是205905533 ...

  9. echarts前后端交互数据_SpringBoot2.0实战(26)整合SpringSecurity前后端分离JSON交互...

    在前端的文章中,我们实现了使用 SpringSecurity 实现登录鉴权,并使用数据库存储用户信息,实现登录鉴权 SpringBoot2.0实战(24)整合SpringSecurity之最简登录方法 ...

最新文章

  1. 怎么让wordpress用sqlite3 搭建轻量级博客系统
  2. 图标和文字对齐的方法
  3. “极致”神话和产品观念_转自“蜗窝科技”
  4. RIPPER算法原理
  5. php mysql_query的的用法_PHPmysqli_query()函数定义与用法
  6. 服务器物理部署拓扑图,【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(五)-物理服务器路由方案及配置...
  7. 360浏览器兼容问题
  8. 死锁Demo、线程通信Demo
  9. Linux内核管理之分配掩码(三)
  10. 安川机器人编程加电弧_安川焊接机器人编程
  11. 静态库.a和动态库.so的制作
  12. linux系统中配置NFS实现文件共享
  13. 【2022年更新】手把手教你去除 WinRAR 的弹窗广告
  14. ios12越狱自签需要联网_从越狱的iOS切换到Android? 这是你需要知道的
  15. 1946年2月14号第一台计算机,1946年2月14日 世界上第一台计算机诞生,世界,您好!...
  16. js报错“TypeError: ‘stepUp‘ called on an object that does not implement interface HTMLInputElement”
  17. GPS导航仪的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. win 7 系统(x64)安装vs2012时遇到的问题
  19. loadrunner破解以及超级license
  20. SM4加密算法原理以及C语言实现

热门文章

  1. protobuf message定义_ProtoBuf 协议设计与开发
  2. @value 静态变量_Spring注解驱动开发之八——@Value属性赋值、@PropertySource 加载外部配置文件...
  3. python xlsxwriter 画图_Python XlsxWriter模块Chart类用法实例分析
  4. 【百家稷学】从传统方法到深度学习,人脸算法和应用的演变(河南平顶山学院技术分享)...
  5. 【杂谈】深度学习之模型设计书看完了完全不过瘾?那这些拓展资料你都看了不?...
  6. 【百战GAN】二次元宅们,给自己做一个专属动漫头像可好!
  7. python循环输出00-59
  8. 农贸自由化对话国际农民丰收节贸易会:东北粮食贸易对策
  9. Android基础(三) UI开发 Part 1
  10. P2698 [USACO12MAR]花盆Flowerpot