小菜鳥之servlet


  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/news881               auth="Container"  type="javax.sql.DataSource"  maxActive="100882               maxIdle="30" maxWait="10000" username="root"  password="root883               driverClassName="com.mysql.jdbc.Driver884               url="jdbc:mysql://127.0.0.1:3306/數據庫名"/>
885 
886 ```
887 
888 ![1573282989441](C:\Users\ww\Desktop\南科院-web-1108\images\1573282989441.png)
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 
相關文章
相關標籤/搜索