1 # Servlet課程-1和2和3 2 容 4 5 Web項目 6 項目代碼部署在服務器上, 7 通常分爲c\s(客戶端\服務器端)和b\s(瀏覽器/服務器) 8 服務器 9 經常使用的服務器(tomcat服務器) 10 tomcat的目錄結構 11 bin tomcat腳本 12 conf 配置文件 13 lib 一些依賴的包 14 logs 日誌文件 15 webapps 部署的項目 16 work 部署的項目java轉成.class 文件 17 項目部署到服務器上 18 maven項目finance1103部署到服務器tomcat 19 Maven項目的建立好處 20 maven項目幫助程序員對jar包進行統一管理管理, 21 方便團隊統一jar包的版本 22 庫的網站 23 https://mvnrepository.com/ 24 25 MVC思想(構建項目) 26 view視圖層: 負責model層處理結果的響應,輸出給用戶 27 將處理結果返回給網民,讓其知道 28 jsp的形式呈現給用戶 29 control控制器層 :負責請求的派發和處理,針對請求進行處理。 30 誰處理該請求?經過servlet類實現 31 32 ``` 33 model模型層: 負責和數據庫進行交互,根據制定的請求處理數據 34 對請求進行處理中 35 ``` 36 37 JSP 38 jsp java server page 運行在服務端的程序,是由html中嵌套java代碼形式實現的。 39 1.聲明該文件爲jsp文件 40 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 41 2.每次修改都要從新運行一下服務器,才能輸出 42 3.jsp的內置對象(系統幫忙建立好) 43 out對象:向頁面輸出信息 44 request: 45 response 46 session 47 config 48 application 49 page 50 pageContext 51 exception 52 四、簡單的登錄功能實現步驟? 53 一、編寫jsp文件中的form表單 54 二、web.xml中配置servlet和servlet-mapping標籤 55 三、建立servlet類,在類中doget方法中進行參數傳遞的處理 56 五、get請求方式下,參數傳遞出現中文亂碼解決方案 57 第一種,經過字符轉碼的方式 58 new String(user1.getBytes("ISO-8859-1"),"utf-8"); 59 缺點:每一個參數都須要這樣操做 60 第二種,經過設置tomcat的server.xml文件,在69行,中添加 URIEncoding="utf-8" 61 <Connector port="8080" protocol="HTTP/1.1" 62 connectionTimeout="20000" 63 redirectPort="8443" /> 64 優勢:全部參數一次性設置 65 六、post請求下,參數傳遞出現中文亂碼解決方案 66 request.setCharacterEncoding("utf-8"); 67 response.setCharacterEncoding("utf-8"); 68 七、如何不分post和get請求進行中文亂碼的處理? 69 經過過濾器的方式實現 70 一、建立過濾器,在doFilter方法中編寫 71 request.setCharacterEncoding("utf-8"); 72 chain.doFilter(request, response); 73 response.setCharacterEncoding("utf-8"); 74 二、在web.xml文件中,編寫filter和filter-mapping標籤 75 <filter> 76 <filter-name>CharacterEncoding</filter-name> 77 <filter-class>com.baidu.filter.CharacterEncodingFilter</filter-class> 78 </filter> 79 <filter-mapping> 80 <filter-name>CharacterEncoding</filter-name> 81 <!--/* 表示url項目名下全部的字段都須要通過此過濾器--> 82 <url-pattern>/*</url-pattern> 83 </filter-mapping> 84 八、如何servlet中的驗證結果信息返回到頁面上? 85 //響應的時候出現中文亂碼的處理方式 86 response.setCharacterEncoding("utf-8"); 87 response.setHeader("Content-Type", "text/html;charset=UTF-8"); 88 response.setContentType("text/html;charset=UTF-8"); 89 PrintWriter writer=response.getWriter(); 90 writer.print("該用戶存在"); 91 九、從servlet類跳轉到jsp文件? 92 //請求轉發:將請求轉發出去 93 request.getRequestDispatcher("jsp/success.jsp").forward(request,response); 94 注意點:url路徑從webapp目錄下開始 95 96 十、將servlet中的提示信息,傳遞到jsp文件中? 97 servlet中編寫: 98 request.setAttribute("success","來自servlet中提示:登錄成功"); 99 jsp中編寫: 100 <%--將servlet中的提示信息傳遞到jsp文件中--%> 101 <% 102 String success1 = (String)request.getAttribute("success"); 103 out.print(success1); 104 %> 105 簡寫方式: 106 ·在web.xml中檢查webapp標籤是否含有以下屬性 107 <web-app 108 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 109 xmlns="http://java.sun.com/xml/ns/javaee" 110 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 111 id="WebApp_ID" version="3.0" 112 > 113 ·在jsp中編寫 114 ${success} 115 116 十一、經過響應重定向方式從servlet類跳轉到jsp文件 117 response.sendRedirect(request.getContextPath()+"/jsp/success.jsp"); 118 十二、請求轉發和響應重定向2種方式的區別 119 ·請求轉發方式url是原來的url,響應重定向方式的url是從新定向的url(新的url) 120 ·經過setAttribute()方法保存在request容器中的key-value不能實現傳遞 121 1三、request\session\application\page等對象是一個容器? 122 request:setAttribute方法 key-value success 登錄成功 123 做用域和生命週期是一次請求: 124 請求轉發是一次請求;甲-》乙-》丙 125 響應重定向是2次請求;甲-》乙 126 甲-》丙 127 session:做用域和生命週期:一次會話(屢次請求,確定超過2次) 128 setAttribute() setAttribute(); 129 HttpSession session = request.getSession(); 130 session.setAttribute("success","來自servlet中提示:登錄成功"); 131 session.getAttribute("success"); 132 session是一次會話,屢次請求?? 133 天然生命週期:兩次請求的時間間隔在30分鐘以內,session中的key-value一直有效; 134 人工方式使session中數據失效 135 session.invalidate(): 是session容器中的全部key-value 數據失效;應用場景:退出功能的實現 136 session.removeAttribute(key):是session容器中的某key對應的數據失效; 137 138 174 175 176 # Servlet課程-4 177 178 ## 九大內置對象 179 180 | 名稱 | 功能 | 類型 | 做用域 | 181 | ----------- | -------------- | ----------------------------------- | ------------------ | 182 | request | 請求對象 | 類型 javax.servlet.ServletRequest | 做用域 Request | 183 | response | 響應對象 | 類型 javax.servlet.SrvletResponse | 做用域 Page | 184 | pageContext | 頁面上下文對象 | 類型 javax.servlet.jsp.PageContext | 做用域 Page | 185 | session | 會話對象 | 類型 javax.servlet.http.HttpSession | 做用域 Session | 186 | application | 應用程序對象 | 類型 javax.servlet.ServletContext | 做用域 Application | 187 | out | 輸出對象 | 類型 javax.servlet.jsp.JspWriter | 做用域 Page | 188 | config | 配置對象 | 類型 javax.servlet.ServletConfig | 做用域 Page | 189 | page | 頁面對象 | 類型 javax.lang.Object | 做用域 Page | 190 | exception | 例外對象 | 類型 javax.lang.Throwable | 做用域 page | 191 192 ## request經常使用的方法 193 194 getContextPath() 195 196 getParameter() 197 198 getParameters() 199 200 setAttribute() 201 202 getAttribute() 203 204 setCharacterCoding() 205 206 getRequestDispatcher() 207 208 ## response經常使用的方法 209 210 sendRedirect() 211 212 setCharacterEncoding() 213 214 setHeader() 215 216 ## session經常使用的方法 217 218 set Attribute(key,value) 219 220 getAttribue(key) 221 222 removeAttribute(key) 223 224 invalidate() 225 226 getMaxInactiveInterval() 227 228 ## session和cookie之間的區別 229 230 · session是容器,在服務器端建立,並保存在服務器 231 232 · cookie也是一個容器,在服務器端建立,保存在客戶端/瀏覽器 233 234 · cookie中的數據在瀏覽器之間是不共享的,session中保存的數據在不一樣瀏覽器中能夠共享訪問 235 236 · 從安全性角度來看,session更安全 237 238 ## cookie的使用實現用戶名保存 239 240 **思路** 241 242 一、在Servlet中建立cookie實例 243 244 二、設置路徑 245 246 三、設置cookie的失效時間 247 248 四、將cookie發送到瀏覽器 249 250 五、在jsp文件中接受cookie 251 252 六、在指定位置輸出cookie中保存的value值 253 254 **實現** 255 256 一、servlet類中 257 258 ```java 259 //登錄成功,使用cookie將huangwei保存進來 260 Cookie cookie=new Cookie("username","huangwei"); 261 //設置路徑 262 cookie.setPath("/"); 263 //設置cookie的過時時間 264 // cookie.setMaxAge(0);//不記錄,此cookie是不起做用的,無效 265 // cookie.setMaxAge(-1);//會話級cookie,關閉瀏覽器就消失,保存在內存中 266 //持久化cookie,以文件的形式保存在硬盤裏,時間能夠自定義,單位秒 267 cookie.setMaxAge(60*60);//持久化1小時 268 //發送到瀏覽器中 269 response.addCookie(cookie); 270 ``` 271 272 二、jsp中 273 274 ```java 275 <%--java腳本--%> 276 <% 277 String username=""; 278 //取到存放在cookie中的值 279 Cookie[] cookies = request.getCookies(); 280 //進行非空判斷 281 if(cookies!=null && cookies.length!=0){ 282 // 遍歷數組 283 for(Cookie c:cookies){ 284 if(c.getName().equals("userCookie")){ 285 username = c.getValue(); 286 }else { 287 System.out.println("cookie的name值不等於userCookie"); 288 } 289 } 290 }else{ 291 System.out.println("數組爲空"); 292 } 293 294 %> 295 <form method="post" action="<%=request.getContextPath() %>/nankeyuan"> 296 姓名:<input type="text" name="xiaogou" value="huangwei "> 297 密碼:<input type="password" name="xiaomao" value=""> 298 ............ 299 <input type="submit" value="登錄"> 300 </form> 301 302 ``` 303 304 ## Cookie的生命週期 305 306 Cookie不僅有name和value兩個屬性 307 308 - Cookie的maxAge(掌握):Cookie的最大生命,即Cookie可保存的最大時長。以秒爲單位. 例如:cookie.setMaxAge(60)表示這個Cookie會被瀏覽器保存到硬盤緩存上60秒 309 310 - maxAge>0:瀏覽器會把Cookie保存到客戶機硬盤上,有效時長爲maxAge的值決定。 311 - maxAge<0:Cookie只在瀏覽器內存中存在,當用戶關閉瀏覽器時,瀏覽器進程結束,同時Cookie也就死亡了. 312 313 - maxAge=0:瀏覽器會立刻刪除這個Cookie! 314 315 316 317 ## Application 318 319 application表示的整個項目,也是一個容器,放在服務器中。 320 321 application對象由多個客戶端用戶共享,它的應用範圍是全部的客戶,服務器啓動後,新建一個application對象,該對象一旦創建,就一直保持到服務器關閉。當有客戶訪問服務器上的一個JSP頁面時,JSP引擎爲該客戶分配已創建的application對象;當客戶在所訪問站點的不一樣頁面瀏覽時,其application是同一個,直到服務器關閉。 322 323 ## 統計頁面被訪問次數 324 325 ```java 326 <%--java 腳本--%> 327 <% 328 //key-value 對應 key是總數代號,value表示總數 count-100 count-1 count-0 329 Object count = application.getAttribute("count"); 330 if(count ==null){ 331 application.setAttribute("count",1); 332 }else{ 333 application.setAttribute("count",(int)count+1); 334 } 335 int count1 = (int)application.getAttribute("count"); 336 System.out.println("該頁面被訪問"+count1); 337 out.print("該頁面被訪問"+count1); 338 %> 339 ``` 340 341 ## servlet 342 343 在mvc思想中servlet類充當與哪一層? 344 345 **補充** 346 347 m:model模型層,負責業務邏輯處理和數據庫的交互。經過建立service包實現業務邏輯 的處理。經過常見dao包實現數據庫的交互。 348 349 v: view 視圖層 ,負責 向用戶展現頁面和表單的編寫等,經過jsp文件實現的 350 351 c: controller 控制器層,負責請求的派發和處理等,經過servlet文件實現 352 353 servlet類,充當controller控制器層,是運行在服務器端的程序,至關於一個容器。也具備生命週期。 354 355 **運行原理** 356 357 <img src="C:\Users\ww\Desktop\南科院-web-1108\images\wps90AB.tmp.jpg" alt="img" style="zoom:33%;" /> 358 359 **Servlet類的建立** 360 361 經過繼承HttpServlet接口實現Servlet類的建立。 362 363 **生命週期** 364 365 init() 初始化,啓動服務器後,先執行init()方法,只初始化執行一次。 366 367 service()提供服務,對請求方式的處理過程。每請求1次,該方法執行一次。 368 369 destory()銷燬死亡,只有在服務器中止的時候才執行。 370 371 387 ## mySql學習 388 389 ```mysql 390 # 數據庫 表 表中記錄 391 #查詢數據庫 392 SHOW DATABASES; 393 #建立數據庫 394 CREATE DATABASE school; 395 #不修改 396 #刪除 397 DROP DATABASE school; 398 #制定選擇某數據庫 399 USE school; 400 ##################### 401 #建立表 402 CREATE TABLE student( 403 `id` INT(10) PRIMARY KEY AUTO_INCREMENT COMMENT '編號id', 404 `name`VARCHAR(40) COMMENT'學生姓名', 405 `studentNo` INT(10) COMMENT'學號', 406 `birthday` DATETIME COMMENT'生日', 407 `createdBy` INT(10) COMMENT'建立人', 408 `creationDate` DATETIME COMMENT'建立時間', 409 `modifyBy` INT(10) COMMENT'修改人', 410 `modifyDate` DATETIME COMMENT'修改時間' 411 ); 412 #查詢表 413 SHOW TABLES; 414 DESCRIBE student1; 415 #刪除表 416 DROP TABLE student1; 417 #修改表 418 #一、修改表的名字 419 ALTER TABLE student RENAME student1; 420 #二、添加字段 421 ALTER TABLE student1 ADD sex VARCHAR(2); 422 #三、刪除字段 423 ALTER TABLE student1 DROP sex; 424 #四、sex改爲gender 425 ALTER TABLE student1 CHANGE sex gender VARCHAR(10); 426 ################################# 427 #處理表中的記錄 428 #添加數據 429 INSERT INTO student1( 430 id,`name`,studentNo, 431 birthday,createdBy, 432 creationDate,modifyBy,modifyDate,gender 433 )VALUES 434 ('1','張三1','1','2019-1-1', 435 '1','2019-11-8','1','2019-11-8','男'), 436 ('2','張三2','1','2019-1-1', 437 '1','2019-11-8','1','2019-11-8','男'), 438 ('3','張三3','1','2019-1-1', 439 '1','2019-11-8','1','2019-11-8','男'), 440 ('4','張三4','1','2019-1-1', 441 '1','2019-11-8','1','2019-11-8','男') 442 ; 443 #查詢表中記錄 444 SELECT * FROM student1; 445 SELECT * FROM student1 WHERE id=1; 446 #刪除表中記錄 447 DELETE FROM student1 WHERE id=4; 448 DELETE FROM student1; 449 #修改某一個字段的賦值 450 UPDATE student1 SET `name`='李四' WHERE id=1; 451 452 453 ``` 454 455 456 457 499 # Servlet課程-5 500 501 ## 如何使MySQL和Java鏈接 502 503 ### **jdbc技術** 504 505 Java database connection :Java和數據庫鏈接技術,實現對數據庫的增刪改查功能(交互)。 506 507 數據庫是一個服務器,鏈接服務器須要知道:url 、用戶名、密碼、驅動加載。 508 509 ### 準備工做 510 511 一、建立util包,util工具包,存放工具性質的類。 512 513 <img src="C:\Users\ww\Desktop\南科院-web-1108\images\1573259997992.png" alt="1573259997992" style="zoom:50%;" /> 514 515 二、在util中建立JdbcUtil類,該類中編寫和數據庫進行交互的方法。 516 517 三、須要驅動,該驅動來源一個依賴jar包:mysql-connector-java.jar 518 519 ```java 520 <dependency> 521 <groupId>mysql</groupId> 522 <artifactId>mysql-connector-java</artifactId> 523 <version>8.0.18</version> 524 </dependency> 525 ``` 526 527 <img src="C:\Users\ww\Desktop\南科院-web-1108\images\1573260450582.png" alt="1573260450582" style="zoom:80%;" /> 528 529 ### 編寫鏈接數據庫方法 530 531 ```java 532 //鏈接數據庫mysql :url 用戶名 密碼 驅動 533 public boolean getConnection(){ 534 535 try { 536 //添加驅動 537 Class.forName("com.mysql.jdbc.Driver"); 538 //編寫url路徑 jdbc:mysql://localhost:3306/數據庫名 539 String url="jdbc:mysql://localhost:3306/school?serverTimezone=UTC&useUnicode=true$characterEncoding=utf8"; 540 541 //得到connection數據庫鏈接器 542 connection = DriverManager.getConnection(url, "root", "root"); 543 544 } catch (Exception e) { 545 e.printStackTrace(); 546 } 547 return true; 548 } 549 ``` 550 551 ### 編寫增刪改方法 552 553 ```java 554 //增刪改功能 555 public int executeUpdate(String sql,Object[] params){ 556 int updateRows=0; 557 try { 558 if (this.getConnection()){ 559 //得到預編譯對象,提升查詢速度 560 preparedStatement = connection.prepareStatement(sql); 561 562 //遍歷params數組,將佔位符中填充數組中的元素 563 for(int i=0;i<params.length;i++){ 564 preparedStatement.setObject(i+1,params[i]); 565 } 566 //執行增刪改功能,返回值大於0,表示 執行成功 567 updateRows= preparedStatement.executeUpdate(); 568 569 } 570 } catch (Exception e) { 571 e.printStackTrace(); 572 } 573 return updateRows; 574 } 575 576 ``` 577 578 **思路** 579 580 ```java 581 ** 1 在sql客戶端編寫的增長sql語句 582 * INSERT INTO student1( 583 * id, 584 * `name`,studentNo,birthday,createdBy,creationDate, 585 * modifyBy,modifyDate 586 * 587 * 588 * )VALUES( 589 * 5,'王五','5','2019-11-11','2','2011-1-1','2','2011-1-1' 590 * ); 591 *2-1 在java類中編寫 592 * 在java的sql表現形式 String sql= 593 * INSERT INTO student1( 594 * id, 595 * `name`,studentNo,birthday,createdBy,creationDate, 596 * modifyBy,modifyDate 597 * 598 * )VALUES( 599 * ?,?,?,?,?,?,?,? 600 * ); 601 * 2-2 String sql=INSERT INTO student1(id,`name`,studentNo,birthday,createdBy,creationDate,modifyBy,modifyDate)VALUES(?,?,?,?,?,?,?,?); 602 * 2-3 Object[] params 是一個數組, 603 * Object[] params={5,'王五','5','2019-11-11','2','2011-1-1','2','2011-1-1'}; 604 * 605 * */ 606 3 將佔位符?中填充數組中的數組元素 607 608 ``` 609 610 ### 編寫查詢功能 611 612 ```java 613 //查詢功能(所有查詢和條件查詢) 614 public ResultSet executeQuery(String sql,Object[] params){ 615 616 try{ 617 //得到預編譯對象 618 if(this.getConnection()){ 619 preparedStatement = connection.prepareStatement(sql); 620 } 621 622 if(params!=null){ 623 //將佔位符填充數組元素 624 for (int i=0;i<params.length;i++){ 625 preparedStatement.setObject(i+1,params[i]); 626 } 627 } 628 //執行查詢功能 629 resultSet = preparedStatement.executeQuery(); 630 631 }catch (Exception e){ 632 e.printStackTrace(); 633 } 634 return resultSet; 635 } 636 ``` 637 638 ### 關閉資源 639 640 ```java 641 //關閉資源 642 public boolean closeResource(){ 643 644 try{ 645 //關閉resultSet 646 if(resultSet!=null){ 647 resultSet.close(); 648 } 649 //關閉preparedStatement 650 if(preparedStatement!=null){ 651 preparedStatement.close(); 652 } 653 //關閉connection 654 if(connection!=null){ 655 connection.close(); 656 } 657 658 }catch (Exception e){ 659 e.printStackTrace(); 660 } 661 662 return true; 663 } 664 665 ``` 666 667 ### 使用junit測試 668 669 #### 一、添加junit依賴(jar) 670 671 ``` 672 <dependency> 673 <groupId>junit</groupId> 674 <artifactId>junit</artifactId> 675 <version>4.11</version> 676 <scope>test</scope>//將此句刪除 677 </dependency> 678 ``` 679 680 681 682 #### 二、建立test包,包內建立測試類 683 684 <img src="C:\Users\ww\Desktop\南科院-web-1108\images\1573267253146.png" alt="1573267253146" style="zoom:67%;" /> 685 686 687 688 #### 三、進行測試 689 690 ##### **查詢全部記錄** 691 692 ```java 693 @Test 694 public void test1(){ 695 //查詢表中的全部數據記錄 696 String sql="select * from student1"; 697 //Object[] params=null; 698 ResultSet resultSet = jdbcUtil.executeQuery(sql, null); 699 try{ 700 while(resultSet.next()){ 701 //得到記錄中的列信息 702 int idValue = (int)resultSet.getObject(1); 703 String nameValue= (String) resultSet.getObject(2); 704 //int studentNo=(int)resultSet.getObject(3); 705 int studentNoValue=resultSet.getInt(3); 706 Date birthdayValue=resultSet.getDate(4); 707 int createdByValue=(int)resultSet.getObject(5); 708 Date creationDateValue=resultSet.getDate(6); 709 int modifyByValue=resultSet.getInt(7); 710 Date modifyDateValue=resultSet.getDate(8); 711 String genderValue=resultSet.getString(9); 712 System.out.println(idValue+nameValue+studentNoValue+ 713 birthdayValue+createdByValue+creationDateValue+ 714 modifyByValue+modifyDateValue+genderValue); 715 } 716 }catch (Exception e){ 717 e.printStackTrace(); 718 } 719 //關閉資源 720 jdbcUtil.closeResource(); 721 } 722 ``` 723 724 ##### **查詢某個id對應的記錄** 725 726 ```java 727 //查詢某個id對應的數據記錄 728 @Test 729 public void test2(){ 730 String sql="select * from student1 where id=?"; 731 Object[] params={2}; 732 ResultSet resultSet = jdbcUtil.executeQuery(sql, params); 733 try{ 734 while(resultSet.next()){ 735 //得到記錄中的列信息 736 //int idValue = (int)resultSet.getObject(1); 737 int idValue=resultSet.getInt("id"); 738 739 //String nameValue= (String) resultSet.getObject(2); 740 String nameValue=resultSet.getString("name"); 741 742 // int studentNoValue=resultSet.getInt(3); 743 int studentNoValue=resultSet.getInt("studentNo"); 744 745 // Date birthdayValue=resultSet.getDate(4); 746 Date birthdayValue=resultSet.getDate("birthday"); 747 748 // int createdByValue=(int)resultSet.getObject(5); 749 int createdByValue=(int)resultSet.getObject("createdBy"); 750 751 //Date creationDateValue=resultSet.getDate(6); 752 Date creationDateValue=resultSet.getDate("creationDate"); 753 754 System.out.println(idValue+nameValue+studentNoValue+ 755 birthdayValue+createdByValue+creationDateValue); 756 } 757 }catch (Exception e){ 758 e.printStackTrace(); 759 } 760 //關閉資源 761 jdbcUtil.closeResource(); 762 } 763 ``` 764 765 ### 備份JdbcUtil工具類 766 767 ```java 768 package com.baidu.util; 769 770 import java.sql.*; 771 772 775 public class JdbcUtil { 776 private Connection connection=null; 777 private PreparedStatement preparedStatement=null; 778 private ResultSet resultSet=null; 779 780 //鏈接數據庫mysql :url 用戶名 密碼 驅動 781 private boolean getConnection(){ 782 try { 783 //添加驅動 784 Class.forName("com.mysql.jdbc.Driver"); 785 //編寫url路徑 jdbc:mysql://localhost:3306/數據庫名 786 String url="jdbc:mysql://localhost:3306/school?serverTimezone=UTC&useUnicode=true$characterEncoding=utf8"; 787 //得到connection數據庫鏈接器 788 connection = DriverManager.getConnection(url, "root", "root"); 789 790 } catch (Exception e) { 791 e.printStackTrace(); 792 } 793 return true; 794 } 795 796 //增刪改功能 797 public int executeUpdate(String sql,Object[] params){ 798 int updateRows=0; 799 try { 800 if (this.getConnection()){ 801 //得到預編譯對象,提升查詢速度 802 preparedStatement = connection.prepareStatement(sql); 803 804 //遍歷params數組,將佔位符中填充數組中的元素 805 for(int i=0;i<params.length;i++){ 806 preparedStatement.setObject(i+1,params[i]); 807 } 808 //執行增刪改功能,返回值大於0,表示 執行成功 809 updateRows= preparedStatement.executeUpdate(); 810 811 } 812 } catch (Exception e) { 813 e.printStackTrace(); 814 } 815 return updateRows; 816 } 817 818 //查詢功能(所有查詢和條件查詢) 819 public ResultSet executeQuery(String sql,Object[] params){ 820 try{ 821 //得到預編譯對象 822 if(this.getConnection()){ 823 preparedStatement = connection.prepareStatement(sql); 824 } 825 if(params!=null){ 826 //將佔位符填充數組元素 827 for (int i=0;i<params.length;i++){ 828 preparedStatement.setObject(i+1,params[i]); 829 } 830 } 831 //執行查詢功能 832 resultSet = preparedStatement.executeQuery(); 833 834 }catch (Exception e){ 835 e.printStackTrace(); 836 } 837 return resultSet; 838 } 839 //關閉資源 840 public boolean closeResource(){ 841 try{ 842 //關閉resultSet 843 if(resultSet!=null){ 844 resultSet.close(); 845 } 846 //關閉preparedStatement 847 if(preparedStatement!=null){ 848 preparedStatement.close(); 849 } 850 //關閉connection 851 if(connection!=null){ 852 connection.close(); 853 } 854 855 }catch (Exception e){ 856 e.printStackTrace(); 857 } 858 return true; 859 } 860 861 } 862 863 ``` 864 865874 875 ##### 一、配置tomcat中context.xml文件 876 877 配置Tomcat的conf/context.xml(將下面代碼複製粘貼到context.xml中的context標籤中) 878 879 ```xml 880 <Resource name="jdbc/news" 881 auth="Container" type="javax.sql.DataSource" maxActive="100" 882 maxIdle="30" maxWait="10000" username="root" password="root" 883 driverClassName="com.mysql.jdbc.Driver" 884 url="jdbc:mysql://127.0.0.1:3306/數據庫名"/> 885 886 ``` 887 888  889 890 ##### 二、編寫鏈接功能 891 892 ```java 893 //經過鏈接池實現鏈接 894 public boolean getConnection1() { 895 try { 896 //初始化上下文 897 Context ct = new InitialContext(); 898 //獲取與邏輯名相關聯的數據源對象 899 DataSource ds = (DataSource) ct.lookup("java:comp/env/jdbc/xiaogou");//爲<Resource>中的name的值 900 cnt = ds.getConnection(); 901 } catch (NamingException e) { 902 // TODO Auto-generated catch block 903 e.printStackTrace(); 904 } catch (SQLException e) { 905 // TODO Auto-generated catch block 906 e.printStackTrace(); 907 } 908 return true; 909 910 } 911 ``` 912 913 ## 經過model層實現三層架構 914 915 一、在項目中建立2個包:service包和dao包 916 917 service包:存放業務邏輯的處理代碼 918 919 dao包:database access 存放鏈接數據庫的代碼 920 921 <img src="C:\Users\ww\Desktop\南科院-web-1108\images\1573347905837.png" alt="1573347905837" style="zoom:67%;" /> 922 923 二、編寫dao包中的代碼 924 925 a 在此包中建立接口和實現類(注意:命名要規範) 926 927 <img src="C:\Users\ww\Desktop\南科院-web-1108\images\1573348188546.png" alt="1573348188546" style="zoom:50%;" /> 928 929 b 在接口中編寫登錄方法和在實現類中重寫該登錄方法 930 931 ```java 932 public interface UserDao { 933 //登錄方法 934 public ResultSet login(String username, String password); 935 } 936 ``` 937 938 ```java 939 public class UserDaoImpl implements UserDao { 940 @Override 941 public ResultSet login(String username, String password) { 942 //鏈接數據庫 943 return null; 944 } 945 } 946 ``` 947 948 c 鏈接數據庫操做 949 950 ```java 951 public class UserDaoImpl implements UserDao { 952 953 ResultSet resultSet=null; 954 @Override 955 public ResultSet login(String username, String password) { 956 //鏈接數據庫 957 JdbcUtil jdbcUtil = new JdbcUtil(); 958 String sql="select count(*) as count from user where " + 959 "username=? and password=?"; 960 Object[] params={username,password}; 961 resultSet = jdbcUtil.executeQuery(sql, params); 962 return resultSet; 963 } 964 } 965 ``` 966 967 d 在數據庫中建立user表(school庫中) 968 969 ```sql 970 #選擇制定庫 971 USE school; 972 #在庫中建立表 973 CREATE TABLE `user`( 974 id INT(4) PRIMARY KEY AUTO_INCREMENT COMMENT '編碼id', 975 username VARCHAR(40) COMMENT '用戶名', 976 `password` VARCHAR(40) COMMENT '用戶密碼' 977 ); 978 #查詢表結構 979 DESCRIBE USER; 980 #插入表記錄2條 981 INSERT INTO `user`(id,username,`password`) 982 VALUES(1,'zhangsan','zhangsan'),(2,'lisi','lisi'); 983 #查詢表記錄 984 SELECT * FROM `user`; 985 #測試是否存在某某人 986 SELECT COUNT(*) AS `count` FROM `user` 987 WHERE username='zhangsan' AND `password`='zhangsan' 988 ``` 989 990 三、在service包中編寫代碼 991 992 a 建立接口和對應的實現類(UserService和UserServiceImpl) 993 994 <img src="C:\Users\ww\Desktop\南科院-web-1108\images\1573350311295.png" alt="1573350311295" style="zoom:67%;" /> 995 996 b 編寫接口和實現類中的代碼 997 998 ```java 1001 */ 1002 public interface UserService { 1003 //登錄方法 1004 public boolean login(String username,String password); 1005 } 1006 ``` 1007 1008 ```java 1009 1012 public class UserServiceImpl implements UserService { 1013 //引用接口userDao 1014 public UserDao userDao=new UserDaoImpl(); 1015 //登錄方法 1016 public boolean login(String username, String password) { 1017 //進行業務邏輯代碼的編寫 1018 ResultSet resultSet = userDao.login(username, password); 1019 boolean flag=false; 1020 if(resultSet!=null){ 1021 flag=true; 1022 } 1023 return flag; 1024 } 1025 } 1026 ``` 1027 1028