标签:func pes 部门 原因 where post 添加 clip 自动
l 步骤一:创建空文件夹,并创建crm仓库,同时创建目录规范
l 步骤二:配置权限
svnserve.conf
passwd
authz
l 步骤三:在myeclipse 创建 svn 资源库路径
l 步骤四:将项目分析到svn
l 步骤五:查看项目日志记录
项目右键/team/显示资源历史记录
配置信息
svnserve.conf
authz
l 先查询
l 用户浏览器修改
l 提交表单,进行更新
l 如果文本框,通过name从值栈的栈顶开始获得数据,如果获得将回显。
l 如果checkbox、radio、select 本身需要有数据,通过name从值栈获得数据,如果与提供数据一致,将回显。
@Override public CrmStaff findById(String staffId) { return this.getHibernateTemplate().get(CrmStaff.class, staffId); } |
@Override public CrmStaff findById(String staffId) { return this.staffDao.findById(staffId); } |
/** * 编辑前操作 * @return */ public String editUI(){ //1 通过id查询员工 CrmStaff findStaff = this.staffService.findById(staff.getStaffId()); ActionContext.getContext().getValueStack().push(findStaff);
|
<td>登录名:</td> <td><s:textfield name="loginName"></s:textfield></td> <td>密码:</td> <td><s:password name="loginPwd" showPassword="true"></s:password> </td> |
public class DepartmentDaoImpl extends HibernateDaoSupport implements DepartmentDao {
@Override public List<CrmDepartment> findAll() { return this.getHibernateTemplate().find("from CrmDepartment"); }
|
public class DepartmentServiceImpl implements DepartmentService {
private DepartmentDao departmentDao; public void setDepartmentDao(DepartmentDao departmentDao) { this.departmentDao = departmentDao; } @Override public List<CrmDepartment> findAll() { return departmentDao.findAll(); }
} |
l 每一个模块单独使用xml,注意:applicationContext.xml import
<!-- 部门配置项:dao、service -->
<bean id="departmentDao" class="com.itheima.crm.department.dao.impl.DepartmentDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean>
<bean id="departmentService" class="com.itheima.crm.department.service.impl.DepartmentServiceImpl"> <property name="departmentDao" ref="departmentDao"></property> </bean>
|
/** * 编辑前操作 * @return */ public String editUI(){ //1 通过id查询员工 CrmStaff findStaff = this.staffService.findById(staff.getStaffId()); ActionContext.getContext().getValueStack().push(findStaff);
//2 查询所有部门 List<CrmDepartment> allDepartment = departmentService.findAll(); // * jsp页面通过“key”获得 ActionContext.getContext().getValueStack().set("allDepartment",allDepartment);
return "editUI"; } |
l listKey 和 listValue 获得当前列表项使用javabean某一个属性的值
l name ,通过name从值栈获得数据,如果listKey确定的数据一致,将回显
<s:select list="allDepartment" name="post.department.depId" listKey="depId" listValue="depName" headerKey="" headerValue="----请--选--择----" > </s:select> |
l 当前员工的职务,所属的部门,此部门下的所有职务 。post.department.postSet
<s:select list="post != null ? post.department.postSet : {}" name="post.postId" listKey="postId" listValue="postName" headerKey="" headerValue="----请--选--择----" ></s:select> |
public class PostDaoImpl extends HibernateDaoSupport implements PostDao { @Override public List<CrmPost> findAll(CrmDepartment department) { return this.getHibernateTemplate().find("from CrmPost where department = ?", department); } } |
public class PostServiceImpl implements PostService { private PostDao postDao; public void setPostDao(PostDao postDao) { this.postDao = postDao; } @Override public List<CrmPost> findAll(CrmDepartment department) { return postDao.findAll(department); } } |
<!-- 部门配置项:dao、service --> <bean id="postDao" class="com.itheima.crm.post.dao.impl.PostDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean>
<bean id="postService" class="com.itheima.crm.post.service.impl.PostServiceImpl"> <property name="postDao" ref="postDao"></property> </bean> |
l 公共
public class PostAction extends ActionSupport implements ModelDriven<CrmPost> { //封装数据 private CrmPost post = new CrmPost(); @Override public CrmPost getModel() { return post; } // service private PostService postService; public void setPostService(PostService postService) { this.postService = postService; } /////////////////////////////////////////////// |
l 功能:需要排除关联对象,响应的中文乱码
/** * ajax 通过部门 ,查询所有的职务 * @return * @throws IOException */ public String findAllWithDepartment() throws IOException{ //1 查询 List<CrmPost> allPost = this.postService.findAll(post.getDepartment());
//2 将java对象 转换 json数据
//2.1 排除不需要数据 JsonConfig jsonConfig = new JsonConfig(); jsonConfig.setExcludes(new String[]{"department","staffSet"}); //2.2 转换 String jsonData = JSONArray.fromObject(allPost,jsonConfig).toString();
//3 将json数据发送给浏览器 //3.1 响应中文乱码 ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8"); //3.2 发送 ServletActionContext.getResponse().getWriter().print(jsonData);
return "none"; } |
<!-- 员工配置 --> <package name="pos" namespace="/" extends="common"> <action name="postAction_*" class="com.itheima.crm.post.web.action.PostAction" method="{1}"> </action> </package> |
l 将采用json-lib 工具生成
l 导入jar包:(注意:重复)
l api使用:
JavaBean 或 Map :JSONObject.fromObject(...).toString();
List 或 Array:JSONArray.fromObject(...).toString();
l /ee19_crm/WebRoot/WEB-INF/pages/staff/editStaff.jsp
l 步骤:
1.获得当前选中部门
2.发送ajax查询职务(获得引擎、设置回调、开发连接、发送请求)
3.获得数据后,将数据添加到职务的select标签中。
<script type="text/javascript"> function showPost(obj){ //1 获得选中部门 var depId = obj.value; //2 发送ajax,通过部门查询职务 //2.1 获得引擎 var xmlhttp=null; if (window.XMLHttpRequest){// code for all new browsers xmlhttp=new XMLHttpRequest(); } else if (window.ActiveXObject) {// code for IE5 and IE6 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); }
//2.2 设置回调函数 xmlhttp.onreadystatechange = function(){ //请求完成,正常响应 if(xmlhttp.readyState == 4 && xmlhttp.status == 200){ //3 获得数据,并展示 ,手动ajax 获得 json数据 字符串 var textData = xmlhttp.responseText; //3.1 将字符串 手动 转换 json对象 var jsonData = eval("("+textData+")");
// 获得select对象 var postSelectElement = document.getElementById("postSelectId"); postSelectElement.innerHTML = "<option value=‘‘>----请--选--择----</option>";
//3.2 遍历 for(var i = 0 ; i < jsonData.length ; i++){ var postObj = jsonData[i]; // 获得职务id var postId = postObj.postId; // 获得职务名称 var postName = postObj.postName;
//3.3 将数显示到select标签 postSelectElement.innerHTML += "<option value=‘"+postId+"‘>"+postName+"</option>"; }
} }; //2.3 创建连接 var url = "${pageContext.request.contextPath}/postAction_findAllWithDepartment?department.depId=" + depId; xmlhttp.open("GET", url); //2.4 发送请求 xmlhttp.send(null); } </script> |
l 填写表单提交位置,添加隐藏字段
<s:form namespace="/" action="staffAction_edit"> <%--隐藏域,存放用户id --%> <s:hidden name="staffId" value="%{staffId}"></s:hidden> |
l 添加javascript click事件,提交表单
<a href="javascript:void(0)" onclick="document.forms[0].submit()"> <img src="${pageContext.request.contextPath}/images/button/save.gif" /> </a> |
/** * 编辑 * @return */ public String edit(){ this.staffService.updateStaff(staff); return "edit"; } |
l 采用 hibernate的 快照 和一级缓存
public void updateStaff(CrmStaff staff) { /* 1 方法1:判断密码是否32长度, * * 如果是,密码没有修改,之前(加密后的) * * 如果不是,密码已经修改了,之后(需要加密) */
/* 2 方式2:不更新密码 * * dao.update(staff),默认更新所有的数据 * * CrmStaff.hbm.xml 配置密码不参加更新 , <property name="loginPwd" update="false"></property> */
/* 3 方法3:先通过id查询,比较密码是否一致 * * 如果不一致,对密码进行MD5加密 * * 将出OID之外的数据,全部设置 * * 原因:一级缓存被修改了,与快照不一致,默认情况下,当提交,自动执行update语句。 */ CrmStaff findStaff = staffDao.findById(staff.getStaffId()); if(! findStaff.getLoginPwd().equals(staff.getLoginPwd())){ findStaff.setLoginPwd(MyStringUtils.getMD5Value(staff.getLoginPwd())); } findStaff.setLoginName(staff.getLoginName()); findStaff.setStaffName(staff.getStaffName()); findStaff.setGender(staff.getGender()); findStaff.setOnDutyDate(staff.getOnDutyDate()); findStaff.setPost(staff.getPost());
} |
<!-- 6 编辑成功 * 重定向可以注入详细配置 * 默认使用 <result name="success" type="redirectAction">staffAction_home</result> 给actionName进行注入 --> <result name="edit" type="redirectAction"> <param name="namespace">/</param> <param name="actionName">staffAction_findAll</param> </result> |
1.dao
2.service
3.spring
4.action class
5.struts
6.jsp
和 执行的都是findAll()查询
<s:form namespace="/" action="courseTypeAction_findAll"> <table width="88%" border="0" class="emp_table" style="width:80%;"> <tr> <td width="10%">课程类别:</td> <td><s:textfield name="courseName" size="30"></s:textfield></td> </tr> <tr> <td >课程简介:</td> <td ><s:textfield name="remark" size="30" ></s:textfield></td> </tr> <tr> <td >总学时:</td> <td > <s:textfield name="totalStart" size="12"></s:textfield> 至 <s:textfield name="totalEnd" size="12"></s:textfield> </td> |
//查询条件 -- 一般查询条件都是字符串 //1 总学时 private String totalStart; private String totalEnd; //2课程费用 private String courseCostStart; private String courseCostEnd; |
/** * 查询所有 * @return */ public String findAll(){ /*1简单查询 List<CrmCourseType> allCourseType = this.courseTypeService.findAll(); // * 查询结果存在值栈 , jsp 通过“#key”获得 ActionContext.getContext().put("allCourseType", allCourseType); */
/*2 条件查询 */ List<CrmCourseType> allCourseType = this.courseTypeService.findAll(courseType); ActionContext.getContext().put("allCourseType", allCourseType);
return "findAll"; } |
l 使用StringBuilder 拼凑字符串,所有的条件格式“ and 属性 运算符 ? ”
toString 转成字符串
l 使用List拼凑实际参数,使用List特性:重复、有序
toArray 转成数组
l commons-lang3 提供 StringUtils工具类
@Override public List<CrmCourseType> findAll(CrmCourseType courseType) { //1.1 拼凑查询条件 StringBuilder builder = new StringBuilder(); //1.2 拼凑实际参数 , 可以重复,顺序 --> List List<Object> paramsList = new ArrayList<Object>();
//2 过滤条件 // 2.1 课程类别 if(StringUtils.isNotBlank(courseType.getCourseName())){ builder.append(" and courseName like ?"); paramsList.add("%"+courseType.getCourseName()+"%"); } // 2.2 课程简介 if(StringUtils.isNotBlank(courseType.getRemark())){ builder.append(" and remark like ?"); paramsList.add("%"+courseType.getRemark()+"%"); } // 2.3 总学时: if(StringUtils.isNotBlank(courseType.getTotalStart())){ builder.append(" and total >= ?"); paramsList.add(Integer.parseInt(courseType.getTotalStart())); } if(StringUtils.isNotBlank(courseType.getTotalEnd())){ builder.append(" and total <= ?"); paramsList.add(Integer.parseInt(courseType.getTotalEnd())); } // 2.4课程费用 if(StringUtils.isNotBlank(courseType.getCourseCostStart())){ builder.append(" and courseCost >= ?"); paramsList.add(Double.parseDouble(courseType.getCourseCostStart())); } if(StringUtils.isNotBlank(courseType.getCourseCostEnd())){ builder.append(" and courseCost <= ?"); paramsList.add(Double.parseDouble(courseType.getCourseCostEnd())); }
//3 使用 // 条件 , 格式:" and ..? and ..." String condition = builder.toString(); // 实际参数 Object[] params = paramsList.toArray();
return courseTypeDao.findAll(condition, params); } |
l service拼凑查询条件,dao直接使用,通过where 1=1 产生一个恒定条件
@Override public List<CrmCourseType> findAll(String condition, Object[] params) { String hql = "from CrmCourseType where 1=1 " + condition; return this.getHibernateTemplate().find(hql , params); } |
1.dao ,hibernate 提供 saveOrUpdate()
代理主键 uuid
如果没有OID,值为null,底层执行save() ,及insert语句
如果有OID,有值,底层执行update(),及update语句。
查询详情
2.service 需要事务管理器 (add、update、delete、find)
addOrEdit
3.action 类
addOrEditUI 显示jsp
如果是更新,需要通过id查询详情 findById()
addOrEdit
直接保存或更新,注意:如果更新需要传递id值
4.jsp
添加,直接显示jsp页面
编辑,传递id值,通过id查询,显示jsp页面
l 编辑需要查询
l 添加和编辑直接执行saveOrUpdate
@Override public CrmCourseType findById(String courseTypeId) { return this.getHibernateTemplate().get(CrmCourseType.class, courseTypeId); }
@Override public void saveOrUpdate(CrmCourseType courseType) { this.getHibernateTemplate().saveOrUpdate(courseType); } |
@Override public CrmCourseType findById(String courseTypeId) { return this.courseTypeDao.findById(courseTypeId); } @Override public void addOrEdit(CrmCourseType courseType) { this.courseTypeDao.saveOrUpdate(courseType); } |
l 添加需要显示jsp,不进行查询
l 更新需要显示jsp,进行查询,使用id进行区分。
/** * 添加或编辑显示jsp页面 * @return */ public String addOrEditUI(){ //如果有id就是编辑,编辑需要查询详情 if(StringUtils.isNotBlank(this.courseType.getCourseTypeId())){ //将查询的详情压入到栈顶,方便标签自动的回显 CrmCourseType findCourseType = this.courseTypeService.findById(this.courseType.getCourseTypeId()); ActionContext.getContext().getValueStack().push(findCourseType); }
return "addOrEditUI"; }
/** * 添加或编辑 功能 * @return */ public String addOrEdit(){ this.courseTypeService.addOrEdit(courseType); return "addOrEdit"; } |
l 使用标签进行回显
l 提供隐藏字段进行更新,添加不需要
<s:form namespace="/" action="courseTypeAction_addOrEdit"> <%--隐藏域 ,如果有值,及更新时才显示--%> <s:if test="courseTypeId != null"> <s:hidden name="courseTypeId" value="%{courseTypeId}"></s:hidden> </s:if> <table width="88%" border="0" class="emp_table" style="width:80%;"> <tr> <td width="10%">课程类别:</td> <td width="20%"><s:textfield name="courseName"></s:textfield></td> <td width="8%">总学时:</td> <td width="62%"><s:textfield name="total"></s:textfield></td> </tr> <tr> <td>课程费用:</td> <td><s:textfield name="courseCost"></s:textfield></td> <td></td> <td></td> </tr> <tr> <td>课程简介:</td> <td> </td> <td> </td> <td> </td> </tr> <tr> <td colspan="4"> <s:textarea name="remark" cols="60" rows="10" ></s:textarea> </td> </tr> </table> </s:form> |
标签:func pes 部门 原因 where post 添加 clip 自动
原文地址:http://www.cnblogs.com/ethan0603/p/7555306.html