-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathJSP、Servlet笔记.txt
More file actions
2285 lines (1772 loc) · 152 KB
/
JSP、Servlet笔记.txt
File metadata and controls
2285 lines (1772 loc) · 152 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
JSP、Servlet笔记
----------------------------------------------------------------------------------------------------------------------
【第一章】动态网页基础
·C/S架构
C/S(Client/Server)即客户端/服务器模式。
客户机 → 数据请求 → 服务器 → 数据库管理系统
·B/S架构
B/S(Browser/Server)即浏览器/服务器模式,采用请求/响应模式进行交互。
用户 → 浏览器 → 应用服务器 → 数据库服务器
B/S模式工作原理:
1.用户输入网址
2.发送客户端的请求信息
3.访问/返回应用服务器和数据库服务器
4.返回从服务端检索到的信息
·B/S架构和C/S架构的区别
C/S:是客户端/服务器模式,主要指的是传统的桌面级的应用程序。比如我们经常用的QQ、微信...
B/S:是浏览器/服务器模式,主要指的是web应用程序,如淘宝,阿里巴巴等。B/S模式最大的优势在于客户端只要有浏 览器就可以运行。而C/S模式的应用程序需要在客户端进行安装,不易于升级维护。
·URL(统一资源定位器)
URL的组成:
URL由三部分组成:协议类型,主机名和路径及文件名。
http://lacalhost:8080/news/index.html
协议部分://主机IP地址:端口号/项目资源地址=项目名+(路径)+访问文件(文件名.后缀名)
·Tomcat服务器
Tomcat是由Apache开发的一个Web应用服务器,JSP/Servlet容器。
Tomcat服务器配置:
压缩版Tomcat的安装:
添加系统变量,名称为CATALINA_HOME
Tomcat服务启动检测:
浏览器地址栏输入:http://localhost:端口号(默认8080)或http://127.0.0.1:端口号
Tomcat目录结构:
/bin - 脚本存放目录(如启动、关闭脚本) *.sh文件用于Unix系统; *.bat文件用于Windows系统
/conf - 配置文件目录
server.xml:配置整个服务器信息。例如修改端口号,添加虚拟主机等
web.xml:部署描述符文件,这个文件中注册了很多MIME类型,即文档类型
/logs - 默认日志目录,记录了Tomcat启动和关闭的信息
/webapps - webapp运行的目录
/work - 运行时生成的文件
/temp - 存放Tomcat的临时文件,这个目录下的东西可以在停止Tomcat后删除
/lib - Tomcat的类库即JAR包
配置Tomcat端口号并设置字符集:
通过配置文件server.xml修改Tomcat端口号,设置字符集
<Connector port="端口号" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
·web项目的目录结构
/ :Web应用的根目录,该目录文件客户端都可访问(JSP、HTML等)
/WEB-INF :这个目录下的文件,是不能被客户端直接访问的
/WEB-INF/classes :存放Web项目的Class文件
/WEB-INF/lib :Web应目使用的第三方JAR包
/WEB-INF/web.xml :Web应目的配置文件,完成用户请求的逻辑名称到真正的servlet类的映射
·配置默认访问页面
通过配置文件web.xml修改访问起始页,假如在web应用下存在一个index.jsp文件,输入http://loacalhost:8080/news地址 时,web容器会默认调用index.jsp页面。
<welcome-file-list>
<welcome-file>文件名.jsp</welcome-file>
</welcome-file-list>
·创建、部署、发布项目流程:
1. 编写Web应用的代码
2. 在webapps目录下创建应用文件目录
3. 将创建的页面复制到应用目录下
4. 启动Tomcat进行访问
·什么是JSP(Java Server Pages)
JSP是一种动态网页开发技术,它使用JSP标签在HTML网页中插入Java代码。
执行过程:
翻译阶段生成.java → 编译阶段生成.class文件 → 执行阶段
·JSP脚本的声明
在JSP页面中执行的java代码。
语法:
<% Java代码 %>
注:任何文本、HTML标签、JSP元素必须写在脚本程序的外面。
·JSP的声明
在JSP页面中定义变量或者方法。
语法:
方式一:
<%! 方法 %>
方式二:
<jsp:declaration>
方法
</jsp:declaration>
·JSP表达式
语法:
<%= 表达式 %>
·JSP注释
语法:
<%--JSP注释--%> //客户端不可见
// 单行注释
/* */ 多行注释
·HTML注释
语法:
<!--HTML注释--> //客户端可见
·Page指令
定义网页依赖属性,比如脚本语言、error页面、缓存需求等。
语法:
<%@page 属性1="属性值1" 属性2="属性值2"%>
常用属性:
-----------------------------------------------------------------------------
| 属性 描述 默认值 |
|-----------------------------------------------------------------------------|
| language 指定JSP页面使用的脚本语言 java |
| import 导入要使用的Java类,可多次导入用逗号隔开 无 |
| contentType 指定当前JSP页面的字符编码 text/html、ISO-8859-1 |
-----------------------------------------------------------------------------
·JSP页面元素
1. 静态内容
2. 指令
3. 表达式
4. 脚本
5. 声明
6. 动作
7. 注释
·运行Web程序常犯的错误
1、未部署Web应用
2、URL输入错误
3、目录不能被引用
4、未启动Tomcat
----------------------------------------------------------------------------------------------------------------------
【第二章】JSP数据交互
·JSP内置(隐式)对象
JSP内置对象是JSP容器为每个页面提供的Java对象,不需要用new关键字声明和导包就可以直接使用。
JSP九大内置对象:
out(输出)
request(请求)
response(响应)
session(会话)
application(全局)
page(页面)
pagecontext(页面上下文)
exception(异常)
config(配置)
·JSP内置对象request
用来处理客户端请求。
客户端 → 请求 → JSP页面 → request对象 → 请求信息 → 服务器
·常用方法
-------------------------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|-------------------------------------------------------------------------------------------------|
|String getParameter(String name) 接收指定表单元素的单个数据 |
|String[] getParameterValues(String name) 接收指定表单元素的多个数据 |
|void setCharacterEncoding(String s) 指定每个请求的编码格式 |
|RequestDispatcher getRequestDispatcher(String path) 返回一个RequestDispatcher转发对象 |
-------------------------------------------------------------------------------------------------
·JSP内置对象response
用来响应客户端请求。
·常用方法
-------------------------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|-------------------------------------------------------------------------------------------------|
| void sendRedirect(String location) 客户端将重新发送请求到指定的URL,即页面重定向 |
-------------------------------------------------------------------------------------------------
·用户请求信息的转发
转发的作用:在多个页面交互过程中实现请求数据的共享。
转发的实现:RequestDispatcher对象的forward()方法
<%
RequestDispatcher rd=request.getRequestDispatcher("文件名.jsp")
rd.forward(request,response);
%>
转发和重定向的异同:
相同: 页面跳转
不同: 1.转发在服务器端完成的;重定向是在客户端完成的
2.转发的速度快;重定向速度慢
3.转发的是同一次请求;重定向是两次不同请求
4.转发不会执行转发后的代码;重定向会执行重定向之后的代码
5.转发地址栏没有变化;重定向地址栏有变化
6.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
通过地址栏传输数据(注意在传输多个值时不要带空格):
<a href="xxx.jsp?key=value&&key1=value2&&……"></a>
·JSP内置对象session
用来跟踪在各个客户端请求间的会话,可以保存每个用户的会话信息存储在服务端,sessionid是通过cookie存储在客户端
什么是会话:
一个会话就是服务器与浏览器的一次通话
·常用方法
---------------------------------------------------------------------------------------------------
|返回类型 方法名 说明 |
|---------------------------------------------------------------------------------------------------|
|void setAttribute(String key,Object value) 以key/value形式保存对象值(作用域仅限于一次请求) |
|Object getAttribute(String key) 通过key获取对象值(获取值时需要强制类型转换) |
|void invalidate() 设置session对象失效 |
|String getId() 获取客户端的id(sessionId) |
|void setMaxInactiveInterval(int interval) 设置客户端停止访问后在服务器的保存时间(以秒为单位) |
|int getMaxInactiveInterval() 获取客户端停止访问后在服务器的保存时间(以秒为单位) |
|int getLastAccessTime() 获取客户最后一次访问服务器的时间 |
|void removeAttribute(String key) 从session中删除指定名称(key)所对应的对象 |
---------------------------------------------------------------------------------------------------
session对象的超时失效
通过设置项目的web.xml或Tomcat目录/conf/web.xml文件,单位为分钟,默认30分钟。
<session-config>
<session-timeout>10</session-timeout>
</session-config>
session与窗口的关系:
1.每一个session对象都与一个浏览器窗口对应,重新开启一个浏览器窗口,可以创建一个session对象
2.通过超链接打开的新窗口,新窗口的session与其父窗口的session相同
解决post方式乱码的方法:
request.setCharacterEncoding("utf-8");设置传送的编码格式
解决get方乱码方法:
方法一:
在接受数据时,通过实例化String对象进行转码
String user=request.getParameter("user");
String user1=new String(user.getBytes("ISO-8859-1"),"UTF-8");解决get方法乱码问题(不建议使用)
方法二:
在tomcat配置文件(conf.xml)添加URIEncoding=“UTF-8”(推荐使用)
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8"/>
·include指令
该指令用于在JSP页面中包含一个文件,该文件可以是JSP页面、HTML网页、文本文件或一段Java代码。
作用:
1、减少代码的重复量
2、方便后期维护
语法:
<%@ include file="被包含文件地址" %>
注:include指令只有一个file属性,该属性用于指定插入到JSP页面当前位置的文件资源。
·out对象
用于把结果输出至网页上。
语法:
<%
out.println();
%>
·常用方法
-----------------------------------------------
|返回类型 方法名 说明 |
|-----------------------------------------------|
| void print(dataType dt) 显示数据内容 |
| void pringln(dataType dt) 换行显示数据内容|
-----------------------------------------------
----------------------------------------------------------------------------------------------------------------------
【第三章】JSP数据交互(二)
·内置对象application
application对象实现了用户间数据的共享,可存放全局变量它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将 一直保存在服务器。
·常用方法
--------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|--------------------------------------------------------------------------------|
| Object getAttribute(String name) 通过key获取对象值 |
| void setAttribute(String name,Object value) 以key/value形式保存对象值|
| String getRealPath(String path) 返回相对路径的真实路径 |
--------------------------------------------------------------------------------
·对象作用域
application:在一个应用服务器范围内有效
session:在一次会话范围内有效
request:在一个服务器请求范围内有效
page:在一个页面范围内有效,通过pageContext对象访问
·Cookie
Cookie是一种浏览器和服务器交互数据的方式,由服务器端创建,但是不会保存在服务器,创建好之后,发送给浏览器,浏 览器保存在用户本地,下一次访问网站的时候,就会把该Cookie发送给服务器。
·作用:
对特定对象的追踪
实现各种个性化服务
简化登录
·安全性能:
容易泄露,适合存储部重要的信息
·cookie工作流程:
客户端→服务端→response携带cookie发送到客户端→客户端接受并存储cookie
·使用Cookies步骤
1、创建Cookie对象
Cookie cookie = new Cookie("key","value");
注:名称(key)和值(value)中都不能包含空格或:[ ] ( ) = , " / ? @ : ;
2、设置Cookie有效期(以秒为单位,如不设置浏览器关闭后失效)
cookie.setMaxAge(24*60*60);
3、将Cookie发送并添加至HTTP响应头中
response.addCookie(cookie);
·读取Cookies
想要读取cookies,您就需要调用request.getCookies()方法来获得一个javax.servlet.http.Cookie对象的数组,然后遍历这个数 组,使用getName()方法和getValue()方法来获取每一个cookie的名称和值。
<%
Cookie cookie = null;
Cookie[] cookies = null;
// 获取cookies的数据,是一个数组
cookies = request.getCookies();
if( cookies != null ){
for (int i = 0; i < cookies.length; i++){
cookie = cookies[i];
out.print("Name : " + cookie.getName( ) + ", ");
out.print("Value: " + cookie.getValue( )+" <br/>");
}
}else{
out.println("Cookis为空");
}
%>
·Cookies常用方法
---------------------------------------------------------------------------------------------------
|返回类型 方法名 说明 |
|---------------------------------------------------------------------------------------------------|
|void setDomain(String path) 设置cookie的域名 |
|String getDomain() 获取cookie的域名 |
|void setMaxAge(int expiry) 设置cookie有效期,以秒为单位,默认有效期为当前session的存活时间 |
|int getMaxAge() 获取cookie有效期,以秒为单位,默认为-1,表明会活到浏览器关闭为止 |
|String getName() 返回cookie的名称,名称创建后将不能被修改 |
|void setValue(String value) 设置cookie的值 |
|String getValue() 获取cookie的值 |
|String getPath() 获取cookie的路径 |
|void setSecure(boolean flag) 指明cookie是否要加密传输 |
|void setComment(String cont) 设置注释描述cookie的目的,当浏览器将cookie展现给用户时,注释非常有用|
|String getComment() 返回描述cookie目的的注释,若没有则返回null |
---------------------------------------------------------------------------------------------------
·浏览器对cookie内容、大小、个数限制:
IE6.0 IE7.0/8.0 Opera FF Safari Chrome
cookie个数: 每个域为20个 每个域为50个 每个域为30个 每个域为50个 没有个数限制 每个域为53个
cookie总大小: 4095个字节 4095个字节 4096个字节 4097个字节 4097个字节 4097个字节
·Cookie与session的对比
---------------------------------------------------------------
| session | cookie |
|--------------------------------|------------------------------|
|在服务端保存用户信息 |在客户端保存用户信息 |
|session中保存的是Object类型 |cookie保存的是String类型 |
|随会话的结束而将其存储的数据销毁|cookie可以长期保存在客户端 |
|保存重要的信息 |保存不重要的用户信息 |
---------------------------------------------------------------
·JavaBean
JavaBean是特殊的Java类,使用Java语言书写并且遵守JavaBean API规范。
·JavaBean与其它Java类相比而言独一无二的特征:
1.提供一个默认的无参构造函数。
2.需要被序列化并且实现了Serializable接口。
3.可能有一系列可读写属性。
4.可能有一系列的"getter"或"setter"方法。
·JavaBean的优势
解决代码的重复编写,减少代码冗余
功能区分明确
提高了代码的维护性
----------------------------------------------------------------------------------------------------------------------
【第四章】JavaWeb项目实现步骤
1、创建数据库(基字符集=utf-8)、创建表、添加数据
2、导包、导入工具类(BaseDao) ps:修改数据库名及数据库用户名、密码
3、创建实体类
3.1私有属性
3.2get、set对外方法
3.3有参构造、无参构造、有参构造(去除id)
4、数据访问层
4.1接口(interface)
4.2实现类(Class) extends BaseDao implements 4.1接口
4.2.1 编写sql语句
4.2.2 将通配符需要的参数封装成Object数组类型 ps:注意顺序别混乱
4.2.3 执行sql语句
( executeQuery()/executeUpdate() ),并得到返回的结果
4.2.4 处理结果
5、业务逻辑层
5.1接口(interface)
5.2实现类(Class) implements 5.1接口
5.2.1 连接数据库
5.2.2 关闭自动提交
5.2.3 声明实例化Dao层对象并调用Dao层方法
5.2.4 手动提交
5.2.5 连接回滚
5.2.6 关闭连接
6、编写测试类(Test)
7、表示层
7.1Html代码
7.2JavaWeb代码
7.3JS/JQ代码
----------------------------------------------------------------------------------------------------------------------
【第五章】使用分层实现业务处理
·JNDI
JNDI(Java Naming and Directory Interface)Java命名和目录接口,是一组在Java应用中访问命名和目录服务的API,是SUN公司 提供的一种标准的Java命名系统接口,通过名称将资源与服务器进行关联,使得我们可以用名称访问对象。
作用与优点:
在应用与Java对象或资源之间建立松耦合的逻辑关系,简化应用对于资源的配置及维护工作
可以更大范围、不同应用之间共享资源
实现步骤:
1.配置资源发布信息(修改Tomcat目录\conf\context.xml文件)
<Context>
<Environment name="tjndi" value="HelloJndi" type="java.lang.String" />
</Context>
2.通过Context的lookup()方法查找资源
//1、获取初始上下文对象(Context)
Context cxt = new InitialContext();
//2、通过设置的名称获取在Tomcat服务器中存储的value值
String name =(String)cxt.lookup("java:comp/env/tjndi");//java:comp/env/为前缀
//2、输出显示
out.print("JNDI:"+name);
·数据库连接池
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
DataSource与连接池:
javax.sql.DataSource接口的实现类负责管理与数据库连接,以连接池形式对数据库连接进行管理
注:数据库使用完毕后,需要将其关闭,释放资源。而在连接池中,使用数据源获得数据库链接对象,在调用close()方法 时不会真正关闭链接,而仅仅是实现了断开应用程序与连接池之间的联系,即将连接的使用权归还给连接池。
为什么使用数据库连接池?
传统数据库的不足:
1.需要经常与数据库建立连接,在访问结束后必须关闭连接释放资源
2.当并发访问数量较大时,执行速度受到极大影响
3.系统安全性、稳定性相对较差
JNDI数据源配置、获取步骤:
1、配置Tomcat服务器conf目录Context.xml文件
<Resource name="jdbc/news" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdIe="30"
maxWait="10000" username="root" password="123456" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/newsmanagersystem?useUnicode=true&characterEncoding=utf-8"/>
Resource>元素的属性:
-------------------------------------------------------------------------------------------------------
| 属性 说明 |
|-------------------------------------------------------------------------------------------------------|
| Name 指定Resource资源的JNDI名称 |
| auth 可选填Container或Application,指定Resource的管理者 |
| type 指定Resource资源的Java类名,既javax.sql.DataSource |
| maxActive 设置数据库连接池中活动状态连接的最大数目,为0则不受限制 |
| maxIdle 设置数据库连接池中空闲状态连接的最大数目,为0则不受限制 |
| maxWait 设置数据库连接池中空闲状态连接的最长等待时间,超时则抛出异常,为-1则可无限等待 |
| username 指定数据库的用户名 |
| password 指定连接数据库的密码 |
| driverClassName 指定数据库的JDBC驱动器的Driver实现类名字 |
| url 连接数据库的url |
-------------------------------------------------------------------------------------------------------
2、配置web应用下的web.xml文件
<resource-ref>
<res-ref-name>jdbc/news</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>元素的属性:
-------------------------------------------------------------------------------
| 属性 说明 |
|-------------------------------------------------------------------------------|
| description 对所引用资源说明(可选) |
| res-ref-name 引用的JNDI资源的名称,与上面<Resource>元素中的name属性一致 |
| res-type 引用的JNDI资源的类名称,与上面<Resource>元素中的type属性一致 |
| res-auth 引用资源的管理者,与上面<Resource>元素中的auth属性一致 |
-------------------------------------------------------------------------------
3、在Tomcat服务器的lib目录下加入数据库连接的驱动JAR包
4、编写代码,使用lookup()方法获取数据源对象
//1.获取上下文对象Context
Context sourceCtx = new InitialContext();
//2.通过lookup方法调用对象
DataSource ds = (DataSource) sourceCtx.lookup("java:comp/env/jdbc/news");
//3.通过DataSource对象调用连接方法
conn = ds.getConnection();
·业务分层处理
为什么需要分层?
两层模式:
表示层
实体类 ↕
数据访问层
JSP使用两层开发的弊端:
1.展示逻辑与业务流程混合、或者业务代码与数据访问混合
2.编码职责不清,修改时互相影响,难以扩展和重用
三层模式:
显示层(与用户交互收集数据展示结果)
↕
实体类 业务逻辑层(根据业务需要控制执行过程,进行事物管理)
↕
数据访问层(提供与业务无关的数据访问操作)
表示层:在web应用中,一般以JSP文件、html文件为主
业务逻辑层:经常放在service包或biz包下
数据库访问层:通常放在dao包下
层与层之间的关系:各层之间互相依赖。表示层依赖于业务逻辑层,业务逻辑层依赖于数据访问层。
分层原则:
1.上层依赖于下层,依赖关系不夸层
1.1表示层不能直接访问数据库
1.2上层调用下层的结果,取决于下层的实现
2.下一层不能调用上一层
3.下一层不依赖上一层
3.1上层的改变不会影响下一层
3.2下层的改变会影响上一层得到的结果
4.在上一层中不能出现下一层的概念
4.1分工明确,各司其职
分层开发的优势:
职责划分清晰
无损替换
复用代码
降低了系统内部的依赖程度
松耦和、重用性高、生命周期成本低、可维护高
----------------------------------------------------------------------------------------------------------------------
【第六章】JSP开发业务应用
·JSP分页显示数据
分页显示的步骤:
1、确定每页显示的数据数量
2、确定分页显示所需的总页数
3、编写SQL查询语句,实现数据查询
4、在JSP页面中进行分页显示设置
将有关分页的数据封装到PageUtil类:
public class Page {
private int pageIndex = 1;// 当前页码
private int pageSize = 15;// 页面大小,即每页显示记录数
private int totalCount;// 记录总数
private int pageCount;// 总页数
List<News> newsList;// 每页新闻集合
…… // 省略getter/setter方法
}
计算总页数:
//根据每页显示记录数计算出总页数,如记录总数能被每页显示记录数整除,则总页数为两者的商,如果不能被整除,则余出 的记录数单独列为一页,所以总页数为两者的商再加一。
public void setTotalCount(int totalCount) {
if (newsCount > 0) {
if (newsCount % pageSize==0) {
pageCount = newsCount / pageSize;
}else{
pageCount = newsCount / pageSize + 1;
}
}
}
使用LIMIT子句:
SELECT `nid`, `ntitle`, `ncreateDate` FROM `news` LIMIT 0,10;
0表示:起始行的下标(起始行的下标 =(当前页码 - 1) * 每页显示的数据量)
10表示:每页显示的数据量
业务层逻辑判断:
//1.获取总量
//2.判断页总量是否 > 0
//2.1成立,则当前页获取新闻
//2.1.1判断当前页码是否大于页码总量;如果大于则将当前页码设置为页总量
//2.1.2获取当前页新闻
//2.2不成立,则设置总量为0,并将集合实例化
页面的设置:
//根据已确认的当前页码设置参数
<%
<a href="pageControl.jsp?pageIndex=1">首页</a>
<a href="pageControl.jsp?pageIndex=<%=pageIndex - 1%>">上一页</a>
<a href="pageControl.jsp?pageIndex=<%=pageIndex + 1%>">下一页</a>
<a href="pageControl.jsp?pageIndex=<%=totalPages%>">末页</a>
%>
页码边界的控制:
//通过判断pageIndex变量实现边界控制
当前页数:[<%=pageIndex%>/<%=pageCount%>]
<%
if (pageIndex > 1) { // 控制页面显示风格
%>
<a href="pageControl.jsp?pageIndex=1">首页</a>
<a href="pageControl.jsp?pageIndex=<%=pageIndex-1%>">上一页</a>
<%
} if (pageIndex < pageCount) { // 控制页面显示风格
%>
<a href="pageControl.jsp?pageIndex=<%=pageIndex+1%>">下一页</a>
<a href="pageControl.jsp?pageIndex=<%=pageCount%>">末页</a>
<%
}
%>
// 获取当前页
String pageIndex = request.getParameter("pageIndex");
if (pageIndex == null) {
currentPage = "1";
}
int pageIndex = Integer.parseInt(currentPage);
·使用Commons-FileUpload组件实现文件上传
Commons-FileUpload组件
Commons是Apache开放源代码组织的一个Java子项目,其中的FileUpload是用来处理HTTP文件上传的子项目
Commons-FileUpload组件特点:
使用简单
可以方便地嵌入到JSP文件中
编写少量代码即可完成文件的上传功能
获取Commons-FileUpload组件的方式:
下载Commons-FileUpload组件:http://commons.apache.org/proper/commons-fileupload/
类库:commons-fileupload-1.2.2.jar
API文档:commons-fileupload-1.2.2\site\apidocs
下载Commons-io组件:http://commons.apache.org/proper/commons-io/
类库:commons-io-2.4.jar
API文档:commons-io-2.4\docs
Commons-FileUpload组件应用:
1、环境准备,在项目中引入commons-fileupload-1.2.2.jar和commons-io-2.4.jar文件
2、设置表单的enctype属性
<form enctype="multipart/form-data" method="post">
3、在表单中使用File控件选择文件
<input type="file" name="nfile" />
注意:上传文件时form标签的method属性必须设置为“post”,不能设置为“get”
ServletFileUpload类的常用方法
-------------------------------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|-------------------------------------------------------------------------------------------------------|
|void setSizeMax(long sizeMax) 设置请求信息实体内容的最大允许的字节数 |
|List parseRequest(
HttpServletRequest req)
解析form表单中的每个字符的数据,返回一个FileItem对象集合|
|boolean isMultipartContent(HttpServletRequest req) 判断请求信息中的内容是否是multipart/form-data类型 |
|void setHeaderEncoding(
String encoding)
设置转换时所使用的字符集 |
-------------------------------------------------------------------------------------------------------
FileItem接口的常用方法
---------------------------------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|---------------------------------------------------------------------------------------------------------|
|boolean isFormField() 判断FileItem对象封装的数据类型(普通表单字段返回true,文件表单字段返回false)|
|String getName()
获得文件上传字段中的文件名(普通表单字段返回null) |
|String getFieldName()
返回表单字段元素的name属性值 |
|
void write()
将FileItem对象中保存的主体内容保存到指定的文件中 |
|String getString("utf-8")
将FileItem对象中保存的主体内容以一个字符串返回 |
|long getSize()
返回单个上传文件的字节数 |
---------------------------------------------------------------------------------------------------------
FileItemFactory接口实现类:DiskFileItemFactory常用方法
-------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|-------------------------------------------------------------------------------|
|void setSizeThreshold(int sizeThreshold) 设置内存缓冲区的大小 |
|void setRepositoryPath(String path) 设置临时文件存放的目录 |
-------------------------------------------------------------------------------
使用fielupload时需要注意以下几点:
1、上传文件使用的都是form表单,表单有两种:
第一种是默认的普通表单,它不能上传文件。
第二种是混合表单,它可以上传文件。必须设置它的属性enctype="multipart/form-data"。
2、在使用setFileSizeMax(param);时,param的大小是B(字节)为单位。
3、当定义了一个FileItme的对象item,String fileName = item.getName()时,使用IE7 fileName只有文件名 使用IE6包含了 路径,因此必须进行截取fileName = fileName.substring(fileName.lastIndexOf("/")+1);
4、当文件上传完毕后,会存在着临时文件,需要手动删除(假设定义FileItme的对象item,删除item.delete())。
编写上传文件处理页实现步骤:
//上传文件的存储路径(服务器文件系统上的绝对文件路径)
String uploadFilePath = request.getSession().getServletContext().getRealPath("upload/")
1. 判断请求信息中的内容是否是multipart/form-data(混合字段)类型
1.1 是混合字段
1.1.1 创建工厂类对象
FileItemFactory fit= new DiskFileItemFactory();
1.1.2 创建文件上传对象
ServletFileUpload sfu = new ServletFileUpload(fit);
1.1.3 使用for each循环遍历集合
List<FileItem> flist = sfu.parseRequest(request);
1.1.3.1 使用for each集合对象名调用isFormField()方法,判断是普通表单字段还是文件字段
1.1.3.1.1 返回true即为普通字段
1.1.3.1.2 返回false即为文件字段
1.1.3.1.2.1 使用for each集合对象名调用getName()方法获取文件名
1.1.3.1.2.2 声明并实例化File对象
1.1.3.1.2.3 使用for each集合对象名调用write()方法存入字段
1.2 不是混合字段类型
,既接收文件失败
控制文件上传的类型:
List<String> fileType = Arrays.asList("gif", "bmp", "jpg");
String ext = fileName.substring(fileName.lastIndexOf(".") + 1);
if (! fileType.contains(ext)) { // 判断文件类型是否在允许范围内
out.print("上传失败,文件类型只能是gif、bmp、jpg");
} else {
//上传文件
}
控制文件上传的大小:
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置一个完整请求的最大限制
upload.setSizeMax(1024 * 30);
try {
// ……省略上传代码
} catch (FileUploadBase.SizeLimitExceededException ex) {
out.print("上传失败,文件太大,全部文件的最大限制是:" + upload.getSizeMax() + "字节");
}
----------------------------------------------------------------------------------------------------------------------
【第七章】Servlet基础
·Servlet简介
Servlet是在服务器端运行的Java程序,可以接收客户端请求并做出响应。
Servlet主要用于生成动态的内容。它可以接受和处理请求,并动态生成HTML内容对客户端进行响应
·Servlet与JSP的关系
Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况 是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。
·Servlet接口
定义了所有Servlet需要实现的
---------------------------------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|---------------------------------------------------------------------------------------------------------| |void init(ServletConfig conf)由Servlet容器调用,用于完成Servlet对象在处理客户请求前的初始化工作
|
|---------------------------------------------------------------------------------------------------------|
|void service(ServletRequest req,ServletResponse res)
由Servlet容器调用,用来处理客户端的请求 |
|---------------------------------------------------------------------------------------------------------|
|void destroy()
由 Servlet容器调用,释放Servlet对象所使用的资源 |
|---------------------------------------------------------------------------------------------------------|
|ServletConfig getServletConfig()
返回ServletConfig对象,该对象包含此Servlet的初始化和启动参数。返回|
| 的ServletConfig对象是传递给init()方法的对象 |
|---------------------------------------------------------------------------------------------------------|
|String getServletInfo ()
返回有关Servlet的信息,比如作者、版本和版权。返回的字符串是纯文本,|
| 而不是任何种类的标记(如 HTML、XML等) |
---------------------------------------------------------------------------------------------------------
·GenericServlet抽象类
提供了Servlet与ServletConfig接口方法的默认实现(service()方法除外)
---------------------------------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|---------------------------------------------------------------------------------------------------------|
|void init(ServletConfig conf)
对Servlet接口中init()方法的实现,对ServletConfig实例进行了|
| 保存。此方法还有一个无参的重载方法,可用于子类中重写
|
|---------------------------------------------------------------------------------------------------------|
|String getInitParameter(String name)
返回web.xml中名称为name的初始化参数的值
|
|---------------------------------------------------------------------------------------------------------|
|ServletContext getServletContext()
返回ServletContext对象的引用 |
---------------------------------------------------------------------------------------------------------
·HttpServlet抽象类
继承自GenericServlet,处理HTTP协议的请求和响应
---------------------------------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|---------------------------------------------------------------------------------------------------------|
|void service(ServletRequest req,ServletResponse res)
对GenericServlet类中service()方法的实现,将|
|请求分发给protected void service(HttpServletRequest req,HttpServletResponse res) |
|---------------------------------------------------------------------------------------------------------|
|void service(HttpServletRequest req,HttpServletResponse res)
接收HTTP请求,并将它们分发给此类中定|
|义的doXXX()方法
|
|---------------------------------------------------------------------------------------------------------|
|protected void doXXX(HttpServletRequest req,HttpServletResponse res)
根据请求方式的不同分别调用的相应处 |
|理方法,如doGet()、doPost()等 |
---------------------------------------------------------------------------------------------------------
·ServletConfig接口
在Servlet初始化过程中获取配置信息,一个Servlet只有一个ServletConfig对象
---------------------------------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|---------------------------------------------------------------------------------------------------------|
|String getInitParameter(String name) 获取web.xml中设置的以name命名的初始化参数值 |
|---------------------------------------------------------------------------------------------------------|
|ServletContext getServletContext() 返回Servlet的上下文对象引用 |
---------------------------------------------------------------------------------------------------------
·ServletContext接口
获取Web应用上下文,与Servlet容器进行通信
---------------------------------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|---------------------------------------------------------------------------------------------------------|
|String getInitParameter(String name) 获取名为name的系统范围的初始化参数值,系统范围的初始化参数 |
| 可在部署描述符中使用<context-param>元素定义 |
|---------------------------------------------------------------------------------------------------------|
|void setAttribute(String name,Object object)
设置名称为name的属性
|
|---------------------------------------------------------------------------------------------------------|
|Object getAttribute(String name)
获取名称为name的属性 |
|---------------------------------------------------------------------------------------------------------| |String getRealPath(String path)
返回参数所代表目录的真实路径
|
|---------------------------------------------------------------------------------------------------------|
|void log(String message)
记录一般日志信息 |
---------------------------------------------------------------------------------------------------------
·ServletRequest接口
获取客户端请求的数据
---------------------------------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|---------------------------------------------------------------------------------------------------------|
|Object getAttribute(String name)
获取名称为name的属性值
|
|---------------------------------------------------------------------------------------------------------|
|void setAttribute(String name,Object object)
在请求中保存名称为name的
属性
|
|---------------------------------------------------------------------------------------------------------|
|void removeAttribute(String name)
清除请求中名字为name的属性 | |---------------------------------------------------------------------------------------------------------| |String getCharacterEncoding()
返回请求体所使用的字符编码 | |---------------------------------------------------------------------------------------------------------| |void setCharacterEncoding(String charset)
设置请求体的字符编码
|
|---------------------------------------------------------------------------------------------------------|
|String getParameter(String name)
返回指定请求参数的值 | |---------------------------------------------------------------------------------------------------------| |String[] getParameterValues(String name)
返回指定请求参数的全部值
|
|---------------------------------------------------------------------------------------------------------|
|RequestDispatcher getRequestDispatcher(String path)
返回指向指定路径的请求分发
对象 |
|---------------------------------------------------------------------------------------------------------|
|String getContextPath() 返回当前应用的根目录 |
|---------------------------------------------------------------------------------------------------------|
|String getServerName() 获取服务器名字,如果在本地返回localhost |
|---------------------------------------------------------------------------------------------------------|
|int getServerPort() 获取服务器的端口号 |
|---------------------------------------------------------------------------------------------------------|
|String getHeader(String name) 获取http协议定义的传送文件头信息 |
|---------------------------------------------------------------------------------------------------------|
|String getMethod() 获取客户端向服务器端传送数据的方法有get、 |
| post、put等类型 |
|---------------------------------------------------------------------------------------------------------|
|String getRemoteAddr() 获取客户端的ip地址 |
---------------------------------------------------------------------------------------------------------
·HttpServletRequest接口
除了继承ServletRequest接口中的方法,还增加了一些用于读取HTTP请求信息的方法
---------------------------------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|---------------------------------------------------------------------------------------------------------|
|String getContextPath()
返回请求URI中表示请求上下文的路径,上下文路径是请求URI的开始部分 |
|---------------------------------------------------------------------------------------------------------|
|
Cookie[] getCookies()
返回客户端在此次请求中发送的所有cookie对象 |
|---------------------------------------------------------------------------------------------------------|
|
HttpSession getSession()
返回和此次请求相关联的session,如果没有给客户端分配session,则创建|
| 一个新session
|
|---------------------------------------------------------------------------------------------------------|
|String getMethod()
返回此次请求所使用的HTTP方法的名字,如GET、POST
|
|---------------------------------------------------------------------------------------------------------|
|String getHeader(String name)
返回指定的请求头信息 |
---------------------------------------------------------------------------------------------------------
·ServletResponse接口
设置响应参数和向客户端发送响应数据
---------------------------------------------------------------------------------------------------------
| 返回类型 方法名 说明 |
|---------------------------------------------------------------------------------------------------------| |PrintWriter getWriter()
返回PrintWriter对象,用于向客户端发送文本 |
|---------------------------------------------------------------------------------------------------------|