一、HTTP协议
1.HTTP协议的概念:
超文本传输协议(Hyper Text Transfer Protocol);
-
作用:规范了浏览器和服务器的数据交互 。
-
特点:
(1) 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快 。
(2)灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
(3)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间; HTTP1.1版本后支持可持续连接 。
(4)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。 -
web 交互的基本流程 :
流程图客户端根据用户输入的地址信息请求服务器,服务器在接收到用户的请求后进行处理,然后将处理结果响应给客户端,客户端将响应结果展示给用户;支持B/S及C/S模式。
请求:客户端根据用户地址信息将数据发送给服务器的过程 。
响应:服务器将请求的处理结果发送给浏览器的过程 。
2.HTTP 的交互流程:
步骤:
- 客户端和服务器端建立连接 ;
- 客户端发送请求数据到服务器端(HTTP 协议) ;
- 服务器端接收到请求后,进行处理,然后将处理结果响应客户端(HTTP 协议);
- 关闭客户端和服务器端的连接(HTTP1.1 后不会立即关闭) 。
HTTP 协议之请求格式:
实例图
- 请求行:请求方式、请求的地址和 HTTP 协议版本 ;
- 请求头:消息报头,一般用来说明客户端要使用的一些附加信息 ;
- 空行: 位于请求行和请求数据之间,空行是必须的。
- 请求数据:非必须的。
(1)get 请求方式: get示例 (2)post请求方式: post示例
两种方式的区别:
- get请求方式:
请求数据会以?的形式隔开拼接在请求头中,不安全,没有请求实体部分。
HTTP 协议虽然没有规定请求数据的大小,但是浏览器对 URL 的长度是有限制的,所以 get 请求不能携带大量的数据。
-post请求方式:
请求数据在请求实体中进行发送,在 URL 中看不到具体的请求数据,安全。适合数据量大的数据发送。
HTTP 协议的响应:
分类 常见状态码响应格式:
- 响应行(状态行):HTTP 版本、状态码、状态消息
- 响应头:消息报头,客户端使用的附加信息
- 空行:响应头和响应实体之间的,必须的。
- 响应实体:正文,服务器返回给浏览器的信息
示例
HTTP 常见响应状态码:
HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP 状态码共分为 5 种类型:
3.Tomcat服务器:
- 基本概念:
所谓服务器软件其实就是代码编写的一个可以根据用户请求实时的调用执行对应的逻辑代码的一个容器。在普通用户看来就是一个安装程序。我们只需要将服务器在操作系统上进行安装,并将我们事先编写好的逻辑处理代码根据规则放到服务器的指定位置,启动服务器,那么服务器就自动的会根据接收到请求调用并执行对象的逻辑代码进行处理。
软件的下载和安装:
下载地址:https://tomcat.apache.org/download-70.cgi
- 安装:
下载成功后会为压缩包文件,解压即可使用 。
注意:尽量不要解压在中文目录中。
-
校验安装:
打开 bin 目录,然后双击执行 startup.bat 文件,打开浏览器在地址栏中输入 localhost:8080/ 如果出现 tomcat 广告页安装成功。 -
安装目录介绍:
安装目录 - 常见问题:
1.tomcat 的运行依赖 JDK,必须配置 JDK 环境。配置方式参照百度。
2.闪退,启动闪退问题一般是因为JDK的环境变量配置有问题,
参照 1 进行重新进行配置,如果还是闪退,在 bin\startup.bat 文件中的第一行前面加入:
SET JAVA_HOME=JDK 目录
SET CATALINA_HOME=解压后 Tomcat 的目录
这样,运行 startup.bat 就可以正常启动 tomcat 服务器,如 果想点击 shutdown.bat 关闭服务器,同样在 shutdown.bat 文 件中加入上面的两行即可 。
二、Servlet技术的引入
1.Servlet 介绍:
- 基础概念:
狭义的 Servlet 是指 Java 语言实现的一个接口。
广义的 Servlet 是指任何实现了这个 Servlet 接口的类。
一般情况下,人们将 Servlet 理解为后者。Servlet 运行于支持 Java 的应用服务器中。从原理上讲,Servlet 可以响应任何类型的请求,但绝大多数情况下 Servlet 只用来扩展基于 HTTP 协议的 Web 服务器 。
- 特点:
运行在支持 java 的应用服务。
Servlet 的实现遵循了服务器能够识别的规则,也就是服务器会自动的根据请求调用对应的 servlet 进行请求处理。
简单方便,可移植性强 。
- 使用步骤:
1.创建普通的 java 类并继承 HttpServlet ;
2.覆写 service 方法 ;
3.在 service 方法中书写逻辑代码即可 ;
5.在 webRoot 下的 WEB-INF 文件夹下的 web.xml文件中配置 servlet。
2.第一个Web程序:
- *Myeclipse的安装与破解:
1.下载开发工具Myeclipse;
2.双击执行安装软件,然后一路 next(位数根据电脑的操作系统位数自行选择)。
3.根据破解文档自行破解;解压破解文件,将MyEclipse2017CI7破解文件\plugins文件夹里所有文件拷贝到MyEclipse安装位置\plugins文件夹进行覆盖替换。 - 第一个web项目:
步骤:
(1)打开 Myeclipse 并创建工作空间 ;
(2)点击 file 选择—>new—>web project—>输入项
目名,点击 finish ;
(3)在 src 下创建包 com.bjsxt.servlet.
(4)在包下创建一个普通 java 类 MyServlet,并继承
HttpServlet 。
- 在 MyServlet 类中覆写 service 方法。
package com.bjsxt.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//覆写Service方法
public class MyServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("第一个Servlet程序");
resp.getWriter().write("This is Servlet");;
}
}
- 在 webRoot 下的 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">
<!-- 配置Servlet
注意:
一组Servlet配置包括两个组成部分(Servlet,servlet-mapping),两个组成部分的servlet-name值必须一致。
-->
<!-- 配置serlet类路径 -->
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.bjsxt.servlet.MyServlet</servlet-class><!-- 书写servlet的全限定路径(包名+类名) -->
</servlet>
<!-- 配置访问方式 -->
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>/my</url-pattern><!-- 配置servlet的访问别名 -->
</servlet-mapping>
-
打开 tomcat 的安装目录,在 webapps 目录下新建文件夹,文件夹名为 project,并将项目源码webRoot 下的内容全部复制到该文件夹下。
-
启动 tomcat 服务器,并在地址栏中输入:localhost:8080/project/my
总结:
MyEclipse 是开发工具,通过此工具便于程序员的代码编写。
真正运行的代码不是 MyEclipse 中编写的代码,而是 tomcat 服务器中部署好的代码。Tomcat 会根据请求自动调用对应的代码进行请求处理。
3.Myeclipse 集成 Tomcat:
将 tomcat 的目录和 Myeclipse 集成起来,这样 Myeclipse 在帮
我们复制更改的代码的时候,就知道复制到哪个服务器中。
- 步骤:
第一步:选中 window---->preferences ;
第二步:
第三步:
4.Servlet 的 web.xml 配置:
- 配置方式一:
精确配置:<url-pattern>/别名</url-pattern>;
注意:
"/"是必须声明的,别名不可以为中文;
此种配置方式可以配置多个。 - 配置方式二:
模糊配置:<url-pattern>*.后缀名</url-pattern>
注意:
*表示任意个数的任意字符;
所有以指定的后缀名结尾的请求都会调用该servlet进行处理;
作用:
进行模块化开发的划分等。 - 配置方式三:
拦截所有请求:<url-pattern>/</url-pattern>;
注意:
会拦截所有类型的请求,包括静态资源请求(css、js、图片等)和jsp请求。
配置方式四:
<url-pattern>/one/</url-pattern>
注意:
会拦截处理所有Servlet的别名以one开头的路径的请求。
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.zlw.servlet.Servlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>my</servlet-name>
<!-- 配置方式一 -->
<url-pattern>/my</url-pattern>
<!-- 配置方式二 -->
<url-pattern>*.do</url-pattern>
<!-- 配置方式三 -->
<url-pattern>/*</url-pattern>
<!-- 配置方式四 -->
<url-pattern>/one/*</url-pattern>
</servlet-mapping>
- 注意:
一个Servlet可以配置多个url-pattern不同的Servlet不允许配置相同的url-pattern,如果配置了在服务器启动的时候就会报错。服务器启动的时候就会将部署的项目中的web.xml文件加载进内存。
5.Servlet的生命周期:
从第一次被调用到服务器关闭 。
- Servlet 的单例创建:
注意:
服务器在接收到浏览器的请求后,会开辟一个线程来处理此次请求,在线程中调用对应的Servlet进行处理。
服务器调用Servlet服务器只会创建一个实例化对象,该对象是线程共享的。
-
生命周期:
(1)init方法 :servlet被初始化创建的时候调用
(2)service方法:处理请求的时候。
(3)destory方法 :当服务器关闭的时候销毁servlet,触发destroy方法的执行。 - 注意:
我们可以在web.xml中配置load-on-startup来设置Servlet的加载时机为服务器启动。生命周期就变为从服务器开启到服务器关闭。
package com.zlw.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LifeServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("LifeServlet.init(我被初始化了)");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("被执行了!");
}
@Override
public void destroy() {
System.out.println("LifeServlet.destroy(我被销毁了)");
}
}
<?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">
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>LifeServlet</servlet-name>
<servlet-class>com.zlw.servlet.LifeServlet</servlet-class>
<load-on-startup>1</load-on-startup><!-- 配置servlet服务器启动时完成加载和初始化创建 -->
</servlet>
<servlet-mapping>
<servlet-name>LifeServlet</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
</web-app>
init
sevice
distroy
6.Service 和 doGet 和 doPost 方法:
- 区别:
Service 方法:
不管是 get 方式还是 post 方式的请求,如果 Servlet 类中有service 方法,则优先调用 Service 方法。
doGet 方法:
在没有service 方法的情况下如果是 get 方式的请求所调用的处理请求的方法。
doPost 方法:
在没有 service 方法的情况下如果是 post 方式的请求所调用的处理请求的方法 。
- 代码示例:
package com.zlw.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UserServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("UserServlet.doGet(我是get方式的请求)");
response.getWriter().write("This is doGet");
}
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("UserServlet.doPost(我是post方式的请求)");
response.getWriter().write("This is doPost");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("UserServlet.service(我是service 方法)");
super.service(req, resp);
}
JSP代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'login.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<form action="user" method="post">
用户名:<input type="text" name="uname" value="" /><br>
密码:<input type="password" name="pwd" value="" /><br>
<input type="submit" value="登录" />
</form>
</body>
</html>
get请求方式
post请求方式
7.Servlet 的常见错误总结:
- 404错误:资源未找到:
原因一:在请求地址中的servlet的别名书写错误 。
原因二:虚拟项目名称拼写错误 。
- 500错误:内部服务器错误:
错误一:ava.lang.ClassNotFoundException:
com.bjsxt.servlet.ServletMothod;
解决:在web.xml中校验servlet类的全限定路径是否拼写错误。
错误二: 因为service方法体的代码执行错误导致 。
解决:根据错误提示对service方法体中的代码进行错误更改。
- 405错误:请求方式不支持:
原因:请求方式和servlet中的方法不匹配所造成的。
解决:尽量使用 service 方法进行请求处理,并且不要再 service 方法中调用父类的 service。
网友评论