一、XML的作用
1. 1、XML是可扩展的标记语言。允许用户自定标签。
2. 2、它被设计的宗旨是“描述数据”,而非显示数据(相对于html来讲)
3. 3、XML的标准是由W3C(万维网联盟)指定的,目前使用的版本为1.0
4. 4、应用:作为配置文件
5. 方式一:*.properties。key=value的形式。无法描述层次关系
6. 方式二:xml作为配置文件。灵活,且能描述层次关系
7.
8.
9. 二、XML的基本语法(1~6)
10. 1、XML文档声明
11. a、表明了这是一个XML文档;必须出现在第一行;
12. b、属性:
13. *version:指定使用的版本号。1.0
14. *encoding:指定xml中出现的字符使用的编码。
15. 注意:保存到磁盘上的文件所使用的编码要与XMl中声明的编码一致。
16. 默认编码为:UTF-8
17. standalone:是否是单独存在(是否依赖其他的文件)。yes|no
18. 2、XML的元素
19. a、必须含有开始和结束标签
20. b、合理嵌套
21. c、必须且只有一个根元素
22. 注意:XML中不会忽略空格和换行
23. d、严格区分大小写
24. 3、XML标签的属性
25. a、属性的取值必须使用引号引起来
26. b、同一个标签中的属性名称不能重复
27. 4、XML的注释
28. 语法:<!--这是注释-->
29. a、注释要合理嵌套
30. b、XML声明前不能有注释
31. 5、CDATA区
32. 是character data的缩写
33. 作用:被CDATA区包围的内容,会当做普通字符串处理
34. 语法:<![CDATA[
35. 这是普通文本内容
36. ]]>
37. 6、特殊字符(转义字符)
38. & &
39. < <
40. > >
41. " "
42. ' '
43. 7、xml的指令
44. 作用:用来指挥软件如何解析XML文档
45. 语法:必须以“<?”作为开头,以“?>”作为结尾。
46.
47. 三、XML的约束之DTD
48. 1、概念:
49. 格式良好的XML文档:遵守XML语法的文档
50. 有效的XML文档:遵守约束的文档。
51. 有效的XML文档必定是格式良好的。但格式良好的不一定是有效的。
52. 2、约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等
53. 3、dtd文件的扩展名是dtd。保存到磁盘上时必须使用UTF-8编码
54. 4、DTD文档的编写方式
55. 方式一:直接写在XML文件中(不用考虑编码问题)
56. 语法:
57. <!DOCTYPE 根元素 [
58. DTD的声明
59. ]>
60. 方式二:写在单独文件中(文件必须使用UTF-8)
61. DTD文档在本地
62. 语法:<!DOCTYPE 根元素 SYSTEM "DTD文档的路径">
63. DTD文档在网上
64. 语法:<!DOCTYPE 根元素 PUBLIC "DTD的名称" "DTD的URL地址">
65. 5、DTD的语法(看懂DTD)
66. 5.1定义元素
67. 语法:<!ELEMENT 元素名称 使用规则>
68. 使用规则:
69. (#PCDATA):Parsed Character Data已解析的字符串。(普通文本)
70. 作用:指定元素的主体内容为普通文本
71. EMPTY:指定该元素为一个空元素。即没有主体内容
72. ANY:用于指示元素的主体内容为任意类型
73. (子元素):指定该元素的孩子元素
74. 子元素如果用逗号分隔,必须按照顺序编写子元素
75. 如果子元素用“|”分开,说明任选其一
76. 元素的出现的次数:
77. +:至少一次
78. *:0次或一次或多次
79. ?:0次或一次
80. 什么都不带:必须一次
81.
82.
83. 5.2定义元素的属性(定以前元素必须存在)
84. 语法:
85. <!ATTLIST 元素名称
86. 属性名1 属性值类型 设置说明
87. 属性名2 属性值类型 设置说明>
88. 属性值类型:
89. CDATA:指定该属性的取值为普通字符
90. ENUMERATED (DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)
91. ID:表示属性的取值不能重复 设置说明:
92. #REQURIED:必须的
93. #IMPLIED:该属性不是必须的
94. #FIXED:表示属性的取值为一个固定值。语法:#FIXED "固定值"
95. 直接值:表示属性的取值为该默认值
96.
97. 5.3定义实体
98. 定义实体就是为一段内容指定一个名称,使用时通过这个名称就可以引用其所代表的内容。 情况一:
99. 引用实体:在DTD中定义,在XML中使用
100. 语法:<!ENTITY 实体名称 "实体内容">
101. 在xml中引用:&实体名称;
102. 情况二:
103. 参数实体:在DTD中定义,在DTD中使用(单独的dtd文件中)
104. 语法:<!ENTITY % 实体名称 “实体内容”>
105. 使用方式(注意是在DTD中使用):%实体名称;
JavaWeb重点知识随堂笔记连载(第二天 XML解析方式及Schema)
106. 一、XML的数据解析
107. 1、DOM方式
108. Document Object Model,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。
109. 把XML文档当做一个树对待;对于增删改查非常地方便。
110. 缺点:构建此树,必须加载整个xml文档。导致内存溢出(XML文件很大)。
111. org.w3c.*
112. 2、SAX方式(推)
113. Simple API for XML。这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。
114. 优点:读取到文档的某一部分时就进行解析。占用内存小。
115. 缺点:只能读。
116. org.sax.*;
117. 3、PULL方式(拉)
118. 这种方式不是官方标准。http://www.xmlpull.org
119. 优点:读取到文档的某一部分时就进行解析。占用内存小。
120. 缺点:只能读。
121. org.xmlpull.*;
122.
123. 二、XML的约束之Schema(看懂Schema)
124. 1、Schema约束本身就是一个xml文件,扩展名为xsd
125. 2、Schema文档的跟节点固定为schema
126. 3、根据Schema编写XML头部信息的步骤:
127. a、查看Schema文档,找到根元素。
128. ---------------------------
129. <书架>
130.
131. </书架>
132. ---------------------------
133. b、思考:书架来自哪个名称空间
134. schema文档中的根元素的targetNamespace指定了名称空间。
135. XML中引入该名称空间即可。使用xmlns关键字
136. ---------------------------
137. <itheima:书架 xmlns:itheima="http://www.itcast.cn">
138.
139. </itheima:书架>
140. ---------------------------
141. c、思考:http://www.itcast.cn对应的xsd文件在何方?
142. 使用schemaLocation去指定:名称空间 xsd的路径
143. ---------------------------
144. <itheima:书架 xmlns:itheima="http://www.itcast.cn"
145. schemaLocation="http://www.itcast.cn book.xsd">
146.
147. </itheima:书架>
148. ---------------------------
149. d、思考:schemaLocation来自何方?
150. 来自一个标准的名称空间,需要使用xmlns来声明:
151. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
152. ---------------------------
153. <itheima:书架 xmlns:itheima="http://www.itcast.cn"
154. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
155. xsi:schemaLocation="http://www.itcast.cn book.xsd">
156.
157. </itheima:书架>
158. ---------------------------
159. e、根据schema的定义,完成剩余的标签编写。都以itheima开头
160.
161. 4、xmlns声明关键字可以声明默认名称空间
162. xmlns="http://www.itheima.com"
JavaWeb重点知识随堂笔记连载(第三天 Web入门&Tomcat)
1、 Web的基本概念
a、web资源的分类
静态资源:html、htm。用户看到的永远都是静态页面。css、js(客户端技术:运行在客户端)。
动态资源:运行在服务器端,主要功能是输出静态内容。(服务端技术:运行在服务器上)
b、用java语言编写的服务器端程序,称之为JavaWeb
2、JavaWeb的服务器
JavaEE:多种Java开发技术的总称。
a、容器:指软件服务器程序。实现了什么规范的服务器就称之为什么容器。
支持的服务多,称之为重量级服务器。
b、轻量级的服务器:Tomcat。支持JSP/Servlet规范。
http://www.apache.org
3、Tomcat的安装与启动遇到的问题解决
a、解压Tomcat进行安装时请不要放在有空格或中文的目录下。
b、启动Tomcat:Tomcat目录/bin/startup.bat.
c、验证是否成功:http://localhost:8080看到猫,证明成功!
启动Tomcat遇到的问题:
1、启动时一闪而过:需要配置环境变量JAVA_HOME指向JDK的安装目录即可。
2、端口被占用了:默认端口8080.Web中的默认使用的端口是80
http://www.itheima.com:80
Catalina_home环境变量指向Tomcat的安装目录。一般不建议配置。
环境变量:
JAVA_HOME:执行JDK的安装目录C:\jdk1.6.0_20
path:.....;%JAVA_HOME%\bin
保证能在任意目录下执行java命令
命令搜索顺序:内部命令
外部命令
当前目录下:exe com bat
依次从path环境变量中指定的目录下搜索。
环境变量的改变,当前窗口不起作用。需要开启新窗口。
classpath:.;%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\lib\dt.jar;
d、Tomcat的目录结构(应用厂商自己制定的)
bin:存放启动Tomcat的一些命令。
conf:Tomcat的配置文件所在目录。server.xml最为重要。
lib:Tomcat所需的jar包
logs:tomcat运行日志
temp:临时文件
webapps:存放JavaWeb应用的。默认目录。此目录中有几个文件夹,就说明当前Tomcat管理着几个JavaWeb应用
work:Tomcat的工作目录
4、JavaWeb应用的标准目录结构(SUN公司制定)
MyApp(应用名称)
html、htm、css、js
a\a.html
WEB-INF:必须有。且写法固定。(此目录中的资源,客户端无法直接访问)
classes:必须有。且写法固定。放编译后的class文件的。com.itheima.Class1.class(\WEB-INF\classes\com\itheima\Class1.class)
lib:必须有。且写法固定。存放当前应用用的jar包。
注意:应用中的lib中的jar只为当前应用服务。Tomcat中lib下的jar,所有应用共用。
类的搜索顺序:应用的classes目录\应用的lib中的jar\TOmcat的lib中的jar
web.xml:当前应用的配置文件。必须有。且写法固定。
5、如何部署应用到服务器上
a、直接将应用的目录拷贝到Tomcat/webapps目录中(开放式目录部署)
b、打成war包,拷贝到Tomcat/webapps目录中
进入应用的目录:c:/MyApp
执行 jar -cvf MyApp.war .
访问应用的资源url的写法:
访问MyApp应用目录下的index.html
http://localhost:8080/MyApp/index.html
6、Tomcat的组成结构
配置虚拟目录:Context代表一个web应用
方式一:Context元素是Host元素的子元素。(修改server.xml。不建议使用。该文件更改后,需要重启Tomcat才起作用)
<Context path="/MyApp" docBase="c:\MyApp"/>
path:虚拟目录名称。必须以/开头
docBase:应用的真是存放路径。
方式二:(推荐的方式。此种方式不用重新启动Tomcat)
在Tomcat安装目录/conf/[enginename]/[hostname]目录下建立一个[contextPath].xml配置文件
[enginename]:server.xml中引擎的名称生成的文件夹
[hostname]]:server.xml中引擎下的主机名称生成的文件夹
[contextPath]:新建的配置文件的主文件名就是应用的虚拟路径
在该文件中添加以下内容:
<?xml version="1.0" encoding="gbk"?>
<Context docBase="c:\MyApp"/>
案例:配置默认端口、默认应用、默认主页
默认端口:80(W3C规定。HTTp协议)
把8080改为80.修改server.xml,找到8080端口的连接器Connector.
默认应用:在Tomcat安装目录/conf/[enginename]/[hostname]目录下建立一个名字为ROOT.xml的配置文件。
(比较特殊,需要重新启动)
默认主页:修改应用中的web.xml
<welcome-file-list>
<welcome-file>a.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
配置虚拟主机:Host
server.xml中的Host元素用于配置虚拟主机。
<Host name="主机域名" appBase="所有应用所在的文件夹路径"/>
配置SSL:https:Connector
HTTPS=http+SSL.默认的端口是443
JavaWeb重点知识随堂笔记连载(第四天HTTP协议&Servlet)
1. 第一部分、HTTP协议
2. 1、HTTP协议的组成
3. 请求部分
4. GET / HTTP/1.1 请求行:位于请求的第一行
5. Accept: */* 请求消息头:从第2行开始至第一个空行
6. Accept-Language: zh-cn
7. Accept-Encoding: gzip, deflate
8. User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
9. Host: localhost:8080
10. Connection: Keep-Alive
11.
12. username=admin&password=123 请求正文:第一个空行之后的全部都是请求正文
13. 响应部分
14. HTTP/1.1 200 OK 响应行:位于响应的第一行
15. Server: Apache-Coyote/1.1 响应消息头:从第2行开始至第一个空行
16. Accept-Ranges: bytes
17. ETag: W/"7777-1322450448000"
18. Last-Modified: Mon, 28 Nov 2011 03:20:48 GMT
19. Content-Type: text/html
20. Content-Length: 7777
21. Date: Sat, 15 Sep 2012 01:47:06 GMT
22.
23. ..... 响应正文:第一个空行之后的全部都是响应正文
24. 浏览器显示的就是正文中的内容
25.
26. 2、各组成部分详解
27. 请求部分
28. GET / HTTP/1.1 请求方式 请求的资源路径 协议版本号
29.
30. GET:请求方式。常用的有GET、POST
31. GET方式:默认方式。直接输入的网址。
32. 表单数据出现在了行中。url?username=abc&password=123
33. 特点:不安全;有长度限制(<1k)
34. POST方式:可以通过表单form method="post"
35. 表单数据会出现在正文中。
36. 特点:安全;没有长度限制
37.
38. *Accept:浏览器可接受的MIME类型.MIME类型:文件系统中使用扩展名来区分不同文件类型的。
39. 在web中使用MIME类型来区分文件类型。(Tomcat\conf\web.xml中有所有的MIME类型,比如text/html)
40. Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
41. *Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip
42. Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。 可以在浏览器中进行设置。
43. *Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面
44. 应用:防盗链;统计网站投放广告的效果
45. *Content-Type: application/x-www-form-urlencoded提交的内容类型
46. form表单的enctype="application/x-www-form-urlencoded"的默认值
47. *If-Modified-Since: Wed, 02 Feb 2011 12:04:56 GMT利用这个头与服务器的文件进行比对,如果一致,则从缓存中直接读取文件
48. *****Cookie:这是最重要的请求头信息之一 。会话技术有关
49.
50.
51. Warning: w1
52. Warning: w2
53.
54.
55. username=admin&password=123 请求正文:第一个空行之后的全部都是请求正文
56. 响应部分
57. HTTP/1.1 200 OK 协议版本号 响应码 描述
58. 响应码:(实际用到的30个左右。其他都是W3C保留的)。
59. 描述:对响应码的描述
60. 常用响应码:
61. 200:一切正常
62. 302/307:请求的资源变更了
63. 304:资源没有被修改过
64. 404:资源不存在
65. 500:服务器程序有错
66.
67.
68. *Location: http://www.it315.org/index.jsp指示新的资源的位置。配合响应码302/307来使用。
69. 302/307+Location:请求重定向
70. Server:apache tomcat指示服务器的类型
71. *Content-Encoding: gzip服务器发送的数据采用的编码类型
72. Content-Length: 80 告诉浏览器正文的长度
73.
74. *Content-Type: text/html; charset=GB2312服务器发送的内容的MIME类型
75. *Refresh: 1;url=http://www.it315.org指示客户端刷新频率。单位是秒
76. *Content-Disposition: attachment; filename=aaa.zip指示客户端下载文件
77.
78. *****Set-Cookie:SS=Q0=5Lb_nQ; path=/search服务器端发送的Cookie会话技术有关
79.
80. *控制客户端不要缓存内容的
81. Expires: -1
82. Cache-Control: no-cache (1.1)
83. Pragma: no-cache (1.0)
84.
85.
86. ..... 响应正文:第一个空行之后的全部都是响应正文
87. 浏览器显示的就是正文中的内容
88.
89.
90. --------------------------------------------------------------------
91. 第二部分、Servlet入门
92. 一、Servlet概述
93. 1、Servlet是SUN制定的一套开发动态Web页面的规范。它是JavaEE技术中的一种
94. 2、Tomcat服务器实现了Servlet规范。XX容器:实现了什么技术的服务器就称之为什么容器。
95. 二、如何编写一个Servlet:编写步骤
96. 1、建立标准的JavaWeb应用的目录结构
97. FirstApp
98. WEB-INF
99. classes
100. lib
101. web.xml
102. 2、进入WEB-INF/classes目录下,编写一个类
103. package com.itheima.servlet;
104. import javax.servlet.*;
105. import java.io.*;
106. public class HelloServlet extends GenericServlet{
107. public void service(ServletRequest req,
108. ServletResponse res)
109. throws ServletException,
110. java.io.IOException{
111. String data = "Hello World";
112. res.getOutputStream().write(data.getBytes());
113. }
114.
115. }
116. 3、编译该类。不要忘记设置classpath,把servlet-api.jar加进来
117. set classpath=%classpath%;C:\apache-tomcat-6.0.35\lib\servlet-api.jar
118. javac -d . HelloServlet.java
119. 4、映射Servlet。修改web.xml文件
120. <?xml version="1.0" encoding="GBK"?>
121. <web-app xmlns="http://java.sun.com/xml/ns/javaee"
122. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
123. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
124. version="2.5">
125. <servlet>
126. <servlet-name>fuck</servlet-name>
127. <servlet-class>com.itheima.servlet.HelloServlet</servlet-class>
128. </servlet>
129. <servlet-mapping>
130. <servlet-name>fuck</servlet-name>
131. <url-pattern>/fuck</url-pattern>
132. </servlet-mapping>
133. </web-app>
134. 5、部署当前web应用,拷贝到Tomcat\webapps目录下,并启动Tomcat
135. 6、访问:http://localhost:8080/FirstApp/fuck
136.
137. 三、GenericServlet和HttpServlet抽象类
138. 1、如果直接实现了Servlet接口或者继承GenericServlet,需要实现service方法。
139. 2、如果是继承HttpServlet,不要覆盖service方法。
140. 原因:在HttpServlet的service方法中,有标准的HTTP请求处理。会根据用户的请求方式,分发给doXXX方法。(模板方法设计模式)
141. 而doXXX方法,给了一个错误的输出,且是protected类型的。
142. 所以:在继承HttpServlet编写Servlet时,应该覆盖掉doXXX方法。
143. 3、修改MyEclipse生成Servlet的模板
144. a、关闭MyEclipse
145. b、在MyEclipse的安装目录下搜索*wizard*(com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar)
146. c、打开该jar包,templates目录下找Servlet.java的文件,该文件就是模板
147. d、修改前先 备份
148.
149. 细节:
150. 1、同一个Servlet可以被映射到多个地址上
151. 2、可以使用通配符*进行映射
152. 有两种写法:
153. 以"/"开头,以*结尾
154. 以"*"开头
155.
156. 多个通配符匹配的原则:"/"开头的优先级高,找最匹配的。
157. 3、如果某个Servlet的映射为"/",那么该Servlet就是缺省Servlet,它负责在web.xml没有对应的url请求时的处理。
158.
159. 四、Servlet的生命周期
160. Servlet对象在创建时会执行init方法,第一次被访问时。
161. destory方法会在释放对象时执行。
162. service方法:每一次请求都会调用该方法。
163. 在web.xml中,注册Servlet时,如果配置了以下标签<load-on-startup>1</load-on-startup>(取值为一个正整数)
164. 那么Tomcat在加载该应用时,就会完成对该Servlet的实例化和初始化。
165.
166. 出现的问题:线程安全
167. 1、尽量使用局部变量;实在是必须使用实例变量时,做同步处理,尽量包含少的代码。
168. SingleThreadModel:实现该接口能解决资源竞争问题。具体处理办法,由服务器决定。
169. a、把代码做了同步处理
170. b、搞了一个对象池:Tomcat采取该方式
171.
172.
173. 五、ServletConfig接口
174. 代表某个Servlet的初始化参数。每个Servlet都有自己对应的ServletConfig对象。
175. getInitParameterNames() :获取所有的参数名称
176. getInitParameter(java.lang.String name) :获取指定参数的取值。
177.
178. 参数和取值对应<init-param>标签
179. <servlet>
180. <servlet-name>ServletDemo5</servlet-name>
181. <servlet-class>com.itheima.servlet.ServletDemo5</servlet-class>
182. <init-param>
183. <param-name>xxx</param-name>
184. <param-value>yyy</param-value>
185. </init-param>
186. <init-param>
187. <param-name>aaa</param-name>
188. <param-value>bbb</param-value>
189. </init-param>
190. </servlet>
191.
192. 六、ServletContext接口
193. 1、相当重要。代表当前JavaWeb应用。每一个JavaWeb应用都有自己的ServletContext对象。
194. 2、是一个域对象。(Map<String,Object>)可以通过以下方法存取该域
195. Object getAttribute(String name)
196. void setAttribute(String name,Object obj)
197. void removeAttribute(String name)
198. 3、可以读取当前应用的全局参数
199. web.xml
200. <web-app>
201. <context-param>
202. <!-- 全局参数配置 -->
203. <param-name>encoding</param-name>
204. <param-value>ISO-8859-1</param-value>
205. </context-param>
206. </web-app>
207. 4、getRealPath(String path)
208. 获取当前JavaWeb应用中的任何资源。path必须以/开头,代表当前应用。
209. 5、实现请求转发
210. ServletContext sc = getServletContext();
211. RequestDispatcher rd = sc.getRequestDispatcher("/servlet/ServletContextDemo6");
212. rd.forward(request, response);//转发
213.
214. a、转发前,会清空response的缓存。因此,转发前所有的response输出都无效。
215. b、转发后,所有的输出也无效。
216.
217. 注:转发前不要清空response对象的缓存。
218.
219. 只有目标资源的输出才会显示。
220. 七、读取配置文件的三种方式
221. xml、properties
222. 1、ServletContext.getRealPath(String path)
223. 可以读取当前应用中的任何资源。
224. 2、ResourceBundle读取*.properties的文件。
225. 只能读取类路径下的properties的配置文件。
226. 3、类加载器加载配置文件
227. 只能读取类路径下的所有的资源文件。
JavaWeb重点知识随堂笔记连载(第五天 请求和响应对象)
1. 一、HttpServletResponse概述
2. 1、作用:向客户端输出内容。
3. 2、具体方法:
4. 响应行:响应码;响应码描述;
5. 响应头:
6. 正文:流
7.
8. 二、向客户端页面输出中文数据
9. 1、字节流
10. data.getBytes("UTF-8")
11. 解决浏览器乱码问题:
12. a、更改浏览器的编码(不可取)
13. b、通知浏览器使用UTF-8解码。(响应头:Content-type=text/html;charset=UTF-8)
14. response.setHeader("Content-Type", "text/html;charset=UTF-8");或者response.setContentType("text/html;charset=UTF-8");
15. c、给客户端输出<meta>头
16. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
17. 2、字符流
18. a、PrintWriter(JavaWeb中)默认查ISO-8859-1,可以通过HttpServletResponse.setCharacterEncoding(编码)更改默认编码
19. 不要忘记通知浏览器以相同的编码进行解码。
20. b、HttpServletResponse.setContentType("text/html;charset=UTF-8")
21. 有2个作用:更改字符流的默认编码为UTF-8,同时通知了客户端解码码表
22.
23.
24.
25. 三、HttpServletResponse应用案例:
26. 1、控制动态资源不要缓存
27. 2、控制静态资源的缓存时间
28. 3、文件下载:中文名称的文件下载
29. 4、定时刷新
30. 5、动态输出随机验证码图片
31. 四、HttpServletResponse的一些细节
32. 1、在同一个Servlet中,response的字节和字符输出流互斥。
33. 2、response的所有输出是输出到自己的缓存中的。容器从response对象的缓存中取出正文数据与响应头和响应码组织成HTTP协议的格式,然后再打给浏览器。
34. 3、response的输出流,容器会自动给你关闭。
35.
36. 五、HttpServletRequest概述及常用方法
37. 1、该对象中包含了所有客户端带过的东东
38.
39. 六、HttpServletRequest获取请求头
40. 七、HttpServletRequest获取请求参数(内省;BeanUtils框架)
41. getParameter(name)方法
42. getParameterValues(String name)方法
43. getParameterNames方法
44. getParameterMap方法 :key:请求参数名 value:请求参数值数组
45. getInputStream:以流的形式获取正文数据
46.
47. 八、请求参数的中文乱码问题:
48. 1、POST:
49. 客户端使用什么编码,就以什么编码传递请求参数。
50. 通知自己的处理程序,客户端提交过来的数据编码:request.setCharacterEncoding("UTF-8");(对get无效)
51. 2、GET:
52. ISO-8859-1
53. 手工编码:new String(data.getBytes("ISO-8859-1"),"UTF-8");
54. 九、请求转发和重定向的不同
55. 请求重定向:(客户端行为)
56. 地址栏会变。发出了2次请求。
57. response.setStatus(302);
58. response.setHeader("Location", "/day05/servlet/RequestDemo5");
59. 或者
60. response.sendRedirect("/day05/servlet/RequestDemo5");
61.
62. 请求转发:(服务器行为)
63. 地址栏不会变。发出了1次请求。
64. 源资源(工商局) 目标资源(民政局):共享请求中的数据
65.
66.
67. 重点:
68. ServletRequest也是一个域对象:Map<String,Object>
69. 十、各种表单输入域(中文请求参数)
70. 1、如果表单输入域的type为radio和checkbox,如果用户一个都不选,则不向服务器传递数据。
71. 2、如果选择了radio或checkbox的输入项中的其中一个,看他们有没有value,如果有,则传value的取值。如果没有,值为on。
72.
73. 十一、请求转发和包含
74. 1、请求转发:(当前应用内转)
75. 方式一:
76. ServletContext.getRequestDispatcher(String path):path必须以"/"开头,表示绝对路径
77. 方式二:
78. ServletRequest.getRequestDispatcher(String path):path如果"/"开头,表示绝对路径;如果不以"/"开头,表示相对路径
79.
80. 2、转发的细节:AServlet(源组件)--->BServlet(目标组件)
81. **转发前会清空response的正文。
82.
83. 转发页面上只会输出目标组件的输出,源组件的任何页面输出都无效。
84.
85. 原则:转发前,不要刷新或关闭response的输出流。
86. 3、包含:RequestDispatcher
87. AServlet(源组件)--->BServlet(目标组件):AServlet包含BServlet的输出内容
88.
89. 目标组件所有设置的头都无效,正文有效。
90.
91. 十二、各种URL地址的写法
92. 绝对地址:建议使用
93. 绝对路径的写法:何时需要加上应用名称"/day06"(如果地址给客户端用,要加上。如果给服务器端用,"/"就代表当前应用,即"/day06")
94. <img src="path"/> 要加/day06
95. <link type="text/style" href="path"/> 要加/day06
96. <a href="path"/> 要加/day06
97. <script type="text/javascript" src="path"/> 要加/day06
98. <form action="path"/> 要加/day06
99.
100. getRequestDispatcher(String path): 不要加。"/"就代表了
101. 头:Refresh=2;URL=path 要加/day06
102. ServletContext.getRealPath(String path): 不要加。"/"就代表了
103.
104. response.sendRedirect(String path): 要加/day06
1. 1、XML是可扩展的标记语言。允许用户自定标签。
2. 2、它被设计的宗旨是“描述数据”,而非显示数据(相对于html来讲)
3. 3、XML的标准是由W3C(万维网联盟)指定的,目前使用的版本为1.0
4. 4、应用:作为配置文件
5. 方式一:*.properties。key=value的形式。无法描述层次关系
6. 方式二:xml作为配置文件。灵活,且能描述层次关系
7.
8.
9. 二、XML的基本语法(1~6)
10. 1、XML文档声明
11. a、表明了这是一个XML文档;必须出现在第一行;
12. b、属性:
13. *version:指定使用的版本号。1.0
14. *encoding:指定xml中出现的字符使用的编码。
15. 注意:保存到磁盘上的文件所使用的编码要与XMl中声明的编码一致。
16. 默认编码为:UTF-8
17. standalone:是否是单独存在(是否依赖其他的文件)。yes|no
18. 2、XML的元素
19. a、必须含有开始和结束标签
20. b、合理嵌套
21. c、必须且只有一个根元素
22. 注意:XML中不会忽略空格和换行
23. d、严格区分大小写
24. 3、XML标签的属性
25. a、属性的取值必须使用引号引起来
26. b、同一个标签中的属性名称不能重复
27. 4、XML的注释
28. 语法:<!--这是注释-->
29. a、注释要合理嵌套
30. b、XML声明前不能有注释
31. 5、CDATA区
32. 是character data的缩写
33. 作用:被CDATA区包围的内容,会当做普通字符串处理
34. 语法:<![CDATA[
35. 这是普通文本内容
36. ]]>
37. 6、特殊字符(转义字符)
38. & &
39. < <
40. > >
41. " "
42. ' '
43. 7、xml的指令
44. 作用:用来指挥软件如何解析XML文档
45. 语法:必须以“<?”作为开头,以“?>”作为结尾。
46.
47. 三、XML的约束之DTD
48. 1、概念:
49. 格式良好的XML文档:遵守XML语法的文档
50. 有效的XML文档:遵守约束的文档。
51. 有效的XML文档必定是格式良好的。但格式良好的不一定是有效的。
52. 2、约束文档定义了在XML中允许出现的元素名称、属性及元素出现的顺序等等
53. 3、dtd文件的扩展名是dtd。保存到磁盘上时必须使用UTF-8编码
54. 4、DTD文档的编写方式
55. 方式一:直接写在XML文件中(不用考虑编码问题)
56. 语法:
57. <!DOCTYPE 根元素 [
58. DTD的声明
59. ]>
60. 方式二:写在单独文件中(文件必须使用UTF-8)
61. DTD文档在本地
62. 语法:<!DOCTYPE 根元素 SYSTEM "DTD文档的路径">
63. DTD文档在网上
64. 语法:<!DOCTYPE 根元素 PUBLIC "DTD的名称" "DTD的URL地址">
65. 5、DTD的语法(看懂DTD)
66. 5.1定义元素
67. 语法:<!ELEMENT 元素名称 使用规则>
68. 使用规则:
69. (#PCDATA):Parsed Character Data已解析的字符串。(普通文本)
70. 作用:指定元素的主体内容为普通文本
71. EMPTY:指定该元素为一个空元素。即没有主体内容
72. ANY:用于指示元素的主体内容为任意类型
73. (子元素):指定该元素的孩子元素
74. 子元素如果用逗号分隔,必须按照顺序编写子元素
75. 如果子元素用“|”分开,说明任选其一
76. 元素的出现的次数:
77. +:至少一次
78. *:0次或一次或多次
79. ?:0次或一次
80. 什么都不带:必须一次
81.
82.
83. 5.2定义元素的属性(定以前元素必须存在)
84. 语法:
85. <!ATTLIST 元素名称
86. 属性名1 属性值类型 设置说明
87. 属性名2 属性值类型 设置说明>
88. 属性值类型:
89. CDATA:指定该属性的取值为普通字符
90. ENUMERATED (DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)
91. ID:表示属性的取值不能重复 设置说明:
92. #REQURIED:必须的
93. #IMPLIED:该属性不是必须的
94. #FIXED:表示属性的取值为一个固定值。语法:#FIXED "固定值"
95. 直接值:表示属性的取值为该默认值
96.
97. 5.3定义实体
98. 定义实体就是为一段内容指定一个名称,使用时通过这个名称就可以引用其所代表的内容。 情况一:
99. 引用实体:在DTD中定义,在XML中使用
100. 语法:<!ENTITY 实体名称 "实体内容">
101. 在xml中引用:&实体名称;
102. 情况二:
103. 参数实体:在DTD中定义,在DTD中使用(单独的dtd文件中)
104. 语法:<!ENTITY % 实体名称 “实体内容”>
105. 使用方式(注意是在DTD中使用):%实体名称;
JavaWeb重点知识随堂笔记连载(第二天 XML解析方式及Schema)
106. 一、XML的数据解析
107. 1、DOM方式
108. Document Object Model,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。
109. 把XML文档当做一个树对待;对于增删改查非常地方便。
110. 缺点:构建此树,必须加载整个xml文档。导致内存溢出(XML文件很大)。
111. org.w3c.*
112. 2、SAX方式(推)
113. Simple API for XML。这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。
114. 优点:读取到文档的某一部分时就进行解析。占用内存小。
115. 缺点:只能读。
116. org.sax.*;
117. 3、PULL方式(拉)
118. 这种方式不是官方标准。http://www.xmlpull.org
119. 优点:读取到文档的某一部分时就进行解析。占用内存小。
120. 缺点:只能读。
121. org.xmlpull.*;
122.
123. 二、XML的约束之Schema(看懂Schema)
124. 1、Schema约束本身就是一个xml文件,扩展名为xsd
125. 2、Schema文档的跟节点固定为schema
126. 3、根据Schema编写XML头部信息的步骤:
127. a、查看Schema文档,找到根元素。
128. ---------------------------
129. <书架>
130.
131. </书架>
132. ---------------------------
133. b、思考:书架来自哪个名称空间
134. schema文档中的根元素的targetNamespace指定了名称空间。
135. XML中引入该名称空间即可。使用xmlns关键字
136. ---------------------------
137. <itheima:书架 xmlns:itheima="http://www.itcast.cn">
138.
139. </itheima:书架>
140. ---------------------------
141. c、思考:http://www.itcast.cn对应的xsd文件在何方?
142. 使用schemaLocation去指定:名称空间 xsd的路径
143. ---------------------------
144. <itheima:书架 xmlns:itheima="http://www.itcast.cn"
145. schemaLocation="http://www.itcast.cn book.xsd">
146.
147. </itheima:书架>
148. ---------------------------
149. d、思考:schemaLocation来自何方?
150. 来自一个标准的名称空间,需要使用xmlns来声明:
151. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
152. ---------------------------
153. <itheima:书架 xmlns:itheima="http://www.itcast.cn"
154. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
155. xsi:schemaLocation="http://www.itcast.cn book.xsd">
156.
157. </itheima:书架>
158. ---------------------------
159. e、根据schema的定义,完成剩余的标签编写。都以itheima开头
160.
161. 4、xmlns声明关键字可以声明默认名称空间
162. xmlns="http://www.itheima.com"
JavaWeb重点知识随堂笔记连载(第三天 Web入门&Tomcat)
1、 Web的基本概念
a、web资源的分类
静态资源:html、htm。用户看到的永远都是静态页面。css、js(客户端技术:运行在客户端)。
动态资源:运行在服务器端,主要功能是输出静态内容。(服务端技术:运行在服务器上)
b、用java语言编写的服务器端程序,称之为JavaWeb
2、JavaWeb的服务器
JavaEE:多种Java开发技术的总称。
a、容器:指软件服务器程序。实现了什么规范的服务器就称之为什么容器。
支持的服务多,称之为重量级服务器。
b、轻量级的服务器:Tomcat。支持JSP/Servlet规范。
http://www.apache.org
3、Tomcat的安装与启动遇到的问题解决
a、解压Tomcat进行安装时请不要放在有空格或中文的目录下。
b、启动Tomcat:Tomcat目录/bin/startup.bat.
c、验证是否成功:http://localhost:8080看到猫,证明成功!
启动Tomcat遇到的问题:
1、启动时一闪而过:需要配置环境变量JAVA_HOME指向JDK的安装目录即可。
2、端口被占用了:默认端口8080.Web中的默认使用的端口是80
http://www.itheima.com:80
Catalina_home环境变量指向Tomcat的安装目录。一般不建议配置。
环境变量:
JAVA_HOME:执行JDK的安装目录C:\jdk1.6.0_20
path:.....;%JAVA_HOME%\bin
保证能在任意目录下执行java命令
命令搜索顺序:内部命令
外部命令
当前目录下:exe com bat
依次从path环境变量中指定的目录下搜索。
环境变量的改变,当前窗口不起作用。需要开启新窗口。
classpath:.;%JAVA_HOME%\jre\lib\rt.jar;%JAVA_HOME%\lib\dt.jar;
d、Tomcat的目录结构(应用厂商自己制定的)
bin:存放启动Tomcat的一些命令。
conf:Tomcat的配置文件所在目录。server.xml最为重要。
lib:Tomcat所需的jar包
logs:tomcat运行日志
temp:临时文件
webapps:存放JavaWeb应用的。默认目录。此目录中有几个文件夹,就说明当前Tomcat管理着几个JavaWeb应用
work:Tomcat的工作目录
4、JavaWeb应用的标准目录结构(SUN公司制定)
MyApp(应用名称)
html、htm、css、js
a\a.html
WEB-INF:必须有。且写法固定。(此目录中的资源,客户端无法直接访问)
classes:必须有。且写法固定。放编译后的class文件的。com.itheima.Class1.class(\WEB-INF\classes\com\itheima\Class1.class)
lib:必须有。且写法固定。存放当前应用用的jar包。
注意:应用中的lib中的jar只为当前应用服务。Tomcat中lib下的jar,所有应用共用。
类的搜索顺序:应用的classes目录\应用的lib中的jar\TOmcat的lib中的jar
web.xml:当前应用的配置文件。必须有。且写法固定。
5、如何部署应用到服务器上
a、直接将应用的目录拷贝到Tomcat/webapps目录中(开放式目录部署)
b、打成war包,拷贝到Tomcat/webapps目录中
进入应用的目录:c:/MyApp
执行 jar -cvf MyApp.war .
访问应用的资源url的写法:
访问MyApp应用目录下的index.html
http://localhost:8080/MyApp/index.html
6、Tomcat的组成结构
配置虚拟目录:Context代表一个web应用
方式一:Context元素是Host元素的子元素。(修改server.xml。不建议使用。该文件更改后,需要重启Tomcat才起作用)
<Context path="/MyApp" docBase="c:\MyApp"/>
path:虚拟目录名称。必须以/开头
docBase:应用的真是存放路径。
方式二:(推荐的方式。此种方式不用重新启动Tomcat)
在Tomcat安装目录/conf/[enginename]/[hostname]目录下建立一个[contextPath].xml配置文件
[enginename]:server.xml中引擎的名称生成的文件夹
[hostname]]:server.xml中引擎下的主机名称生成的文件夹
[contextPath]:新建的配置文件的主文件名就是应用的虚拟路径
在该文件中添加以下内容:
<?xml version="1.0" encoding="gbk"?>
<Context docBase="c:\MyApp"/>
案例:配置默认端口、默认应用、默认主页
默认端口:80(W3C规定。HTTp协议)
把8080改为80.修改server.xml,找到8080端口的连接器Connector.
默认应用:在Tomcat安装目录/conf/[enginename]/[hostname]目录下建立一个名字为ROOT.xml的配置文件。
(比较特殊,需要重新启动)
默认主页:修改应用中的web.xml
<welcome-file-list>
<welcome-file>a.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
配置虚拟主机:Host
server.xml中的Host元素用于配置虚拟主机。
<Host name="主机域名" appBase="所有应用所在的文件夹路径"/>
配置SSL:https:Connector
HTTPS=http+SSL.默认的端口是443
JavaWeb重点知识随堂笔记连载(第四天HTTP协议&Servlet)
1. 第一部分、HTTP协议
2. 1、HTTP协议的组成
3. 请求部分
4. GET / HTTP/1.1 请求行:位于请求的第一行
5. Accept: */* 请求消息头:从第2行开始至第一个空行
6. Accept-Language: zh-cn
7. Accept-Encoding: gzip, deflate
8. User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
9. Host: localhost:8080
10. Connection: Keep-Alive
11.
12. username=admin&password=123 请求正文:第一个空行之后的全部都是请求正文
13. 响应部分
14. HTTP/1.1 200 OK 响应行:位于响应的第一行
15. Server: Apache-Coyote/1.1 响应消息头:从第2行开始至第一个空行
16. Accept-Ranges: bytes
17. ETag: W/"7777-1322450448000"
18. Last-Modified: Mon, 28 Nov 2011 03:20:48 GMT
19. Content-Type: text/html
20. Content-Length: 7777
21. Date: Sat, 15 Sep 2012 01:47:06 GMT
22.
23. ..... 响应正文:第一个空行之后的全部都是响应正文
24. 浏览器显示的就是正文中的内容
25.
26. 2、各组成部分详解
27. 请求部分
28. GET / HTTP/1.1 请求方式 请求的资源路径 协议版本号
29.
30. GET:请求方式。常用的有GET、POST
31. GET方式:默认方式。直接输入的网址。
32. 表单数据出现在了行中。url?username=abc&password=123
33. 特点:不安全;有长度限制(<1k)
34. POST方式:可以通过表单form method="post"
35. 表单数据会出现在正文中。
36. 特点:安全;没有长度限制
37.
38. *Accept:浏览器可接受的MIME类型.MIME类型:文件系统中使用扩展名来区分不同文件类型的。
39. 在web中使用MIME类型来区分文件类型。(Tomcat\conf\web.xml中有所有的MIME类型,比如text/html)
40. Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
41. *Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip
42. Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。 可以在浏览器中进行设置。
43. *Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面
44. 应用:防盗链;统计网站投放广告的效果
45. *Content-Type: application/x-www-form-urlencoded提交的内容类型
46. form表单的enctype="application/x-www-form-urlencoded"的默认值
47. *If-Modified-Since: Wed, 02 Feb 2011 12:04:56 GMT利用这个头与服务器的文件进行比对,如果一致,则从缓存中直接读取文件
48. *****Cookie:这是最重要的请求头信息之一 。会话技术有关
49.
50.
51. Warning: w1
52. Warning: w2
53.
54.
55. username=admin&password=123 请求正文:第一个空行之后的全部都是请求正文
56. 响应部分
57. HTTP/1.1 200 OK 协议版本号 响应码 描述
58. 响应码:(实际用到的30个左右。其他都是W3C保留的)。
59. 描述:对响应码的描述
60. 常用响应码:
61. 200:一切正常
62. 302/307:请求的资源变更了
63. 304:资源没有被修改过
64. 404:资源不存在
65. 500:服务器程序有错
66.
67.
68. *Location: http://www.it315.org/index.jsp指示新的资源的位置。配合响应码302/307来使用。
69. 302/307+Location:请求重定向
70. Server:apache tomcat指示服务器的类型
71. *Content-Encoding: gzip服务器发送的数据采用的编码类型
72. Content-Length: 80 告诉浏览器正文的长度
73.
74. *Content-Type: text/html; charset=GB2312服务器发送的内容的MIME类型
75. *Refresh: 1;url=http://www.it315.org指示客户端刷新频率。单位是秒
76. *Content-Disposition: attachment; filename=aaa.zip指示客户端下载文件
77.
78. *****Set-Cookie:SS=Q0=5Lb_nQ; path=/search服务器端发送的Cookie会话技术有关
79.
80. *控制客户端不要缓存内容的
81. Expires: -1
82. Cache-Control: no-cache (1.1)
83. Pragma: no-cache (1.0)
84.
85.
86. ..... 响应正文:第一个空行之后的全部都是响应正文
87. 浏览器显示的就是正文中的内容
88.
89.
90. --------------------------------------------------------------------
91. 第二部分、Servlet入门
92. 一、Servlet概述
93. 1、Servlet是SUN制定的一套开发动态Web页面的规范。它是JavaEE技术中的一种
94. 2、Tomcat服务器实现了Servlet规范。XX容器:实现了什么技术的服务器就称之为什么容器。
95. 二、如何编写一个Servlet:编写步骤
96. 1、建立标准的JavaWeb应用的目录结构
97. FirstApp
98. WEB-INF
99. classes
100. lib
101. web.xml
102. 2、进入WEB-INF/classes目录下,编写一个类
103. package com.itheima.servlet;
104. import javax.servlet.*;
105. import java.io.*;
106. public class HelloServlet extends GenericServlet{
107. public void service(ServletRequest req,
108. ServletResponse res)
109. throws ServletException,
110. java.io.IOException{
111. String data = "Hello World";
112. res.getOutputStream().write(data.getBytes());
113. }
114.
115. }
116. 3、编译该类。不要忘记设置classpath,把servlet-api.jar加进来
117. set classpath=%classpath%;C:\apache-tomcat-6.0.35\lib\servlet-api.jar
118. javac -d . HelloServlet.java
119. 4、映射Servlet。修改web.xml文件
120. <?xml version="1.0" encoding="GBK"?>
121. <web-app xmlns="http://java.sun.com/xml/ns/javaee"
122. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
123. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
124. version="2.5">
125. <servlet>
126. <servlet-name>fuck</servlet-name>
127. <servlet-class>com.itheima.servlet.HelloServlet</servlet-class>
128. </servlet>
129. <servlet-mapping>
130. <servlet-name>fuck</servlet-name>
131. <url-pattern>/fuck</url-pattern>
132. </servlet-mapping>
133. </web-app>
134. 5、部署当前web应用,拷贝到Tomcat\webapps目录下,并启动Tomcat
135. 6、访问:http://localhost:8080/FirstApp/fuck
136.
137. 三、GenericServlet和HttpServlet抽象类
138. 1、如果直接实现了Servlet接口或者继承GenericServlet,需要实现service方法。
139. 2、如果是继承HttpServlet,不要覆盖service方法。
140. 原因:在HttpServlet的service方法中,有标准的HTTP请求处理。会根据用户的请求方式,分发给doXXX方法。(模板方法设计模式)
141. 而doXXX方法,给了一个错误的输出,且是protected类型的。
142. 所以:在继承HttpServlet编写Servlet时,应该覆盖掉doXXX方法。
143. 3、修改MyEclipse生成Servlet的模板
144. a、关闭MyEclipse
145. b、在MyEclipse的安装目录下搜索*wizard*(com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar)
146. c、打开该jar包,templates目录下找Servlet.java的文件,该文件就是模板
147. d、修改前先 备份
148.
149. 细节:
150. 1、同一个Servlet可以被映射到多个地址上
151. 2、可以使用通配符*进行映射
152. 有两种写法:
153. 以"/"开头,以*结尾
154. 以"*"开头
155.
156. 多个通配符匹配的原则:"/"开头的优先级高,找最匹配的。
157. 3、如果某个Servlet的映射为"/",那么该Servlet就是缺省Servlet,它负责在web.xml没有对应的url请求时的处理。
158.
159. 四、Servlet的生命周期
160. Servlet对象在创建时会执行init方法,第一次被访问时。
161. destory方法会在释放对象时执行。
162. service方法:每一次请求都会调用该方法。
163. 在web.xml中,注册Servlet时,如果配置了以下标签<load-on-startup>1</load-on-startup>(取值为一个正整数)
164. 那么Tomcat在加载该应用时,就会完成对该Servlet的实例化和初始化。
165.
166. 出现的问题:线程安全
167. 1、尽量使用局部变量;实在是必须使用实例变量时,做同步处理,尽量包含少的代码。
168. SingleThreadModel:实现该接口能解决资源竞争问题。具体处理办法,由服务器决定。
169. a、把代码做了同步处理
170. b、搞了一个对象池:Tomcat采取该方式
171.
172.
173. 五、ServletConfig接口
174. 代表某个Servlet的初始化参数。每个Servlet都有自己对应的ServletConfig对象。
175. getInitParameterNames() :获取所有的参数名称
176. getInitParameter(java.lang.String name) :获取指定参数的取值。
177.
178. 参数和取值对应<init-param>标签
179. <servlet>
180. <servlet-name>ServletDemo5</servlet-name>
181. <servlet-class>com.itheima.servlet.ServletDemo5</servlet-class>
182. <init-param>
183. <param-name>xxx</param-name>
184. <param-value>yyy</param-value>
185. </init-param>
186. <init-param>
187. <param-name>aaa</param-name>
188. <param-value>bbb</param-value>
189. </init-param>
190. </servlet>
191.
192. 六、ServletContext接口
193. 1、相当重要。代表当前JavaWeb应用。每一个JavaWeb应用都有自己的ServletContext对象。
194. 2、是一个域对象。(Map<String,Object>)可以通过以下方法存取该域
195. Object getAttribute(String name)
196. void setAttribute(String name,Object obj)
197. void removeAttribute(String name)
198. 3、可以读取当前应用的全局参数
199. web.xml
200. <web-app>
201. <context-param>
202. <!-- 全局参数配置 -->
203. <param-name>encoding</param-name>
204. <param-value>ISO-8859-1</param-value>
205. </context-param>
206. </web-app>
207. 4、getRealPath(String path)
208. 获取当前JavaWeb应用中的任何资源。path必须以/开头,代表当前应用。
209. 5、实现请求转发
210. ServletContext sc = getServletContext();
211. RequestDispatcher rd = sc.getRequestDispatcher("/servlet/ServletContextDemo6");
212. rd.forward(request, response);//转发
213.
214. a、转发前,会清空response的缓存。因此,转发前所有的response输出都无效。
215. b、转发后,所有的输出也无效。
216.
217. 注:转发前不要清空response对象的缓存。
218.
219. 只有目标资源的输出才会显示。
220. 七、读取配置文件的三种方式
221. xml、properties
222. 1、ServletContext.getRealPath(String path)
223. 可以读取当前应用中的任何资源。
224. 2、ResourceBundle读取*.properties的文件。
225. 只能读取类路径下的properties的配置文件。
226. 3、类加载器加载配置文件
227. 只能读取类路径下的所有的资源文件。
JavaWeb重点知识随堂笔记连载(第五天 请求和响应对象)
1. 一、HttpServletResponse概述
2. 1、作用:向客户端输出内容。
3. 2、具体方法:
4. 响应行:响应码;响应码描述;
5. 响应头:
6. 正文:流
7.
8. 二、向客户端页面输出中文数据
9. 1、字节流
10. data.getBytes("UTF-8")
11. 解决浏览器乱码问题:
12. a、更改浏览器的编码(不可取)
13. b、通知浏览器使用UTF-8解码。(响应头:Content-type=text/html;charset=UTF-8)
14. response.setHeader("Content-Type", "text/html;charset=UTF-8");或者response.setContentType("text/html;charset=UTF-8");
15. c、给客户端输出<meta>头
16. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
17. 2、字符流
18. a、PrintWriter(JavaWeb中)默认查ISO-8859-1,可以通过HttpServletResponse.setCharacterEncoding(编码)更改默认编码
19. 不要忘记通知浏览器以相同的编码进行解码。
20. b、HttpServletResponse.setContentType("text/html;charset=UTF-8")
21. 有2个作用:更改字符流的默认编码为UTF-8,同时通知了客户端解码码表
22.
23.
24.
25. 三、HttpServletResponse应用案例:
26. 1、控制动态资源不要缓存
27. 2、控制静态资源的缓存时间
28. 3、文件下载:中文名称的文件下载
29. 4、定时刷新
30. 5、动态输出随机验证码图片
31. 四、HttpServletResponse的一些细节
32. 1、在同一个Servlet中,response的字节和字符输出流互斥。
33. 2、response的所有输出是输出到自己的缓存中的。容器从response对象的缓存中取出正文数据与响应头和响应码组织成HTTP协议的格式,然后再打给浏览器。
34. 3、response的输出流,容器会自动给你关闭。
35.
36. 五、HttpServletRequest概述及常用方法
37. 1、该对象中包含了所有客户端带过的东东
38.
39. 六、HttpServletRequest获取请求头
40. 七、HttpServletRequest获取请求参数(内省;BeanUtils框架)
41. getParameter(name)方法
42. getParameterValues(String name)方法
43. getParameterNames方法
44. getParameterMap方法 :key:请求参数名 value:请求参数值数组
45. getInputStream:以流的形式获取正文数据
46.
47. 八、请求参数的中文乱码问题:
48. 1、POST:
49. 客户端使用什么编码,就以什么编码传递请求参数。
50. 通知自己的处理程序,客户端提交过来的数据编码:request.setCharacterEncoding("UTF-8");(对get无效)
51. 2、GET:
52. ISO-8859-1
53. 手工编码:new String(data.getBytes("ISO-8859-1"),"UTF-8");
54. 九、请求转发和重定向的不同
55. 请求重定向:(客户端行为)
56. 地址栏会变。发出了2次请求。
57. response.setStatus(302);
58. response.setHeader("Location", "/day05/servlet/RequestDemo5");
59. 或者
60. response.sendRedirect("/day05/servlet/RequestDemo5");
61.
62. 请求转发:(服务器行为)
63. 地址栏不会变。发出了1次请求。
64. 源资源(工商局) 目标资源(民政局):共享请求中的数据
65.
66.
67. 重点:
68. ServletRequest也是一个域对象:Map<String,Object>
69. 十、各种表单输入域(中文请求参数)
70. 1、如果表单输入域的type为radio和checkbox,如果用户一个都不选,则不向服务器传递数据。
71. 2、如果选择了radio或checkbox的输入项中的其中一个,看他们有没有value,如果有,则传value的取值。如果没有,值为on。
72.
73. 十一、请求转发和包含
74. 1、请求转发:(当前应用内转)
75. 方式一:
76. ServletContext.getRequestDispatcher(String path):path必须以"/"开头,表示绝对路径
77. 方式二:
78. ServletRequest.getRequestDispatcher(String path):path如果"/"开头,表示绝对路径;如果不以"/"开头,表示相对路径
79.
80. 2、转发的细节:AServlet(源组件)--->BServlet(目标组件)
81. **转发前会清空response的正文。
82.
83. 转发页面上只会输出目标组件的输出,源组件的任何页面输出都无效。
84.
85. 原则:转发前,不要刷新或关闭response的输出流。
86. 3、包含:RequestDispatcher
87. AServlet(源组件)--->BServlet(目标组件):AServlet包含BServlet的输出内容
88.
89. 目标组件所有设置的头都无效,正文有效。
90.
91. 十二、各种URL地址的写法
92. 绝对地址:建议使用
93. 绝对路径的写法:何时需要加上应用名称"/day06"(如果地址给客户端用,要加上。如果给服务器端用,"/"就代表当前应用,即"/day06")
94. <img src="path"/> 要加/day06
95. <link type="text/style" href="path"/> 要加/day06
96. <a href="path"/> 要加/day06
97. <script type="text/javascript" src="path"/> 要加/day06
98. <form action="path"/> 要加/day06
99.
100. getRequestDispatcher(String path): 不要加。"/"就代表了
101. 头:Refresh=2;URL=path 要加/day06
102. ServletContext.getRealPath(String path): 不要加。"/"就代表了
103.
104. response.sendRedirect(String path): 要加/day06