3.Android学习笔记--servlet相关

------------------------------------------------------------------------
day06
【】【XML&Tomcat】

【】1、xml的简介【XML】
 1.什么是xml:eXtensible Markup Language,可扩展标记型语言
1)标记型语言:html是标记型语言,都是使用标签进行操作。
xml里面的操作也是使用标签进行操作。
2)可扩展:html里面的标签,每个标签有自己特定的含义,比如

,
在xml中标签自己定义的,比如  <猫>
3)xml的主要的功能是存储数据(不是显示数据)
4)xml的版本 1.0  1.1 ,一般使用的是 1.0版本
【注意】html和xml都是标记型语言。html里面的标签都是预制好的,不能自己定义,可以直接使用;而在xml里的标签是自己定义的。html的主要的功能是显示数据,xml的主要的功能是存储数据。


 2.xml的应用
第一,xml用于作为系统之间传输数据的格式
第二,xml用于表示生活中有关系的数据
第三,xml经常使用在系统的配置文件


【】2、xml的语法【XML】
 1.xml的文档声明
1)如果创建xml文件,在xml中必须要有一个文档声明
写法:
version : 必须要有,xml的版本 ,一般使用1.0
encoding:可选的,xml的编码方式
standalone:可选的,xml是否依赖其他文件 yes no
【注意】文档声明需要放在xml文件的第一行第一列
 2.xml的元素的定义
1)xml中的标签定义,有开始标签也要有结束标签
2)有的标签没有内容(没有结束标签,类似于html
),需要在标签内结束
3)xml中的标签可以嵌套,但是必须合理嵌套
4)一个XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签或孙标签
5)命名规范
第一,xml区分大小写,例如,

是两个不同的标记。
第二,xml的标签不能以数字或"_" (下划线)开头。 <1a> <_bb>: 这样写不对的
第三,xml的标签不能以xml(或XML、或Xml 等)开头。
第四,在xml的标签里面不能包含空格。: 这样写不对的
第五,xml的标签名称中间不能包含冒号(:)。 : 这样写不对的
 3.xml的属性的定义
1)在xml的标签里面可以有多个属性,但是属性的名称不能相同
2)属性和属性值之间需要使用=隔开,属性值需要使用引号包起来(双引号和单引号)

3)属性名称的命名规范与元素的命名规范相同
 4.xml的注释
1)写法
2)注释不能嵌套
 5.xml的CDATA区
(1)写法:
(2)把CDATA区里面的内容当做普通文本内容,而不是标签来进行处理(即,将CDATA内的内容原样输出)


【】3、xml的解析简介【XML】
 1.xml解析的分类
1)解析xml有三种方式
第一种方式:dom解析
第二种方式:sax解析
第三种方式:pull解析
* 掌握dom解析和sax解析的原理,以及优点和缺点
* 掌握pull解析代码
 2.dom解析xml【面试】
1)根据xml的层级结构在内存中分配一个树形结构,
document :代表整个文档
element:代表元素对象(标签)
属性对象
文本对象
node节点对象,是上面对象的父对象
2)dom解析xml的优点和缺点:
优点:因为分配了一个树形结构,很方便的实现增加 修改 删除的操作
缺点:如果要解析的文件过大,一次性在内存中分配一个树形结构,造成内存的溢出


 3.sax解析xml【面试】
1)sax解析的方式:边读边解析
当使用sax方式读到特定的标签时候,自动调用相应的方法进行操作
2)sax解析xml的优点和缺点::
优点:不会造成内存的溢出
缺点:不能实现增加 修改 删除的操作
4 pull解析xml【实际操作】
首先,导入pull的jar包(两个jar包)
1)使用pull解析xml文件把xml中的内容放到集合里面
步骤:
* 1、创建解析器工厂
* 2、根据解析器工厂创建解析器
* 3、把要操作的文件放到解析器里面
* 4、解析数据
2)把集合(对象)里面的数据写到xml文件中(序列化)

【注意】pull解析是按照sax解析原理进行解析


【序列化格式化显示代码】
serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); 


---------------------
【Tomcat】


【】1、web相关概念的介绍【Tomcat】
 1.动态资源和静态资源
(1)静态资源:html+css+js
(2)动态资源:数据是变化的
(3)动态资源的开发技术
* sun公司:jsp servlet
* php
* asp
..........
 2.c s 和 b s结构
1)c s:客户端 服务器(client server)
常见的应用:qq、迅雷.........
优点:需要在本地电脑安装软件,减轻服务器的压力
缺点:服务器如果升级,客户端软件也需要升级
2)b s:浏览器 服务器(browser server)
常见的应用:网银、支付宝、12306.....
优点:服务器如果升级,不需要升级
缺点:不需要安装软件,造成服务器的压力比较大
 3.web间的通信
1)在浏览器的地址栏输入地址,地址解析器会把输入的域名转换成ip地址,通过ip地址+端口号进行访问


【】2、web服务器介绍【Tomcat】
 1.什么是服务器
1)硬件:一台配置高的电脑
2)软件:在电脑上安装服务器软件
 2.常见的web服务器
(1)tomcat服务器:是Apache组织,开源的免费的服务器
(2)weblogic服务器:bea公司,收费的软件
(3)websphere服务器:ibm公司,收费的软件


【】3、tomcat服务器的安装和目录结构【Tomcat】
 1.tomcat的安装
