Web 的发展基础
Socket 编程
- 客户端
- 向服务器发起请求,并传递数据
- 服务端
- 接收客户端的请求,并响应数据
- 通信规则
- TCP/IP 协议
服务器的出现
- 常见服务器:Tomcat、JBOOS、Apache、Jetty等
- 服务器的作用:
- 服务器统一接收客户端处理并进行分发到不同的资源,由各个资源进行处理,最后结果交由服务器响应。
Java Web
- C/S体系结构
- 客户端和服务端模式
- B/S体系结构
- 浏览器和服务端模式
- 区别:
- C/S采用高性能的PC端或工作站,使用大型数据库,效率高,但是成本也高。
- C/S一般用于局域网,B/S一般用广域网。
- C/S的使用人员相对固定,B/S使用人群不固定。
- C/S需要安装专用得客户机,需要专业人员维护,维护成本高。
- Web应用技术
- 客户端技术:
- HTML
- CSS
- JavaScript
- 服务端技术:
- Servlet
- JSP
- 客户端技术:
Tomcat
Tomcat是符合JavaEE和Web标准的最小 Web容器。
-
特点:
- 技术先进、性能稳定、免费开源
-
安装:
- 需要在系统环境变量中配置JAVA_HOME
-
目录结构:
- bin:存放相关的脚本
- startup.bat 启动服务器
- shutdown.bat 关闭服务器
- lib:存放jar包
- conf:存放配置文件
- server.xml 中可以修改服务器默认的8080端口
- logs:存放打印的日志记录的
- webapps:存放项目资源
- work:JSP的源码会生成在该目录下
- bin:存放相关的脚本
HTTP 协议
HTTP 简介
Http是超文本传输协议,是应用层协议
HTTP 协议的路径格式
- http://IP?或域名:[port]/项目路径/项目中的资源路径?参数名=参数值
- http://:表示但前使用的HTTP超文本传输协议
- IP|域名:表示当前主机的IP或域名
- 本地:localhost | 127.0.0.1
- port:服务器的端口
- tomcat:8080
HTTP 协议的特点
- 支持客户端和服务端模式
- 简单快捷
- 灵活
- HTTP1.1后支持持续连接
- 无状态:协议对于事务处理没有记忆能力
请求协议
- 客户端向服务端发起请求时的协议
- 请求协议由三部分构成
- 请求行:
- 请求方式 GET/POST
- 请求路径
- 请求协议版本
- 请求头
- 键值对组成,键: 值;多个请求头之间会换行
- 请求正文
- GET请求没有请求正文,POST请求才有(From Data)
- 请求行:
响应协议
- 服务端向客户端响应数据时的协议
- 响应协议由三部分组成:
- 状态行(响应行)
- 协议版本
- 响应状态码 (200=成功 404=未找到资源 500=服务器异常)
- 响应状态码的说明
- 消息报头(响应头)
- 键值对组成,键: 值;多个消息头头之间会换行
- 响应正文
- 浏览器中所看到的的内容
- 状态行(响应行)
消息头
HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。
请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有 CRLF 的行),消息正文(可选)组成。
每一个报头域都是由 “名字 + ‘:’ + 空格 + 值” 组成,消息报头域的名字是大小写无关的。
-
请求头:对于请求协议而言
- Referer:该请求头指明请求从哪里来
- 如果是直接从浏览器的地址栏直接访问,则没有Referer请求头
- 作用:可以得知的页面的上一个访问地址
- 应用场景:百度竞价、防盗链、邀请链接等
- Referer:该请求头指明请求从哪里来
-
响应头:对于响应协议而言
-
Location:
- Location响应报头域用于重定向接受者到一个新的位置
- Location响应报头域,常用在更换域名的时候
-
Refresh:
-
自动跳转(单位是秒),可以在页面通过meta标签实现,也可在后台实现
-
格式:
<meta http-equiv="refresh" content="时间秒数;url=跳转的地址"> <!-- 3秒钟后跳转到百度 --> <meta http-equiv="refresh" content="3;url=http://www.baidu.com"> <!-- 每隔3秒刷新一次页面 --> <meta http-equiv="refresh" content="3;">
-
-
Servlet 的实现
Servlet是Server与Applet的缩写,是服务端小程序的意思。
Servlet本质上也是Java类,但要遵循Servlet规范进行编写,没有 main()方法,它的创建、使用、销毁都由Servlet容器进行管理(如 Tomcat)。
实现
-
创建Web项目
- 右键选择"New",选择"Other"
- 搜索"Web",选择"Dynamic Web Project"
- 设置项目的名称,选择"Dynamic web module version"的版本为2.5,选择"Next",再选择"Next"
- 设置"Context root"的值
- 默认与项目名保持一致,代表的是项目的对外访问路径,即站点名
- 创建完成
-
访问Web项目
- 选择服务器,右键选择"Add and remove",将项目加到服务器中
- 右键服务器,选择"Start"或者"Debug"启动服务器
- 在浏览器中输入"http://localhost:8080/站点名/资源路径"
-
创建Servlet
-
创建普通的JAVA类
-
继承HttpServlet类
-
重写service方法
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") public class Servlet01 extends HttpServlet { @Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { System.out.println("Hello Servlet!!!"); } }
-
配置项目中WEB-INF下的web.xml文件
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>servlet01</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- servlet类的配置 --> <servlet> <servlet-name>Servlet01</servlet-name> <!-- servlet的名称,给服务器看的,与servlet-mapping中servlet-name标签保持一致 --> <servlet-class>com.myservlet.Servlet01</servlet-class> <!-- servlet的路径,包含包名+类名 --> </servlet> <!-- servlet类的映射配置 --> <servlet-mapping> <servlet-name>Servlet01</servlet-name> <!-- servlet的名称,给服务器看的,与servlet中servlet-name标签保持一致 --> <url-pattern>/ser01</url-pattern> <!-- servlet类的对外访问路径。注:"/"不要忘记 --> </servlet-mapping> </web-app>
-
-
实现Servlet的另外两种方式
-
继承GenericServlet类,实现service方法
-
实现Servlet接口,实现接口中的方法
import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * 实现Servlet接口 * 1、创建普通Java类 * 2、实现Servlet接口 * 3、实现接口中的方法 * 4、配置web.xml */ public class Servlet01 implements Servlet { /** * 系统方法,初始化方法,当servlet被实例化时调用,只会执行一次(在第一次访问 Servlet执行) * 当有请求访问servlet时,会先判断是否存在servlet实例,如果不存在,则调用init方法,实例化servlet类;如果存在,则不调用init方法 */ @Override public void init(ServletConfig config) throws ServletException { System.out.println("Servlet01 init..."); } /** * 系统方法,服务方法,没法打那个有请求访问servlet时,都会调用;可以调用多次 */ @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("Servet01..."); } /** * 系统方法,销毁方法,在服务器关闭时调用该方法,只会执行一次 */ @Override public void destroy() { System.out.println("Servlet01 destoy..."); } }
-
Servlet 生命周期
- servlet 类加载–>实例化–>服务–>销毁
- Web Client 向 Servlet 容器(Tomcat)发出 Http 请求
- Servlet 容器接收 Web Client 的请求
- Servlet 容器创建一个 HttpRequest 对象,将 Web Client 请求的信息封装到这个对象 中
- Servlet 容器创建一个 HttpResponse 对象
- Servlet 容器调 HttpServlet 对象 service 方法,把 HttpRequest 对象与 HttpResponse对象作为参数,传给 HttpServlet 对象
- HttpServlet 调用 HttpRequest 对象的有关方法,获取 Http 请求信息
- HttpServlet 调用 HttpResponse 对象的有关方法,生成响应数据
- Servlet 容器把 HttpServlet 的响应结果传给 Web Client
Servlet 的配置
-
基本配置
<servlet> <servlet-name>Servlet01</servlet-name> <servlet-class>com.myservlet.Servlet01</servlet-class> </servlet> <servlet-mapping> <servlet-name>Servlet01</servlet-name> <url-pattern>/ser01</url-pattern> </servlet-mapping>
-
初始化参数:在servlet被实例化时,即可获取的参数
<init-param> <param-name>参数名</param-name> <param-value>参数值</param-value> </init-param>
-
自启动:服务器启动时servlet被实例化 (值越小,优先级越高)
<load-on-startup>1</load-on-startup>
-
设置多个访问路径
<!-- 设置多个路径访问servlet --> <url-pattern>/ser04</url-pattern> <!-- 指定路径 --> <url-pattern>/ser004</url-pattern> <!-- 以指定后缀结尾的路径 .html .do --> <url-pattern>*.do</url-pattern> <!-- 以指定目录开头的路径 --> <url-pattern>/test/*</url-pattern> <!-- 所有路径 --> <url-pattern>/*</url-pattern> <!-- "*" 是个通用符,代表所有 -->
- "*"只能放在最前面或者最后面,不能单独使用,不能和字母组合
- 越精准,优先级越高
-
注意点:
- 修改配置文件,必须重启服务器,配置才会生效
- 在web.xml文件中,servlet标签中的servlet-name的值必须唯一
- servlet-mapping标签中url-pattern的值必须唯一:java.lang.IllegalArgumentException
- servlet-mapping标签中url-pattern的值要加"/":java.lang.IllegalArgumentException