Java工程师培训课(十四【新的领域】)

夜光序言:

 

 

正文:

XML入门

1.1 引入

HTML,超文本标记语言。

html语言语法是很松散的!

1)标签不区分大小写的!

2)标签可以不匹配的。

 

由w3c组织,针对html的语法缺陷,去设计了另一门,叫xml语言。

 

html语言的标签是固定的。

1.2 XML语言

XML:,  Extend Markup lanuage 可扩展标记语言。

 

HTML               XML

概念       超文本标记语言      可扩展标记语言

标记数量   是固定的             是不固定的,可扩展的

作用       负责网页的结构       1)描述带关系的数据结构(作为软件的配置文件)

properties配置文件: 键值对  name=eric   password=123456

xml可以描述包含与被包含的关系。

<student>

<name></name>

</student>

<student>

<name></name>

</student>

配置使用场景:

1)框架(struts2 , hibernate,spring),xml作为框架的配 置文件

        2)tomcat服务器软件配置文件(web.xml server.xml)

 

2)装载数据(作为小型的“数据库”)。

 

2 XML作用

2.1 作为软件配置文件

PCweb服务器:学生管理系统 - > 添加学生 -> name=张三,age=20  -》 提交到后台程序 - 》 把数据存储到数据库中

 

两台通讯条件;

IP地址和端口

java代码: 根据ip和端口连接数据库服务器(ip改动会改变代码)

 

properties文件:

ip=211.34.21.43

port=20

xml文件:

<host-list>

<host id="main">

<ip> 211.34.21.43</ip>

<port>20</port>

</host>

<host id="backup">

<ip> 211.34.21.44</ip>

<port>20</port>

</host>

</host-list>

PC数据库服务器1:oracle数据库  211.34.21.43     20

 

PC数据库服务器2:oracle数据库  211.34.21.44     20

 

2.2 作为小型数据库

 

教师管理系统      教师信息: 姓名  工龄  邮箱地址

 

传输数据:

字符串:  张|三|20|zhangsan@qq.com|.......|....  (格式不是行业规范的,不通用)

xml格式:

<teacher-list>

<teacher>

<name></name>

<email></email>

<workage></workage>

....

</teacher>

<teacher>

<name></name>

<email></email>

<workage></workage>

....

</teacher>

<teacher-list>              (xml是w3c组织的制定的标准)

json格式

 

获取字符串,截取字符串数据。

财务系统

发邮件给教师:

邮箱地址   姓名

 

方案1:财务系统中也存储了一套教师信息。数据维护成本比较高了!!!

方案2: 财务系统使用的教师数据从教师管理系统中发送过去的。

3 XML语法

3.1 标签

<student>学生</student>  

 注意:

1)分带标签体的标签,也有空标签。

2)标签是区分大小写

3)标签一定要配对

4)标签中间不能含有空格

5)不能使用数字开头

6)如果没有指定名称空间的话, 标签名中间不能含有冒号

7)在同一个xml文件中,有且仅有一个根标签

3.2 属性

<student id="1"></student>

注意:

1)一个属性分为属性名和属性值。属性名和值之间使用=号分割。

2)属性值一定要使用单引号或者双引号包含,不能省略,也不能单双混用!

3)一个标签内可以包含多个属性,但是不能出现同名的属性

3.3 注释

<!--  xml --->

3.4 文档声明

<?xml version="1.0"  encoding="码表"?>

 

version: xml的版本号

encoding: 表示解析xml文件内容时使用的码表

 

xml文件的编码问题:

1)xml文件内容保存的编码(另存为-》选择编码保存)

2)解析xml文件内容的编码(   <?xml version="1.0" encoding="utf-8"?> )

以上两个编码必须保存一致,才能避免中文乱码问题。

注意:

如果在ecplise开发工具上,编写xml文件,那么xml文件内容自动按照文档声明的encoding的编码保存,所以不会中文乱码问题.

 

3.5 转义字符

和html的转义字符.

3.6 CDATA块

把CDATA块中的内容全部原样输入

3.7 处理指令(不用了,过时了)

<?xml-stylesheet type="text/css" href="1.css"?>

 

练习:

通讯录程序

联系人: 编号  姓名  性别  手机  地址  QQ

要求:

1)编写一个xml文件。(contact.xml),该文件描述联系人的信息

2)该文件可以同时描述多个联系人。

 

4 XML解析

4.1 xml解析方式

1)DOM解析:

2)SAX解析

4.2 DOM解析的工具

Sun官方jaxp工具

jdom工具

dom4j工具: 三大框架读取xml文件的程序。(非官方的,第三方的)

dom for java

iphone4s  iphone for steven   

 

4.3 dom4j工具使用

1)到dom4j的官方下载 。dom4j-1.6.1.zip

2)导入dom4j的支持jar包、

dom4j-1.6.1.jar核心包

 

 

 

总结:

xml解析

dom解析方法: dom4j的工具

 

查:

标签: element("name")  

elements("name")

elements();

getName() 标签名称

getRootElement(): 根标签

属性: atrributeValue("name")  属性值

atrribute("name")  对象

atrributes()  属性对象列表

getName() : 属性名

getValue() 属性值

文本:

  getText();  当前标签的文本

  elementText("name")  子标签的文本

 

增:

DocumentHelper.createDocument()   文档

addElement("name");   标签

addAtribute("name","value" )  属性

 

改:

setValue()   修改属性值

addAttribute(”同名“) 修改属性值

setText()    修改文本内容

 

删除:

detach()   标签、属性

getParent().remove(标签/属性)

 

 

夜光-作业:

编写一个通讯录程序

功能需求:

1)增加联系人

2)修改联系人

3)删除联系人

4)查询所有联系人(全部)

要求:

1)交互使用控制台进行交互

2)联系人的数据存储到xml文件中(contact.xml)  (dom4j的操作)

 

 

