版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
《Servlet應(yīng)用開發(fā)課程設(shè)計(jì)》項(xiàng)目實(shí)驗(yàn)報(bào)告項(xiàng)目名稱:娛樂無限下載中心指導(dǎo)老師:黃銘班級:WEB11307第二組地點(diǎn):J1B401小組成員:葉佳隴、王月、李飛、袁梅廖小飛、江偉、李占銀、李虹穎、侯燕王晶晶、林姣、宋曉、嚴(yán)映婷、饒琴英徐小川、王婷、楊梅、王曉莉、魏海林時(shí)間:18周,2012年12月31日2013年01月04日
目錄1.1需求分析11.2項(xiàng)目設(shè)計(jì)21.2.1選擇開發(fā)模型21.2.2數(shù)據(jù)庫設(shè)計(jì)21.3項(xiàng)目實(shí)施31.3.1創(chuàng)建web項(xiàng)目31.3.2通用功能的實(shí)現(xiàn)31.3.3普通用戶功能的實(shí)現(xiàn)31.3.4管理員功能的實(shí)現(xiàn)31.4項(xiàng)目運(yùn)行41.4.1Web項(xiàng)目的目錄結(jié)構(gòu)41.4.2Web項(xiàng)目的發(fā)布41.5個(gè)人總結(jié)5
1.1需求分析a.功能需求<1>用戶分為管理員和普通用戶<2>對于普通用戶:能夠直接訪問網(wǎng)站的內(nèi)容,包括瀏覽排行榜、瀏覽所有信息、分類瀏覽、分頁瀏覽也可進(jìn)行下載信息,當(dāng)瀏覽的較多時(shí)可以進(jìn)行分頁瀏覽。<3>對于管理員除了具有普通用的權(quán)利之外,還可以通過登陸進(jìn)行信息的管理包括信息的添加、刪除、修改b.結(jié)構(gòu)功能分析1.src目錄的結(jié)構(gòu)1.1service包(模型層):建立普通用戶所實(shí)現(xiàn)的功能以及管理員所實(shí)現(xiàn)的功能以及他們的共享的功能.UserService類中,包括獲得下載次數(shù)排名前十位的數(shù)據(jù)信息獲得數(shù)據(jù)庫中的所有信息獲得指定分類的數(shù)據(jù)庫信息獲得指定名稱的數(shù)據(jù)信息。CommonService:獲得下載文件信息及下載文件是更新文件的下載次數(shù)的方法。AdminService:實(shí)現(xiàn)各種業(yè)務(wù)羅就包括驗(yàn)證登錄信息獲得數(shù)據(jù)庫中的所有信息添加信息檢索單條信息修改信息等。1.2servlets包(控制層):將后臺的數(shù)據(jù)庫和前臺的界面進(jìn)行連接LoginServlet驗(yàn)證登錄信息。AdminServlet實(shí)現(xiàn)信息的管理。UserServlet根據(jù)用戶的請求路徑不同調(diào)用相應(yīng)的模型去處理請求并選擇合適的視圖層去響應(yīng)客戶端。DownLoadServlet:進(jìn)行對上傳文件的下載。1.3util包(實(shí)現(xiàn)通用功能的java類):前臺數(shù)據(jù)庫的建立DBHelper創(chuàng)建數(shù)據(jù)庫的鏈接創(chuàng)建語句對象設(shè)置SQL語句的參數(shù)返回查詢操作的單條記錄返回查詢操作的多天記錄執(zhí)行更新語句管部數(shù)據(jù)庫的連接。1.2項(xiàng)目設(shè)計(jì)1.2.2選擇開發(fā)模型本系統(tǒng)的開發(fā)基于MVC模式,其中模型層負(fù)責(zé)業(yè)務(wù)數(shù)據(jù)的表示和實(shí)現(xiàn)業(yè)務(wù)邏輯,用Java類實(shí)現(xiàn);視圖層用于與用戶交互,由JSP頁面實(shí)現(xiàn),通過在JSP頁面中使用EL和JSTL,避免了Java腳本的出現(xiàn);控制器層完成流程控制,它接收來自視圖層用戶輸入的數(shù)據(jù)并調(diào)用相應(yīng)的模型進(jìn)行處理,最后選擇合適的視圖去響應(yīng)用戶,控制器層用Servlet實(shí)現(xiàn)。1.2.2 數(shù)據(jù)庫設(shè)計(jì)本系統(tǒng)的數(shù)據(jù)信息存儲在SQL數(shù)據(jù)庫服務(wù)器的數(shù)據(jù)庫中,數(shù)據(jù)庫中共有兩張數(shù)據(jù)表,即admin和files,其中admin表用于存儲管理員的登錄信息,files表用于存儲娛樂信息。Admin表Fils表1.3項(xiàng)目實(shí)施1.3.1創(chuàng)建Web項(xiàng)目利用myeclipse創(chuàng)建新的Web項(xiàng)目,名為ch4的目錄結(jié)構(gòu)如圖3-1所示。其中,src目錄的service包保存模型層的java類,servlets包保存控制器層的servlet,util包保存實(shí)現(xiàn)通用功能的java類;WebRoot目錄下的admin文件夾保存與管理員操作相關(guān)的JSP頁面,用戶相關(guān)的JSP頁面直接保存在WebRoot目錄下,software文件夾保存上傳的文件。圖3—1項(xiàng)目ch14的目錄結(jié)構(gòu)AdminServiceUserServiceCommonServiceService AdminServiceUserServiceCommonServiceServiceAdminsevletAdminsevletDownLoadServiceDownLoadServiceServletsServletsLoginServletLoginServletUsersevletDBUtilDBUtilFileutilPageBeanUtilFileutilPageBeanUtilLogin.jspAdd.jspHeader.jspHeader.jspIndex.jspList.jspList.jspdelete.jspUpdate.jspToplist.jspSortlist.jspShowfile.jspSearchlist.jspresult.jspListall.jspWebRootdelete.jspUpdate.jspToplist.jspSortlist.jspShowfile.jspSearchlist.jspresult.jspListall.jspWebRoot1.3.2通用功能的實(shí)現(xiàn)系統(tǒng)的通用功能包括數(shù)據(jù)庫訪問、分頁處理和文件的上傳/下載,這些功能在模型層通過Java語言實(shí)現(xiàn)。A.數(shù)據(jù)庫訪問數(shù)據(jù)庫訪問操作封裝在util.DBUtil類中,包括創(chuàng)建數(shù)據(jù)庫連接、創(chuàng)建語句對象、設(shè)置SQL語句的參數(shù)、返回查詢操作的單條記錄、返回查詢操作的多條記錄、執(zhí)行更新語句、關(guān)閉數(shù)據(jù)庫連接等功能。文件名:DBUtil.javapackageutil;importjava.sql.*;importjava.util.*;publicclassDBUtil{ privateConnectionconn=null; privatePreparedStatementpstmt=null; privateResultSetrs=null; privateStringurl="jdbc:odbc:music";privateintpageSize=3; //獲取連接對象 privateConnectiongetConnection(){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conn=DriverManager.getConnection(url,"root","root"); }catch(ClassNotFoundExceptione){ e.printStackTrace(); }catch(SQLExceptione){ e.printStackTrace(); } returnconn; } //獲取語句對象 privatePreparedStatementgetPreoareStatement(Stringsql){ try{ pstmt=getConnection().prepareStatement(sql); }catch(SQLExceptione){ e.printStackTrace(); } returnpstmt; } //給pstmt的SQL語句設(shè)置參數(shù)(要求參數(shù)以數(shù)組形式給出) privatevoidsetParams(Stringsql,Object[]params){ pstmt=this.getPreoareStatement(sql); for(inti=0;i<params.length;i++) try{ pstmt.setString(i+1,(String)params[i]); }catch(SQLExceptione){ e.printStackTrace(); } } //執(zhí)行數(shù)據(jù)庫查詢操作,返回結(jié)果的記錄數(shù) privateintgetTotalRows(Stringsql,Object[]params){ inttotalRows=0; StringcountSQL="selectcount(*)from("+sql+")astemp"; try{ this.setParams(countSQL,params); ResultSetrs=pstmt.executeQuery(); if(rs.next()) totalRows=rs.getInt(1); }catch(SQLExceptione){ e.printStackTrace(); }finally{ close(); } returntotalRows; } //執(zhí)行數(shù)據(jù)庫查詢操作時(shí),將返回的結(jié)果封裝到List對象中 publicListgetList(Stringsql,Object[]params){ Listlist=newArrayList(); try{ this.setParams(sql,params); ResultSetrs=pstmt.executeQuery(); ResultSetMetaDatarsmd=rs.getMetaData(); while(rs.next()){ Mapm=newHashMap(); for(inti=1;i<=rsmd.getColumnCount();i++){ StringcolName=rsmd.getColumnName(i); inttype=rsmd.getColumnType(i); m.put(colName,rs.getString(colName)); } list.add(m); } }catch(SQLExceptione){ e.printStackTrace(); }finally{ close(); } returnlist; } //執(zhí)行數(shù)據(jù)庫查詢操作時(shí)將返回的結(jié)果封裝到Map對象中 publicMapgetMap(Stringsql,Object[]params){ Listlist=getList(sql,params); if(list.isEmpty()) returnnull; else return(Map)list.get(0); } //分頁顯示查詢結(jié)果時(shí),將當(dāng)前頁中的所有信息封裝到pageBean中 publicPageBeangetPageBean(Stringsql,Object[]params,intcurPage){ StringnewSql=sql+"limit"+(cur1)*pageSize+","+pageSize; Listdata=this.getList(newSql,params); PageBeanpb=newPageBean(); pb.setCurPage(curPage); pb.setPageSize(pageSize); pb.setTotalRows(getTotalRows(sql,params)); pb.setData(data); returnpb; } //更新數(shù)據(jù)庫時(shí)調(diào)用的update()方法 publicintupdate(Stringsql,Object[]params){ intrecNo=0; try{ setParams(sql,params); recNo=pstmt.executeUpdate(); }catch(Exceptione){ e.printStackTrace(); }finally{ close(); } returnrecNo; } //關(guān)閉對象 privatevoidclose(){ try{ if(rs!=null) rs.close(); if(pstmt!=null) pstmt.close(); if(conn!=null) conn.close(); }catch(SQLExceptione){ } }}B.分頁處理分頁后的數(shù)據(jù)保存在util.PageBean中,該信息通過util.DBUtil類的PageBean的getPageBean()方法得到。文件名:PageBean.javapackageutil;importjava.util.List;publicclassPageBean{ privateintcurPage; privateinttotalPages; privateinttotalRows; privateintpageSize; privateListdata; publicintgetCurPage(){ if(curPage>getTotalPages()){ curPage=getTotalPages(); }elseif(curPage<1){ curPage=1; } returncurPage; } publicvoidsetCurPage(intcurPage){ this.curPage=curPage; } publicintgetTotalPages(){ if(totalRows%pageSize==0){ totalPages=totalRows/pageSize; }else{ totalPages=totalRows/pageSize+1; } returntotalPages=totalPages; }publicvoidsetTotalPages(inttotalPages){ this.totalPages=totalPages;}publicintgetTotalRows(){ returntotalRows;}publicvoidsetTotalRows(inttotalRows){ this.totalRows=totalRows;}publicintgetPageSize(){ returnpageSize;}publicvoidsetPageSize(intpageSize){ this.pageSize=pageSize;}publicListgetData(){ returndata;}publicvoidsetData(Listdata){ this.data=data;} }C.文件的上傳和下載文件的上傳的下載功能封裝在util.FileUtil類中,提供了實(shí)現(xiàn)文件上傳和下載的通用方法。文件名:FileUtil.javapackageutil;importjava.io.*;importjava.util.*;importjavax.servlet.*;importjavax.servlet.http.*;importmons.fileupload.FileItem;importmons.fileupload.FileUploadException;importmons.fileupload.FileUploadBase.SizeLimitExceededException;importmons.fileupload.disk.DiskFileItemFactory;importmons.fileupload.servlet.ServletFileUpload;publicclassFileUtil{ privateMapparameters=null; privateMapfile=null; privatelongmax_size=30*1024*1024; publicFileUtil(){ parameters=newHashMap(); file=newHashMap(); } publicintupload(ServletContextservletContext,HttpServletRequestrequest,HttpServletResponseresponse,StringuploadPath)throwsIOException{ DiskFileItemFactorydiskFileItemFactory=newDiskFileItemFactory(); diskFileItemFactory.setSizeThreshold(4096); ServletFileUploadfileUpload=newServletFileUpload(diskFileItemFactory); fileUpload.setSizeMax(max_size); fileUpload.setHeaderEncoding("GBK"); response.setContentType("text/html;charset=GBK"); PrintWriterout=response.getWriter(); ListfileList=null; try{ fileList=fileUpload.parseRequest(request); }catch(FileUploadExceptione){ if(einstanceofSizeLimitExceededException){ System.out.println("文件大小超過"+max_size+"字節(jié)"); return0; } e.printStackTrace(); } IteratorfileItr=fileList.iterator(); while(fileItr.hasNext()){ FileItemfileItem=null; StringsourceFilePath=null; StringsourceFileName=null; StringfileExt=null; StringfilePath=null; StringrealPath=null; StringfileName=null; longsize=0; fileItem=(FileItem)fileItr.next(); if(!fileItem.isFormField()){ sourceFilePath=fileItem.getName(); size=fileItem.getSize(); if(!sourceFilePath.equals("")&&size!=0){ sourceFileName=sourceFilePath.substring(sourceFilePath.lastIndexOf("\\")+1); fileExt=sourceFileName.substring(sourceFileName.lastIndexOf(".")+1); longsystemTime=System.currentTimeMillis(); filePath=uploadPath+"/"+systemTime+"."+fileExt; realPath=servletContext.getRealPath(filePath); try{ fileItem.write(newFile(realPath)); }catch(Exceptione){ e.printStackTrace(); return0; } file.put("size",String.valueOf(size)); file.put("filePath",filePath); file.put("fileName",sourceFileName); } }else{ StringfieldName=fileItem.getFieldName(); Stringvalue=fileItem.getString("GBK"); parameters.put(fieldName,value); } } return1; } publicintdownload(ServletContextservletContext,HttpServletResponseresponse,Mapfile)throwsIOException{ java.io.BufferedInputStreambis=null; java.io.BufferedOutputStreambos=null; try{ StringfilePath=(String)file.get("filePath"); StringrealPath=servletContext.getRealPath(filePath); longfileLength=newFile(realPath).length(); response.setHeader("Content-disposition","attachment;filename="+newString(((String)file.get("fileName")).getBytes("GBK"),"ISO8859-1")); response.setHeader("Content-Length",String.valueOf(fileLength)); bis=newBufferedInputStream(newFileInputStream(realPath)); bos=newBufferedOutputStream(response.getOutputStream()); byte[]buff=newbyte[2048]; intbytesRead; while((bytesRead=bis.read(buff,0,buff.length))!=-1){ bos.write(buff,0,bytesRead); } }catch(IOExceptione){ return0; }finally{ if(bis!=null) bis.close(); if(bos!=null) bos.close(); } return1; } publicMapgetFile(){ returnfile; } publicMapgetParameters(){ returnparameters; } publicvoidsetMax_size(longmax_size){ this.max_size=max_size; }}模型層的service.CommonService類提供了獲得下載文件信息及下載文件時(shí)更新文件下載次數(shù)的通用方法。文件名:CommonService.javapackageservice;importutil.*;importjava.util.*;importjava.io.*;publicclassCommonService{ privateDBUtildb=newDBUtil(); publicMapgetDownLoadFile(Stringid){ Stringsql="selectfilePath,fileNamefromfileswhereid=?"; returndb.getMap(sql,newObject[]{id}); } publicvoidupdateHits(Stringid){ Stringsql="updatefilessethits=hits+1whereid=?"; db.update(sql,newObject[]{id}); }}控制器層的servlet.DownLoadServlet類用于處理用戶的下載請求,完成下載文件信息的獲取,調(diào)用util.FileUtil類的下載方法完成文件的下載動作,以及更新文件的下載次數(shù)。文件名:DownLoadServlet.javapackageservlets;importutil.*;importjava.io.*;importjava.util.*;importjavax.servlet.*;importjavax.servlet.http.*;importservice.CommonService;publicclassDownLoadServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doPost(request,response); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ Stringid=request.getParameter("id"); CommonServicecs=newCommonService(); Mapfile=cs.getDownLoadFile(id); FileUtilfu=newFileUtil(); intr=fu.download(this.getServletContext(),response,file); if(r==1) cs.updateHits(id); }}1.3.3普通用戶功能的實(shí)現(xiàn)普通用戶功能包括瀏覽排行榜、瀏覽所有信息、分類瀏覽和分類搜索。A.模型層的實(shí)現(xiàn)實(shí)現(xiàn)普通用戶功能的業(yè)務(wù)邏輯被封裝在模型層的service.UserService類中,包括獲得下載次數(shù)排名前10位的數(shù)據(jù)信息、獲得數(shù)據(jù)庫中所有的信息、獲得指定分類的數(shù)據(jù)信息、獲得指定分類和指定名稱的數(shù)據(jù)信息等。文件名:UserService.javapackageservice;importutil.*;importjava.util.*;importjava.io.*;publicclassUserService{ privateDBUtildb=newDBUtil();//獲得所有信息的PageBean對象 publicPageBeanlistAll(intcurPage){ Stringsql="select*fromfilesorderbylastModifieddesc"; returndb.getPageBean(sql,newObject[]{},curPage); } //獲得下載次數(shù)排名前10位的信息 publicListtopList(){ Stringsql="selectid,name,hitsfromfileswherehits!=0orderbyhitsdesclimit0,10"; returndb.getList(sql,newObject[]{}); }//通過id獲得單條數(shù)據(jù)信息 publicMapgetById(Stringid){ Stringsql="select*fromfileswhereid=?"; returndb.getMap(sql,newObject[]{id}); }//獲得指定類型的數(shù)據(jù)信息的PageBean對象 publicPageBeanlistSort(Stringtype,intcurPage){ Stringsql=null; if(type==null||type.equals("")){ sql="select*fromfilesorderbytype"; returndb.getPageBean(sql,newObject[]{},curPage); }else{ sql="select*fromfileswheretype=?"; returndb.getPageBean(sql,newObject[]{type},curPage); } }//獲得指定類型和指定名稱的數(shù)據(jù)信息的PageBean對象 publicPageBeansearch(Stringtype,Stringname,intcurPage){ Stringsql=null; if(type==null||type.equals("")){ if(name==null||name.equals("")){ sql="select*fromfilesorderbytype"; returndb.getPageBean(sql,newObject[]{},curPage); }else{ sql="select*fromfileswherenamelike?"; returndb.getPageBean(sql,newObject[]{"%"+name+"%"},curPage); } }else{ if(name==null||name.equals("")){ sql="select*fromfileswheretype=?"; returndb.getPageBean(sql,newObject[]{type},curPage); }else{ sql="select*fromfileswheretype=?andnamelike?"; returndb.getPageBean(sql,newObject[]{type,"%"+name+"%"},curPage); } } }}B.控制器層的實(shí)現(xiàn)普通用戶功能的控制器層由servlets.UserServlet類實(shí)現(xiàn),完成根據(jù)用戶的請求路徑調(diào)用相應(yīng)的模型去處理請求,并選擇合適的視圖層文件響應(yīng)用戶。文件名:UserServlet.javapackageservlets;importutil.*;importjava.util.*;importjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;importservice.UserService;publicclassUserServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doPost(request,response); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ request.setCharacterEncoding("GBK"); StringrequestPath=request.getRequestURI(); inti=requestPath.lastIndexOf('/'); Stringpath=requestPath.substring(i); RequestDispatcherrd=null; UserServiceus=newUserService(); if(path.equals("/listAll")){ Stringpage=request.getParameter("page"); intcurPage=0; if(page==null||page.length()<1){ curPage=1; }else{ curPage=Integer.parseInt(page); }PageBeanpageBean=us.listAll(curPage);request.setAttribute("pageBean",pageBean);rd=request.getRequestDispatcher("/listAll.jsp"); rd.forward(request,response); }elseif(path.equals("/top")){ Listtop=us.topList(); request.setAttribute("top",top);rd=request.getRequestDispatcher("/topList.jsp"); rd.forward(request,response); }elseif(path.equals("/show")){ Stringid=request.getParameter("id"); Mapfile=us.getById(id); request.setAttribute("file",file);rd=request.getRequestDispatcher("/showFile.jsp"); rd.forward(request,response); }elseif(path.equals("/sort")){ Stringtype=request.getParameter("type"); Stringpage=request.getParameter("page"); intcurPage=0; if(page==null||page.length()<1){ curPage=1; }else{ curPage=Integer.parseInt(page); }PageBeanpageBean=us.listSort(type,curPage);request.setAttribute("pageBean",pageBean);rd=request.getRequestDispatcher("/sortList.jsp"); rd.forward(request,response); }elseif(path.equals("/search")){ Stringtype=request.getParameter("type"); Stringname=request.getParameter("name"); Stringpage=request.getParameter("page"); intcurPage=0; if(page==null||page.length()<1){ curPage=1; }else{ curPage=Integer.parseInt(page); }PageBeanpageBean=us.search(type,name,curPage);request.setAttribute("pageBean",pageBean);rd=request.getRequestDispatcher("/searchList.jsp"); rd.forward(request,response); } }}C.視圖層的實(shí)現(xiàn)(1)首頁——index.jsp(2)瀏覽排行榜有信息——listAll.jsp(3)排行榜——toplist.jsp(4)查看排行榜中某文件的詳細(xì)信息——showFile.jsp(5)信息分類瀏覽——sortLis.jsp(6)分類搜索——searchList.jsp1.3.3管理員功能的實(shí)現(xiàn)管理員登錄后將瀏覽到所有信息,并且可以信息進(jìn)行添加、修改、刪除。模型層的實(shí)現(xiàn)實(shí)現(xiàn)管理員功能的業(yè)務(wù)邏輯被封裝在模型層的service.AdminService類中,包括驗(yàn)證登錄信息、獲得數(shù)據(jù)庫所有信息、添加信息、檢索單條信息、修改信息等文件名:AdminService.javapackageservice;importutil.*;importjava.util.*;importjava.io.*;publicclassAdminService{ privateDBUtildb=newDBUtil();//驗(yàn)證登錄信息 publicbooleancheckLogin(Stringusername,Stringpassword){ Stringsql="select*fromadminwhereusername=?andpassword=?"; Mapm=db.getMap(sql,newObject[]{username,password}); if(m==null) returnfalse; else returntrue; }//添加信息 publicintadd(Mapfile,Mapparameters){ intresult=0; Objectname=parameters.get("name"); Objectsize=file.get("size"); Stringhits="0"; Objecttype=parameters.get("type"); Objectdescription=parameters.get("description"); ObjectfilePath=file.get("filePath"); ObjectfileName=file.get("fileName"); Stringsql="insertintofilesvalues(null,?,now(),?,?,?,?,?,?)"; result=db.update(sql,newObject[]{name,size,hits,type,description,filePath,fileName}); returnresult; }//獲得所有信息的PageBean對象 publicPageBeanlist(intcurPage){ Stringsql="selectid,name,lastModified,size,hits,descriptionfromfiles"; returndb.getPageBean(sql,newObject[]{},curPage); }//通過id檢索單條信息 publicMapgetById(Stringid){ Stringsql="select*fromfileswhereid=?"; returndb.getMap(sql,newObject[]{id}); }//更新上傳文件信息 publicintupdateFile(StringrealPath,Mapfile,Mapparameters){ intresult=0; Filef=newFile(realPath); f.delete(); Stringsql="updatefilessetsize=?,hits=?,filePath=?,fileName=?whereid=?"; result=db.update(sql,newObject[]{file.get("size"),"0",file.get("filePath"),file.get("fileName"),parameters.get("id")}); returnresult; }//更新信息 publicintupdateInfo(Mapparameters){ Objectid=parameters.get("id");Objectname=parameters.get("name"); Objecttype=parameters.get("type"); Objectdescription=parameters.get("description"); Stringsql="updatefilessetname=?,lastModified=now(),type=?,description=?whereid=?"; returndb.update(sql,newObject[]{name,type,description,id}); }}B、控制器層的實(shí)現(xiàn)登錄驗(yàn)證控制器層由servlets.loginServlet實(shí)現(xiàn),其他的信息管理功能的控制器層由servlets.AdminServlet實(shí)現(xiàn)文件名:LoginServlet.java(代碼略)文件名:AdminServlet.javapackageservlets;importutil.*;importjava.util.*;importjava.io.*;importjavax.servlet.*;importjavax.servlet.http.*;importservice.AdminService;publicclassAdminServletextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ doPost(request,response); } publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ request.setCharacterEncoding("GBK"); StringrequestPath=request.getRequestURI(); inti=requestPath.lastIndexOf('/'); Stringpath=requestPath.substring(i); RequestDispatcherrd=null; AdminServiceas=newAdminService(); if(path.equals("/add")){ StringuploadPath="/software"; FileUtilfu=newFileUtil(); intr=fu.upload(this.getServletContext(),request,response,uploadPath); if(r==1&&as.add(fu.getFile(),fu.getParameters())==1){ request.setAttribute("result","添加成功!"); }else{ request.setAttribute("result","添加失??!"); } rd=request.getRequestDispatcher("/admin/result.jsp"); rd.forward(request,response); }elseif(path.equals("/update")){ Stringid=request.getParameter("id"); Mapfile=as.getById(id); request.setAttribute("file",file); rd=request.getRequestDispatcher("/admin/update.jsp"); rd.forward(request,response); }elseif(path.equals("/dealUpdate")){ intresult=0; StringuploadPath="/software"; FileUtilfu=newFileUtil(); intr=fu.upload(this.getServletContext(),request,response,uploadPath); if(r==1){ Mapfile=(Map)fu.getFile(); Mapparameters=(Map)fu.getParameters(); if(!file.isEmpty()){ StringrealPath=this.getServletContext().getRealPath((String)parameters.get("filePath")); result=as.updateFile(realPath,file,parameters); } result=as.updateInfo(parameters); } if(result==1){ request.setAttribute("result","更新成功!"); }else{ request.setAttribute("result","更新失??!"); } rd=request.getRequestDispatcher("/admin/result.jsp"); rd.forward(request,response); }elseif(path.equals("/delete")){ }elseif(path.equals("/list")){ Stringpage=request.getParameter("page"); intcurPage=0; if(page==null||page.length()<1){ curPage=1; }else{ curPage=Integer.parseInt(page); }PageBeanpageBean=as.list(curPage);request.setAttribute("pageBean",pageBean);rd=request.getRequestDispatcher("/admin/list.jsp"); rd.forward(request,response); } }}C、視圖層的實(shí)現(xiàn)(1)登錄頁面——login.jsp(2)管理頁面——list.jsp(3)添加信息——add.jsp(4)修改信息——update.jsp(5)結(jié)果顯示——result.jsp(6)刪除信息——delete.jsp1.4項(xiàng)目運(yùn)行14.4.1Web項(xiàng)目的目錄結(jié)構(gòu)Web項(xiàng)目ch14的最終目錄結(jié)構(gòu)如圖14-12所示。14.4.2Web項(xiàng)目的發(fā)布將web項(xiàng)目發(fā)布到tomcat服務(wù)器上可以通過打包、安裝的方式。打包Web項(xiàng)目發(fā)布時(shí),需要將webRoot目錄下的所有內(nèi)容打包到一個(gè)war文件中。使用WAR文件更新以便于web項(xiàng)目的發(fā)布和設(shè)置,便于web應(yīng)用的移植。打包時(shí),需要進(jìn)入web項(xiàng)目的webroot目錄下,運(yùn)行如下命令:Jarcvfch14.war.安裝將WAR文件復(fù)制到$CATALINA-HOME\webapps目錄下即可,然后再瀏覽器地址欄中輸入U(xiǎn)RL:http://locahost:8080/ch14,即可訪問web應(yīng)用。1.5個(gè)人總結(jié)為了了解自己對本學(xué)期知識的掌握情況,我們進(jìn)行了十四章的項(xiàng)目訓(xùn)練。其項(xiàng)目設(shè)計(jì):一、項(xiàng)目系統(tǒng)的開發(fā)基于MVC模式。二、數(shù)據(jù)庫設(shè)計(jì)。讓我們清楚的了解到系統(tǒng)的運(yùn)行機(jī)制與數(shù)據(jù)庫的建立。這其中也有些文件需要我們自己去完成。這個(gè)項(xiàng)目所蘊(yùn)含的知識幾乎囊括本書的所有內(nèi)容,極具完整性。最后在與對數(shù)據(jù)庫的鏈接遇到了問題,用JDBC-ODBC的鏈接方法鏈接不上,只能用我們還沒有學(xué)過的鏈接MySQL的方法鏈接MySQL,以MySQL作為數(shù)據(jù)庫,這讓我清楚的了解到自己的不足。李占銀突然而來的綜訓(xùn),感到非常棘手。在團(tuán)隊(duì)成員的幫助下才勉強(qiáng)完成作業(yè),這是這學(xué)期第一次敲代碼,但是經(jīng)過這次的綜訓(xùn),還是學(xué)到了不少的jsp的知識。團(tuán)隊(duì)的力量是最大的,在這次綜訓(xùn)中,我干的很少,其余的都是團(tuán)隊(duì)做的,我覺得一個(gè)人很難把事干好,集體的才能做到完美李飛通過這次的《Servlet應(yīng)用開發(fā)》項(xiàng)目實(shí)戰(zhàn),讓我基本掌握Servlet基礎(chǔ)、Servlet會話跟蹤、Servlet監(jiān)聽和Servlet過濾等知識,并將所學(xué)的重要技能融會貫通,更加全面的,熟練的掌握使用Servlet的基礎(chǔ)方法和技巧,雖然還是有些不懂,我相信在以后的學(xué)習(xí)過程中,我會更加深刻。此次開發(fā)一個(gè)基于MVC模式的JavaWeb項(xiàng)目—娛樂無限下載中心,實(shí)現(xiàn)娛樂信息的共享和管理。其中模型層(M)負(fù)責(zé)業(yè)務(wù)數(shù)據(jù)的表示和實(shí)現(xiàn)業(yè)務(wù)邏輯,用Java類實(shí)現(xiàn);視圖層(V)用于與用戶交互,由JSP頁面實(shí)現(xiàn),通過在JSP頁面中使用EL和JSTL,避免了Java腳本的實(shí)現(xiàn);控制器層(C)完成流程控制,它接收來自視圖層用戶輸入的數(shù)據(jù)并調(diào)用相應(yīng)的模型進(jìn)行處理,最后選擇合適的視圖去響應(yīng)用戶,控制層用Servlet實(shí)現(xiàn)。在所有代碼都已完成,實(shí)現(xiàn)數(shù)據(jù)庫連接,本章節(jié)使用的數(shù)據(jù)庫是MYSQL,而我們所學(xué)的是SQLServer,這給我們連接數(shù)據(jù)庫帶來不少麻煩,不知從何下手,通過和小組成員的討論,我們對MYSQL有一點(diǎn)點(diǎn)的掌握,在大家的努力之下,將數(shù)據(jù)庫成功連接。完成了這次項(xiàng)目?;叵脒@次做項(xiàng)目的過程,在學(xué)習(xí)過程中沒有認(rèn)真,導(dǎo)致了很多時(shí)候不知該怎樣做這個(gè)項(xiàng)目,通過全體組員的共同努力,還是完成了任務(wù),也讓我學(xué)到了不少知識,在今后的學(xué)習(xí)過程中我會認(rèn)真的學(xué)習(xí)。李虹穎經(jīng)過幾天的綜訓(xùn),我更加熟悉掌握了servlet數(shù)據(jù)處理、重定向和請求轉(zhuǎn)發(fā)等的使用。和servlet監(jiān)聽和serl\vlet過濾的基本技術(shù),以及怎么連接到數(shù)據(jù)庫,當(dāng)然在做這個(gè)項(xiàng)目的過程中我們也遇到過很多各種各樣的問題,比如說進(jìn)行數(shù)據(jù)檢索后,再次顯示查詢結(jié)果時(shí)就出問題了等等,但是通過我們團(tuán)隊(duì)的合作努力我們通過上網(wǎng)查詢,去圖書館找資料,把這些問題都統(tǒng)統(tǒng)解決了。下面舉幾個(gè)例子說說我們在做過程中遇到的幾個(gè)問題以及我們的解決方法:1)進(jìn)行數(shù)據(jù)檢索后,再次顯示查詢結(jié)果是,數(shù)據(jù)顯示不出來了,這是我們就用了POST提交,varform=document.getElementById(“form1”);Form.action=”showaction.action”;form.submit();2)當(dāng)我們運(yùn)行時(shí)出現(xiàn)過這么一個(gè)錯(cuò)誤提示:Theimportjavax.servletcannotberesolved我們找了很久都找不到錯(cuò)誤的地方,原來是包放錯(cuò)位置了,這個(gè)包應(yīng)該是在tomcat里面,引導(dǎo)這個(gè)包正確的語句是importjavax.servlet.*;而不是importjava.servlet.*;運(yùn)行JSP后,無法轉(zhuǎn)入servlet,報(bào)告http404錯(cuò)誤。這個(gè)問題是路徑問題,還有就是web.xml的WEB-INF文件必須與JSP文件處于同一目錄下??傊谧鲞^程中我們也是遇到了很多很多問題的,但是只要努力我們最后還是把項(xiàng)目完成了,在這過程中把我以前不大懂的地方做了很好的補(bǔ)充,也很好的鍛煉了我們動手制作的能力。林姣通過為期一周的JSP綜訓(xùn),使我對JSP的知識有了更深的理解,在這一周中,我們班上同學(xué)分成了兩個(gè)小組,每個(gè)小組都要完成老師布置的任務(wù)。在剛開始時(shí),組長就給大家分配好了任務(wù),每個(gè)人都有自己要完成的任務(wù),組員們團(tuán)結(jié)一致,在很短的時(shí)間內(nèi)疚完成了自己的任務(wù),把代碼敲好發(fā)給要調(diào)試的那個(gè)同學(xué),在調(diào)試的過程中出現(xiàn)了些許的問題,但是大家不放棄,翻閱資料,請教老師,最終還是很順利的完成了任務(wù)。在這周,我了解到對于開發(fā)基于MVC模式的Web應(yīng)用時(shí),視圖層可以選擇JSP頁面實(shí)現(xiàn),通過在JSP頁面中使用JSTL和EL避免了Java腳本的出現(xiàn),可以選擇Servlet作為控制器,負(fù)責(zé)流程控制、模型的調(diào)用和視圖的選擇;模型層可以使用Java類來實(shí)現(xiàn),完成相應(yīng)的業(yè)務(wù)邏輯。開發(fā)過程中要注意路徑和書寫正確,以及在JSP頁面中對于以get方式提交的中文參數(shù)的特殊處理。而在結(jié)束時(shí)可以使用jar命令對其打包,打包后的應(yīng)用便于發(fā)布和移植。宋曉在本次JAVA項(xiàng)目中,小組分工完成了創(chuàng)建WEB項(xiàng)目,每個(gè)人完成一部分代碼。利用MyEclips創(chuàng)建新的Web項(xiàng)目。其中,src目錄的service包保存模型層Java類,servlets包保存控制器層的Servlet,util包保存實(shí)現(xiàn)通用功能的JAVA類;WEBROOT目錄下的admin文件夾保存與管理員操作相關(guān)的JSP頁面,用戶相關(guān)的JSP頁面直接保存在WEBROOT目錄下,software文件夾保存上傳文件。管理員功能實(shí)現(xiàn)——模型層的實(shí)現(xiàn):實(shí)現(xiàn)管理員功能的業(yè)務(wù)邏輯被封裝在模型層的service.AdminSvice類中。王晶晶由于是分組作業(yè),而需要輸入的代碼很多,所以每個(gè)小組選出一個(gè)組長,由組長來分配任務(wù),我的任務(wù)很簡單,就是負(fù)責(zé)sortList.jsp的輸入。在輸入過程中,遇到一些問題,最突出的問題就是輸入時(shí)有些代碼的拼寫不正確,特別是一些符號容易被漏掉。再一點(diǎn)就是有些代碼看不懂,還需努力王婷本次項(xiàng)目實(shí)戰(zhàn)中項(xiàng)目的功能主要有數(shù)據(jù)庫訪問、分頁處理、文件的上傳和下載等功能,其中實(shí)現(xiàn)了一些普通用戶的功能、管理員功能的實(shí)現(xiàn),例如:模型層的實(shí)現(xiàn)、控制器層的實(shí)現(xiàn)和試圖層的實(shí)現(xiàn),我所負(fù)責(zé)的代碼部分為“修改信息——update.jsp”,這部分代碼實(shí)現(xiàn)了文件的修改王曉莉通過本章的學(xué)習(xí),能夠了解MVC模式開發(fā)WEB應(yīng)用的流程,綜合運(yùn)用JAVAWeb開發(fā)的相關(guān)知識和技術(shù)完成項(xiàng)目開發(fā)。并且通過實(shí)訓(xùn)完成這一課程的學(xué)習(xí)和應(yīng)用編程實(shí)踐環(huán)節(jié)。熟練掌握Servlet基礎(chǔ)、Servlet會話跟蹤、Servlet監(jiān)聽和Servlet過濾等知識,并將所學(xué)的重要技能融會貫通,更加全面的,熟練的掌握使用Servlet的基礎(chǔ)方法和技巧。重點(diǎn)掌握J(rèn)SP中路徑的正確書寫方式,以get方式提交請求時(shí)傳遞中文參數(shù)的方法、文件的上傳、下載功能和分頁功能,并能夠運(yùn)用軟件工程的相關(guān)知識對項(xiàng)目進(jìn)行構(gòu)思、設(shè)計(jì)、實(shí)施和運(yùn)行。書到用時(shí)方恨少。通過這次的學(xué)習(xí),我找到了自己的很多不足,自己需要提升的地方有很多,今后還需要多多努力學(xué)習(xí)。王月上周,在我們小組的共同努力下,我們成功完成了這次的實(shí)訓(xùn)項(xiàng)目。這個(gè)項(xiàng)目主要是通過Servlet技術(shù)做一個(gè)可以下載和上傳音樂的軟件。這個(gè)軟件里面包含了很多知識,如:數(shù)據(jù)庫的訪問、文件的上傳和下載、普通用戶功能的實(shí)現(xiàn)等等。所以我們每個(gè)人都有著自己的任務(wù)。通過這次的任務(wù)我們知道了,一個(gè)好的程序是要通過團(tuán)隊(duì)合作完成的,我們一定會更加的努力。魏海林通過本章的學(xué)習(xí),能夠了解基于MVC模式開發(fā)Web應(yīng)用的流程,綜合運(yùn)用JavaWeb開發(fā)的相關(guān)知識和技術(shù)完成項(xiàng)目開發(fā),重點(diǎn)掌握J(rèn)SP中路徑的正確書寫方式。本系統(tǒng)的開發(fā)基于MVC模式,其中模型層負(fù)責(zé)業(yè)務(wù)數(shù)據(jù)的表示和實(shí)現(xiàn)業(yè)務(wù)邏輯。熟練掌握Servlet數(shù)據(jù)處理、重定向和請求轉(zhuǎn)發(fā)、COOKIE和SESSION對象的創(chuàng)建使用以及ServletContexe接口的使用基礎(chǔ)知識,掌握Servlet監(jiān)聽和Servlet過濾基本技術(shù),掌握Servlet編程常使用的類的屬性和方法。創(chuàng)建Web項(xiàng)目,通過功能的實(shí)現(xiàn)普通用戶功能的實(shí)現(xiàn)管理員功能的實(shí)現(xiàn)關(guān)鍵問題的說明。通過學(xué)習(xí)明白了,在掌握Servlet技術(shù),并將所學(xué)的重要技能融會貫通,更加全面的,熟練的掌握使用Servlet的基礎(chǔ)方法和技巧。培養(yǎng)我們的綜合應(yīng)用能力和解決實(shí)際問題的能力。徐小川經(jīng)過一周14章項(xiàng)目的訓(xùn)練,對MVC模式開發(fā)Web應(yīng)用流程有了更進(jìn)一步的了解,在整個(gè)程序的實(shí)現(xiàn)中,包括數(shù)據(jù)庫訪問、分頁處理和文件的上傳/下載,這些功能在模型層通過Java語言實(shí)現(xiàn);登錄驗(yàn)證的控制層由servlets.LoginServlet實(shí)現(xiàn),其他的信息管理功能由servlets.AdminServlet實(shí)現(xiàn);最后視圖層可以選擇JSP頁面實(shí)現(xiàn)。將Web項(xiàng)目發(fā)布到Tomcat服務(wù)器上可以通過打包、安裝的方式。通過此次的項(xiàng)目,發(fā)現(xiàn)自己對知識點(diǎn)掌握的還不是很牢固,但同時(shí)也鞏固了自己對知識點(diǎn)的認(rèn)識,以前不懂的地方在項(xiàng)目的實(shí)現(xiàn)中通過與同學(xué)的交流也有了一定的了解。通過本章的學(xué)習(xí),能夠運(yùn)用軟件工程的相關(guān)知識對項(xiàng)目進(jìn)行構(gòu)思、設(shè)計(jì)、實(shí)施和運(yùn)行。楊梅通過做這個(gè)項(xiàng)目,我感覺到了自身存在很大的不足,平時(shí)書上代碼基本上都看得懂,但是放下書自己做時(shí)卻無從下手,這個(gè)項(xiàng)目讓我感覺最深的還是連接數(shù)據(jù)庫,連接數(shù)據(jù)庫的部分我弄了很久,最終還是經(jīng)過全組重要成員討論出來才做出來的,開始我打算經(jīng)過改書上代碼達(dá)到連接SQLServer2005數(shù)據(jù)庫但是我經(jīng)過很久的調(diào)試還是沒弄出來,最后經(jīng)過討論我們決定使用MySQL經(jīng)過我們的努力將項(xiàng)目調(diào)試出來了。在做這個(gè)項(xiàng)目的時(shí)候我感覺一個(gè)學(xué)期的理論知識,卻無從下手,有幾個(gè)代碼書上是沒有的,我們經(jīng)過查資料翻書,仿寫其他代碼將項(xiàng)目調(diào)試成功,我感覺真的很不容易,但是我覺得這只是書上的成果,我想完成的效果是通過頁面連接SQLServer2005而不是MySQL,最遺憾的是這個(gè)目標(biāo)還沒有完成,但是我還會繼續(xù)調(diào)試SQLServer的。通過這個(gè)項(xiàng)目我還感覺到這不僅僅是這學(xué)期的知識要用上,還必須需要以前的知識,還是數(shù)據(jù)庫是讓我最惱火的。包括連接和創(chuàng)建數(shù)據(jù)庫,幸運(yùn)的是這讓我知道了連接數(shù)據(jù)庫的方法。這個(gè)項(xiàng)目讓我學(xué)會的我想不僅是將它調(diào)試出來而已,而是讓我能夠舉一反才是我想要的結(jié)果。葉佳隴通過本周的學(xué)習(xí),我了解了基于MVC模式開發(fā)Web應(yīng)用的流程,綜合運(yùn)用JavaWeb開發(fā)的相關(guān)知識和技術(shù)完成項(xiàng)目開發(fā),重點(diǎn)掌握J(rèn)SP中路徑的正確書寫方式,以get方式提交請求時(shí)傳遞中文參數(shù)的方法、文件的上傳/下載功能和分頁處理功能,并
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年城市別墅裝修改造服務(wù)協(xié)議
- 2024水電項(xiàng)目工程承包協(xié)議范本
- 2024年酒店用品買賣協(xié)議
- 2024年房屋租賃三方協(xié)議樣本
- 店鋪裝修設(shè)計(jì)與施工一體化協(xié)議模板
- 2024年度勞動力成本協(xié)議樣本
- DB11∕T 1697-2019 動力鋰離子蓄電池制造業(yè)綠色工廠評價(jià)要求
- 2024年度中央空調(diào)系統(tǒng)翻新工程協(xié)議
- 2024商業(yè)采購協(xié)議模板全面指南
- 2024年輔導(dǎo)班家長服務(wù)協(xié)議
- 小學(xué)六年級數(shù)學(xué)上冊口算題300道(全)
- 《干粉滅火器檢查卡》
- 校園監(jiān)控值班記錄表(共2頁)
- 試樁施工方案 (完整版)
- 走中國工業(yè)化道路的思想及成就
- ESTIC-AU40使用說明書(中文100版)(共138頁)
- 河北省2012土建定額說明及計(jì)算規(guī)則(含定額總說明)解讀
- Prolog語言(耐心看完-你就入門了)
- 保霸線外加電流深井陽極地床陰極保護(hù)工程施工方案
- 藍(lán)色商務(wù)大氣感恩同行集團(tuán)公司20周年慶典PPT模板
- 恒溫箱PLC控制系統(tǒng)畢業(yè)設(shè)計(jì)
評論
0/150
提交評論