1)安装tomcat服务器有两种方式:第一种方式使用exe文件进行安装;第二种方式使用压缩文件进行安装(推荐)
安装目录、命名空格等注意事项
2)检验toma安装成功
 * 启动tomcat服务器,如果正常启动,tomcat安装成功了   
   找到tomcat的bin目录,找到文件startup.bat文件,点击这个文件,启动tomcat服务器,出现一个黑窗口,在黑窗口里面出现ms,同时没有异常信息,表示tomcat启动成功了
 * 关闭tomcat服务器
   直接关闭黑窗口;找到tomcat里面bin目录,找到文件shutd.bat文件,点击这个文件关闭tomcat服务器
3)访问tomcat
 *  tomcat的默认端口是8080
 * 使用ip地址+tomcat的端口号进行访问
 * 因为使用的本机,ip地址可以写:127.0.0.1或者localhost, 例如,http://127.0.0.1:8080
【注意】tomcat的默认端口号为80,当端口号为80时,可以直接用IP地址127.0.0.1或localhost访问
 2.tomcat问题的解决【实际问题解决】
1)安装tomcat时候前提条件:必须安装jdk,同时配置环境变量JAVA_HOME
 * 没有配置环境变量,启动tomcat服务器,一闪就消失了
 * 查看错误:打开cmd窗口,进入到启动tomcat文件所在的路径,执行文件,看到错误信息
2)端口冲突的问题
 * 在logs文件夹下catalina.log文件可以查看报错日志。
 * 修改tomcat的启动端口
找到tomcat的conf目录,找到server.xml文件,进行端口的修改
                   connectionTimeout="20000"
               redirectPort="8443" />
修改port=""的值,修改了tomcat的端口,需重新启动tomcat服务器
【注意】如果将tomcat的启动端口修改为 80,访问时候不需要输入端口号了,直接通过ip地址进行访问
 3.tomcat的目录结构
bin(**):放tomcat启动和关闭的文件
conf(**):放tomcat配置文件(server.xml  web.xml)
lib:放jar包
logs:放tomcat的日志文件
temp:放临时文件
webapps(**):如果一个项目想要在tomcat里面运行,这个项目放到webapps里面
work:jsp就是servlet,最终会被编译成servlet,jsp编译成servlet放到这个目录


【】4、发布项目到tomcat【需要全部实际操作】【Tomcat】
 1.开放式项目部署
1)在tomcat里面webapps目录,把项目直接复制到这个目录下面
2)静态网站
* 在tomcat的webapps目录下创建文件夹,比如aa,在aa里面创建html文件
* 在浏览器的地址栏就可以访问到这个文件
  http://127.0.0.1:端口号/创建的文件夹的名称/文件的名称
3)动态网站
* 如果想要在tomcat里面运行动态网站,必须要遵循一定的目录结构
* 结构:
  website 
WEB-INF(必须)
-- web.xml(必须)
-- classes(可选)
-- lib(可选)
 2.配置虚拟路径
有两种方式
1)第一种方式配置虚拟路径
找到tomcat的conf目录里面server.xml,进行虚拟路径的配置
写在Host标签里面


访问:http://127.0.0.1/demo/hello.html
2)第二种方式配置虚拟路径
找到tomcat的conf,下面继续找\Catalina\localhost文件夹
在这个文件夹里面创建一个xml格式的文件,进行虚拟路径的配置
在创建的文件里面进行配置(使用Context,不需要写path属性)


访问:使用创建的xml文件的名称作为访问的路径
http://127.0.0.1/创建的xml格式的文件文件名/需要访问的html文件名
 3.使用myeclipse整合tomcat【工作应用】
创建web项目,部署之后,把web项目里面webroot里面的内容都放到tomcat的webapps目录下面,webroot变成项目的名称
部署项目是两个名称区别
*上面的名称是项目显示名称,下面的名称是部署到tomcat的webapps里面的名称(通过浏览器访问的名称)



【】http协议的简介【http协议】
 1.请求和响应
1)请求:在浏览器的地址栏输入一个地址,点击回车,这个过程就是一次请求
2)响应:服务器根据发送的请求,把数据返回显示到浏览器的页面上,这个过程称为响应
 2.什么是http协议
1)请求和响应遵循的数据格式
2)http协议的特点:
第一个:基于请求和响应的操作(先有请求,再有响应)
第二个:基于tcp协议,80端口



【】使用抓包工具查看http协议【http协议】【暂时了解】
 1.httpwatch软件,通过这个软件查看当前请求和响应的数据格式(只能用在ie浏览器里面)
 2.在ie、火狐、谷歌浏览器里面都有自带调试工具,点击键盘上面f12 ,会在页面下面出现调试的工具


---------------------------------------------------------------------------------------------------
day07


【javaweb之servlet】


【】1、servlet的入门【javaweb之servlet】
 1.什么是servlet
1)servlet 是运行在 Web 服务器中的小型 Java 程序。
2)servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。
 2.实现servlet
1)实现Servlet接口
* 如果实现接口,需要把接口里面的方法都实现
2)继承GenericServlet, HttpServlet类
* 如果继承类,不需要把类中的方法都实现
3)需要web服务器知道java程序不是一个普通的java程序,而是一个servlet
* 通过配置进行操作
* 在web项目中,web.xml里面进行配置
 3.servlet的入门程序
(1)写一个servlet,实现向页面输出内容 hello servlet
(2)步骤
第一步,创建一个类,使用这个类继承GenericServlet类
第二步,实现类里面的 service(ServletRequest req, ServletResponse res) 
* ServletRequest代表请求
* ServletResponse代表响应
第三步,使用ServletResponse向页面输出内容 getWriter() 
res.getWriter().write("众里寻他千百度");
第四步,在web项目中的web.xml进行配置,让服务器知道是一个servlet
*
名称
包类路径(包.类名)