回顾重点内容:

XML解析-DOM解析

 

1)DOM解析的原理:

xml解析引擎把一个xml文件一次性加载进内存,在内存中创建一颗document对象树。通过树上的对象获取或设置xml文件信息

 

2)基于dom解析原理工具

dom4j工具

 3)dom4j使用方法

查:

Document doc= new SAXReader().read("xml文件");

标签:

element("name")  查询第一个子标签

    elements("name")  查询指定名称的所有子标签

elements()       查询所有子标签

属性:

    attributeValue("name")  根据属性名获取属性值

attribute("name")  根据属性名获取属性对象

getName()  属性名   /  getValue()  属性值

   文本:

getText()    获取当前标签的文本内容

elementText("name")  获取子标签文本

 

增:

文档: DocumentHelper.createDocumnt();

标签:  addElement("name")   

属性:  addAttribute("name","value")

改:

属性值: setValue("修改值")  /  addAttribute("同名属性","修改值")

文本:  setText("文本")

删:

标签、属性: detach()   /    getParent().remove(标签/属性)

 

1 XPath技术

1.1 作用

作用: 快速地查询到xml文件中节点。

 

当xml文件中的标签层次结构很深,那么如何来快速地定位到所需的标签呢?这就用到了xpath技术!!

 

1.2 体验xpath技术

1)导入jaxen-1.1-beta-6.jar  dom4j的xpath插件包

2)在dom4j中使用xpath

      List<Node> list = selectNodes("xpath表达式")  查询多个节点

 Node node = selectSingleNode("xpath表达式")   查询一个节点

1.3 xpath表达式(重点)

/   绝对路径    斜杠在最前面,代表xml文件的根。斜杠在中间,表示子元素。

//  相对路径    选择后代元素(不分层次结构)

*   通配 选择所有元素

[ ]   条件        选择什么条件下的元素。例如 /AAA/BBB[1] 选择第一个BBB子元素

@   属性         选取属性

=    内容 (值)  

and  逻辑与

text()   选取文本内容

 

1.4 案例

模拟登录效果:

用户输入用户名密码 -> 到“数据库”中是否存在用户名和密码的用户 -》

存在: 登录成功

   不存在: 登录失败

 

  

2 SAX解析

2.1 引入

xml解析方法:

dom解析:原理xml解析引擎一次性把整个xml文件加载进内存,在内存创建一颗document树。

问题:大文件的话,使用dom解析效率比较低,甚至会导致内存溢出。

编码方式: 面向对象编程方式

 

sax解析: 原理加载一点,读取一点,处理一点。优势:占用的内存比较小。

编程方式:基于事件编程方式。

2.2 SAX解析工具

sun公司官方的sax解析工具。  在jdk中包含sax解析工具的api。org.xml.sax.*;

 

2.3 SAX解析的开发步骤

2.4 SAX案例

 

===============  DOM解析 vs  SAX解析=====================

 

 

DOM解析

SAX解析

原理

一次性加载进内存,构造docuemnt数,内存占用比较大

加载一点,读取一点,内存占用相对小

读取顺序

可以读取XML文件任意位置信息,甚至往回读

只能是从上往下依次读取,不能往回读

操作方式

可以进行查询,也可以进行修改

只能查询

编码方式

面向对象编程方式,更加适合java开发者

基于事件编程方式,相对java开发难理解

 

3 XML约束

3.1 什么是约束?

xml语法: w3c组织对xml文件的编程规则规范。(w3c组织制定的)

xml约束: 由开发者指定的对xml文件内容规范。(开发者根据业务指定的)

 

3.2 约束分类

DTD约束:相对简单的,数据类型简单的

场景:hibernate  struts2

Schema约束:相对复杂,功能很强大,数据类型非常丰富。schema的出现时为了替代DTD的。

 

3.3 DTD约束

1)dtd的使用方法

内部的dtd

外部的dtd

 

2)语法

约束标签

<!ELEMENT 元素名称 类别> 或 <!ELEMENT 元素名称 (元素内容)>

 

类别:

EMPTY:空标签

PCDATA:普通字符串(不能包含子标签)

ANY: 任意内容(可以包含子标签)

 

顺序问题:

(子元素名称 1,子元素名称 2,.....): 一定要依次出现1,2,...

 

数量问题:

子元素:  有且仅有1个

+ :    1个或多个

* :  0个或多个

? :    0个或1个

 

 

约束属性

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

 

默认值

#REQUIRED:必须

#IMPLIED:不是必须的

#FIXED value : 固定的

 

属性类型:控制属性值

CDATA:普通字符串

(en1|en2...): 枚举中的一个值

ID: 唯一的值

 

3.4 schema约束

重点:名称空间

 

 

总结:

1)xml语法:

标签、属性、文档声明、处理指令

2)xml解析(运用)

Dom解析:原理???(面向对象)

2.1 dom解析的工具:dom4j工具

2.2 对xml文件增删改查 (方法)

2.3 xpath技术: 快速查询xml文件的节点(标签,属性,文本)

SAX解析:原理???(基于事件的)

2.1 DefaultHandler类

startElement(): 开始标签

characters():文本内容

endElement(): 结束标签

3)xml约束(看懂)

dtd约束:简单

schema约束: 看得懂名称空间,如何找到scheme约束文件?

语法查询w3c文档

 

夜光:作业:通讯录程序

 

web开发入门

1.1 回顾软件结构分类

C/S: 客户端与服务器端

特点:

1)需要安装特定的客户端

2)服务器程序升级,那么客户端程序同步升级

B/S: 浏览器与服务器端

特点:

1) 不需要安装特定的客户端(只需要一个浏览器软件)

2) 服务器程序升级,客户端程序不需要升级。

 

结论:进入web开发之后,软件结构从C/S 过渡到 B/S

java web开发就是基于B/S结构软件。

1.2 服务器

