您的位置:首页 > 其它

基于SSH框架-CRM客户资源管理系统-简单小项目开发记录-CRM系统-03

2017-11-28 20:39 821 查看
一、编辑员工以及基本信息的回显

@Override
public CrmStaff findById(String staffId) {
// TODO Auto-generated method stub
CrmStaff findStaff = this.getHibernateTemplate().get(CrmStaff.class,staffId);
return findStaff;
}

//根据id查询员工
@Override
public CrmStaff findById(String staffId) {
// TODO Auto-generated method stub
CrmStaff findStaff = staffDao.findById(staffId);
return findStaff;
}

/* 3 方法3:先通过id查询,比较密码是否一致
* * 如果不一致,对密码进行MD5加密
* * 将出OID之外的数据,全部设置
* * 原因:一级缓存被修改了,与快照不一致,默认情况下,当提交,自动执行update语句。
*/
@Override
public void updateStaff(CrmStaff staff) {
// TODO Auto-generated method stub
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());
}

//编辑员工前的操作
public String editUI(){
//1.通过id查询员工
CrmStaff findStaff = staffService.findById(staff.getStaffId());
ActionContext.getContext().getValueStack().push(findStaff);

//查询所有部门
List<CrmDepartment> findAllDepartment = departmentService.findAllDepartment();
ActionContext.getContext().getValueStack().set("findAllDepartment",findAllDepartment);
return "editUI";
}

//员工编辑
public String editStaff(){
staffService.updateStaff(staff);
return "editStaff";
}
}


二、编辑员工以及部门和职务的回显

<s:form namespace = "/" action = "staffAction_editStaff">
<!-- 隐藏域:存放用户id -->

<s:hidden name = "staffId" value = "%{staffId}"></s:hidden>
<table width="88%" border="0" class="emp_table" style="width:80%;">
<tr>
<td>登录名:</td>
<td><s:textfield name="loginName"></s:textfield></td>
<td>密码:</td>
<td><s:password name="loginPwd" showPassword="true"></s:password> </td>
</tr>
<tr>
<td>姓名:</td>
<td><s:textfield name="staffName"></s:textfield></td>
<td>性别:</td>
<td>
<s:radio list="{'男','女'}" name="gender"></s:radio>
</td>
</tr>
<tr>
<td width="10%">所属部门:</td>
<td width="20%">
<s:select list="findAllDepartment" name="post.department.depId" onchange="showPost(this)"
listKey="depId" listValue="depName"
headerKey="" headerValue="----请--选--择----"
>
</s:select>

</td>
<td width="8%">职务:</td>
<td width="62%">
<s:select list="post != null ? post.department.postSet : {}" name="post.postId"
listKey="postId" listValue="postName"
headerKey="" headerValue="----请--选--择----"  id="postSelectId"
></s:select>
</td>
</tr>
<tr>
<td width="10%">入职时间:</td>
<td width="20%">
<s:date name="onDutyDate" format="yyyy-MM-dd" var="myDate"/>
<s:textfield name="onDutyDate" readonly="true" value="%{#myDate}" onfocus="c.showMoreDay=true;c.show(this);"></s:textfield>
</td>
<td width="8%"></td>
<td width="62%"></td>
</tr>
</table>
</s:form>


三、编辑员工之ajax的二
4000
级联动

根据部门查询该部门下的所有职务:

package com.itheima.crm.post.dao.impl;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.itheima.crm.department.domain.CrmDepartment;
import com.itheima.crm.post.dao.PostDao;
import com.itheima.crm.post.domain.CrmPost;

public class PostDaoImpl extends HibernateDaoSupport implements PostDao {

@Override
public List<CrmPost> findAllPostWithDepartment(CrmDepartment department) {
// TODO Auto-generated method stub
List<CrmPost> findALLPostWithDepartment=  this.getHibernateTemplate().find("from CrmPost where department = ?",department);
return findALLPostWithDepartment;
}

}

package com.itheima.crm.post.service.impl;

import java.util.List;

import com.itheima.crm.department.domain.CrmDepartment;
import com.itheima.crm.post.dao.PostDao;
import com.itheima.crm.post.domain.CrmPost;
import com.itheima.crm.post.service.PostService;

public class PostServiceImpl implements PostService {

//注入PostDao
private PostDao postDao;
public void setPostDao(PostDao postDao) {
this.postDao = postDao;
}
@Override
public List<CrmPost> findAllPostWithDepartment(CrmDepartment department) {
// TODO Auto-generated method stub
return postDao.findAllPostWithDepartment(department);
}

}

