小菜鸟之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   4、简单的登陆功能实现步骤?
 53     1、编写jsp文件中的form表单
 54     2、web.xml中配置servlet和servlet-mapping标签
 55     3、创建servlet类,在类中doget方法中进行参数传递的处理
 56   5、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   6、post请求下,参数传递出现中文乱码解决方案
 66                 request.setCharacterEncoding("utf-8");
 67                 response.setCharacterEncoding("utf-8");
 68   7、如何不分post和get请求进行中文乱码的处理?
 69      通过过滤器的方式实现
 70         1、创建过滤器,在doFilter方法中编写
 71                     request.setCharacterEncoding("utf-8");
 72                     chain.doFilter(request, response);
 73                     response.setCharacterEncoding("utf-8");
 74         2、在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   8、如何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   9、从servlet类跳转到jsp文件?
 92         //请求转发:将请求转发出去
 93         request.getRequestDispatcher("jsp/success.jsp").forward(request,response);
 94         注意点:url路径从webapp目录下开始
 95 
 96   10、将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 11、通过响应重定向方式从servlet类跳转到jsp文件
117       response.sendRedirect(request.getContextPath()+"/jsp/success.jsp");
118 12、请求转发和响应重定向2种方式的区别
119     ·请求转发方式url是原来的url,响应重定向方式的url是重新定向的url(新的url)
120     ·通过setAttribute()方法保存在request容器中的key-value不能实现传递
121 13、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 1、在Servlet中创建cookie实例
243 
244 2、设置路径
245 
246 3、设置cookie的失效时间
247 
248 4、将cookie发送到浏览器
249 
250 5、在jsp文件中接受cookie
251 
252 6、在指定位置输出cookie中保存的value值
253 
254 **实现**
255 
256 1、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 2、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 #1、修改表的名字
419 ALTER TABLE student RENAME student1;
420 #2、添加字段
421 ALTER TABLE student1 ADD sex VARCHAR(2);
422 #3、删除字段
423 ALTER TABLE student1 DROP sex;
424 #4、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 1、创建util包,util工具包,存放工具性质的类。
512 
513 <img src="C:\Users\ww\Desktop\南科院-web-1108\images\1573259997992.png" alt="1573259997992" style="zoom:50%;" />
514 
515 2、在util中创建JdbcUtil类,该类中编写和数据库进行交互的方法。
516 
517 3、需要驱动,该驱动来源一个依赖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 #### 1、添加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 #### 2、创建test包,包内创建测试类
683 
684 <img src="C:\Users\ww\Desktop\南科院-web-1108\images\1573267253146.png" alt="1573267253146" style="zoom:67%;" />
685 
686 
687 
688 #### 3、进行测试
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 ##### 1、配置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 ##### 2、编写连接功能
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 1、在项目中创建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 2、编写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 3、在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 
posted @ 2019-11-12 08:52  一片风的独白  阅读(249)  评论(0编辑  收藏  举报