从物理上来说,服务器就是一台PC机器。通常配置比较高。CPU 4核,内存8G以上,硬盘T

 

web服务器:在PC机器上,安装了web服务软件,提供web服务

数据库服务器:在PC机器上,安装了数据库软件(mysql/oracle/sql server),提供了数据存储的服务

邮件服务器:在PC机器上,安装了收发邮件服务软件,提供了收发邮件的功能

收邮件服务器:pop3.126.com

发邮件服务器:stmp.126.com

 

1.3 web服务软件原理

web服务软件作用:把本地的资源公开给外部访问

 

javaweb: B/S   浏览器- >web服务软件

 

 

/**

 * socket服务器端程序

 * 1)把本地资源读取

 *  2)发送给不同的客户端

 * @author APPle

 *

 */

public class SocketServer {

 

public static void main(String[] args) throws Exception{

//1.创建ServerSocket

ServerSocket server = new ServerSocket(8888);

 

System.out.println("服务器已经启动....");

 

while(true){

//2.接收客户端的请求

Socket socket = server.accept();

 

//3.读取本地的文件

File file = new File("e:/myweb/test.html");

 

FileInputStream fis = new FileInputStream(file);

 

//4.构建数据发送通道

OutputStream out = socket.getOutputStream();

 

//5.开始发送数据

byte[] buf = new byte[1024];

int len = 0;

while( (len=fis.read(buf))!=-1 ){

out.write(buf, 0, len);

}

//6.关闭资源

fis.close();

out.close();

}

}

}

 

1.4 常用的市面上web服务软件

web服务软件 , 也可以说成是web服务器   

 

WebLogic: 是BEA公司的产品。支持JavaEE规范。收费的。

javaSE规范:支持 IO流,集合,网络编程,线程技术

javaEE规范: 支持13种技术。servlet、jsp、ejb、jdbc

 

WebSphere: 是IBM公司的产品。支持JavaEE规范。收费的。解决方案

WebSphere -> IBM操作系统(aix)- IBM服务器PC - IBM数据库(DB2)

JBoss: 是Redhat公司的产品。支持JavaEE规范。linux。软件免费开源的。服务收费的。

Tomcat: 是 Apache开源组织的产品。支持servlet/jsp规范(不支持ejb)。开源免费的

tomcat用在中小应用。

 

web开发基础阶段重点使用tomcat服务器

2 Tomcat服务器

2.1 基本操作

1)去apache官网。www.apache.org . tomcat的产品页面: http://jakarta.apache.org

2)tomcat不同的安装包

安装版本:  window(exe  msi)      linux(rmp)

压缩版本:   不分window和linux (zip 、 tar 、rar) 学习时使用

 

2.2 启动和关闭

1)启动

a)找到%tomcat%/bin/startup.bat,双击,弹出一个窗口停止不动。

b)确认窗口上显示没有任何错误,然后打开浏览器输入:

http://localhost:8080

 

看到一只猫,证明tomcat服务器启动成功!!!

 

2)关闭

找到%tomcat%/bin/shutdown.bat,双击。

 

2.3 体验tomcat服务器作用

tomcat服务器作用:把本地资源公开给外部访问

 

webapps: 把需要公开访问的文件放到该目录

2.4 URL

URL: 统一资源定位符。用于定位基于http协议的资源。

 

浏览器:  http://localhost:8080/myweb/test.html

 

http:// : 协议,http协议

执行流程: 在本地找hosts文件,如果找不到,联网找网络运营商的DNS服务器

localhost   域名。

localhost: 本地域名

www.baidu.com: 外地域名

8080      定位具体的一个软件。

tomcat: 8080

mysql:3306

oracle: 1521

myweb  : web应用的根目录。

test.html:  web资源

 

练习:

1)把tomcat服务器启动

2)在webapps建立  myweb目录,编写一个html文件

3)互相通过浏览器访问(URL)

 

2.5 tomcat服务器常见问题

1)闪退

原因: 在tomcat服务器启动时(运行startup命令),在本地环境变量中查找一个叫JAVA_HOME的环境变量。(tomcat用java开发,需要用jvm运行)

解决办法: 在本地环境变量中添加一个JAVA_HOME

JAVA_HOME= C:\Program Files\Java\jdk1.6.0_30 

 

2)端口占用问题

原因: tomcat服务器启动所需端口被其他软件所占用

解决办法:

1)把占用端口的软件停止掉(进程杀死)

2)改变tomcat服务器启动端口

找到%tomcat%/conf/server.xml

 

<Connector port="8081" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

 

3)CATALINA_HOME环境变量

原因: tomcat在启动后会通过CATALINA_HOME环境变量加装tomcat的根目录下的文件(例如conf、webapps)

解决办法:建议不要设置CATALINA_HOME环境变量

 

注意:安装版的tomcat会自动设置CATALINA_HOME环境变量设

3 Tomcat服务器目录结构

|-bin: 目录。存放tomcat操作命令。bat是window版本,sh是linux版本。

startup.bat : 后台在调用catalina.bat start

shutdown.bat  : 后台在调用catalina.bat stop

|-conf: 目录。存在tomcat服务器软件的配置文件。server.xml文件是核心配置文件。

|-lib:目录。支撑tomcat软件运行的jar包。

|-logs:目录。存在tomcat服务器运行过程中日志信息。

|-temp: 目录。tomct的临时目录,存在临时文件。

|-webapps: 目录。存在web应用的目录

|-work: 目录。tomcat运行目录。存放jsp页面运行过程中产生的临时文件。

4 web应用目录结构(规范)

|- WebRoot: 根目录。一个web应用必须有一个根目录。

|- 静态资源:  html+css+javascript+images+xml

|-WEB-INF: 目录。名称是固定写法。

|-classes: (可选) 目录。名称是固定写法。存放class字节码