//根据部门查询改部门下所有的职务(编辑中的ajax 二级联动)
//TODO:ajax的二级联动有问题(已解决)
public String findAllPostWithDepartment() throws IOException{
//1 查询
List<CrmPost> findAllPostWithDepartment = this.postService.findAllPostWithDepartment(post.getDepartment());

//2 将java对象 转换 json数据

//2.1 排除不需要数据
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setExcludes(new String[]{"department","staffSet"});

//2.2 转换
String jsonData = JSONArray.fromObject(findAllPostWithDepartment,jsonConfig).toString();

//3 将json数据发送给浏览器
//3.1 响应中文乱码
ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8");
//3.2 发送
ServletActionContext.getResponse().getWriter().print(jsonData);

return "none";
}

ajax实现:

<script type="text/javascript">
function showPost(obj){
//1.获得部门id
var depId = obj.value;

//2.发送ajax通过部门查询职务

//2.1获得ajax引擎
var xmlHttpRequest =  null;
if(window.XMLHttpRequest){
xmlHttpRequest = new XMLHttpRequest();
}else if(window.ActiveXObject){
xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
//2.2设置回调函数
xmlHttpRequest.onreadystatechange = function(){
//请求完成,正常响应
if(xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200){
//3.获得json数据字符串
var textData = xmlHttpRequest.responseText;

//3.1将json数据字符串转换为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 jsonObj = jsonData[i];
var postId = jsonObj.postId;
var postName = jsonObj.postName;

//3.3将数据显示到select标签
postSelectElement.innerHTML += ("<option value = '"+postId+"'>"+postName+"</option>");
}

}
}
//2.3建立连接
var url = "${pageContext.request.contextPath}/postAction_findAllPostWithDepartment?department.depId="+depId;
xmlHttpRequest.open("GET", url);
//2.4发送请求
xmlHttpRequest.send(null);
}
</script>




注:json数据转换成字符串需要json-lib工具!

API:

JavaBean or Map :JsonObject.fromObject(...).toString()

List or Array:JsonArray.fromObject(...).toString()

Ajax接收Json数据字符串:

var textData = new XMLHttpRequest().responseText()

Json数据字符串转成Json对象

var jsonData = eval("("+textDate+")")

四、课程类别之查询所有(这个比较简单这里就不贴代码了。)

五、课程类别之条件查询(***)

//2.带有条件的查询所有
@Override
public List<CrmCourseType> findCourseTypeWithCondition(String condition,Object[] params) {
// TODO Auto-generated method stub
String hql = "from CrmCourseType where 1 = 1" + condition;
return this.getHibernateTemplate().find(hql, params);
}

@Override
public List<CrmCourseType> findAllCourseWithCondition(CrmCourseType courseType) {
// TODO Auto-generated method stub
//1.1拼凑查询条件
StringBuilder sb = new StringBuilder();

//1.2拼凑实际参数,可以重复,有顺序
List<Object> paramsList = new ArrayList<Object>();

//2.过滤条件
//2.1课程类别
if(StringUtils.isNotBlank(courseType.getCourseName())){
sb.append("and courseName like ?");
paramsList.add("%"+courseType.getCourseName()+"%");
}
//2.2课程简介
if(StringUtils.isNotBlank(courseType.getRemark())){
sb.append("and remark like ?");
paramsList.add("%"+courseType.getRemark()+"%");
}
//2.3总学时
if(StringUtils.isNotBlank(courseType.getTotalStart())){
sb.append("and total >= ?");
paramsList.add(Integer.parseInt(courseType.getTotalStart()));
}

if(StringUtils.isNotBlank(courseType.getTotalEnd())){
sb.append("and total <= ?");
paramsList.add(Integer.parseInt(courseType.getTotalEnd()));
}
//2.4课程费用
if(StringUtils.isNotBlank(courseType.getCourseCostStart())){
sb.append("and courseCost >= ?");
paramsList.add(Double.parseDouble(courseType.getCourseCostStart()));
}

if(StringUtils.isNotBlank(courseType.getCourseCostEnd())){
sb.append("and courseCost <= ?");
paramsList.add(Double.parseDouble(courseType.getCourseCostEnd()));
}

//3.使用
//条件
String condition = sb.toString();//and...?and...?
//实际的参数
Object[] params = paramsList.toArray();

List<CrmCourseType> findCourseTypeWithCondition = courseTypeDao.findCourseTypeWithCondition(condition, params);
return findCourseTypeWithCondition;
}

