*.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:需要的表
#数据字典
CREATE TABLE Elec_SystemDDL(
seqID INT NOT NULL primary key, #主键ID(自增长)
keyword VARCHAR(20) NULL, #数据类型
ddlCode INT NULL, #数据项的code
ddlName VARCHAR(50) NULL #数据项的value
)
#数据字典
CREATE TABLE Elec_SystemDDL(
seqID INT NOT NULL primary key, #主键ID(自增长)
keyword VARCHAR(20) NULL, #数据类型
ddlCode INT NULL, #数据项的code
ddlName VARCHAR(50) NULL #数据项的value
)
存放的数据:
2:hql和sql语句的投影查询
(1)如果投影查询是一个字段,此时返回List<Object>,例如
String hql = "SELECT DISTINCT o.keyword FROM ElecSystemDDL o";
List<Object> list = this.getHibernateTemplate().find(hql);
(2)如果投影查询是多个字段,此时返回List<Object[]>,例如
String hql = "SELECT DISTINCT o.keyword,o.ddlName FROM ElecSystemDDL o";
List<Object[]> list = this.getHibernateTemplate().find(hql);
(3)如果投影查询是多个字段,此时返回List<Object[]>,例如
String hql = "SELECT o,o.ddlName FROM ElecSystemDDL o";
List<Object[]> list = this.getHibernateTemplate().find(hql);
数组的第一个值,是一个ElecSystemDDL的对象,数组的第二个值表示字段ddlName的值。
(4)如果投影查询是一个对象,此时返回List<ElecSystemDDL>,例如
String hql = "SELECT o FROM ElecSystemDDL o";
List<ElecSystemDDL> list = this.getHibernateTemplate().find(hql);
(5)如果是hql语句,使用hql语句直接将投影查询的字段放置到对象中,例如
String hql = "SELECT DISTINCT new cn.itcast.elec.domain.ElecSystemDDL(o.keyword) FROM ElecSystemDDL o";
List<ElecSystemDDL> list = this.getHibernateTemplate().find(hql);
@SuppressWarnings("serial")
public class ElecSystemDDL implements java.io.Serializable {
private Integer seqID; //主键ID(自增长)
private String keyword; //数据类型
private Integer ddlCode; //数据项的code
private String ddlName; //数据项的value
3:页面使用select进行遍历List<ElecSystemDDL>
(1)Dao中的查询代码
@Override
public List<ElecSystemDDL> findSystemDDLListWithDistinct() {
String hql = "select distinct o.keyword from ElecSystemDDL o";
List<Object> list = this.getHibernateTemplate().find(hql);
//类型转换
List<ElecSystemDDL> newList = new ArrayList<ElecSystemDDL>();
for (Object object : list) {
ElecSystemDDL elecSystemDDL = new ElecSystemDDL();
elecSystemDDL.setKeyword(object.toString());
newList.add(elecSystemDDL);
}
return newList;
}
(2)方案一:使用<s:iterator>遍历<option>
<select name="keyword" class="bg" style="width:180px" onchange="changetype()">
<option value="jerrynew"></option>
<s:iterator value="#request.list" var="system">
<option value="<s:property value="#system.keyword"/>">
<s:property value="#system.keyword"/>
</option>
</s:iterator>
</select>
(3)方案二:使用<s:select>
<s:select list="#request.list" name="keyword" id="keyword"
listKey="keyword" listValue="keyword"
headerKey="jerrynew" headerValue=""
cssClass="bg" cssStyle="width:180px" onchange="changetype()">
</s:select>
4:掌握js的写法(<table>标签的添加行和删除行)
(1)页面效果:
(2)Js代码:
(2-1)JQuery方式:
function insertRows(){
//获取表格对象
var tb1 = $("#dictTbl");
var tempRow = $("#dictTbl tr").size();//获取表格的行数
var $tdNum = $("<td align=‘center‘></td>");
$tdNum.html(tempRow);
var $tdName = $("<td align=‘center‘></td>");
$tdName.html("<input name=\"itemname\" type=\"text\" id=\""+tempRow+"\" size=\"45\" maxlength=25>");
var $tdDel = $("<td align=‘center‘></td>");
$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>");
// 创建tr,将3个td放置到tr中
var $tr = $("<tr></tr>");
$tr.append($tdNum);
$tr.append($tdName);
$tr.append($tdDel);
//在表格的最后追加新增的tr
tb1.append($tr);
}
function delTableRow(rowNum){
//改变行号和删除的行号
var $tb1 = $("#dictTbl");
var tempRow = $("#dictTbl tr").size();//获取表格的行数
if (tempRow >rowNum){
//获取删除行的id指定的对象,例如:<input name=\"itemname\" type=\"text\" id=\""+tempRow+"\" size=\"45\" maxlength=25>
$("#"+rowNum).parent().parent().remove();
//加1表示寻找下一个id,目的是将后面tr的格式向上移动
for (i=(parseInt(rowNum)+1);i<tempRow;i++){
//将i-1的值赋值给编号
$("#"+i).parent().prev().html(i-1);
//将i-1的值赋值给超链接的删除
$("#"+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>");//
//将i-1的值赋值给文本框的id,用于删除
$("#"+i).attr("id",(i-1));//将id设置成i-1
}
}
}
(2-2)Dom方式:
function insertRows(){
var tempRow=0;
var tbl=document.getElementById("dictTbl");
tempRow=tbl.rows.length;
var Rows=tbl.rows;//类似数组的Rows
var newRow=tbl.insertRow(tbl.rows.length);//插入新的一行
var Cells=newRow.cells;//类似数组的Cells
for (i=0;i<3;i++)//每行的3列数据
{
var newCell=Rows[newRow.rowIndex].insertCell(Cells.length);
newCell.align="center";
switch (i)
{
case 0 : newCell.innerHTML=""+tempRow+"";break;
case 1 : newCell.innerHTML="<input name=\"itemname\" type=\"text\" id=\""+tempRow+"\" size=\"45\" maxlength=25>";break;
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;
}
//alert(newCell.innerHTML);
}
}
function delTableRow(rowNum){
var tbl=document.getElementById("dictTbl");
if (tbl.rows.length >rowNum){
tbl.deleteRow(rowNum);
for (i=rowNum;i<tbl.rows.length;i++)
{
tbl.rows[i].cells[0].innerHTML=i;
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>";
tbl.rows[i].cells[1].childNodes[0].id=i;
}
}
}
(3)Jsp代码:
第一行为表格的表头,默认再显示一个第二行方便用户操作,table的id为dicTbl。
<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">
<tr style="FONT-WEIGHT:bold;FONT-SIZE:12pt;HEIGHT:25px;BACKGROUND-COLOR:#afd1f3">
<td class="ta_01" align="center" width="20%" height=22 background="${pageContext.request.contextPath }/images/tablehead.jpg">编号</td>
<td class="ta_01" align="center" width="60%" height=22 background="${pageContext.request.contextPath }/images/tablehead.jpg">名称</td>
<td class="ta_01" align="center" width="20%" height=22 background="${pageContext.request.contextPath }/images/tablehead.jpg">删除</td>
</tr>
<tr>
<td class="ta_01" align="center" width="20%">1</td>
<td class="ta_01" align="center" width="60%">
<input name="itemname" type="text" size="45" maxlength="25"></td>
<td class="ta_01" align="center" width="20%"></td>
</tr>
</table>
在使用<table>标签实现表格添加行和删除行的时候,后台获取页面填写的值,此时是一个String类型的数组对象,可以采用遍历数组的方式,保存数据。
5:DOM对象的ajax(封装在pub.js)
Ajax操作的核心对象:xmlreq = new XMLHttpRequest();
第一步:在dictionaryIndex.jsp中添加:
<script type="text/javascript" src="${pageContext.request.contextPath }/script/pub.js"></script>
第二步:调用js的代码:实现:
/**
Pub.submitActionWithForm:
* 参数一:表单Form2的名称
* 参数二:表示URL连接
* 参数三:表单Form1的名称
ajax的封装:
1:在dictionaryIndex.jsp中存在2个表单Form1和Form2
2:使用ajax传递表单Form1中的元素作为参数,在服务器端进行处理,将处理后的结果放置dictionaryEdit.jsp中
3:将dictionaryEdit.jsp中的全部内容放置dictionaryIndex.jsp页面的Form2中
效果:异步效果,一个页面表单Form1中的内容不发生变化,Form2中的内容发生变化
*/
Pub.submitActionWithForm(‘Form2‘,‘${pageContext.request.contextPath }/system/elecSystemDDLAction_edit.do‘,‘Form1‘);
第三步:在pub.js中定义:
方法一:(Pub.submitActionWithForm——发送了Form1选择的参数)
/***
* domId:表单Form2的名称
* action:表示URL连接
* sForm:表单Form1的名称
*/
Pub.submitActionWithForm=function(domId,action,sForm){
/**第一步:创建Ajax引擎对象*/
var req = Pub.newXMLHttpRequest();
/**第二步:req.onreadystatechange表示事件处理函数(相当于一个监听),用来监听客户端与服务器端的连接状态*/
var handlerFunction = Pub.getReadyStateHandler(req, domId,Pub.handleResponse);
req.onreadystatechange = handlerFunction;
/**第三步:打开一个连接,要求:如果是POST请求,需要设置一个头部信息,否则此时不能使用req.send()方法向服务器发送数据*/
req.open("POST", action, true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
/**第四步:向服务器发送数据,格式:name=张三&age=28*/
var str = Pub.getParams2Str(sForm);
//传递表单Form1中的元素作为参数给服务器
req.send(str);
}
方法二:创建ajax引擎(Pub.newXMLHttpRequest)
/**
* 创建ajax引擎
*/
Pub.newXMLHttpRequest=function newXMLHttpRequest() {
var xmlreq = false;
if (window.XMLHttpRequest) {
xmlreq = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
xmlreq = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e1) {
try {
xmlreq = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
alert(e2);
}
}
}
return xmlreq;
}
方法三:传递表单Form1中的元素作为参数(Pub.getParams2Str)
/**
*
* @param sForm:传递表单Form1的名称
* @returns {String}:使用ajax返回服务器端的参数,传递的就是表单Form1中元素的参数
*/
Pub.getParams2Str=function getParams2Str(sForm){
var strDiv="";
try {
var objForm=document.forms[sForm];
if (!objForm)
return strDiv;
var elt,sName,sValue;
for (var fld = 0; fld < objForm.elements.length; fld++) {
elt = objForm.elements[fld];
sName=elt.name;
sValue=""+elt.value;
if(fld==objForm.elements.length-1)
strDiv=strDiv + sName+"="+sValue+"";
else
strDiv=strDiv + sName+"="+sValue+"&";
}
}
catch (ex) {
return strDiv;
}
return strDiv;
}
方法四:接收服务器端返回的结果(Pub.getReadyStateHandler)
/**
*
* @param req:引擎对象
* @param eleid:表单Form2的名称
* @param responseXmlHandler:Pub.handleResponse(函数体)
* @returns {Function}
*/
Pub.getReadyStateHandler =function getReadyStateHandler(req, eleid,responseXmlHandler) {
return function () {
/**
* req.readyState:用来监听客户端与服务器端的连接状态
* 0:表示此时客户端没有调用open()方法
* 1:表示客户端执行open方法,但是send方法没有执行
* 2:open方法执行,send方法也执行
* 3:服务器开始处理数据,并返回数据
* 4:返回数据成功,只有4这个状态,才能获取服务器端返回的结果
*/
if (req.readyState == 4) {
/**
* req.status:表示java的状态码
* 404:路径错误
* 500:服务器异常
* 200:表示没有异常,正常访问数据,只有200这个状态的时候,才能获取服务器端返回的结果
*/
if (req.status == 200) {
/**
* req.responseText:获取服务器端返回的结果,返回的是文本的结果(包括:字符串,json数据)
* req.responseXML:获取服务器端返回的结果,返回的是XML数据的结果
*/
responseXmlHandler(req.responseText,eleid);
} else {
alert("HTTP error: "+req.status);
return false;
}
}
}
方法五:将返回的结果dictionaryEdit.jsp,并放置到dictionaryIndex.jsp的Form2中(Pub.handleResponse)
/**
* @param data:服务器返回的结果
* @param eleid:表单Form2的名称
*/
Pub.handleResponse= function handleResponse(data,eleid){
//获取表单Form2的对象
var ele =document.getElementById(eleid);
//将返回的结果放置到表单Form2的元素中
ele.innerHTML = data;
}
(1)功能实现代码:
(1-1)Action中的代码:
/**
* 跳转进入数据字典维护编辑页面
* @return
*/
public String edit(){
//获取页面传递的keyword值
String keyword = elecSystemDDL.getKeyword();
if (!"jerrynew".equals(keyword)) {
//根据keyword查询出对应类别的所有记录
List<ElecSystemDDL> list = elecSystemDDLService.findElecSystemDDL(keyword);
//建list存储到request域中转发到dictionaryIndex.jsp页面
request.setAttribute("list", list);
}
return "edit";
}
(1-2)Service中的代码:
@Override
@Transactional(readOnly=false,isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
public List<ElecSystemDDL> findElecSystemDDL(String keyword) {
String condition = "and o.keyword = ?";
Object[] params = {keyword};
Map<String,String> orderby = new LinkedHashMap<String,String>();
orderby.put("o.ddlCode", "asc");
List<ElecSystemDDL> list = elecSystemDDLDao.findCollectionByConditionNoPage(condition, params, orderby);
return list;
}
(1-3)效果:
(1-4)完成选择类型列表,实现Form2表单的内容替换
(1-5)保存功能的实现:
//ElecSystemDDL:首先在这个类中添加几个非持久化javabean属性,用于接收页面传递过来的隐藏域和表单值
/*————————————————————非持久化JavaBean属性——————————————————*/
//接受页面表单的多个输入值
private String[] itemname;
//存放数据类型
private String keywordname;
//进行保存功能的业务判断,如果为new表示新增一种数据类型,add表示在已有的类型基础上进行添加
private String typeflag;
(1-6)点击保存传递隐藏域值:
<tr>
<td align="center" colspan=3>
<input type="button" name="saveitem" value="保存" style="font-size:12px; color:black; height=20;width=50" onClick="returnMethod()">
</td>
</tr>
<input type="hidden" name="keywordname" >
<input type="hidden" name="typeflag" >
(1-7)调用:
function returnMethod(){
return saveDict();
}
(1-8)点击保存判断当前的操作是新增一种数据类型还是在已有数据类型的基础上进行添加:
function saveDict(){
if(document.Form1.keyword.value=="jerrynew"){
if(Trim(document.Form1.keywordname.value)==""){
alert("请输入类型名称");
return false;
}
var allkeywords= document.Form1.keyword;
for(var i=0;i<allkeywords.length;i++){
if(allkeywords[i].value==Trim(document.Form1.keywordname.value)){
alert("已存在此类型名称,请重新输入");
return false;
}
}
document.Form2.keywordname.value=document.Form1.keywordname.value;
document.Form2.typeflag.value="new";
}else{
document.Form2.keywordname.value=document.Form1.keyword.value;
document.Form2.typeflag.value="add";
}
var tbl=document.getElementById("dictTbl");
for (i=1;i<tbl.rows.length;i++){
var name = tbl.rows[i].cells[1].getElementsByTagName("input")[0].value;
if(Trim(name)==""){
alert("名称不能为空!");
return false;
}
}
for(k=1;k<=tbl.rows.length-2;k++)
{
for(m=k+1;m<=tbl.rows.length-1;m++)
{
var name1 = tbl.rows[k].cells[1].getElementsByTagName("input")[0].value;
var name2 = tbl.rows[m].cells[1].getElementsByTagName("input")[0].value;
if(name1 == name2){
alert("名称不能相同!");
return false;
}
}
}
document.Form2.action="savedict.do";
document.Form2.submit();
}
(1-9)保存操作(ElecSystemDDLAction中的代码):
/**
* 保存数据字典更新或者添加的字段
* @return
*/
public String savedict(){
//获取模型对象接收到的页面值
String keywordname = elecSystemDDL.getKeywordname();
//获取表单上的值
String[] itemnames = elecSystemDDL.getItemname();
//获取操作类型
String typeflag = elecSystemDDL.getTypeflag();
//查询出对应keyword的所有记录
List<ElecSystemDDL> list = elecSystemDDLService.findElecSystemDDL(keywordname);
//add,在已有基础上进行添加,最好的处理方式就是 将该类别的所有记录删除再添加进去
if ("add".equals(typeflag)) {
//先删除
elecSystemDDLService.deleteObjectByCollection(list);
//再添加,根据类别将具体itemnames数组中的值插入数据库中
elecSystemDDLService.saveSystemDDL(itemnames,keywordname);
}else{
//new,直接向数据库中添加一条对应类型的数据
elecSystemDDLService.saveSystemDDL(itemnames,keywordname);
}
return "savedict";
}
(1-10)ElecSystemDDLServiceImpl的代码:
@Override
@Transactional(readOnly=false,isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
public void deleteObjectByCollection(List<ElecSystemDDL> list) {
elecSystemDDLDao.deleteObjectByCollection(list);
}
@Override
@Transactional(readOnly=false,isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED)
public void saveSystemDDL(String[] itemnames, String keywordname) {
if (itemnames!= null && itemnames.length > 0) {
for (int i = 0; i < itemnames.length; i++) {
ElecSystemDDL elecSystemDDL = new ElecSystemDDL();
//将遍历的值设置到对象中去
elecSystemDDL.setDdlName(itemnames[i]);
elecSystemDDL.setKeyword(keywordname);
//设置保存的ddlCode值
elecSystemDDL.setDdlCode(i+1);
//保存到数据库中去
elecSystemDDLDao.save(elecSystemDDL);
}
}
}
注意:数据字典的数据会影响整个应用的数据,只能由管理员来操作,这个后面权限管理的时候会用到。
效果:
(1-11)附录:jquery对象的ajax应用:
Pub.js
function Pub(){ }
/**
* @param data:服务器返回的结果
* @param eleid:表单Form2的名称
*/
Pub.handleResponse= function handleResponse(data,eleid){
//获取表单Form2的对象
var ele = $("#"+eleid);
//将返回的结果放置到表单Form2的元素中
ele.html(data);
}
/**
* @param sForm:传递表单Form1的名称
* @returns {String}:使用ajax返回服务器端的参数,传递的就是表单Form1中元素的参数
*/
Pub.getParams2Str=function getParams2Str(sForm){
var strDiv = "";
strDiv = $("#"+sForm).serialize();
return strDiv;
}
/***
* Post请求
* domId:表单Form2的名称
* action:表示URL连接
* sForm:表单Form1的名称
*/
Pub.submitActionWithForm=function(domId,action,sForm){
var str = Pub.getParams2Str(sForm);
$.post(action,str,function(data){
Pub.handleResponse(data,domId);
})
}
/***
* Get请求
* domId:表单Form2的名称
* action:表示URL连接
* sForm:表单Form1的名称
*/
Pub.submitActionWithFormGet=function(domId,action,sForm){
$.get(action,{},function(data){
Pub.handleResponse(data,domId);
})
}
6:DOM对象去掉空格的方法
function LTrim(str)
{
var i;
for(i=0;i<str.length;i++)
{
if(str.charAt(i)!=" "&&str.charAt(i)!=" ")break;
}
str=str.substring(i,str.length);
return str;
}
function RTrim(str)
{
var i;
for(i=str.length-1;i>=0;i--)
{
if(str.charAt(i)!=" "&&str.charAt(i)!="?")break;
}
str=str.substring(0,i+1);
return str;
}
function Trim(str)
{
return LTrim(RTrim(str));
}
页面中使用
if(Trim(document.Form1.keywordname.value)==""){
alert("请输入类型名称");
return false;
}
7.附录:
Jquery对象去掉空格:
$.trim($(“#keywordname”).val());
8:实现百分比效果的进度条
分析原理:
面试的问到进度条如何实现:
结论:百分比进度条,实质上使用ajax在保存的过程中开启多个线程实现其中一个线程:执行保存
执行保存的业务操作,同时计算页面返回的百分比数值,将计算的数值存放到Session中在执行完保存的业务操作之后,即线程即将结束的时候,将Session清空
另一个线程:从Session总获取百分比的内容
获取百分比的内容同时使用ajax将结果返回到页面上,使用js将数据填写到页面显示。操作步骤:
请看【技术资料\进度条\进度条(百分比)】中的《进度条.doc》1:在jsp上添加代码:这个table标签要隐藏,进度条执行的时候再显示
<table id="load" width="700" border="0" align="center" bgcolor="#FAFAFA" cellpadding="0" cellspacing="0" bordercolor="#000000" style="border-collapse:collapse;display:none ">
<tr>
<td><br><br>
<table width="100%" border="1" cellspacing="0" cellpadding="0" bordercolor="#287BCE" style="border-collapse:collapse ">
<tr bgcolor="#F7F7F6">
<td width="20%" height="100" valign="middle">
<table align=‘center‘ width=‘500‘>
<tr>
<td colspan=‘2‘ align=‘center‘ id="progressPersent"><font size="2">
正在进行保存,用时较长,请稍后...
</font>
</td>
</tr>
<tr>
<td id=‘tdOne‘ height=‘25‘ width=1 bgcolor="blue"> </td>
<td id=‘tdTwo‘ height=‘25‘ width=500 bgColor=‘#999999‘> </td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
2:添加js代码:
var xmlHttp;
//创建ajax引擎
function createXMLHttpRequest() {
if (window.XMLHttpRequest) {
xmlHttp = new XMLHttpRequest();
} else if (window.ActiveXObject) {
try {
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e1) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
}
}
}
}
function loading() {
createXMLHttpRequest();
clearLoad();
var url = "elecCommonMsgAction_progressBar.do";
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = createCallback;
xmlHttp.send(null);
}
function createCallback() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
//每隔1秒钟执行一次percentServer()方法,直到当前访问结束
setTimeout("percentServer()", 1000);
}
}
}
function percentServer() {
createXMLHttpRequest();
var url = "elecCommonMsgAction_progressBar.do";
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = updateCallback;
xmlHttp.send(null);
}
function updateCallback() {
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
//获取XML数据中的percent存放的百分比的值
var percent_complete = xmlHttp.responseXML.getElementsByTagName("percent")[0].firstChild.data;
var tdOne = document.getElementById("tdOne");
var progressPersent = document.getElementById("progressPersent");
//改变蓝色区域的宽度
tdOne.width = percent_complete + "%";
//将百分比的数值显示到页面上
progressPersent.innerHTML = percent_complete + "%";
//如果计算获取的百分比的数值没有达到100,则继续调用方法,直到操作结束为止
if (percent_complete < 100) {
setTimeout("percentServer()", 1000);
}
}
}
}
function clearLoad() {
document.getElementById("load").style.display="";
document.getElementById("opperate1").style.display="none";
document.getElementById("opperate2").style.display="none";
}
3:在保存的submit()的方法后调用loading()方法。4:在Action操作的类中定义:
public String progressBar() throws Exception{
//从session中获取操作方法中计算的百分比
Double percent = (Double) ServletActionContext.getRequest().getSession().getAttribute("percent");
String res = "";
//此时说明操作的业务方法仍然继续在执行
if(percent!=null){
//计算的小数,四舍五入取整
int percentInt = (int) Math.rint(percent);
res = "<percent>" + percentInt + "</percent>";
}
//此时说明操作的业务方法已经执行完毕,session中的值已经被清空
else{
//存放百分比
res = "<percent>" + 100 + "</percent>";
}
//定义ajax的返回结果是XML的形式
PrintWriter out = response.getWriter();
response.setContentType("text/xml");
response.setHeader("Cache-Control", "no-cache");
//存放结果数据,例如:<response><percent>88</percent></response>
out.println("<response>");
out.println(res);
out.println("</response>");
out.close();
return null;
}
5:在操作业务的方法中,进行测试:
public String save(){
//模拟:循环遍历150条数据,观察百分比的变化情况
for(int i=1;i<=150;i++){
elecCommonMsgService.saveCommonMsg(elecCommonMsg);
ServletActionContext.getRequest().getSession().setAttribute("percent", (double)i/150*100);//存放计算的百分比
}
//线程结束时,清空当前session
ServletActionContext.getRequest().getSession().removeAttribute("percent");
return "save";
}
注意:可以在复杂的业务中将代码段分成点,一个点的进度是占百分之多少,然后存放到Session中,然后通过ajax调用服务从Session中获取值,返回进度并显示即可。