|-lib: (可选)目录。名称是固定写法。存放jar包。不能有子目录,全部jar包放在根目录下。

|-web.xml: 文件。web应用的配置文件。

 

注意:

1)不做任何配置的情况下,WEB-INF目录下的文件不能直接通过浏览器访问。

2)在web.xml文件中进行配置,那么WEB-INF目录下的内容就可以被外部访问到!!!

5 web应用部署三种方法

1)直接把web应用拷贝到webapps目录下

默认web应用:ROOT是默认应用。访问默认应用,不需要web应用名称。

默认资源:访问默认资源,不需要web资源名称。

在web.xml文件中配置

 

    <!-- 默认资源-->

<welcome-file-list>

<welcome-file>index.html</welcome-file>

<welcome-file>test.html</welcome-file>

<welcome-file>abc.html</welcome-file>

</welcome-file-list>

 

问题:tomcat软件和web应用绑定在一起。

解决办法: 把tomcat软件和web应用分离!!!使用到虚拟web应用(虚拟网站)

2)虚拟网站配置

在%tomcat%/conf/server.xml文件中修改:

<Host name="localhost"  appBase="webapps"

            unpackWARs="true" autoDeploy="true"

            xmlValidation="false" xmlNamespaceAware="false">         

 <!--配置虚拟网站

docBase: web应用所在的绝对路径位置。

path: 访问web应用使用的名称。名称可以自定义

-->

<Context docBase="C:\projects\myweb" path="/itcast"/>

</Host>

 

注意:

如果path为空字符串,那么也不需要名称访问该web应用,而且优先于ROOT应用。

问题:修改了server.xml核心配置文件,风险比较高。

解决办法: 添加配置文件方法配置虚拟网站。

3)添加配置文件方法配置虚拟网站(推荐使用)

在%tomcat%/conf/Catalina/localhost目录下,添加abc.xml文件

 

<?xml version="1.0" encoding="utf-8"?>

<!-- 配置虚拟网站

访问web应用名称就是xml的文件名abc

-->

<Context docBase="C:\projects\myweb"/>

 

6 Tomcat的站点配置

站点的配置:

<Host name="localhost"  appBase="webapps"

            unpackWARs="true" autoDeploy="true"

            xmlValidation="false" xmlNamespaceAware="false">

 

        </Host>

 

1)name: 表示站点的名称。访问站点就使用站点名称

       appBase: 表示站点的根目录。用于存放所有web应用。一个站点下可以包括多个web应用

 

 

如何在tomcat下配置一个站点:

1)修改%tomcat%/conf/server.xml

 

<!--- 配置一个新的站点: www.baidu.com

name: 站点的名称

appBase:站点的根目录

  -->

  <Host name="www.baidu.com"  appBase="C:\baidu"

            unpackWARs="true" autoDeploy="true"

            xmlValidation="false" xmlNamespaceAware="false">

 

      </Host>

 

2)修改本地域名和ip的映射文件hosts文件,加上

 127.0.0.1       www.baidu.com

3)启动tomcat,访问测试

在浏览器访问:

默认站点:

http://localhost:8080

新站点:

http://www.baidu.com:8080/news/index.html

 

练习: 在本地tomcat服务器上配置一个新浪站点。域名: www.sina.com.cn

7 手动开发动态资源

7.1 静态资源 vs 动态资源

静态资源: html+css+javascript

动态资源: servlet+jsp

 

静态资源: 当用户多次访问该资源时,资源的源代码永远不会发送改变的资源。

动态资源: 当用户多次访问该资源时,资源的源代码可能会发生改变的资源。

 

7.2 开发动态资源技术

Servlet技术: 用java语言开发动态资源的技术

 

Servlet技术特点:

1)Servlet是普通的java类,继承HttpServlet类,覆盖doGet方法

2)Servlet程序必须由tomcat服务器运行!!!

 

开发servlet的步骤:

 

1)编写servlet程序,继承HttpServlet

 

/**

 * 第一个servlet程序

 * @author APPle

 *

 */

public class HelloServlet extends HttpServlet{

 

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

//向浏览器输出内容

resp.getWriter().write("this is first servlet!!!"+new Date());

}

 

}

 

2)把servlet交给tomcat服务器运行!!!

  2.1 把class字节码文件拷贝到web应用的WEB-INF/classes目录下

 

  2.2 在web应用的web.xml文件配置servlet

 

<web-app xmlns="http://java.sun.com/xml/ns/javaee"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

   version="2.5">

 

<!--配置一个servlet -->

<servlet>

<!-- servet的内部名称。可以自定义-->

<servlet-name>HelloServlet</servlet-name>

<!--- servlet程序的全名:包名+简单类名 -->

<servlet-class>gz.itcast.b_servlet.HelloServlet</servlet-class>

</servlet>

 

<!-- servlet的映射配置-->

<servlet-mapping>

<!--servet的内部名称,和上面内部名称保持一致!!! -->

<servlet-name>HelloServlet</servlet-name>

<!-- servlet映射路径: 表示在浏览器上访问该servlet程序的名称。该名称可以自定义 -->

<url-pattern>/hello</url-pattern>

</servlet-mapping>

</web-app>

 

3)浏览器访问servlet:

http://localhost:8080/myweb/hello

 

8 使用工具开发动态资源

1)创建一个web proejct

2)在WebRoot下编写静态资源文件(html+css+javascript)

3)在src目录下编写servlet动态资源

使用servlet代码生成器:

a)右键src- > new -> 点击”servlet“

b)servlet的包,类名,指定覆盖的方法(doGet)

c)next-> servlet内部名称(不用改)-> url (访问servlet名称,可以改) -> finished

点击finished之后,生成servlet的代码和web.xml的配置信息

4)关联tomcat服务器

a)window-> preferences- > MyEcplise->servers-> Tomcat6.X

b)选择tomcat的根目录,然后enable。

5)部署项目

