一、Web发展基础
1.简单通信
网络编程中是通过客户端请求服务端通信,直观了解Web编程
1、需要有服务器端(server) :等待被请求,需要暴露 ip 和 port
2**、需要有客户端(client):主**动发起请求 ,知晓服务端的 ip 和 port
3、通信规则(协议):TCP/IP 协议
//server /** * 服务器端,接收客户端请求并给出简单的响应 * */ public class Server01 { public static void main(String[] args) throws Exception { //创建服务器,指定端口ServerSocket(int port) ServerSocket socket=new ServerSocket(9999); //接收客户端连接 Socket client=socket.accept(); System.out.println("连接上了"); //获取数据 io流 InputStream is=client.getInputStream(); //使用字符缓存流 BufferedReader br=new BufferedReader(new InputStreamReader(is)); String msg=""; while((msg=br.readLine())!=null){ System.out.println(msg); } br.close(); } }
/** * 客户端:向服务器发送请求,并发送简单的消息 * */ public class Client01 { public static void main(String[] args) throws Exception{ //创建客户端 指定服务器+端口 Socket client =new Socket("localhost",9999); //io流操作 发送流 OutputStream os=client.getOutputStream(); BufferedWriter br=new BufferedWriter(new OutputStreamWriter(os)); //发送的信息 String msg="hello world"; br.write(msg); br.close(); }
2.不同请求
public class Client02 { //客户端 public static void main(String[] args) throws Exception { // TODO Auto-generated method stub // TODO Auto-generated method stub //通过系统默认类型SocketImpl 创建未连接套接字 Socket socket =new Socket(); //此类实现IP套接字地址(IP地址+端口号) SocketAddress address=new InetSocketAddress("localhost",8888); //此套接字连接到服务器,并指定一个超时值 或者不指定超时时间 socket.connect(address,1000); OutputStream os=socket.getOutputStream(); os.write("money".getBytes()); os.flush(); socket.close(); } //服务器 public static void main(String[] args) throws Exception { //创建绑定到特定端口的服务套接字 ServerSocket server=new ServerSocket(8888); //接收客户端 Socket client=server.accept(); System.out.println("连接上"); //io流操作 InputStream is=client.getInputStream(); BufferedInputStream bis=new BufferedInputStream(is); byte [] req=new byte[1024]; //接收客户端请求 int len=bis.read(req); String reqStr=new String(req,0,len); if(reqStr.equals("money")){ System.out.println("here's the money"); }else if(reqStr.equals("time")){ System.out.println("you have so much time"); } client.close(); server.close(); }
3.复杂请求
随着客户需求越来越复杂,需要的功能越来越多,我们的服务器端需要处理的请求越来越多,需要区分不同的请求,还需要按照不同请求进行请求数据的提取以及资源的分配和运算还有逻辑的处理,最后还需要响应给客户端,这就使得服务器端代码越来越复杂,实现越来越困难
4.服务器的出现
服务器统一接收客户端处理并进行分发到不同的资源,由各个资源进行处理,最后结果交由服务器响应。
服务器:Tomcat、JBOOS、IBM 的 WebSphere、BEA 的 WebLogic 、jetty 以及 Apache 等。
二、JavaWeb简介
1.C/S体系结构
C/S 是Client/Server 的缩写,即客户端/服务器结构,局域网用的比较多,传输速度快,比较安全、通信开销小。
2.B/S体系结构
B/S 是Browser/Server 的缩写,即浏览器/服务器结构,客户端不需要开发任何用户界面,而统一采用如 IE、Firefox、Chrome 等浏览器,通过 Web 浏览器向 Web 服务器发送请求,由 Web 服务器进行处理,并将处理结果逐级传回客户端。
3.Web应用程序的工作原理
Web 应用程序大体上可以分为两种,即静态网站和动态网站;
**静态网站:**网站使用 HTML 语言来编写,放在 Web 服务器上,用户使用浏览器通过 HTTP 协议请求服务器上的 Web 页面,服务器上的 Web 服务器将接收到的用户请求处理后,再发送给客户端浏览器,显示给用户。
**动态网站:网站通常使用 HTML 语言和动态脚本语言(**如 JSP、ASP 或者是 PHP 等)编写,并将编写后的程序部署到 Web 服务器上,由 Web 服务器对动态脚本代码进行处理,并转化为浏览器可以解析的 HTML 代码,返回给客户端浏览器,显示给用户。
4.Web应用技术
1)客户端应用的技术
客户端技术包 括HTML 语言、CSS、js、Flash 和客户端脚本技术
2)服务器端应用的技术
在开发动态网站时,离不开服务器端技术,比较传统和经典的 Web 服务器端技术主要 有:CGI、ASP、SERVLET/JSP、PHP 等。
三、Tomcat
1.tomcat特点
Tomcat 技术先进、性能稳定,而且免费,因而深受 Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的 Web 应用服务器。Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器。
2.Tomcat目录结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G0skxPXs-1582289529075)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1582286018482.png)]
\1. bin:启动和关闭 tomcat 的 脚本文件
\2. conf:配置文件 server.xml 该文件用于配置 server 相关的信息,比如 tomcat 启动的端口号,配置主机(Host) web.xml 文件配置与 web 应用(web 应用相当于一个 web 站点)tomcat-user.xml 配置用户名密码和相关权限.
\3. lib:该目录放置运行 tomcat 运行需要的 jar 包
\4. logs:存放日志,当我们需要查看日志的时候,可以查询信息
\5. webapps:放置我们的 web 应用
\6. work 工作目录:该目录用于存放 jsp 被访问后生成对应的 server 文件和.class 文件
3.Eclipse关联Tomcat
Window–>preferences—>Server–>Runtime Environment–>add–>apache-tomcat-8.0.23
四、HTTP协议
1.浏览器中的书写格式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cNsKkvZg-1582289529077)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1582286369384.png)]
http://host[":"port][abs_path]
http://IP(主机名/域名):端口号/访问的资源路径
2.HTTP协议的主要特点
HTTP 协议(Hypertext Transfer Protocol, 超文本传输协议)
1.)支持客户/服务器模式
2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径
3)灵活:HTTP 允许传输任意类型的数据对象。传输的类型由 Content-Type 加以标记
4)HTTP1.1支持持续连接
5)无状态:HTTP 协议是无状态协议
3.HTTP请求
http 请求由三部分组成,分别是:请求行、请求头、请求正文通过 chrome 浏览器, F12–> Network 查看get(没有请求体)
请求头:Method Request-URI HTTP-Version CRLF
其中 Method 表示请求方法;Request-URI 是一个统一资源标识符;HTTP-Version 表示请 求的 HTTP 协议版本;CRLF 表示回车和换行
4.HTTP响应
在接收和解释请求消息后,服务器返回一个 HTTP 响应消息。HTTP 响应也是由三个部分组成,分别是:状态行、消息报头、响应正文格式状态行响应头 1 响应头 2
5.消息头
HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行), 消息报头(可选),空行(只有 CRLF 的行),消息正文(可选)组成。
请求头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
Referer:该请求头指明请求从哪里来
Refresh:自动跳转(单位是秒),可以在页面通过 meta 标签实现,也可在后台实现。
五、Servlet的实现
Servlet 是 Server 与 Applet 的缩写,**是服务端小程序的意思。**使用 Java 语言编写的服务器端程序,可以像生成动态的 WEB 页,Servlet 主要运行在服务器端,并由服务器调用执行, 是一种按照 Servlet 标准来开发的类。
Servlet 本质上也是 Java 类,但要遵循 Servlet 规范进行编写,没有 main()方法,它的创建、使用、销毁都由 Servlet 容器进行管理(如 Tomcat)。(言外之意:写自己的类,不用写 main 方法,别人自动调用)。
1.实现
/** * 通过继承HttpServlet类创建Servlet * 1、创建普通Java类 2、继承HttpServlet类 3、重写service()方法 4、设置web.xml * @author Lisa Li * */ @SuppressWarnings("serial") public class Servlet01 extends HttpServlet { @Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { System.out.println("Hello Servlet!"); } } //web.xml配置 <!-- servlet --> <servlet> <!-- 在当前web.xml中,servlet标签中的servlet-name的值必须唯一--> <servlet-name>Servlet01</servlet-name> <!-- 给服务器看的,servlet的名称;servlet标签中的servlet-name要与servlet-mapping中的servlet-name保持一致 --> <servlet-class>com.shsxt.servlet.Servlet01</servlet-class> <!-- servlet类的全路径(包名+类名);按住ctrl键,能够点进去,则表示路径正确 --> </servlet> <!-- servlet的映射配置 --> <servlet-mapping> <servlet-name>Servlet01</servlet-name> <!-- 给服务器看的,servlet的名称;servlet-mapping标签中的servlet-name要与servlet中的servlet-name保持一致 --> <url-pattern>/ser01</url-pattern> <!-- 给浏览器看的,servlet资源的对外访问路径(注意路径前面要加"/") url-pattern的值是唯一的 --> </servlet-mapping>
/** * 继承GenericServlet类 1、创建普通Java类 2、继承GenericServlet类 3、实现service()方法 4、设置web.xml * @author Lisa Li * */ @SuppressWarnings("serial") public class Servlet02 extends GenericServlet { @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("Servlet02..."); } }
/** * 实现Servlet接口 1、创建普通Java类 2、实现Servlet接口 3、实现方法 4、设置web.xml * @author Lisa Li * */ public class Servlet03 implements Servlet { @Override public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("Servlet03..."); } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } @Override public void destroy() { // TODO Auto-generated method stub } }
2.工作原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MKhElRnM-1582289529078)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1582287954139.png)]
执行过程
客户端发出请求 根据 web.xml 文件的配置,找到对应的 读取中的值 找到对应的 找到该 class 并加载执行该 class,返回结果 由 Web 服务器将结果响应给客户端
3.Servlet的生命周期
l 实例和初始化时机
当请求到达容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创建实例并 进行初始化。
l 就绪/调用/服务阶段
有请求到达容器,容器调用 servlet 对象的 service()方法,处理请求的方法在整个生命周期中可以被多次调用;
HttpServlet 的 service()方法,会依据请求方式来调用 doGet()或者 doPost()方法。但是, 这两个 do 方法默认情况下,会抛出异常,需要子类去 override。
l 销毁时机
当容器关闭时(应用程序停止时),会将程序中的 Servlet 实例进行销毁。
上述的生命周期可以通过 Servlet 中的生命周期方法来观察。在 Servlet 中有三个生命周期方法,不由用户手动调用,而是在特定的时机有容器自动调用,观察这三个生命周期方法 即可观察到 Servlet 的生命周期。
public class Servlet04 extends HttpServlet { /** * 系统方法,初始化方法 * 在第一次请求时,会执行,只会执行一次 * 当有请求到达容器时,容器会去判断该servlet实例是否存在,如果不存在,则创建servlet实例 */ @Override public void init() throws ServletException { System.out.println("Servlet04 init..."); } /** * 系统方法,就绪/服务方法 * 只有有请求访问资源该方法都会被调用,可以执行多次 */ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("Servlet04 service..."); } /** * 系统方法,销毁方法 * 当容器销毁时(服务器关闭时),调用该方法,只会执行一次 */ @Override public void destroy() { System.out.println("Servlet04 destroy..."); } }
servlet的生命周期步骤:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mSDChb0g-1582289529079)(C:\Users\Hello Word\AppData\Roaming\Typora\typora-user-images\1582288476990.png)]
1、Web Client 向 Servlet 容器(Tomcat)发出 Http 请求
2、Servlet 容器接收 Web Client 的请求
3、Servlet 容器创建一个 HttpRequest 对象,将 Web Client 请求的信息封装到这个对象 中
4、Servlet 容器创建一个 HttpResponse 对象
5、Servlet 容器调 HttpServlet 对象 service 方法,把 HttpRequest 对象与 HttpResponse 对象作为参数,传给 HttpServlet 对象
6、HttpServlet 调用 HttpRequest 对象的有关方法,获取 Http 请求信息
7、HttpServlet 调用 HttpResponse 对象的有关方法,生成响应数据 8、Servlet 容器把 HttpServlet 的响应结果传给 Web Client
4.Servlet的配置
/** * Servlet的配置: web.xml配置: * 1.初始化参数 * <init-param> <param-name>userName</param-name> <!-- 参数名 --> <param-value>zhangsan</param-value> <!-- 参数值 --> </init-param> 2.自启动 在服务器启动时,实例化servlet <!-- 在服务器启动时,实例化servlet;值越小,优先级越高 --> <load-on-startup>1</load-on-startup> * * */ @SuppressWarnings("serial") public class Servlet07 extends HttpServlet { @Override public void init(ServletConfig config) throws ServletException { // TODO Auto-generated method stub //获取初始化参数 String name=config.getInitParameter("userName"); System.out.println(name); } @Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub System.out.println("Servelt07...."); } @Override public void destroy() { // TODO Auto-generated method stub } <!-- url-pattern 可以配多个(一个 servlet 可以通过多个 url-pattern 访问) 当多个 servlet 配置成了同一个 url-pattern,报错 java.lang.reflect.InvocationTargetExceptionion 通配符“*”只能放在最前面或最后面,不能放中间且不能单独存在(以/分割的,不能和单词组成整体)。越精确越优先。 --> <url-pattern>/ser07</url-pattern> <url-pattern>/ser007</url-pattern> <url-pattern>/test/ser07</url-pattern> <url-pattern>/test/*</url-pattern> <url-pattern>*.do</url-pattern> }