public String findAllCourseType(){
/*//查询所有课程类别
List<CrmCourseType> findAllCourseType = this.courseTypeService.findAllCourseType();
ActionContext.getContext().getValueStack().set("findAllCourseType", findAllCourseType);*/

//带有条件的查询所有
List<CrmCourseType> findAllCourseType = this.courseTypeService.findAllCourseWithCondition(courseType);
ActionContext.getContext().getValueStack().set("findAllCourseType", findAllCourseType);
return "findAllCourseType";
}
注:条件查询就是查询所有,是带有条件的查询所有!

六、课程类别之添加或更新

添加或更新:savaOrUpdate()!

dao层需要两个方法:

@Override
public CrmCourseType findById(String courseTypeId) {
// TODO Auto-generated method stub
return this.getHibernateTemplate().get(CrmCourseType.class,courseTypeId);
}

@Override
public void saveOrUpdate(CrmCourseType courseType) {
// TODO Auto-generated method stub

this.getHibernateTemplate().saveOrUpdate(courseType);
}


service层需要两个方法:

@Override
public CrmCourseType findById(String courseTypeId) {
// TODO Auto-generated method stub
return courseTypeDao.findById(courseTypeId);
}
@Override
public void addOrEdit(CrmCourseType courseType) {
// TODO Auto-generated method stub
courseTypeDao.saveOrUpdate(courseType);

}


web层需要两个方法:

/**
* 添加或编辑显示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";
}
jsp页面需要注意的部分:



<td width="11%" align="center">
<s:a namespace="/" action="courseTypeAction_addOrEditUI">
<s:param name="courseTypeId" value="courseTypeId"></s:param>
<img src="${pageContext.request.contextPath}/images/button/modify.gif" class="img" />
</s:a>
</td>
(编辑时候需要携带一个参数!)
点击添加、或者编辑都会进入这个页面,只不过编辑数据会回显!所有dao层有个根据id查询对象的方法,Action中把对象压入栈顶,方便编辑的时候内容自动回显!





该添加或编辑页面的源码:

<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>
隐藏域的部分是一个需要注意的部分!
点击添加,页面源代码里隐藏域是不会显示的:





点击编辑:



因为添加和编辑走的是同一份页面,是同一个action,编辑链接里维护一个id,添加链接里没有,所以action中需要有个方法判断id是否存在,如果id存在,根据id查询并且压栈之后struts转向编辑页面,数据回显,并且页面源代码中隐藏域id值出现。如果没有id那我不用查询不用压栈,直接显示添加页面,对应页面源代码隐藏域是没有的,填写好数据,点击保存,定向到addOrEdit.action,执行该Action中的saveOrUpdate方法,因为hibernate一级缓存被修改与快照不一致,所以会自动更改数据库中数据!

附:

/*StringUtils方法的操作对象是java.lang.String类型的对象,是JDK提供的String类型操作方法的补充,
并且是null安全的(即如果输入参数String为null则不会抛出NullPointerException,而是做了相应处理,
例如,如果输入为null则返回也是null等,具体可以查看源代码)。除了构造器,StringUtils中一共有130多个
方法,并且都是static的,所以我们可以这样调用StringUtils.xxx()。*/

1. public static boolean isEmpty(String str)
判断某字符串是否为空,为空的标准是str==null或str.length()==0
下面是StringUtils判断是否为空的示例:
StringUtils.isEmpty(null) = true
StringUtils.isEmpty("") = true
StringUtils.isEmpty(" ") = false //注意在StringUtils中空格作非空处理
StringUtils.isEmpty(" ") = false
StringUtils.isEmpty("bob") = false
StringUtils.isEmpty(" bob ") = false

2. public static boolean isNotEmpty(String str)
判断某字符串是否非空,等于!isEmpty(String str)
下面是示例:
StringUtils.isNotEmpty(null) = false
StringUtils.isNotEmpty("") = false
StringUtils.isNotEmpty(" ") = true
StringUtils.isNotEmpty(" ") = true
StringUtils.isNotEmpty("bob") = true
StringUtils.isNotEmpty(" bob ") = true

3. public static boolean isBlank(String str)
判断某字符串是否为空或长度为0或由空白符(whitespace)构成
下面是示例:
StringUtils.isBlank(null) = true
StringUtils.isBlank("") = true
StringUtils.isBlank(" ") = true
StringUtils.isBlank(" ") = true
StringUtils.isBlank("\t \n \f \r") = true //对于制表符、换行符、换页符和回车符StringUtils.isBlank()均识为空白符
StringUtils.isBlank("\b") = false //"\b"为单词边界符
StringUtils.isBlank("bob") = false
StringUtils.isBlank(" bob ") = false

