Skip to content

一 Web服务器

1 C/S和B/S

C/S和B/S是软件发展过程中出现的两种软件架构方式

1.1 C/S架构

Client/Server客户端/服务器

特点:必须在客户端安装特定软件

优点:图形效果显示较好(如:3D游戏)

缺点:服务器的软件和功能进行升级,客户端也必须升级、不利于维护

常见的C/S程序:QQ、微信等

1.2 B/S架构

Browser/Server 浏览器/服务端

特点:无需安装客户端,任何浏览器都可直接访问

优点:涉及到功能的升级,只需要升级服务器端

缺点:图形显示效果不如C/S架构

需要通过HTTP协议访问

2 web服务器

2.1 web

WEB,在英语中表示网页的意思,它用于表示Internet主机上供外界访问的资源。

Internet上供外界访问的Web资源分为静态资源和动态资源。

静态web资源(如html 页面):指web页面中供人们浏览的数据始终是不变。

动态web资源:指web页面中供人们浏览的数据是由程序产生的,不同时间点访问web页面看到的内容各不相同。

常用动态web资源开发技术:JSP/Servlet、ASP.net、PHP等

在Java中,动态web资源开发技术统称为Java web开发。

2.2 web服务器

Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问。

2.3 常见的web服务器软件

WebLogic:Oracle公司,收费,全面支持javaEE规范

JBoss:RedHat ,收费,全面支持javaEE规范

Tomcat:Apache,免费,部分支持javaEE规范

3 Http协议

浏览器端与服务端交互的过程中,若想获得web服务器中的某个web资源,需遵守一定的规则,这个规则就是Http协议。HTTP协议用于定义浏览器端与web服务器之间数据交互的过程和数据格式。

HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,是一种请求/响应协议。

img

HTTP协议的版本:HTTP/1.0、HTTP/1.1

3.1 Http请求

客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。一个完整的HTTP请求包括如下内容:一个请求行、若干请求头、以及请求体内容,其中的一些请求头和请求体内容都是可选的,请求头和请求体之间要用空行隔开。

请求体用于封装post请求提交的数据

如下所示 :

http
GET /test/HelloServlet HTTP/1.1  --请求行
Host: localhost:8080  -- 以下内容都是请求头  数据是key-value形式
Connection: keep-alive  
Cache-Control: max-age=0 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: zh-CN,zh;q=0.8

3.2 请求方式

请求行中的GET称之为请求方式,请求方式有:

请求方式描述
GET请求指定的页面信息,并返回实体主体。
HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。
PUT从客户端向服务器传送的数据取代指定的文档的内容。
DELETE请求服务器删除指定的数据。
CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS允许客户端查看服务器的性能。
TRACE回显服务器收到的请求,主要用于测试或诊断。
PATCH是对 PUT 方法的补充,用来对已知资源进行局部更新 。

常用的有:POST、GET

不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上,客户端通过这两种方式都可以带一些数据给服务器。

3.2.1 get请求

直接在浏览器中输入某个地址,浏览器将以get方式发送请求。

使用GET请求方式时,如果需要向服务器提交数据,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔。

如:

java
http://localhost:8080/test/HelloServlet?name=zhangsan&age=12

form表单中,可以将提交方式设置为get

3.2.2 post请求

如请求方式为POST方式,提交的数据放在请求数据的请求体

form表单中,可以将提交方式设置为post

3.2.3 get请求和post请求主要区别

1)get请求是,提交的参数会放在url中,所以隐私性,安全性较差;而post请求时,提交的数据是放在请求体中,用户无法直接看到

2)get请求传输的数据长度有限制,不同的浏览器和服务器不同,比如1kb、2kb等;而post请求时,数据大小没有长度限制

3)get请求一般用于查询之类的操作,用于资源的获取,数据的读取;post请求一般用于修改和写入数据

4)相对来说,get比post速度快

5)get请求会将返回的静态数据(网页、图片等)缓存起来,而post请求不会(当然,也不会使用post获取静态资源)

3.3 Http响应

一个HTTP响应代表服务器向客户端回送的数据,它包括:

​ 一个响应行、若干响应头、以及响应体,其中的一些响应头和响应体都是可选的,响应头和响应体之间要用空行隔开。