6)启动tomcat,访问测试

 

 

1 Http协议入门

1.1 什么是Http协议?

Http协议: 对浏览器客户端 和 服务器端数据传输格式的规范!!!!

1.2 查看Http协议工具

1)火狐浏览器的firebug

2)谷歌浏览器的审查元素

3)telnet工具

a)cmd输入 telnet localhost 8080 回车

b)ctrl+] 回车

c)输入请求,回车

GET /day09/first HTTP/1.1

Host: localhost:8080

 

1.3 Http协议内容详情

浏览器->服务器(请求)

GET /day09/first HTTP/1.1

Host: localhost:8080

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Connection: keep-alive

 

服务器->浏览器(响应)

HTTP/1.1 200 OK

Server: Apache-Coyote/1.1

Content-Length: 51

Date: Sun, 28 Dec 2014 01:51:16 GMT

 

this is first servlet!!Sun Dec 28 09:51:16 CST 2014

 

2 Http请求

GET /day09/first HTTP/1.1            --请求行(必须有)

Host: localhost:8080                --多个请求头(必须有)

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Connection: keep-alive

                                --一个空行

name=eric&password=123456       --请求实体内容(可选)

 

2.1 请求行

GET /day09/first HTTP/1.1

#http协议版本:

http1.0: 当浏览器客户端与服务器连接之后,只能向服务器发送一次请求。

http1.1: 当浏览器客户端与服务器连接之后,可以发送多次请求。(效率比1.0高)

 

问题:一个web页面中,使用img标签引用了三幅图片,当客户端访问服务器中的这个web页 面时,客户端总共会访问几次服务器,即向服务器发送了几次HTTP请求。

答案:4次

#请求资源

URI: 统一资源标识符(可以定位本地文件,局域网文件,互联网文件)

URL:统一资源定位符(定位互联网文件),是URI的子集。

 

/day09/first  : web应用名称+web资源名称

 

#请求方式

请求方式: GET / POST  / HEAD / PUT / CONNECT/  TRACE / DELETE

常用的请求方式: GET  和  POST

 

表单提交:

<form action="提交的地址" method="GET/POST">

 

</form>

 

=========GET 和 POST方式区别?==============

GET方式:(在地址栏输入的请求,默认是GET方式)

1)地址栏会发送改变。请求参数会跟在URI后面。参数以?开头,参数之间用&分割

2)不合适传递敏感数据

3)GET方式提交内容有限制的,不超过1kB。

 

GET /day09/testMethod.html?userName=eric&userPwd=123456 HTTP/1.1

Host: localhost:8080

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Referer: http://localhost:8080/day09/testMethod.html

Connection: keep-alive

If-Modified-Since: Sun, 28 Dec 2014 02:40:40 GMT

If-None-Match: W/"961-1419734440000"

 

POST方式:

1)地址栏不会改变。请求参数放在请求实体内容中。参数之间用&分割。

2)适合传递敏感数据

3)POST方式提交没有限制的。

 

POST /day09/testMethod.html HTTP/1.1

Host: localhost:8080

User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3

Accept-Encoding: gzip, deflate

Referer: http://localhost:8080/day09/testMethod.html?userName=eric&userPwd=123456

Connection: keep-alive

 

userName=eric&userPwd=123456

 

2.2 多个请求头

常见的请求头:

Accept: text/html,image/*        --浏览器接收的数据类型

Accept-Charset: ISO-8859-1       --浏览器接收的编码格式

Accept-Encoding: gzip,compress    --浏览器接收的数据压缩格式

Accept-Language: en-us,zh-        --浏览器接收的语言

Host: www.it315.org:80             --当前请求访问哪个主机和端口

If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT  --浏览器最后更新的缓存时间

Referer: http://www.it315.org/index.jsp        --当前请求来自于哪里(从超链接过来的请求包含此头)

User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) ---浏览器类型

Cookie: name=eric                                      ---浏览器保存的cookie信息

Connection: close/Keep-Alive                 --浏览器和服务器连接状态。close:关闭连接。keep-alive:保持连接。

Date: Tue, 11 Jul 2000 18:23:51 GMT             --请求发出时间

 

2.3 HttpServletRequeset对象

1)tomcat服务器把http请求信息封装到HttpServletRequest对象中。

2)开发者通过HttpServletRequest对象得到http请求信息。

 

请求行:

request.getMethod(); 请求方式

request.getRequestURI()  请求资源

request.getRequestURL()

request.getProtocol()   协议版本

请求头:

request.getHeader("name"): 根据请求头获取请求值

request.getHeaderNames(): 获取所有请求头名称

实体内容:

request.getInputStream();

2.4 请求案例

案例【浏览器类型】

案例【拦截用户非法请求】

 

下载资源网站(csdn) -> 点击下载 -> 弹出广告页面(点击下载) -> 开始下载(资源链接)

 

(非法链接)发给朋友:点击资源链接 -> 广告页面(点击下载) ->   开始下载

 

非法链接:

不是从广告页面过来的链接

 

案例【service和doXX方法的联系】

2.5 请求参数的获取

  Get方式的参数跟在URI的后面

  Post方式的参数放在实体内容中

 

获取参数方式:

GET:request.getQueryString();

POST:request.getInputStream();

 

通用获取参数方式:(不分Post和Get)

   request.getParameter(name) : 根据参数名获取参数值(获取一个参数值)

   request.getParameterValues(name): 根据参数名获取参数值(获取多个参数值)

   request.getParameterNames()  获取所有参数名称

       request.getParameterMap():  获取所有参数

 

2.6 请求参数中文乱码问题

POST方式:

request.setCharacetEncoding(“utf-8”)

 

GET方式:

1)重新解码(推荐使用)

if("GET".equals(request.getMethod())){

//重新解码

hobit = new String(hobit.getBytes("iso-8859-1"),"utf-8");

}

 

2)修改tomcat的server.xml文件

 

<Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" URIEncoding="utf-8"/>

 

3 Http响应

HTTP/1.1 200 OK             --响应行

Server: Apache-Coyote/1.1    --多个响应头

Content-Length: 51

Date: Sun, 28 Dec 2014 01:51:16 GMT

                                --一个空行

this is first servlet!!Sun Dec 28 09:51:16 CST 2014    --实体内容(用户直接看到的内容)

 

3.1响应行

   HTTP/1.1 200 OK

#http协议版本

#状态码

状态码:服务器对于请求处理的结果

 

常见的状态码:

200:  表示请求处理完成。

302:  表示请求需要进一步细化。通常该状态码和location响应头结合使用。

404 : 表示客户端错误,找不到资源。

500:  表示服务器错误。

 

3.2 多个响应头

 

Location: http://www.it315.org/index.jsp  --重定向地址。通常和302状态码配合使用,完成请求重定向效果

Server:apache tomcat    --服务器类型

Content-Encoding: gzip    --服务器发送给浏览器的数据压缩格式

Content-Length: 80        --服务器发送给浏览器数据长度

Content-Language: zh-cn    --服务器发送给浏览器数据语言

Content-Type: text/html; charset=GB2312    --服务器发送给浏览器数据类型

Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT  --服务器资源最后修改时间

Refresh: 1;url=http://www.it315.org  --定时刷新或每隔n秒跳转页面

Content-Disposition: attachment; filename=aaa.zip --告诉浏览器以下载方式打开资源

Transfer-Encoding: chunked

Set-Cookie:SS=Q0=5Lb_nQ; path=/search   --服务器发送给浏览器的cookie信息  

Expires: -1                       --建议浏览器不使用缓存

Cache-Control: no-cache

Pragma: no-cache

Connection: close/Keep-Alive     --服务器和浏览器连接状态。close:关闭连接。keep-alive:保持连接。

Date: Tue, 11 Jul 2000 18:23:51 GMT  --响应发送的时间

 

3.3 HttpServletResponse对象

HttpServletResponse对象用于设置响应信息。

 

常用方法:

响应行:

response.setStatus();  设置状态码

 

响应头:

response.setHeader(name,value);  设置响应头

 

实体内容

  response.getWriter().writer()    以字符格式发送实体内容

response.getOutputStream().writer()  以字节格式发送实体内容

 

3.4 响应案例

【案例】请求重定向 (302 状态码 + location响应头)

【案例】定时刷新

 

编码问题:

1)请求参数(浏览器->服务器)

     request.setCharcterEncoding("utf-8")

 

2)响应数据(服务器->浏览器)

response.setContentType("text/html;charset=utf-8");

 

建议:把以上两句代码放在每个servlet的前两句。

 

1. 会话管理入门

1.1 生活中的会话

我:小张,最近怎样?

小张: 还不错啊,什么时候还钱?

我: 这个嘛,你这么任性,再迟点把。

小张:我就是太任性了,所以才把钱借给你了。

我: 今天天气不错,你那里呢?

小张:.........

 

以上通话过程,会产生对话数据

 

1.2 程序中的会话

程序(BS结构)中的一次会话: 打开浏览器 -> 访问服务器应用  -> 关闭浏览器

 

场景:

登录 : 打开浏览器 -> 登陆页面 -> 输入用户名和密码  ->  后台校验是否登录成功 -.> 登录成功->

进入主页(显示登录的用户信息)

修改个人信息页面(看到用户信息)  

-> 关闭浏览器

 

登录会话过程中,产生会话数据(用户名和密码),怎么保存下来的?

 

购物:

打开浏览器 -> 浏览器商品列表 ->  点击购买 -> 商品进入购物车 -> 关闭浏览器

打开浏览器 -> 直接进入购物车- > 看到之前购买的商品 -> 购买 -> 关闭浏览器

 

购物会话过程中,产生会话数据(商品信息),怎么保存下来的?

 

会话管理: 管理 浏览器客户端  和 服务器端 之间会话过程中产生的会话数据

 

使用域对象保存会话数据:

context域

request域

 

假如使用context域:

张三:

输入“张三”  ->  登录(context.setAttribute("name","张三"))-> 个人信息(context.getAttribute("name")  张三  (变成李四))

李四:

输入“李四”  -》 登录 (context.setAttribute("name","李四")) -> 个人信息(context.getAttribute("name") 李四)

会话信息会产生覆盖。(不合理)

 

假如使用request域:

张三 (request.setAttribute("name",“张三”)) -> 个人信息(request.getAttribute("name"))

-> 个人主页(request.getAttribute("name")))

整个web应用强制使用转发技术。(不合理)

 

1.3 会话管理技术

Cookie技术: 会话数据保存在浏览器客户端。

Session技术: 会话数据保存在服务器端。(域对象)

2 Cookie技术

2.1 Cookie技术特点:

会话数据保存浏览器客户端

2.2 Cookie的API

Cookie类: 保存会话数据

 

1)创建Cookie对象,用于保存会话数据

new Cookie(java.lang.String name, java.lang.String value)

2)设置Cookie对象

void setPath(java.lang.String uri)  设置cookie有效路径

void setMaxAge(int expiry)     设置cookie的有效时长

void setValue(java.lang.String newValue)  设置cookie的值

3)发送Cookie数据到浏览器保存

response.addCookie(cookie);

4)接收浏览器发送的Cookie数据

Cookie[] request.getCookies()

2.3 Cookie的原理

  1)服务器端创建Cookie数据,然后通过set-cookie的响应头把cookie数据发送给浏览器保存

响应头: 例如: set-cookie: name=eric

 

2)浏览器得到服务器发送cookie数据,保存在浏览器目录中。

3)浏览器在下次访问服务器时,会带着cookie数据访问服务器。通过cookie的请求头把cookie数据发送给服务器端

请求头: 例如 : cookie: name=eric

4)服务器可以接受浏览器发送的cookie数据

request.getCookies();

2.4 Cookie的细节

1)设置cookie有效路径: setPath(uri) 。如果cookie在有效路径下,那么浏览器在下次访问该有效 路径时就会带着cookie数据到服务器。

2)设置cookie的有效时长: setMaxAge(整数)

正整数: cookie数据保存在浏览器的缓存目录中(硬盘中)。例如10。10秒之后就cookie 就会丢失。(从最后一次访问cookie开始计算)

负整数: cookie数据保存在浏览器的内存中,浏览器关闭cookie数据就会丢失。

零:  删除同名的cookie

3)可以同时往浏览器发送多个cookie数据,必须是字符串类型的。浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

 

2.5 案例

显示用户上次访问时间

显示最近浏览过的商品

 

3 Session技术

3.1 回顾Cookie技术

cookie特点:

1)会话数据保存在客户端

2)会话数据只能是字符串类型,不能保存中文的

3)会话数据容量有限制,一个cookie不能超过4kb,一个站点20个cookie

4)不适合存在敏感数据

 

cookie技术有一定限制,所以要使用其他技术补充,来保存这些会话数据

3.2 Session特点

Session的会话数据保存服务器端(服务器端的内存中)

3.3 Session的API

HttpSession接口

 

1)创建或得到Session对象

HttpSession getSession()  

HttpSession getSession(boolean create)  

2)session对象操作会话数据(域对象)

void setAttribute(java.lang.String name, java.lang.Object value) 保存数据

java.lang.Object getAttribute(java.lang.String name)  得到数据

void removeAttribute(java.lang.String name)   清除数据

3)设置session对象

void setMaxInactiveInterval(int interval)  设置session有效时长

java.lang.String getId() 得到session对象编号

void invalidate()  销毁session对象

 

3.4 猜测Session原理

问题: 服务器如何识别不同的浏览器客户端???

 

前提: 取出数据的session和保存数据的session对象应该是同一个session对象

 

浏览器1(标记001):把会话数据保存到session对象中

HttpSession session = request.getSession();  (session对象:标记001)

session.setAttribute("name", "rose");

 

浏览器1(标记001): 从session对象取出会话数据

(服务器得到标记001,在服务器内存中搜索是否存在001标记的session对象)

HttpSession session = request.getSession(); (是)

String name = (String)session.getAttribute("name");  (可以得到)

 

浏览器1(新窗口)(标记001):从session对象取出会话数据

HttpSession session = request.getSession(); (是)

String name = (String)session.getAttribute("name");  (可以得到)

 

浏览器2(没有标记001):从session对象取出会话数据

HttpSession session = request.getSession(); (不是)

String name = (String)session.getAttribute("name");  (不能取出)

 

新的浏览器1(没有标记001):从session对象取出会话数据

HttpSession session = request.getSession(); (不是)

String name = (String)session.getAttribute("name");  (不能取出)

 

3.5 Session原理

1)服务器创建Session对象,分配一个唯一的标记(JSESSIONID),会话数据保存sessino对象中,然后服务器把JSESSION作为cookie发送给浏览器保存

响应头: JSESSIONID=7EBC5D0B44D9D3DDE7FAD83C077E3D3E

2)浏览器得到JSESSIONID的cookie,保存在浏览器的目录中

3)浏览器在下次访问服务器时,带着JSESSIONID的cookie数据访问服务器。

请求头:Cookie: JSESSIONID=7EBC5D0B44D9D3DDE7FAD83C077E3D3E

4)服务器得到JSESSIONID,在服务器内存中查询是否存在对应的编号的session对象。

5)如果找到对应的session对象,返回这个对象

6)如果找不到对应的session对象,有可能返回null,也有可能是创建新的session对象。

 

核心方法:HttpSession session = request.getSession();

伪代码:

1)创建session对象

  Session session1 = new Session();

  Cookie cookie = new Cookie("JSESSIONID","001") //注意默认保存在浏览器内存

  response.addCookie(cookie);

2)得到session对象

在服务器查询对应JSESSIONID的session对象,返回session对象

 

结论: 浏览器通过JSESSIONID(session编号)在服务器中查询session对象

 

3.6 Session细节

1)得到session对象编号: getId()  得到JSESSION的cookie值。

2)设置session有效时长:

注意: 关闭浏览器不会导致session对象销毁!!

 

2.1 默认时间: 30分钟后,服务器自动回收session对象。(最后一次访问session开始计算)

2.2 代码设置session的有效时长:

void setMaxInactiveInterval(int interval) 以秒为单位

2.3 全局设置session的有效时长:

在web.xml文件中,设置

<!-- 配置session的有效时长:以分为单位 -->

<session-config>

<session-timeout>1</session-timeout>

</session-config>

 

2.4 立即手动销毁session对象:invalidate()

3)request.getSession()方法

 

HttpSession getSession()/getSession(true)   创建或得到session对象。当前没有找到对应的session 对象,创建新的session对象

HttpSession getSession(false)           得到session对象。如果找不到,则返回null  

 

4)默认情况下,JSESSSOIN的cookie保存在浏览器内存,如果要保存到硬盘。

   

        Cookie cookie = new Cookie("JSESSIONID",session.getId());

cookie.setMaxAge(100000);

response.addCookie(cookie);

 

3.7 案例

用户登录

 

 

 

 

 

1)编写一个普通的java类,继承HttpServlet类,覆盖doGet方法(

注意: 到tomcat的lib目录下拷贝servlet-api.jar导入到你的项目中

 

public class HelloServlet extends HttpServlet{

 

//覆盖doGet

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

resp.setContentType("text/html;charset=utf-8");

//向浏览器输出内容

resp.getWriter().write("当前时间为:"+new Date());

}

 

}

 

 

2)把servlet交给tomcat服务器运行!!!!!!

 

2.1 把servlet对应的class文件拷贝到tomcat的某个项目(bbs)的WEB-INF/classes目录下

 

2.2 在bbs项目的WEB-INF/web.xml文件配置servlet

 

<?xml version="1.0" encoding="utf-8"?>

 

<web-app xmlns="http://java.sun.com/xml/ns/javaee"

   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"

   version="2.5">

<!--配置servlet -->

<servlet>

<!-- servlet名称,自定义-->

<servlet-name>HelloServlet</servlet-name>

<!-- servlet类的全名:包名+类名 -->

<servlet-class>gz.itcast.b_servlet.HelloServlet</servlet-class>

</servlet>

 

<servlet-mapping>

<!-- servlet名称,和上面的名称保持一致 -->

<servlet-name>HelloServlet</servlet-name>

<!-- 公开给外部访问这个servlet的名称(路径) -->

<url-pattern>/hello</url-pattern>

</servlet-mapping>

 

</web-app>

 

 

3.通过URl访问这个servlet

 

http://localhost:8080/bbs/hello

 

 

用工具开发:帅气牧尘

1)创建一个bbs的web project

 

2)在WebRoot下编写静态网页

 

3)在src下编写动态网页

 

3.1 在src右键选择 “servlet”

3.2 写上servlet的包,名,选择覆盖doGet方法 -> next

3.3 修改servlet的名称,修改访问servlet的url -> finished

 

4)myecplise关联tomcat服务器

4.1 window-> preferences -》 搜索“tomcat” -> 找到“tomcat6.x”

4.2 选择 tomcat的根目录

4.3 把disable -> enable

 

5)部署网站

5.1 点击发布图标 -> 选择网站- 》 选择发布的tomcat服务器

-> ok

 

6)访问:

静态文件: http://localhost:8080/bbs/index.html

动态文件: http://locahost:8080/bbs/hello

 

 

通讯录程序:

联系人: 编号   姓名   性别   电话   邮箱   地址

功能:

增加联系人

修改联系人

删除联系人

查询所有联系人

要求:

1)使用控制台交互

2)联系人数据保存在xml文件中

 

 

 

 

回顾重点内容:

会话管理:管理浏览器与服务器之间会话过程产生的会话数据

 

Cookie技术:  会话数据保存在浏览器端

Cookie技术API:

1)创建Cookie对象,保存会话数据

Cookie cookie = new Cookie("name","value");

2)服务器发送cookie给浏览器保存(原理:响应头: set-cookie)

response.addCookie(cookie);

3)浏览器携带cookie数据访问服务器 (原理:请求头:cookie)

4)服务器接收到浏览器发送的cookie数据

Cookie[] cookies = request.getCookies();

 

    Session技术:会话数据保存在服务器端

Session技术API:

1)创建HttpSession对象

HttpSession session = request.getSession(true/false);   (原理:发送一个JSESSIONID 的cookie)

2)使用HttpSession对象保存会话数据

session.setAttribute("name",Object);

3)使用HttpSession对象获取会话数据

session.getAttribute("name");

4)使用HttpSession对象删除会话数据

session.removeAttribute("name")

 

1 编程实战(上)

通讯录程序

需求:

添加联系人

修改联系人

删除联系人

查询所有联系人

 

职业发展:

技术线:初级开发攻城狮 - > 高级开发攻城狮 -> 核心开发人员(系统分析师助理) -> 系统分析师

非技术线:初级开发攻城狮 -> 高级开发攻城狮 -> 项目组长(项目经理助理)-> 项目经理

 

1.1 需求分析(需求分析师)

a) 功能需求:

需求:

添加联系人

修改联系人

删除联系人

查询所有联系人

b)功能流程

抽取业务模型: 图书模型: 名称,页码,出版社....     

 功能流程图

1.2 需求设计(系统分析师)

a)美工设计(设计静态原型)

b)系统设计

1)设计实体

class Contact{

String id;

String name;

String gender;

String phone;

String email;

String address;

}

 

2)设计“数据库”

xml文件代替“数据库”

 

设计contact.xml

 

<?xml version="1.0" encoding="utf-8"?>

<contact-list>

<contact id="001">

<name>张三</name>

<gender>男</gender>

<phone>13411112222</phone>

<email>zhangsan@qq.com</email>

<address>广州天河</address>

</contact>

 

</contact-list>

 

3)设计接口

面向接口编程:

联系人DAO类:集中编写联系人实体对象的CURD方法。(数据访问对象)

规则: 一个实体对象对应一个dao接口和类

interface ContactDao{

public void addContact(Contact contact);

public void updateContact(Contact contact);  包含修改的id

public void deleteContact(String id);

public List<Contact> findAll();

public Contact findById(String id); 根据id查询对应的联系人  

}

4)设计系统目录(包)规范

 |-contactSys_web    根目录

|-src

|-gz.itast.contactSys_web.entity     存放实体对象类

|- gz.itast.contactSys_web.dao       存放dao接口和类

|- gz.itast.contactSys_web.web       存放servlet类

|- gz.itast.contactSys_web.util        存放工具类

|- gz.itast.contactSys_web.exception    自定义异常类

|-images    存放图片

|-css       存放css文件

|-js        存放js文件

 

1.3 编程实现(开发攻城狮)

1)搭建项目环境

a)项目建立

b)建立目录结构

c)导入第三方的包

2)开发步骤:从底层往上层开发

a)“数据库" (设计xml)

b)实体对象(建立实体对象)

c) DAO接口和实现类

d)页面+servlet(跟用户直接相关的)

 

1.4 功能测试(测试攻城狮)

1.5 性能测试(测试攻城狮)

1.6 部署上线(实施攻城狮)

1.7 系统维护(实施攻城狮)

 

结束语:踏入十四才是新的开始~~新的领域嗯

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值