名称
/访问的路径名称

【注意】名称中的名称可以自定义,上下两个名称必须一致



【】2、servlet的执行过程(画图分析执行过程)【javaweb之servlet】
1)根据在浏览器地址栏输入的地址,找web.xml中相同的url-pattern
2)找到了url-pattern,对应的servlet-name
3)根据找到的servlet-name到另外一个标签里面(servlet)相同名称的servlet-name
4)在servlet标签里面找到了相同名称的servlet-name,找servlet的包类路径servlet-class,利用反射原理,让servlet里面的service方法执行



【】3、servlet的生命周期【javaweb之servlet】
 1.什么是生命周期:一个人从出生到死亡
 2.servlet的生命周期:从servlet创建到servlet销毁的过程
 3.在servlet接口里面有五个方法,其中有三个方法是与生命周期相关的方法
1)init方法,在servlet创建的时候执行这个方法,只执行一次,servlet在第一次访问的时候创建(启动服务器时不创建servlet,不执行init方法)
2)service方法,在每次访问servlet时候会执行这个方法,执行多次
3)destroy方法,销毁servlet时候执行这个方法,执行一次



【】4、servlet开发细节的问题【javaweb之servlet】
 1.HttpServletRequest和ServletRequest关系:ServletRequest是HttpServletRequest的父接口
   HttpServletResponse和ServletResponse关系ServletResponse是HttpServletResponse的父接口
1)servletRequest和serlvetResponse不带协议
  HttpServletRequest和HttpServletResponse带协议
 2.在GenericServlet类里面有init没有参数的方法和init有参数的方法的关系
有参数init方法最终也要调用init没有参数的方法,直接使用init没有参数的方法就可以了
 3.在HttpServlet类里面service方法和doxxx方法关系
1)根据提交的方式,调用不同的doXX的方法。比如提交方式是get,调用doGet方法;比如提交方式是post,调用doPost方法
2)一般在开发中,直接写doGet和doPost方法就可以了
3)一般在创建servlet时候,直接继承HttpServlet实现servlet
 4.在服务器启动时候创建servlet
通过配置文件进行配置 ,在servlet标签里面写标签 正整数的值


【】5、url-pattern的配置【javaweb之servlet】
 1.配置有三种方式