java
HTTP/1.1 200 OK   --响应行
Server: Apache-Coyote/1.1  --响应头
Content-Length: 24 
Date: Mon, 31 Jul 2017 02:57:09 GMT
空行
服务端返回浏览器显示的数据--响应体

3.4 响应行

格式:HTTP版本号 状态码 原因叙述

举例:HTTP/1.1 200 OK

状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:

100~199表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程
200~299表示成功接收请求并已完成整个处理过程,常用200
300~399未完成请求,客户需进一步细化请求。例如,请求的资源已经移动一个新地址,常用302、307和304
400~499客户端的请求有错误,常用404
500~599服务器端出现错误,常用 500

二 tomcat基本使用

1 下载安装

官网:http://tomcat.apache.org/

获取Tomcat安装程序包

tar.gz文件是Linux操作系统下的压缩版本

exe文件是Windows系统下的安装版本

zip文件是Windows系统下的压缩版本

本教学过程中使用zip版的tomcat8,将其解压后放在合适的目录下,路径中不要包含中文

2 启动关闭

启动:Tomcat安装目录/bin/startup.bat

关闭:Tomcat安装目录/bin/shutdown.bat

启动tomcat服务后,在浏览器输入http://localhost:8080/,如果显示如下界面说明服务器启动正常

img

3 常见问题

  1. JAVA_HOME

没有JAVA_HOME环境变量,启动tomcat服务器,闪退

  1. 8080端口占用

Tomcat使用8080端口

修改tomcat端口或者关闭占用8080端口的程序

conf/server.xml文件中修改端口号位置:

java
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" />

3)CATALINA_HOME引起的问题

安装版的tomcat会自动增加CATALINA_HOME环境变量,如果卸载tomcat,不会卸载该环境变量。再次安装tomcat时,如果和以前的路径不一样,启动tomcat就会出问题

解决方案:直接删除该环境变量

4 tomcat主要目录结构

bin :tomcat相关的命令和脚本文件

conf :tomcat服务器相关的配合文件,server.xml核心配置

lib :运行tomcat需要的jar文件

logs: 存放日志文件,记录了Tomcat启动和关闭的信息,如果启动Tomcat时有错误,异常也会记录在日志文件中。

webapps:存放web应用,即供外界访问的web资源

work:tomcat工作目录,存放jsp生成的class文件

三 web应用开发

1 web应用目录结构

Web应用目录

​ --页面相关的资源,如html、jsp、js、css等文件外界可以直接访问

​ --META-INF

​ --WEB-INF该目录下的文件外界无法非法直接访问,由web服务器负责调用

​ --classes:web应用程序的字节码文件

​ --lib:存放运行web程序需要的jar文件

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

2 Servlet体验

2.1 新建java项目,将其转变为web项目

img

img

项目的目录结构

img

2.2 添加tomcat

选择Local

img

默认界面如下:

img

点击“Configure”添加tomcat:

img

选择tomcat的安装路径

img

设置name

img

点击右下角的“Fix”,配置项目部署后的访问路径等信息

img

“Application Context”可以修改为指定的项目路径,本例采用默认值

img

修改如下配置,debug状态下,实现热部署(不用重启服务,修改的代码就会生效)

"On Update action",修改文件时触发的操作

"On frame deactivation" 表示ide失去焦点触发的操作

img

2.3 添加tomcat相关jar包依赖

img

img

选择Library后显示页面,选择“Tomcat8.5.57”

img

添加后界面:

img

另外,注意如下页面,如果new中无法新建Servlet,需要进行如下配置

img

2.4 新建Servlet

img

修改Servlet的Name,暂时勾选“Create Java EE 6+ annotated class”(servlet注解方式)

img

增加如下代码:

img

2.5 启动tomcat

img

img

2.6 通过浏览器访问Servlet资源

http://tomcat服务器ip:端口号/web应用名称/资源名称

img

2.7 tomcat启动时,控制台中文乱码问题

解决控制台乱码后,System.out.println()输出中文会乱码,还需要按照2.8进行处理

方案1:

img

添加: -Dfile.encoding=UTF-8

img

方案2:

img

修改完成后,一定要重启idea

2.8 System.out.println() 中文乱码解决

方案1:

每次都需要修改,比较麻烦

img

方案2:

修改D:\apache-tomcat-9.0.33\bin\catalina.bat文件