4. public static boolean isNotBlank(String str)
判断某字符串是否不为空且长度不为0且不由空白符(whitespace)构成,等于!isBlank(String
a55a
str)
下面是示例:
StringUtils.isNotBlank(null) = false
StringUtils.isNotBlank("") = false
StringUtils.isNotBlank(" ") = false
StringUtils.isNotBlank(" ") = false
StringUtils.isNotBlank("\t \n \f \r") = false
StringUtils.isNotBlank("\b") = true
StringUtils.isNotBlank("bob") = true
StringUtils.isNotBlank(" bob ") = true

5. public static String trim(String str)
去掉字符串两端的控制符(control characters, char <= 32),如果输入为null则返回null
下面是示例:
StringUtils.trim(null) = null
StringUtils.trim("") = ""
StringUtils.trim(" ") = ""
StringUtils.trim(" \b \t \n \f \r ") = ""
StringUtils.trim(" \n\tss \b") = "ss"
StringUtils.trim(" d d dd ") = "d d dd"
StringUtils.trim("dd ") = "dd"
StringUtils.trim(" dd ") = "dd"

6. public static String trimToNull(String str)
去掉字符串两端的控制符(control characters, char <= 32),如果变为null或"",则返回null
下面是示例:
StringUtils.trimToNull(null) = null
StringUtils.trimToNull("") = null
StringUtils.trimToNull(" ") = null
StringUtils.trimToNull(" \b \t \n \f \r ") = null
StringUtils.trimToNull(" \n\tss \b") = "ss"
StringUtils.trimToNull(" d d dd ") = "d d dd"
StringUtils.trimToNull("dd ") = "dd"
StringUtils.trimToNull(" dd ") = "dd"

7. public static String trimToEmpty(String str)
去掉字符串两端的控制符(control characters, char <= 32),如果变为null或"",则返回""
下面是示例:
StringUtils.trimToEmpty(null) = ""
StringUtils.trimToEmpty("") = ""
StringUtils.trimToEmpty(" ") = ""
StringUtils.trimToEmpty(" \b \t \n \f \r ") = ""
StringUtils.trimToEmpty(" \n\tss \b") = "ss"
StringUtils.trimToEmpty(" d d dd ") = "d d dd"
StringUtils.trimToEmpty("dd ") = "dd"
StringUtils.trimToEmpty(" dd ") = "dd"

8. public static String strip(String str)
去掉字符串两端的空白符(whitespace),如果输入为null则返回null
下面是示例(注意和trim()的区别):
StringUtils.strip(null) = null
StringUtils.strip("") = ""
StringUtils.strip(" ") = ""
StringUtils.strip(" \b \t \n \f \r ") = "\b"
StringUtils.strip(" \n\tss \b") = "ss \b"
StringUtils.strip(" d d dd ") = "d d dd"
StringUtils.strip("dd ") = "dd"
StringUtils.strip(" dd ") = "dd"

9. public static String stripToNull(String str)
去掉字符串两端的空白符(whitespace),如果变为null或"",则返回null
下面是示例(注意和trimToNull()的区别):
StringUtils.stripToNull(null) = null
StringUtils.stripToNull("") = null
StringUtils.stripToNull(" ") = null
StringUtils.stripToNull(" \b \t \n \f \r ") = "\b"
StringUtils.stripToNull(" \n\tss \b") = "ss \b"
StringUtils.stripToNull(" d d dd ") = "d d dd"
StringUtils.stripToNull("dd ") = "dd"
StringUtils.stripToNull(" dd ") = "dd"

10. public static String stripToEmpty(String str)
去掉字符串两端的空白符(whitespace),如果变为null或"",则返回""
下面是示例(注意和trimToEmpty()的区别):
StringUtils.stripToNull(null) = ""
StringUtils.stripToNull("") = ""
StringUtils.stripToNull(" ") = ""
StringUtils.stripToNull(" \b \t \n \f \r ") = "\b"
StringUtils.stripToNull(" \n\tss \b") = "ss \b"
StringUtils.stripToNull(" d d dd ") = "d d dd"
StringUtils.stripToNull("dd ") = "dd"
StringUtils.stripToNull(" dd ") = "dd"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