1)第一种方式:完全路径匹配
写法 : /aa   /hello
2)第二种方式:目录匹配
写法:  /aa/*(匹配aa目录下的所有文件)
3)第三种方式:扩展名匹配
写法:  *.do   *.action
 2.优先级
完全路径匹配 > 目录匹配 > 扩展名匹配
【注意】匹配是写在web.xml文件中url-pattern标签内的,不是写在浏览器的地址栏中的



【】6、开发中路径的问题【javaweb之servlet】
 1.相对路径,有三种情况以在在html文件中引入图片
1)第一种:图片和html在同一个目录下面
* 直接写图片的名称
2)第二种:图片在html的上层目录
* 写 ../ 表示上层目录
3)第三种:图片在html的下层目录
* 直接写目录名称和图片名称
2.绝对路径(一般开发中都使用)
1)第一种写法:http://ip地址+端口号/文件的路径

2)第二种写法:直接写 /项目名称/文件路径



【】7、重定向和转发【javaweb之servlet】
 1.重定向
1)使用的是客户端路径
2)重定向请求两次,使用的是客户端路径,携带项目名称 ,比如 /day07/demo3
【重定向解释】客户端向服务器某个IP发送请求,该IP无法直接提供解决该问题的方法,此时服务器会返回给客户端一个信息,告诉客户端另一个IP能够提供解决方法,客户端向另一个IP发送请求获得解决问题的方法,这种通过两次请求获得解决问题方法的途径,可以理解为重定向
 2.转发
1)使用的是服务端路径
2)转发请求一次,使用的是服务器端路径,不需要携带项目名称 , 比如 /demo4
【转发解释】客户端向服务器某个IP发送请求,该IP无法直接提供解决该问题的方法,此时服务器内部寻找解决问题的方法,并返回给客户端,这种通过一次请求获得解决问题方法的途径,可以理解为转发


【】8、ServletConfig对象【javaweb之servlet】
 1.创建ServletConfig对象
直接使用方法创建对象,直接使用 getServletConfig()方法
 2.得到当前运行的servlet的名称
String getServletName() 
 3.创建servletContext对象
(1)ServletContext getServletContext() 
(2)一般都直接使用 getServletContext()方法
 4.获取初始化参数
1)在web.xml中进行配置初始化参数:在servlet标签里面进行配置


name
value


2)方法:
* String getInitParameter(String name) :根据名称得到值(参数是初始化参数名称)
name为标签内标签内的内容
   * Enumeration getInitParameterNames()  :得到所有的初始化参数的名称


【】9、ServletContext对象【javaweb之servlet】
 1.创建ServletContext对象
1)第一种方式,使用ServletConfig对象里面的方法 getServletContext()
2)第二种方式,直接使用 getServletContext()
 2.获取全局的初始化参数
1)配置全局初始化参数,不能写在任何servlet标签内
 
name
localhost
 

2)方法:
* String getInitParameter(String name) :根据名称得到全局初始化参数的值
* Enumeration getInitParameterNames()  :得到所有的全局初始化参数的名称
 3.在启动tomcat服务器时候,会为每个项目创建一个servletContext对象,在这个项目里面如果通过servlet1向servletContext里面设置一个值,在这个项目里面的其他的servlet里面可以的这个值
1)servletContext域对象:在一定的范围内,存值和取值,范围是整个web项目
2)存值:setAttribute(String name, Object object) 
3)取值:getAttribute(String name) 
【注意】ServletConfig对象可以获得某个servlet的初始化参数,只对当前servlet标签有效(即,只能当前servlet标签使用),而ServletContext对象可以获得某个项目所有servlet的初始化参数,都所有servlet标签都有效(即,所有servlet标签都可以使用)


【注意】web项目中相对路径是相对于虚拟机的路径,是相对于tomcat的bin目录的路径;而java项目的相对路径,是相对于项目根目录的路径


【】11.2 使用servletContext对象读取web项目中的文件【javaweb之servlet】
 1.InputStream getResourceAsStream(java.lang.String path) :得到要操作文件的输入流
1)第一个操作:文件放到src下面
* 路径: 第一个位置 /,理解为项目的名称;后面写文件在tomcat的webapps里面的具体的路径
* 代码:InputStream in = context.getResourceAsStream("/WEB-INF/classes/db1.properties");
2)第二个操作:文件放到包里面
* 路径:第一个位置 / 理解为项目名称;后面写文件在tomcat的webapps下面的具体的路径
* 代码:InputStream in = context.getResourceAsStream("/WEB-INF/classes/cn/itcast/read/db2.properties");
3)第三个操作:文件放到webroot下面
* 路径:第一个位置 / 理解为项目名称;后面写文件在tomcat的webapps下面的具体的路径
* 代码:InputStream in = context.getResourceAsStream("/db3.properties");
【注意】当把文件放到和webroot同级的目录下面,这个文件不会部署到tomcat里面,所以使用servletContext对里面getResourceAsStream方法不能得到文件的内容


 2.String getRealPath(java.lang.String path)  :得到要操作文件的完全路径(带盘符的路径)
* 参数:和getResourceAsStream类似的
第一个位置 / ,项目名称;后面写文件在tomcat的webapps里面的具体的路径
* 代码:String path = context.getRealPath("/db3.properties");
        InputStream in = new FileInputStream(path);//得到要操作文件的输入流
【注意】getResourceAsStream()返回的是一个输入流;getRealPath()返回的是一个字符串,该字符串的内容为文件在计算机中的绝对路径(带盘符的全路径)


【】12、使用类加载器读取文件【javaweb之servlet】
 1.读取的文件的位置是 classes里面的文件
 2.得到Class的三种方法
* 第一种方式:类名.class
* 第二种方式:对象.getClass()
* 第三种方式:Class.forName("包类路径")
 3.代码
Class clazz = ServletDemo1.class; //得到类的Class
ClassLoader loader = clazz.getClassLoader(); //得到类加载器
InputStream in = loader.getResourceAsStream("db1.properties");//得到要操作文件的输入流
//文件的路径,因为读取的classes里面的文件,直接写文件的名称
【注意】类加载器操作的是.class文件


【】13、默认的servlet【javaweb之servlet】
 1.比如在浏览器的地址栏随便输入一个地址,出现404,资源找不到,这个效果是由默认的servlet实现的
 2.在tomcat的conf里面找到web.xml,有对默认servlet的配置
* 如果自己创建servlet,让这个servlet在启动时候创建,大于1的值
* 默认servlet的配置里面url-pattern是 /,当把自己创建的servlet的url-pattern写成/,这个servlet就会变成一个默认的servlet
 3.在默认的servlet的初始化参数里面有listings,当把这个参数的值设置成true之后,当直接访问web项目中文件夹时候,会把文件夹里面的所有内容显示出来


------------------------------------------------------------------------------------------------
day08

【request与response】


request:代表请求,在浏览器的地址栏输入地址,点击回车,这个过程称为一次请求
response:代表响应,服务器端根据的请求,返回数据到浏览器中进行显示,这个过程称为一次响应


【】1、response的简介【request与response】
 1.HttpServletResponse,是一个接口,父接口是ServletResponse,代表响应对象
 2.http的响应包含三部分组成
1)第一部分:响应行
1.1)状态码
1.2)设置状态码的方法:setStatus(int sc)
 * response.setStatus(302) 
2)第二部分:响应头
1.1)是key-value结构,一个key可以有一个value,一个key也可以有多个value
1.2)方法
 * setHeader(java.lang.String name, java.lang.String value) :设置响应头
 * 两个参数:第一个参数是响应名称;第二个参数值
 * 针对一个key和一个value情况
 【注意】setHeader如果用同一个名称设置多次,后面的设置的值会覆盖前面设置的值
* 针对特殊的类型,设置头的方法
* setIntHeader(java.lang.String name, int value) :针对int类型值的方法
* setDateHeader(java.lang.String name, long date) :值long类型,是毫秒数(1970 1 1至今的毫秒数)
* addHeader(java.lang.String name, java.lang.String value) :设置响应头
* 两个参数:第一个参数是响应名称;第二个参数值
* 针对一个key和多个value的情况
addHeader("bb","55");
addHeader("bb","66");
结果:名称 bb ,值 55,66
 【注意】addHeader如果用同一个名称设置多次,后面的设置的值不会覆盖前面设置的值,结果是多个值并列
* 针对特殊的类型,设置头的方法
* addIntHeader(java.lang.String name, int value) :针对int类型值的方法
* addDateHeader(java.lang.String name, long date) :值long类型,是毫秒数
3)第三部分:响应体
3.1)向页面显示的内容
3.2)方法
* getWriter():使用字符流向页面输出内容
* getOutputStream():使用字节流向页面输出内容


【】2、重定向的案例【request与response】
 1.实现重定向的步骤
1)设置状态码
response.setStatus(302);
2)使用头Location完成重定向
response.setHeader("Location", "/项目名称/url");
 2.重定向的代码简写的方式
response.sendRedirect("要重定向到的页面的路径");
【注意】重定向到的页面路径需要带项目名称


【】3、定时跳转的案例【request与response】
 1.实现方式
1)使用头信息Refresh实现
2)写法: response.setHeader("Refresh","在几秒值后跳转;url=要跳转到页面的路径");
* response.setHeader("Refresh", "5;url=/day08-1/login.html");
 2.倒计时的效果
(1)直接在html页面中实现操作
在html中使用meta标签实现页面的定时跳转




【备注】web项目中设置编码语句(简写):response.setContentType("text/html;charset=UTF-8");
相当于语句:response.setHeader("Content-Type","text/html;charset=utf-8");
简写形式同时设置了浏览器和response缓冲区的编码
        html中设置编码(浏览器打开页面)语句:



【】4、设置响应体(向页面输出内容)【request与response】
 1.使用字节流向页面输出内容
1)getOutputStream() 
2)代码
response.getOutputStream().write("输出的内容".getBytes());
3)如果向页面输出中文,根据不同的浏览器的编码设置会产生乱码问题
* 解决方法:(1)设置浏览器的编码(设置响应头);(2)设置字节数组的编码;(3)让浏览器的编码和字节数组的编码一致
* 设置浏览器的编码 使用头信息 Content-Type
response.setHeader("Content-Type", "text/html;charset=utf-8");
* 设置字节数组的编码
response.getOutputStream().write("字节流中文".getBytes("utf-8"));
 2.使用字符流向页面输出内容
1)getWriter() 
2)代码
response.getWriter().write("输出的内容");
3)如果使用字符流向页面输出中文,一定会有乱码
3.1)产生乱码的原因:使用字符流向页面输出内容,首先会把内容放到response缓冲区里面,response缓冲区默认的编码是 iso8859-1,这个编码不支持中文,一定会有乱码
3.2)解决方法:(1)设置response缓冲区的编码;(2)设置浏览器的编码(设置响应头);(3)response缓冲区的编码和浏览器的编码一致
* 设置response缓冲区的编码
response.setCharacterEncoding("utf-8");
* 设置浏览器的编码
response.setHeader("Content-Type", "text/html;charset=utf-8");
* 输出内容
response.getWriter().write("字符流中文");
【小结】
* 使用字节流getOutputStream()向页面输出中文内容,可能会出现乱码,是否出现乱码取决于浏览器的编码设置。解决方法为:将浏览器的编码和输出的字节数组的编码设置为一致。
* 使用字符流getWriter()向页面输出中文内容,一定会有乱码;因为使用字符流向页面输出内容时,首先会把内容放到response缓冲区里面,而response缓冲区默认的编码是 iso8859-1,这个编码不支持中文。解决方法为:将response缓冲区的编码和浏览器的编码设置为一致。



【备注】
* 设置response缓冲区的编码:response.setCharacterEncoding("utf-8");
* 设置浏览器的编码, 使用头信息 Content-Type :response.setHeader("Content-Type", "text/html;charset=utf-8")
  * 设置字节数组的编码:response.getOutputStream().write("输出的内容".getBytes("utf-8"));
  * 字符流输出时,同时设置缓冲区和浏览器的编码:response.setContentType("text/html;charset=UTF-8");


【】5、使用response的流的注意事项【request与response】
 1.使用字符流向页面输出中文乱码问题解决,简写方式
response.setContentType("text/html;charset=utf-8");
【注意】简写方式不需设置response缓冲区的编码,因为简写方式相当于同时设置了缓冲区和浏览器的编码。
 2.字节流和字符流是互斥的,即字节流和字符流不能同时使用
 3.使用字符流不能直接向页面输出数字
使用字符流向页面直接输出数字时,页面不会显示数字,而是根据数字到码表中查询数字对应的字符,把字符输出


【】6、验证码的案例【request与response】
 1. 什么验证码:防止恶意注册
 2. 实现验证码的步骤(画图分析)
第一步:生成图片
第二步:生成随机的数字和字母
第三步:把数字和字母画到图片上
第四步:把图片显示到页面上
 3.代码实现验证码(略)
 4.显示验证码
1)把验证码显示到登录的页面中

2)实现看不清换一张,即刷新验证码页面,同时要清除缓存
function loadCode() {
var img1 = document.getElementById("img1");//得到img标签
img1.src = "/day08-5/code?"+new Date().getTime();//刷新验证码页面,同时要清除缓存
}


【注意】浏览器访问网页后会在计算机中生成缓存,再次访问时不会向服务器发送请求,而是从缓存中读取数据。如果在再次访问时不从缓存中读取数据而是向服务器发送请求,可以在url后加个问号(?),再加个随机数,(即url?随机数),即url="请求的url?"+new Date().getTime();其中"请求的url"表示具体的访问地址;"+"表示字符串拼接;"?"表示分割,?前表示url地址会被解析成IP地址,?后面表示附带的一些信息,不会被地址解析,而是作为传递数据使用(?后面以key=value的形式传递数据,后台用request.getParameter(key)获取传递的数据)。工作中一般使用url="请求的url?time="+new Date().getTime()



【】7、文件下载的案例【request与response】
 1 文件下载的基本实现的步骤
1.1)设置头信息 Content-Disposition,无论是什么格式的文件都以下载方式打开
1.2)在服务器上面有一个可以下载的文件
1.3)从服务器上拿到这个文件(使用文件输入流得到文件)
1.4)使用输出流把文件写到浏览器
 2.代码实现文件的下载
//得到要下载文件的路径
String path = getServletContext().getRealPath("/down/a.zip");
//得到文件的名称,上面的到的path为需要下载的文件的带盘符的全路径,可以截取最后一个\后面的字符串作为文件的名称
int lens = path.lastIndexOf("\\");
String filename = path.substring(lens+1);
//设置头信息
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//得到文件的输入流
InputStream in = new FileInputStream(path);
//使用输出流操作
OutputStream out = response.getOutputStream();
//流对接
int len = 0;
byte[] b = new byte[1024*8];
while((len=in.read(b))!=-1) {
out.write(b, 0, len);
}
//关闭流
in.close();


【】8、request对象【request与response】
 1.代表请求的对象,HttpServletRequest接口,父接口是ServletRequest
 2.获取请求行的信息
1)getMethod() :得到http请求方式(即,得到网页提交方式)(网页的2种提交方式:get或post方式)
2)getRequestURI() :得到请求地址(不包含ip+端口号,得到的是"/项目名称/请求的url")
3)getProtocol() :得到http的版本
 3.获取请求头的信息
1)getHeader(java.lang.String name) :根据名称得到请求头的值
* 头信息 User-Agent:获取当前请求的浏览器的类型
* String agent = request.getHeader("User-Agent");
 4.获取客户机的信息
1)getContextPath() :请求项目的名称
2)getRequestURL() :客户端发送的请求的路径(全路径)
3)getRemoteAddr() :获取当前客户端的ip地址
4)getQueryString() //查询字符串(参数)(即地址栏中?后面的内容)
【备注】以上方法需掌握getMethod() 、getContextPath()、getRequestURL()
 5.获取表单提交的数据
1)String getParameter(java.lang.String name) :
* 参数是表单输入项name属性的值,根据名称得到输入的值,返回的是一个字符串
* 代码:String username = request.getParameter("username");
2)String[] getParameterValues(java.lang.String name) :
* 参数是表单输入项name的值,针对复选框的情况,返回的是一个字符串数组
* 代码:String[] loves = request.getParameterValues("love");
3)Map getParameterMap() :
* 返回的是map集合,key是表单输入项name属性的值,value是输入的值
4)Enumeration getParameterNames()  
 6.获取表单提交的中文数据乱码问题的解决
1)post提交方式解决方法
* 使用post提交数据时候,会把数据放到request缓冲区里面,request缓冲区默认的编码 iso8859-1,不支持中文,会出现乱码
* 解决方法:设置request缓冲区的编码
* 代码:request.setCharacterEncoding("utf-8");
2)get提交中文乱码解决,三种方式
2.1)第一种:修改tomcat的配置文件(修改tomcat安装路径下的conf/server.xml配置文件,添加编码方式URIEncoding="utf-8")
              connectionTimeout="20000"
            redirectPort="8443" URIEncoding="utf-8"/>
2.2)第二种:把数据先编码,再进行解码
前台提交数据编码EncodeURI(),后台解码 URLDecoder.decode(fileName, "utf-8");
2.3)第三种:使用string构造进行编码:new String("");
* 代码:username = new String(username.getBytes("iso8859-1"),"utf-8");
【备注】get提交中文乱码解决方法,一般使用前台编码后台解码的方式(第二种方法)
 7.request是域对象
1)域对象:在一定的范围内,可以存值和取值
2)servletContext域对象:范围是整个web项目,存值 setAttribute方法 和取值 getAttribute方法
3)request也是一个域对象:范围是一次请求,存值和取值
* 向request域里面存值的方法:setAttribute(java.lang.String name, java.lang.Object o)
* 从request域里面取值的方法:getAttribute(java.lang.String name) 
4)request域对象范围是一次请求,经常和转发一起使用
* 代码 request.getRequestDispatcher("转发的路径 不带项目名称").forward(..);
【注意】转发时,通过在servlet1里面用request.setAttribute("msg", "设置的内容")设置的值,转发到servlet2里面后,可以在servlet2里面用request.getAttribute("msg")获取,而重定向则不能
 8.重定向和转发的区别
1)重定向
* 重定向请求两次,请求的地址带项目名称
* 302+Location实现重定向的操作
response.setStatus(302);
response.setHeader("Location", "路径 带项目名称");
* 简写形式:response.sendRedirect("路径 带项目名称");
2)转发
* 转发请求一次,路径不需要带项目名称(在服务器内部进行操作)
request.getRequestDispatcher("转发的路径 不带项目名称").forward(request, response);
3)重定向:从一个网站到另外的一个网站
    转发:请求的过程中需要携带数据操作
【注意】
* 转发是一次请求一次响应,重定向是两次请求两次响应。
* 转发是response的转发,对象不发生改变,转发的是同一个对象,需携带数据,转发在服务器内部进行;重定向是request的重定向,对象发生改变,不携带数据。
* 重定向时页面会跳转到新的url页面,转发时页面不会重新跳转到新的url页面。
* 重定向时重定向的路径需要带项目名称(/项目名称/url),转发时转发的路径不需带项目名称(/url)




【】9、转发的案例【request与response】
 1.使用request域对象+转发实现登录功能
1)创建登录页面,在登录页面中写表单,提交到servlet里面
2)创建servlet,在servlet里面获取表单提交的数据,判断用户名和密码是否正确
3)如果用户名和密码都正确,表示登录成功,向页面输出内容
4)如果用户名或者密码错误,表示登录失败,转发到登录页面(同时向页面显示错误信息)
转发的代码:request.getRequestDispatcher("登录的页面 不带项目名称").forward(request, response);
传递数据的页面:首先把显示内容放到request域里面,使用转发到登录页面,在登录页面中使用el表达式获取request域里面的值
 2.知识的引入
1)jsp:sun公司用于动态网站的技术,jsp就是servelt,最终会编译成servlet
2)el表达式:用于获取域对象里面的值  ${名称}
【补充】jsp与servlet区别:jsp本质上是一个servlet,jsp是页面形式的html,后台会编译成servlet,通过tomcat服务器进行运行;servlet(服务器程序)是一个后台形式java文件,可以通过tomcat以网页形式访问


【小结】响应头不同功能的代码
(1)重定向:(302+)Location
* 写法::response.setStatus(302);
       response.setHeader("Location", "要重定向的路径 带项目名称");
 简写形式:response.sendRedirect("要重定向的路径 带项目名称");
* 代码:
(2)定时跳转:Refresh:
* 写法:response.setHeader("Refresh","在几秒值后跳转;url=要跳转到页面的路径");
* 代码: response.setHeader("Refresh", "5;url=/day08-1/login.html");
(3)设置页面编码:Content-Type
* 写法:response.setHeader("Content-Type", "text/html;charset=编码方式");
* 代码:response.setHeader("Content-Type", "text/html;charset=utf-8");
 简写形式:response.setContentType("text/html;charset=UTF-8");简写形式同时设置了浏览器和response缓冲区的编码
(4)下载:Content-Disposition
* 写法:response.setHeader("Content-Disposition", "attachment;filename=文件名(带后缀)");
* 代码:response.setHeader("Content-Disposition", "attachment;filename="+filename);


【小结】域对象
  域对象
1.ServletContext: 一个web项目
setAttribute(String name, Object object); set值以后,该项目中所有地方都可以使用ServletContext.getAttribute()方法获取设置的值
getAttribute(String name);

2.request: 一次请求
setAttribute(String name, Object object); set值以后,本次请求可以使用request.getAttribute()方法获取设置的值
getAttribute(String name);

3.session: 一次会话
setAttribute(String name, Object object); set值以后,本次会话可以使用request.getAttribute()方法获取设置的值
getAttribute(String name);

  具有各自的作用
1.ServletContext:
getInitParameter(String name);等方法,获取设置在web.xml中的全局初始化参数
getInitParameterNames();
2.request
getParameter(String name); 获取前台传递的数据(不值用来接收表单提交)
getParameterValues();

------------------------------------------------------------------------------------------------
day09


【】【cookie&session】


【第一部分:jsp入门和el表达式入门】


【】1、jsp的入门【jsp入门和el表达式入门】
 1.什么是jsp:
1)sun公司用于动态网站开发技术,使用servlet如果向页面输出内容很麻烦,有了jsp,使用jsp向页面输出内容很方便,jsp就是servlet,最终会被编译成servlet,放到tomcat的work目录。
2)jsp:java server pages,java服务器端页面,jsp会编译成servlet,通过tomcat服务器进行运行。
 2.jsp在什么时候编译成servlet:在访问jsp时候会编译成servlet
 3.jsp的组成:html+java代码+jsp自身的一些东西
 4.jsp里面如何嵌入java代码,有三种方式
1)第一种方式:<%!  %> : 在里面定义变量,这个变量是成员变量。代码后面要加分号。
2)第二种方式:<%=  %> :表示向页面输出内容(固定值、变量)
* 生成的servlet代码会在service里面,生成的代码为out.print(输出的内容);
* 后面不要加分号;
3)第三种方式:<%  %> :书写java代码,编译成servlet之后,代码生成在service方法里。代码后面要加分号。
 5.在jsp中html代码和java代码混合使用
html代码与HTML页面书写方式一致,java代码放在<%  %> 内
【注意】jsp中html代码和java代码混合使用方法:将java代码写在<%  %>内的%号内,html代码写在<%  %>外


【】2、el表达式的入门【jsp入门和el表达式入门】
 1.作用:获取域对象里面的值,不能使用在html中,使用在jsp中
 2.写法:${设置的名称}
 3.通过例子演示el表达式
1)创建jsp页面,在jsp中向两个域对象里面设置值(servletContext、request)
getServletContext().setAttribute("contextName", "contextvalue");  向servletContext域里面设置值
request.setAttribute("requestName", "requsetvalue");向request域里面设置值
2)在jsp中首先使用传统方式获取域对象里面的值
   <%=getServletContext().getAttribute("contextName") %>
   <%=request.getAttribute("requestName") %>
3)在jsp再使用el表达式获取域对象里面的值
${contextName }
   ${requestName }
 4.其他的问题
1)使用el表达式获取的域对象名称不存在
* 如果使用传统方式获取域对象的值不存在,返回null,容易造成空指针异常
* 使用el表达式获取的域对象名称不存在,返回空字符串 "",不会造成空指针异常
2)如果分别向多个域对象里面设置值,名称都相同
* 使用el表达式获取的值是域范围小的里面的值
* 分别获取不同的域对象里面的值
${requestScope.msg }
${applicationScope.msg }


【】【第二部分:会话管理 cookie技术】
【】1、会话管理的简介【会话管理 cookie技术】
 1.什么是会话:打开浏览器,进行网页的浏览,到关闭浏览器的过程,称为一次会话
 2.会话技术用两种技术
1)cookie技术:客户端的技术
2)session技术:服务器端的技术
 3.使用域对象是否保存购物信息
1)使用request域是否保存购物信息
因为request域范围是一次请求,所以最终结算时候在request域里面没有任何购物信息
2)使用servletContext域是否保存购物信息
因为每个项目有一个servletContext域对象,不同的人购物的商品都要存到这个域里面,不同的人购买的商品需要加标记以区分,逻辑处理比较复杂。
 4.使用cookie和session技术保存购物信息
1)使用cookie保存购物信息
* 第一次购买鼠标,在服务器端得到鼠标,把鼠标放到cookie里面,把cookie返回到浏览器中
* 第二次购物键盘,携带浏览器里面鼠标发送请求,在服务器端分别得到购物的商品和携带商品,把这两个商品放到cookie里面,把cookie返回到浏览器中
* 最终结算:携带浏览器中的商品发送请求,完成结算
2)使用session保存购物信息
* 第一次购买商品A,在服务器端得到商品A,开辟一个空间,把商品A放到空间里面,返回一把可以打开空间的钥匙,把这把钥匙返回到浏览器中
* 第二次购买商品B,携带浏览器中的钥匙发送请求,在服务器端得到购买的商品和携带钥匙,使用钥匙打开空间,把购买的商品B放到空间中,返回一把新的钥匙到浏览器中
* 最终结算:携带着浏览器中的钥匙发送请求,在服务器端获取钥匙,使用钥匙打开空间,把空间中的商品取出来,最终完成结算


【】2、cookie的api使用【会话管理 cookie技术】
 1.cookie的分类:分成两类
1)第一类:会话级别的cookie,在关闭浏览器之后,cookie销毁了,在默认的情况下是会话级别的cookie
2)第二类:持久化的cookie,在一定的时间范围内,cookie一致有效。
* 设置成持久化的cookie,使用setMaxAge(int expiry) :参数是秒
 2.常用的方法
1)Cookie[] getCookies() :得到所有的cookie[httpServletRequest类中的方法]
2)addCookie(Cookie cookie) :把cookie返回到浏览器中(回写)[httpServletResponse类中的方法]
3)new Cookie(java.lang.String name, java.lang.String value) [Cookie类中的方法]
两个参数:第一个参数是cookie名称,第二个参数是值
4)getName() :得到cookie的名称 [Cookie类中的方法]
5)getValue() :得到cookie的值 [Cookie类中的方法]
6)setMaxAge(int expiry) :设置cookie的有效时长
7)setPath(java.lang.String uri) :设置cookie的有效路径
* 比如通过setPath方法设置了一个路径,在浏览器的地址栏输入一个地址,如果这个地址包含设置的路径,才会携带cookie信息过来
* 举例
setPath("/day10")
访问路径: http://127.0.0.1/day10/demo1 ,会携带cookie信息
访问路径: http://127.0.0.1/day09/demo2 , 不会携带cookie信息
setPath("/")  任何访问路径都会携带cookie信息
 3.使用注意事项
* cookie大小有限制
* 创建cookie时候至少两部分内容,一个name,一个value
* 在默认的情况下,cookie是一个会话级别cookie
 4.销毁持久化的cookie
第一步:创建一个和要销毁cookie项目名称的cookie  new Cookie("name","");
第二步:设置cookie有效时长 setMaxAge(0)
第三步:设置有效路径 ,要和销毁的cookie的路径一致 ,一般写成setPath("/")
第四步:把cookie回写到浏览器中


【】练习二:使用cookie记录用户浏览的商品【会话管理 cookie技术】
 1.基本步骤
1)使用超链接提交不同的商品,每个商品是id值区分
2)在servlet中得到点击商品的id值,把id值放到cookie里面,再把cookie回写浏览器中
3)如果第一次访问商品id=1.把1放到cookie里面,返回到浏览器中
  第二次访问携带id=1的值进行访问,在服务器端得到当前浏览商品id和携带的id值,把这两个id值放到cookie里面,返回到浏览器中。
 2.实现清空浏览记录,即销毁持久化的cookie操作



【】【第三部分:会话管理 session技术】
【】1、session的简介【会话管理 session技术】
 1.session是服务器端的技术
 2.创建session:使用request里面getSession()创建session对象,名称:HttpSession 
 3.在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),
注意:一个浏览器独占一个session对象(默认情况下)
 4.session域对象
1)域对象:在一定的范围内,存值和取值
2)session域对象,范围是一次会话,存值和取值
3)存值的方法:setAttribute(java.lang.String name, java.lang.Object value) 
    取值的方法:getAttribute(java.lang.String name) 
 
 
【】2、练习:使用session实现简单的购物车【会话管理 session技术】
 1.实现的步骤
第一步:判断是否是第一次加入到购物车
* 判断session里面是否有名称是 cart的值
第二步:如果是第一次加入到购物车,
* 得到商品id,根据id得到名称,把名称和数量1加入到购物车(购物车可以用Map表示)
第三步:如果不是第一次加入到购物车,
* 判断当前要加入到购物车的商品在购物车里面是否存在,如果已经存在,获取出商品数量,+1,放回购物车里面,如果不存在,直接把商品名称和数量1加入到购物车
第四步:把购物车放到session里面(将map放到session里)
 2.清空购物车,即销毁session
* 调用session里面方法 invalidate() 
 


【】session的创建和销毁【会话管理 session技术】
 1 session的创建
* 使用request里面方法 getSession()可以创建session对象,返回的是HttpSession 
 2 session的销毁,有三种方式
1)非正常关闭服务器
2)session默认的过期时间,默认为30min
   
30
   

3)调用session里面方法 invalidate() 

你可能感兴趣的:(学习笔记)