找到 set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%",增加-Dfile.encoding=UTF-8

修改后如下:

bash
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS% -Dfile.encoding=UTF-8"

img

2.9 web项目打包

img

img

img

img

img

将war包拷贝到tomcat的webapps目录下,启动tomcat,war包会自动解压,相当于发布web程序。

img

注意:

war模式称为发布模式,先将程序打包成war包,再部署到服务器发布;

war exploded模式是直接把web工程中文件夹、页面资源 、classes等等发布到Tomcat,直接进行加载部署。因此这种方式支持热部署,一般在开发的时候也是用这种方式。

附录

1 XML

XML(EXtensible Markup Language),可扩展标记语言,它是一种类似于HTML的标记语言。

XML是由W3C组织推出的,它是一种通用的数据交换格式。

xml
<?xml version="1.0" encoding="utf-8"?>
<stus>
    <stu id="001">
        <name>Tom</name> 
        <sex>男</sex>
        <age>20</age>
    </stu>  
    <stu id="002">
        <name>Jerry</name>    
        <sex>女</sex>
        <age>21</age>
    </stu>
</stus>

1.1 基础语法

1.1.1 文档声明

XML必须有文档声明

XML声明放在XML文档的第一行

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

XML声明由以下几个部分组成:

version –文档符合XML1.0规范

encoding –文档字符编码,比如GB2312、UTF-8等

standalone –文档定义是否独立使用

standalone=”no”为默认值;yes代表是独立使用,而no代表不是独立使用

1.1.2 XML中元素

也可称为节点、标记

1)每个XML文档必须有且只有一个根元素

根元素是一个完全包括文档中其他所有元素的元素

2)XML元素指的是XML文件中出现的标签,一个标签分为开始标签和结束标签

xml
<name>Tom</name>

3)一个标签中可以嵌套多个子标签

xml
<stu id="001">
  <name>Tom</name> 
  <sex>男</sex>
  <age>20</age>
</stu>

4)命名规范:

区分大小写

不能以数字或下划线”_”开头

标签内不能包含空格等特殊字符

1.1.3 标签中的属性

xml
<stu id="001">
  <name>Tom</name> 
</stu>

1)一个元素可以有多个属性,它的基本格式为:

xml
<元素名 属性名1="属性值1" 属性名2="属性值2">

2)属性值用双引号或单引号

如果属性值中有单引号,则外层使用双引号;如果值中有双引号,则外层使用单引号

1.1.4 XML中注释

XML的注释类似于HTML中的注释:

xml
<!--这是一个注释-->

1.1.5 XML中的特殊符号

元素的内容不能包含特殊符号

特殊符号实体引用XML中的含义
<<新元素的开始
>>
&&字符实体的开始
""
''

比如数据库连接的url:

jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=UTC

在xml文件中,&要写成&

xml
<url>jdbc:mysql://localhost:3306/test?characterEncoding=utf8&amp;useSSL=false&serverTimezone=UTC<url>

注意:对于XML,只有"<"和"&"是严格禁止使用的。引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。

1.2 XML约束 了解

约束表示规则,一些第三方提供的组件中,有些用到xml,里面的标签名和属性是不能随便定义的

1.2.1 DTD约束

DTD约束是早期出现的一种XML约束模式语言,根据它的语法创建的文件称为DTD文件

1)引用本地的DTD文件

xml
<!DOCTYPE 根元素名称 SYSTEM  "外部DTD文件的URI">

2)引用公用的DTD文件

xml
<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "外部DTD文件的URI">

使用DTD约束的例子:

java
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

</configuration>

1.2.2 Schema约束

Schema约束也是一种用于定义和描述XML文档结构与内容的模式语言,它比DTD功能强大很多,但相应的语法也复杂很多

1)使用名称空间引入XML Schema文档

通过属性xsi:schemaLocation来声明名称空间的文档,

xsi:schemaLocation属性是在标准名称空间“http://www.w3.org/2001/XMLSchema-instance”中定义的

2)不使用名称空间引入XML Schema文档

通过xsi:noNamespaceSchemaLocation属性直接指定,n

oNamespaceSchemaLocation属性是在标准名称空间“http://www.w3.org/2001/XMLSchema-instance”中定义的。

使用Schema约束的例子:

xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    
</web-app>