国家电力项目-03

*.hl_mark_KMSmartTagPinkImg{background-color:#ffaaff;}*.hl_mark_KMSmartTagBlueImg{background-color:#99ccff;}*.hl_mark_KMSmartTagYellowImg{background-color:#ffff66;}*.hl_mark_KMSmartTagOrangeImg{background-color:#ffad5b;}*.hl_mark_KMSmartTagGreenImg{background-color:#84e384;}*.hl_mark_KMSmartTagPurpleImg{background-color:#d6acff;}*.hl_mark_KMSmartTagRedImg{background-color:#ff8888;}

.wiz-todo, .wiz-todo-img {width: 16px; height: 16px; cursor: default; padding: 0 10px 0 2px; vertical-align: -7%;-webkit-user-select: none;} .wiz-todo-label { line-height: 2.5;} .wiz-todo-label-checked { color: #666;} .wiz-todo-label-unchecked {text-decoration: initial;} .wiz-todo-completed-info {padding-left: 44px; display: inline-block; } .wiz-todo-avatar { width:20px; height: 20px; vertical-align: -20%; margin-right:10px; border-radius: 2px;} .wiz-todo-account, .wiz-todo-dt { color: #666; }

项目第三天(数据字典)

1:需要的表

  1. #数据字典
  2. CREATE TABLE Elec_SystemDDL(
  3. seqID INT NOT NULL primary key, #主键ID(自增长)
  4. keyword VARCHAR(20) NULL, #数据类型
  5. ddlCode INT NULL, #数据项的code
  6. ddlName VARCHAR(50) NULL #数据项的value
  7. )

存放的数据:

2:hql和sql语句的投影查询

(1)如果投影查询是一个字段,此时返回List<Object>,例如

  1. String hql = "SELECT DISTINCT o.keyword FROM ElecSystemDDL o";
  2. List<Object> list = this.getHibernateTemplate().find(hql);

(2)如果投影查询是多个字段,此时返回List<Object[]>,例如

  1. String hql = "SELECT DISTINCT o.keyword,o.ddlName FROM ElecSystemDDL o";
  2. List<Object[]> list = this.getHibernateTemplate().find(hql);

(3)如果投影查询是多个字段,此时返回List<Object[]>,例如

  1. String hql = "SELECT o,o.ddlName FROM ElecSystemDDL o";
  2. List<Object[]> list = this.getHibernateTemplate().find(hql);

数组的第一个值,是一个ElecSystemDDL的对象,数组的第二个值表示字段ddlName的值。

(4)如果投影查询是一个对象,此时返回List<ElecSystemDDL>,例如

  1. String hql = "SELECT o FROM ElecSystemDDL o";
  2. List<ElecSystemDDL> list = this.getHibernateTemplate().find(hql);

(5)如果是hql语句,使用hql语句直接将投影查询的字段放置到对象中,例如

  1. String hql = "SELECT DISTINCT new cn.itcast.elec.domain.ElecSystemDDL(o.keyword) FROM ElecSystemDDL o";
  2. List<ElecSystemDDL> list = this.getHibernateTemplate().find(hql);
  1. @SuppressWarnings("serial")
  2. public class ElecSystemDDL implements java.io.Serializable {
  3. private Integer seqID; //主键ID(自增长)
  4. private String keyword; //数据类型
  5. private Integer ddlCode; //数据项的code
  6. private String ddlName; //数据项的value

3:页面使用select进行遍历List<ElecSystemDDL>

(1)Dao中的查询代码

  1. @Override
  2. public List<ElecSystemDDL> findSystemDDLListWithDistinct() {
  3. String hql = "select distinct o.keyword from ElecSystemDDL o";
  4. List<Object> list = this.getHibernateTemplate().find(hql);
  5. //类型转换
  6. List<ElecSystemDDL> newList = new ArrayList<ElecSystemDDL>();
  7. for (Object object : list) {
  8. ElecSystemDDL elecSystemDDL = new ElecSystemDDL();
  9. elecSystemDDL.setKeyword(object.toString());
  10. newList.add(elecSystemDDL);
  11. }
  12. return newList;
  13. }

(2)方案一:使用<s:iterator>遍历<option>

  1. <select name="keyword" class="bg" style="width:180px" onchange="changetype()">
  2. <option value="jerrynew"></option>
  3. <s:iterator value="#request.list" var="system">
  4. <option value="<s:property value="#system.keyword"/>">
  5. <s:property value="#system.keyword"/>
  6. </option>
  7. </s:iterator>
  8. </select>

(3)方案二:使用<s:select>

  1. <s:select list="#request.list" name="keyword" id="keyword"
  2. listKey="keyword" listValue="keyword"
  3. headerKey="jerrynew" headerValue=""
  4. cssClass="bg" cssStyle="width:180px" onchange="changetype()">
  5. </s:select>

4:掌握js的写法(<table>标签的添加行和删除行)

(1)页面效果:

(2)Js代码:

(2-1)JQuery方式:

  1. function insertRows(){
  2. //获取表格对象
  3. var tb1 = $("#dictTbl");
  4. var tempRow = $("#dictTbl tr").size();//获取表格的行数
  5. var $tdNum = $("<td align=‘center‘></td>");
  6. $tdNum.html(tempRow);
  7. var $tdName = $("<td align=‘center‘></td>");
  8. $tdName.html("<input name=\"itemname\" type=\"text\" id=\""+tempRow+"\" size=\"45\" maxlength=25>");
  9. var $tdDel = $("<td align=‘center‘></td>");
  10. $tdDel.html("<a href=‘javascript:delTableRow(\""+tempRow+"\")‘><img src=${pageContext.request.contextPath }/images/delete.gif width=15 height=14 border=0 style=CURSOR:hand></a>");
  11. // 创建tr,将3个td放置到tr中
  12. var $tr = $("<tr></tr>");
  13. $tr.append($tdNum);
  14. $tr.append($tdName);
  15. $tr.append($tdDel);
  16. //在表格的最后追加新增的tr
  17. tb1.append($tr);
  18. }
  19. function delTableRow(rowNum){
  20. //改变行号和删除的行号
  21. var $tb1 = $("#dictTbl");
  22. var tempRow = $("#dictTbl tr").size();//获取表格的行数
  23. if (tempRow >rowNum){
  24. //获取删除行的id指定的对象,例如:<input name=\"itemname\" type=\"text\" id=\""+tempRow+"\" size=\"45\" maxlength=25>
  25. $("#"+rowNum).parent().parent().remove();
  26. //加1表示寻找下一个id,目的是将后面tr的格式向上移动
  27. for (i=(parseInt(rowNum)+1);i<tempRow;i++){
  28. //将i-1的值赋值给编号
  29. $("#"+i).parent().prev().html(i-1);
  30. //将i-1的值赋值给超链接的删除
  31. $("#"+i).parent().next().html("<a href=‘javascript:delTableRow(\""+(i-1)+"\")‘><img src=${pageContext.request.contextPath }/images/delete.gif width=15 height=14 border=0 style=CURSOR:hand></a>");//
  32. //将i-1的值赋值给文本框的id,用于删除
  33. $("#"+i).attr("id",(i-1));//将id设置成i-1
  34. }
  35. }
  36. }

(2-2)Dom方式:

  1. function insertRows(){
  2. var tempRow=0;
  3. var tbl=document.getElementById("dictTbl");
  4. tempRow=tbl.rows.length;
  5. var Rows=tbl.rows;//类似数组的Rows
  6. var newRow=tbl.insertRow(tbl.rows.length);//插入新的一行
  7. var Cells=newRow.cells;//类似数组的Cells
  8. for (i=0;i<3;i++)//每行的3列数据
  9. {
  10. var newCell=Rows[newRow.rowIndex].insertCell(Cells.length);
  11. newCell.align="center";
  12. switch (i)
  13. {
  14. case 0 : newCell.innerHTML=""+tempRow+"";break;
  15. case 1 : newCell.innerHTML="<input name=\"itemname\" type=\"text\" id=\""+tempRow+"\" size=\"45\" maxlength=25>";break;
  16. case 2 : newCell.innerHTML="<a href=‘javascript:delTableRow(\""+tempRow+"\")‘><img src=${pageContext.request.contextPath }/images/delete.gif width=15 height=14 border=0 style=CURSOR:hand></a>";break;
  17. }
  18. //alert(newCell.innerHTML);
  19. }
  20. }
  21. function delTableRow(rowNum){
  22. var tbl=document.getElementById("dictTbl");
  23. if (tbl.rows.length >rowNum){
  24. tbl.deleteRow(rowNum);
  25. for (i=rowNum;i<tbl.rows.length;i++)
  26. {
  27. tbl.rows[i].cells[0].innerHTML=i;
  28. tbl.rows[i].cells[2].innerHTML="<a href=‘javascript:delTableRow(\""+i+"\")‘><img src=${pageContext.request.contextPath }/images/delete.gif width=15 height=14 border=0 style=CURSOR:hand></a>";
  29. tbl.rows[i].cells[1].childNodes[0].id=i;
  30. }
  31. }
  32. }

(3)Jsp代码:

第一行为表格的表头,默认再显示一个第二行方便用户操作,table的id为dicTbl。

  1. <table cellspacing="0" cellpadding="1" rules="all" bordercolor="gray" border="1" id="dictTbl" style="BORDER-RIGHT:gray 1px solid; BORDER-TOP:gray 1px solid; BORDER-LEFT:gray 1px solid; WIDTH:100%; WORD-BREAK:break-all; BORDER-BOTTOM:gray 1px solid; BORDER-COLLAPSE:collapse; BACKGROUND-COLOR:#f5fafe; WORD-WRAP:break-word">
  2. <tr style="FONT-WEIGHT:bold;FONT-SIZE:12pt;HEIGHT:25px;BACKGROUND-COLOR:#afd1f3">
  3. <td class="ta_01" align="center" width="20%" height=22 background="${pageContext.request.contextPath }/images/tablehead.jpg">编号</td>
  4. <td class="ta_01" align="center" width="60%" height=22 background="${pageContext.request.contextPath }/images/tablehead.jpg">名称</td>
  5. <td class="ta_01" align="center" width="20%" height=22 background="${pageContext.request.contextPath }/images/tablehead.jpg">删除</td>
  6.     </tr>
  7. <tr>
  8. <td class="ta_01" align="center" width="20%">1</td>
  9. <td class="ta_01" align="center" width="60%">
  10. <input name="itemname" type="text" size="45" maxlength="25"></td>
  11. <td class="ta_01" align="center" width="20%"></td>
  12. </tr>
  13. </table>

在使用<table>标签实现表格添加行和删除行的时候,后台获取页面填写的值,此时是一个String类型的数组对象,可以采用遍历数组的方式,保存数据。

5:DOM对象的ajax(封装在pub.js)

Ajax操作的核心对象:xmlreq = new XMLHttpRequest();

第一步:在dictionaryIndex.jsp中添加:

  1. <script type="text/javascript" src="${pageContext.request.contextPath }/script/pub.js"></script>

第二步:调用js的代码:实现:

  1. /**
  2. Pub.submitActionWithForm:
  3. * 参数一:表单Form2的名称
  4. * 参数二:表示URL连接
  5. * 参数三:表单Form1的名称
  6. ajax的封装:
  7. 1:在dictionaryIndex.jsp中存在2个表单Form1和Form2
  8. 2:使用ajax传递表单Form1中的元素作为参数,在服务器端进行处理,将处理后的结果放置dictionaryEdit.jsp中
  9. 3:将dictionaryEdit.jsp中的全部内容放置dictionaryIndex.jsp页面的Form2中
  10. 效果:异步效果,一个页面表单Form1中的内容不发生变化,Form2中的内容发生变化
  11. */
  12. Pub.submitActionWithForm(‘Form2‘,‘${pageContext.request.contextPath }/system/elecSystemDDLAction_edit.do‘,‘Form1‘);

第三步:在pub.js中定义:

方法一:(Pub.submitActionWithForm——发送了Form1选择的参数)

  1. /***
  2. * domId:表单Form2的名称
  3. * action:表示URL连接
  4. * sForm:表单Form1的名称
  5. */
  6. Pub.submitActionWithForm=function(domId,action,sForm){
  7. /**第一步:创建Ajax引擎对象*/
  8. var req = Pub.newXMLHttpRequest();
  9. /**第二步:req.onreadystatechange表示事件处理函数(相当于一个监听),用来监听客户端与服务器端的连接状态*/
  10. var handlerFunction = Pub.getReadyStateHandler(req, domId,Pub.handleResponse);
  11. req.onreadystatechange = handlerFunction;
  12. /**第三步:打开一个连接,要求:如果是POST请求,需要设置一个头部信息,否则此时不能使用req.send()方法向服务器发送数据*/
  13. req.open("POST", action, true);
  14. req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  15. /**第四步:向服务器发送数据,格式:name=张三&age=28*/
  16. var str = Pub.getParams2Str(sForm);
  17. //传递表单Form1中的元素作为参数给服务器
  18. req.send(str);
  19. }

方法二:创建ajax引擎(Pub.newXMLHttpRequest)

  1. /**
  2. * 创建ajax引擎
  3. */
  4. Pub.newXMLHttpRequest=function newXMLHttpRequest() {
  5. var xmlreq = false;
  6. if (window.XMLHttpRequest) {
  7. xmlreq = new XMLHttpRequest();
  8. } else if (window.ActiveXObject) {
  9. try {
  10. xmlreq = new ActiveXObject("Msxml2.XMLHTTP");
  11. } catch (e1) {
  12. try {
  13. xmlreq = new ActiveXObject("Microsoft.XMLHTTP");
  14. } catch (e2) {
  15. alert(e2);
  16. }
  17. }
  18. }
  19. return xmlreq;
  20. }

方法三:传递表单Form1中的元素作为参数(Pub.getParams2Str)

  1. /**
  2. *
  3. * @param sForm:传递表单Form1的名称
  4. * @returns {String}:使用ajax返回服务器端的参数,传递的就是表单Form1中元素的参数
  5. */
  6. Pub.getParams2Str=function getParams2Str(sForm){
  7. var strDiv="";
  8. try {
  9. var objForm=document.forms[sForm];
  10. if (!objForm)
  11. return strDiv;
  12. var elt,sName,sValue;
  13. for (var fld = 0; fld < objForm.elements.length; fld++) {
  14. elt = objForm.elements[fld];
  15. sName=elt.name;
  16. sValue=""+elt.value;
  17. if(fld==objForm.elements.length-1)
  18. strDiv=strDiv + sName+"="+sValue+"";
  19. else
  20. strDiv=strDiv + sName+"="+sValue+"&";
  21. }
  22. }
  23. catch (ex) {
  24. return strDiv;
  25. }
  26. return strDiv;
  27. }

方法四:接收服务器端返回的结果(Pub.getReadyStateHandler)

  1. /**
  2. *
  3. * @param req:引擎对象
  4. * @param eleid:表单Form2的名称
  5. * @param responseXmlHandler:Pub.handleResponse(函数体)
  6. * @returns {Function}
  7. */
  8. Pub.getReadyStateHandler =function getReadyStateHandler(req, eleid,responseXmlHandler) {
  9. return function () {
  10. /**
  11. * req.readyState:用来监听客户端与服务器端的连接状态
  12. * 0:表示此时客户端没有调用open()方法
  13. * 1:表示客户端执行open方法,但是send方法没有执行
  14. * 2:open方法执行,send方法也执行
  15. * 3:服务器开始处理数据,并返回数据
  16. * 4:返回数据成功,只有4这个状态,才能获取服务器端返回的结果
  17. */
  18. if (req.readyState == 4) {
  19. /**
  20. * req.status:表示java的状态码
  21. * 404:路径错误
  22. * 500:服务器异常
  23. * 200:表示没有异常,正常访问数据,只有200这个状态的时候,才能获取服务器端返回的结果
  24. */
  25. if (req.status == 200) {
  26. /**
  27. * req.responseText:获取服务器端返回的结果,返回的是文本的结果(包括:字符串,json数据)
  28. * req.responseXML:获取服务器端返回的结果,返回的是XML数据的结果
  29. */
  30. responseXmlHandler(req.responseText,eleid);
  31. } else {
  32. alert("HTTP error: "+req.status);
  33. return false;
  34. }
  35. }
  36. }

方法五:将返回的结果dictionaryEdit.jsp,并放置到dictionaryIndex.jsp的Form2中(Pub.handleResponse)

  1. /**
  2. * @param data:服务器返回的结果
  3. * @param eleid:表单Form2的名称
  4. */
  5. Pub.handleResponse= function handleResponse(data,eleid){
  6. //获取表单Form2的对象
  7. var ele =document.getElementById(eleid);
  8. //将返回的结果放置到表单Form2的元素中
  9. ele.innerHTML = data;
  10. }

(1)功能实现代码:

(1-1)Action中的代码:

  1. /**
  2. * 跳转进入数据字典维护编辑页面
  3. * @return
  4. */
  5. public String edit(){
  6. //获取页面传递的keyword值
  7. String keyword = elecSystemDDL.getKeyword();
  8. if (!"jerrynew".equals(keyword)) {
  9. //根据keyword查询出对应类别的所有记录
  10. List<ElecSystemDDL> list = elecSystemDDLService.findElecSystemDDL(keyword);
  11. //建list存储到request域中转发到dictionaryIndex.jsp页面
  12. request.setAttribute("list", list);
  13. }
  14. return "edit";
  15. }

(1-2)Service中的代码:

  1. @Override
  2. @Transactional(readOnly=false,isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
  3. public List<ElecSystemDDL> findElecSystemDDL(String keyword) {
  4. String condition = "and o.keyword = ?";
  5. Object[] params = {keyword};
  6. Map<String,String> orderby = new LinkedHashMap<String,String>();
  7. orderby.put("o.ddlCode", "asc");
  8. List<ElecSystemDDL> list = elecSystemDDLDao.findCollectionByConditionNoPage(condition, params, orderby);
  9. return list;
  10. }

(1-3)效果:

(1-4)完成选择类型列表,实现Form2表单的内容替换

(1-5)保存功能的实现:

  1. //ElecSystemDDL:首先在这个类中添加几个非持久化javabean属性,用于接收页面传递过来的隐藏域和表单值
  2. /*————————————————————非持久化JavaBean属性——————————————————*/
  3. //接受页面表单的多个输入值
  4. private String[] itemname;
  5. //存放数据类型
  6. private String keywordname;
  7. //进行保存功能的业务判断,如果为new表示新增一种数据类型,add表示在已有的类型基础上进行添加
  8. private String typeflag;

(1-6)点击保存传递隐藏域值:

  1. <tr>
  2. <td align="center" colspan=3>
  3. <input type="button" name="saveitem" value="保存" style="font-size:12px; color:black; height=20;width=50" onClick="returnMethod()">
  4. </td>
  5. </tr>
  6. <input type="hidden" name="keywordname" >
  7. <input type="hidden" name="typeflag" >

(1-7)调用:

  1. function returnMethod(){
  2. return saveDict();
  3. }

(1-8)点击保存判断当前的操作是新增一种数据类型还是在已有数据类型的基础上进行添加:

  1. function saveDict(){
  2. if(document.Form1.keyword.value=="jerrynew"){
  3. if(Trim(document.Form1.keywordname.value)==""){
  4. alert("请输入类型名称");
  5. return false;
  6. }
  7. var allkeywords= document.Form1.keyword;
  8. for(var i=0;i<allkeywords.length;i++){
  9. if(allkeywords[i].value==Trim(document.Form1.keywordname.value)){
  10. alert("已存在此类型名称,请重新输入");
  11. return false;
  12. }
  13. }
  14. document.Form2.keywordname.value=document.Form1.keywordname.value;
  15. document.Form2.typeflag.value="new";
  16. }else{
  17. document.Form2.keywordname.value=document.Form1.keyword.value;
  18. document.Form2.typeflag.value="add";
  19. }
  20. var tbl=document.getElementById("dictTbl");
  21. for (i=1;i<tbl.rows.length;i++){
  22. var name = tbl.rows[i].cells[1].getElementsByTagName("input")[0].value;
  23. if(Trim(name)==""){
  24. alert("名称不能为空!");
  25. return false;
  26. }
  27. }
  28. for(k=1;k<=tbl.rows.length-2;k++)
  29. {
  30. for(m=k+1;m<=tbl.rows.length-1;m++)
  31. {
  32. var name1 = tbl.rows[k].cells[1].getElementsByTagName("input")[0].value;
  33. var name2 = tbl.rows[m].cells[1].getElementsByTagName("input")[0].value;
  34. if(name1 == name2){
  35. alert("名称不能相同!");
  36. return false;
  37. }
  38. }
  39. }
  40. document.Form2.action="savedict.do";
  41. document.Form2.submit();
  42. }

(1-9)保存操作(ElecSystemDDLAction中的代码):

  1. /**
  2. * 保存数据字典更新或者添加的字段
  3. * @return
  4. */
  5. public String savedict(){
  6. //获取模型对象接收到的页面值
  7. String keywordname = elecSystemDDL.getKeywordname();
  8. //获取表单上的值
  9. String[] itemnames = elecSystemDDL.getItemname();
  10. //获取操作类型
  11. String typeflag = elecSystemDDL.getTypeflag();
  12. //查询出对应keyword的所有记录
  13. List<ElecSystemDDL> list = elecSystemDDLService.findElecSystemDDL(keywordname);
  14. //add,在已有基础上进行添加,最好的处理方式就是 将该类别的所有记录删除再添加进去
  15. if ("add".equals(typeflag)) {
  16. //先删除
  17. elecSystemDDLService.deleteObjectByCollection(list);
  18. //再添加,根据类别将具体itemnames数组中的值插入数据库中
  19. elecSystemDDLService.saveSystemDDL(itemnames,keywordname);
  20. }else{
  21. //new,直接向数据库中添加一条对应类型的数据
  22. elecSystemDDLService.saveSystemDDL(itemnames,keywordname);
  23. }
  24. return "savedict";
  25. }

(1-10)ElecSystemDDLServiceImpl的代码:

  1. @Override
  2. @Transactional(readOnly=false,isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
  3. public void deleteObjectByCollection(List<ElecSystemDDL> list) {
  4. elecSystemDDLDao.deleteObjectByCollection(list);
  5. }
  6. @Override
  7. @Transactional(readOnly=false,isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
  8. public void saveSystemDDL(String[] itemnames, String keywordname) {
  9. if (itemnames!= null && itemnames.length > 0) {
  10. for (int i = 0; i < itemnames.length; i++) {
  11. ElecSystemDDL elecSystemDDL = new ElecSystemDDL();
  12. //将遍历的值设置到对象中去
  13. elecSystemDDL.setDdlName(itemnames[i]);
  14. elecSystemDDL.setKeyword(keywordname);
  15. //设置保存的ddlCode值
  16. elecSystemDDL.setDdlCode(i+1);
  17. //保存到数据库中去
  18. elecSystemDDLDao.save(elecSystemDDL);
  19. }
  20. }
  21. }

注意:数据字典的数据会影响整个应用的数据,只能由管理员来操作,这个后面权限管理的时候会用到。

效果:

(1-11)附录:jquery对象的ajax应用:

  1. Pub.js
  2. function Pub(){ }
  3. /**
  4. * @param data:服务器返回的结果
  5. * @param eleid:表单Form2的名称
  6. */
  7. Pub.handleResponse= function handleResponse(data,eleid){
  8. //获取表单Form2的对象
  9. var ele = $("#"+eleid);
  10. //将返回的结果放置到表单Form2的元素中
  11. ele.html(data);
  12. }
  13. /**
  14. * @param sForm:传递表单Form1的名称
  15. * @returns {String}:使用ajax返回服务器端的参数,传递的就是表单Form1中元素的参数
  16. */
  17. Pub.getParams2Str=function getParams2Str(sForm){
  18. var strDiv = "";
  19. strDiv = $("#"+sForm).serialize();
  20. return strDiv;
  21. }
  22. /***
  23. * Post请求
  24. * domId:表单Form2的名称
  25. * action:表示URL连接
  26. * sForm:表单Form1的名称
  27. */
  28. Pub.submitActionWithForm=function(domId,action,sForm){
  29. var str = Pub.getParams2Str(sForm);
  30. $.post(action,str,function(data){
  31. Pub.handleResponse(data,domId);
  32. })
  33. }
  34. /***
  35. * Get请求
  36. * domId:表单Form2的名称
  37. * action:表示URL连接
  38. * sForm:表单Form1的名称
  39. */
  40. Pub.submitActionWithFormGet=function(domId,action,sForm){
  41. $.get(action,{},function(data){
  42. Pub.handleResponse(data,domId);
  43. })
  44. }

6:DOM对象去掉空格的方法

  1. function LTrim(str)
  2. {
  3.     var i;
  4.     for(i=0;i<str.length;i++)
  5.     {
  6.         if(str.charAt(i)!=" "&&str.charAt(i)!=" ")break;
  7.     }
  8.     str=str.substring(i,str.length);
  9.     return str;
  10. }
  11. function RTrim(str)
  12. {
  13.     var i;
  14.     for(i=str.length-1;i>=0;i--)
  15.     {
  16.         if(str.charAt(i)!=" "&&str.charAt(i)!="?")break;
  17.     }
  18.     str=str.substring(0,i+1);
  19.     return str;
  20. }
  21. function Trim(str)
  22. {
  23.     return LTrim(RTrim(str));
  24. }

页面中使用

  1. if(Trim(document.Form1.keywordname.value)==""){
  2. alert("请输入类型名称");
  3. return false;
  4. }

7.附录:

Jquery对象去掉空格:

  1. $.trim($(“#keywordname”).val());

8:实现百分比效果的进度条

分析原理:

面试的问到进度条如何实现:

结论:百分比进度条,实质上使用ajax在保存的过程中开启多个线程实现

其中一个线程:执行保存

执行保存的业务操作,同时计算页面返回的百分比数值,将计算的数值存放到Session中

在执行完保存的业务操作之后,即线程即将结束的时候,将Session清空

另一个线程:从Session总获取百分比的内容

获取百分比的内容

同时使用ajax将结果返回到页面上,使用js将数据填写到页面显示。

操作步骤:

请看【技术资料\进度条\进度条(百分比)】中的《进度条.doc》

1:在jsp上添加代码:这个table标签要隐藏,进度条执行的时候再显示

  1. <table id="load" width="700" border="0" align="center" bgcolor="#FAFAFA" cellpadding="0" cellspacing="0" bordercolor="#000000" style="border-collapse:collapse;display:none ">
  2. <tr>
  3. <td><br><br>
  4. <table width="100%" border="1" cellspacing="0" cellpadding="0" bordercolor="#287BCE" style="border-collapse:collapse ">
  5. <tr bgcolor="#F7F7F6">
  6. <td width="20%" height="100" valign="middle">
  7. <table align=‘center‘ width=‘500‘>
  8. <tr>
  9. <td colspan=‘2‘ align=‘center‘ id="progressPersent"><font size="2">
  10. 正在进行保存,用时较长,请稍后...
  11. </font>
  12. </td>
  13. </tr>
  14. <tr>
  15. <td id=‘tdOne‘ height=‘25‘ width=1 bgcolor="blue">&nbsp;</td>
  16. <td id=‘tdTwo‘ height=‘25‘ width=500 bgColor=‘#999999‘>&nbsp;</td>
  17. </tr>
  18. </table>
  19. </td>
  20. </tr>
  21. </table>
  22. </td>
  23. </tr>
  24. </table>
2:添加js代码:

  1. var xmlHttp;
  2. //创建ajax引擎
  3. function createXMLHttpRequest() {
  4. if (window.XMLHttpRequest) {
  5. xmlHttp = new XMLHttpRequest();
  6. } else if (window.ActiveXObject) {
  7. try {
  8. xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
  9. } catch (e1) {
  10. try {
  11. xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  12. } catch (e2) {
  13. }
  14. }
  15. }
  16. }
  17. function loading() {
  18. createXMLHttpRequest();
  19. clearLoad();
  20. var url = "elecCommonMsgAction_progressBar.do";
  21. xmlHttp.open("GET", url, true);
  22. xmlHttp.onreadystatechange = createCallback;
  23. xmlHttp.send(null);
  24. }
  25. function createCallback() {
  26. if (xmlHttp.readyState == 4) {
  27. if (xmlHttp.status == 200) {
  28. //每隔1秒钟执行一次percentServer()方法,直到当前访问结束
  29. setTimeout("percentServer()", 1000);
  30. }
  31. }
  32. }
  33. function percentServer() {
  34. createXMLHttpRequest();
  35. var url = "elecCommonMsgAction_progressBar.do";
  36. xmlHttp.open("GET", url, true);
  37. xmlHttp.onreadystatechange = updateCallback;
  38. xmlHttp.send(null);
  39. }
  40. function updateCallback() {
  41. if (xmlHttp.readyState == 4) {
  42. if (xmlHttp.status == 200) {
  43. //获取XML数据中的percent存放的百分比的值
  44. var percent_complete = xmlHttp.responseXML.getElementsByTagName("percent")[0].firstChild.data;
  45. var tdOne = document.getElementById("tdOne");
  46. var progressPersent = document.getElementById("progressPersent");
  47. //改变蓝色区域的宽度
  48. tdOne.width = percent_complete + "%";
  49. //将百分比的数值显示到页面上
  50. progressPersent.innerHTML = percent_complete + "%";
  51. //如果计算获取的百分比的数值没有达到100,则继续调用方法,直到操作结束为止
  52. if (percent_complete < 100) {
  53. setTimeout("percentServer()", 1000);
  54. }
  55. }
  56. }
  57. }
  58. function clearLoad() {
  59. document.getElementById("load").style.display="";
  60. document.getElementById("opperate1").style.display="none";
  61. document.getElementById("opperate2").style.display="none";
  62. }
3:在保存的submit()的方法后调用loading()方法。

4:在Action操作的类中定义:

  1. public String progressBar() throws Exception{
  2. //从session中获取操作方法中计算的百分比
  3. Double percent = (Double) ServletActionContext.getRequest().getSession().getAttribute("percent");
  4. String res = "";
  5. //此时说明操作的业务方法仍然继续在执行
  6. if(percent!=null){
  7. //计算的小数,四舍五入取整
  8. int percentInt = (int) Math.rint(percent);
  9. res = "<percent>" + percentInt + "</percent>";
  10. }
  11. //此时说明操作的业务方法已经执行完毕,session中的值已经被清空
  12. else{
  13. //存放百分比
  14. res = "<percent>" + 100 + "</percent>";
  15. }
  16. //定义ajax的返回结果是XML的形式
  17. PrintWriter out = response.getWriter();
  18. response.setContentType("text/xml");
  19. response.setHeader("Cache-Control", "no-cache");
  20. //存放结果数据,例如:<response><percent>88</percent></response>
  21. out.println("<response>");
  22. out.println(res);
  23. out.println("</response>");
  24. out.close();
  25. return null;
  26. }
5:在操作业务的方法中,进行测试:

  1. public String save(){
  2. //模拟:循环遍历150条数据,观察百分比的变化情况
  3. for(int i=1;i<=150;i++){
  4. elecCommonMsgService.saveCommonMsg(elecCommonMsg);
  5. ServletActionContext.getRequest().getSession().setAttribute("percent", (double)i/150*100);//存放计算的百分比
  6. }
  7. //线程结束时,清空当前session
  8. ServletActionContext.getRequest().getSession().removeAttribute("percent");
  9. return "save";
  10. }

注意:可以在复杂的业务中将代码段分成点,一个点的进度是占百分之多少,然后存放到Session中,然后通过ajax调用服务从Session中获取值,返回进度并显示即可。

来自为知笔记(Wiz)

时间: 2024-10-12 17:44:10

国家电力项目-03的相关文章

国家电力项目SSH搭建

SSH项目框架搭建总结: 1.建立Web工程 * 导入需要的jar的包 db:连接数据库的驱动包 hibernate:使用hibernate的jar包 jstl:java的标准标签库 junit:测试用到的jar包 spring:使用spring的jar包 struts2:使用struts2的jar包 * 项目体系分层: cn.itcast.elec.containner:自定义的spring容器,用于在控制层调用操作业务层 cn.itcast.elec.dao:项目的dao层,负责连接数据库的

国家扶贫项目福彩双色球玩法规则

国家扶贫项目福彩双色球玩法规则 福彩双色球开奖网fucaishuangseqiu.pk10kaijiangw.com 对于福彩相信大家都有听过,那么福彩有很多种彩种,双色球就是其中的一种.双色球是由红球和蓝球两部分组成,红球是由01到33个号码中选择,蓝球是由01到16个号码中选择.每次开奖在红色球中随机摇出6个红号,在蓝球中随机摇出1个蓝号(在快乐星期天的摇奖中将多摇出一个蓝号组成快乐星期天的得奖号). 每周双色球开出三期,每周二.四.日开奖. 奖金分配方式 双色球常规奖级分为6级2009年1

SSH电力项目一 搭建Hibernate框架

Hibernate所需要的基本文件: ElectText.java ElecText.hbm.xml hibernate.cfg.xml 第一步:创建测试表Elec_Text: create table Elec_Text(textID varchar(50) not null primary key,textName varchar(50),textDate datetime,textRemark varchar(500) ); 第二步:创建项目,导入jar包 第三步:持久层 (1)在com.

JAVAEE——BOS物流项目03:学习计划、messager、menubutton、登陆拦截器、信息校验和取派员添加功能

1 学习计划 1.jQuery easyUI messager使用方式 n alert方法 n confirm方法 n show方法 2.jQuery easyUI menubutton使用方式 3.自定义拦截器实现用户未登录自动跳转到登录页面 n 创建拦截器 n 注册拦截器 4.基于ajax实现用户修改密码功能 n easyUI中validatebox校验功能 n 发送ajax请求 n 服务端修改数据库 5.基础设置部分需求分析 6.创建基础设置部分数据表 n 取派员表 n 区域表 n 分区表

分布式电商项目(03)--后台管理系统整合测试

前言:前面的博客讲到了后台管理系统的工程搭建以及SSM框架的整合,这篇就讲一下后台管理系统的整合测试 1.逆向工程生成代码 1.1 什么是逆向工程 简单点说,就是通过数据库中的单表,自动生成java代码. Mybatis官方提供了逆向工程,可以针对单表自动生成mybatis代码 1.2 逆向工程以及项目sql下载 链接   提取码:zaez 1.3 修改配置文件 下载好逆向工程之后,将其作为一个新工程导入,然后找到工程下的generatorConfig.xml文件,按照文件中的注释以及实际情况修

电力项目七--运行监控中添加进度条

<%@ page language="java" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s" %> <!-- 添加标签,然后做栈顶获取数据 --> <html> <head> <title>运行监控模块编辑</title> <link href="

电力项目十八--DOM对象的ajax

Ajax操作的核心对象:xmlreq = new XMLHttpRequest(); 第一步:在dictionaryIndex.jsp中添加: <script type="text/javascript" src="${pageContext.request.contextPath }/script/pub.js"></script> 第二步:调用js的代码:实现: Pub.submitActionWithForm: * 参数一:表单Form

电力项目十五--数据字典

数据字典的作用: 1.贯穿系统的所有数据项,开发过程中,动态的维护系统数据项: 2.保证数据的录入安全,业务表使用数据字典的时候,存放的是数据项的编号,而不是数据项的值. 3.方便系统的统计. 1.数据库的设计: #数据字典 create table Elec_SystemDDL( seqID INT NOT NULL primary key, #主键ID(自增长) keyword VARCHAR(20)  NULL, #数据类型 ddlCode INT NULL, #数据项的code ddlN

电力项目八--运行监控的保存

需求分析:保存运行监控文本内容到数据库,并再次查询后回显. 页面中调用保存的函数 function checkchar(){ if(document.Form2.stationRun.value.length>2500){ alert("站点运行情况字数不能超过2500字"); return; } if(document.Form2.devRun.value.length>2500){ alert("设备运行情况字数不能超过2500字"); return