웹 페이지에서 페이지를 새로 고치지 않고 진행률 표시줄을 표시하는 것은 그리 어려운 일이 아니지만, 진행률 표시줄이 현재 트랜잭션이나 복잡한 논리의 실행 진행 상황을 정확하게 반영할 수 있다면 현재는 쉬운 작업이 아닙니다. AJAX 기술 대중적이기 때문에 이 글의 저자는 독자의 관심을 끌기 위해 AJAX를 사용하여 웹 페이지의 정확한 진행률 표시줄을 구현하려고 합니다.
먼저, 복잡한 트랜잭션이나 비즈니스 로직이 스레드 방식으로 실행되지 않는 경우 JAVA에서 실행 시 진행 표시를 처리하기 위해 복잡한 트랜잭션을 건너뛸 수 없다는 점을 생각해 보아야 합니다. 복잡한 트랜잭션이나 비즈니스 로직을 수행하기 위해 멀티스레딩을 사용하는 것을 고려해보세요.
또 다른 질문을 생각해보면, 트랜잭션 처리에는 웹 페이지에 일련의 매개변수 정보가 필요합니다. 이러한 매개변수를 얻는 방법은 생각하기 쉬운 것 같습니다. HttpServletRequest를 전달하기만 하면 됩니다.
진행률 표시줄을 공유하려면 모든 복잡한 트랜잭션 처리가 동일한 인터페이스 또는 추상 클래스를 구현해야 합니다. 여기서는 다음과 같이 인터페이스를 사용했습니다.
공개 인터페이스 IprogressBar {
public voidexecute(HttpServletRequest req,String pbid);//복잡한 트랜잭션 실행
}
다음과 같이 추상 클래스를 사용하여 멀티스레딩을 구현합니다.
공용 추상 클래스 AbstractProgressBar는 TimerTask를 확장하고 IprogressBar를 구현합니다.
개인 HttpServletRequest 요청;
개인 문자열 pbid;
공개 AbstractProgressBar(){
}
//하위 클래스는 이 함수를 재정의해야 합니다.
공개 추상 무효 실행(HttpServletRequest req, String pbid);
공개 무효 실행() {
실행(요청,pbid);
}
공개 무효 setRequest(HttpServletRequest req){
this.request=요청;
}
공공 무효 setPbid(문자열 pbid){
this.pbid=pbid;
}
}
특정 프로젝트에 대한 코드를 제공하는 것이 불편하므로 여기서는 복잡한 트랜잭션 처리를 수행하는 클래스인 또 다른 테스트 클래스를 다음과 같이 작성했습니다.
공개 클래스 TestPB는 AbstractProgressBar를 확장합니다.
공개 무효 실행(HttpServletRequest req, 문자열 pbid) {
String sql="temp_table(idx)값에 삽입(?)";
int pid=Integer.parseInt(pbid);
ProgressBar pb=new ProgressBar(pid,300,0,1);
//대규모 트랜잭션 시뮬레이션
for(int i=0;i<300;i++){
DbUtils.executeUpdate(sql,new Object[]{new Integer(i)});
//진행상황 제어
pb.stepIt();
}
}
}
그런 다음 AJAX 기술을 사용하여 웹 페이지의 새로 고침되지 않는 진행률 표시줄을 실현합니다. 코드는 다음과 같습니다.
<%@ 페이지 contentType="text/html;charset=UTF-8"%>
<title>새로 고침 페이지 진행 표시줄 테스트 없음</title>
<스타일 유형="텍스트/css">
<!--
BODY {OVERFLOW:스크롤;OVERFLOW-X:숨김}
.DEK {위치:절대;가시성:숨김;Z-INDEX:200;}
//-->
</STYLE>
<스크립트 유형="텍스트/자바스크립트">
var xmlHttp;
var pbid;//진행률 표시줄 ID
함수 createXMLHttpRequest(){
if (window.ActiveXObject) {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
else if (window.XMLHttpRequest) {
xmlHttp = 새로운 XMLHttpRequest();
}
}
함수 checkDiv() {
var Progress_bar = document.getElementById("progressBar");
if (progress_bar.style.visibility != "visible") {
Progress_bar.style.visibility = "표시됨";
}또 다른
{
Progress_bar.style.visibility = "숨김";
}
}
함수 이동() {
createXMLHttpRequest();
checkDiv();
var url = "../servlet/ProgressBarServlet?task=create&impcls=blogcn.pb.imp.TestPB";//여기서 blogcn.pb.imp.TestPB는 복잡한 트랜잭션의 구현 클래스입니다.
var 버튼 = document.getElementById("go");
버튼.비활성화 = true;
xmlHttp.open("GET", url, true);
xmlHttp.setRequestHeader("Content-Type", "text/xml;charset=gb2312");
xmlHttp.onreadystatechange = goCallback;
xmlHttp.send(null);
}
함수 goCallback(){
if (xmlHttp.readyState==4)
{
if (xmlHttp.status==200) {
pbid=xmlHttp.responseXML.getElementsByTagName("pbid")[0].firstChild.data;
setTimeout("pollServer()", 2000);
}
}
}
함수 pollServer() {
createXMLHttpRequest();
var url = "../servlet/ProgressBarServlet?task=poll&pbid="+pbid;
xmlHttp.open("GET", url, true);
xmlHttp.onreadystatechange = pollCallback;
xmlHttp.send(null);
}
함수 pollCallback(){
if (xmlHttp.readyState == 4) {
if (xmlHttp.status == 200) {
var 퍼센트_완료 =
xmlHttp.responseXML
.getElementsByTagName("퍼센트")[0].firstChild.data;
if (퍼센트 완료 < 100) {
PB1.pos=percent_complete;
PB1.업데이트();
setTimeout("pollServer()", 2000);
} 또 다른 {
PB1.pos=100;
PB1.업데이트();
document.getElementById("go").disabled = false;
}
}
}
}
<input type="button" value="대규모 거래 실행" id="go" onclick="go();"/>
<DIV id="진행 표시줄">
<스크립트 언어="자바스크립트">
var PB1=new TProgressBar("myPB1",220,180,375,20);
PB1.Create();
해적수=100;
PID=해적수-2;
PB1.재위치();
PB1.max=PID;