C/S(Client-Server)。比如我们手机上的app QQ软件 飞秋
特点:必须下载特定的客户端程序。服务端升级之后,客户端也需要随着升级。
B/S(Broswer-Server).比如京东网站,腾讯qq官方网站
特点:只需要安装浏览器就可以访问。如果服务器端升级了,浏览器端不需要随之升级。
JavaWeb开发,开发的软件是基于B/S的软件架构。
资源就是用户想要获取的资源。资源分为两种,一种是静态资源,一种是动态资源。
静态资源是不会经常发生变化的资源,比如HTML CSS JS 图片。
动态资源是会发生变化的资源,比如servlet jsp。如果我们想要获取动态资源,这些动态资源必须通过服务器部署之后才能获取。
服务器的种类有很多,有文件服务器、邮件服务器、web服务器、数据库服务器。我们的动态资源是部署在web服务器上的,web服务器接收到http请求之后把请求交给Servlet来处理,调?业务类实现动态资源获取。
web服务器有很多,比如tomcat、jetty、weblogic,jboss。
Tomcat是一个免费的开放源代码的Web应用服务器,是Apache软件基金会项目中的一个核心项目,由Apache ,Sun共同开发而成,深受Java爱好者的喜爱,是一款比较流行的web应用服务器。
官网:https://tomcat.apache.org/
安装:下载绿色版tomcat后,解压到本地磁盘即完成安装
①bin:启动和关闭tomcat的bat文件。
②conf:配置文件。
③lib:该目录放置运行tomcat运行需要的jar包。
④logs:存放日志,当我们需要查看日志的时候,可以查询信息。
⑤webapps:放置我们的web应用。
⑥work工作目录:该目录用于存放jsp被访问后生成对应的server文件和.class文件。
启动:双击 bin/startup.bat 文件 ;
停止:双击 bin/shutdown.bat 文件 ;
访问:http://localhost:8080
war 包是 Sun 提出的一种 web 应用程序格式,它与 jar 类似是一个特殊的压缩包。一个 war 文件包含 Servlet、HTML 页面、Java 类、图像文件及其他资源,简单的来说,jar 只是类的归档文件,而 war 包是一个完整的 web 应用程序。我们war文件直接放在 Tomcat 的 webapps 文件夹下就可以启动该项目了。
什么是Http协议: 浏览器和服务器之间进行数据传输需要遵循的格式规范。
主要包含:请求方式、请求URL、状态码、HTTP协议及版本
HTTP Strict Transport Security(通常简称为HSTS)是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式。
响应体就是服务器返回的HTML页面或者json数据
Servlet是Server Applet的简称,是用Java编写的是运行在 Web 服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
Servlet技术的核心是Servlet接口,定义了Servlet与Servlet容器之间的契约,Servlet容器将Servlet类载入内存,生成Servlet实例并调用它具体的方法,所以它是所有Servlet类必须直接或者间接实现的一个接口。
Servlet接口:只负责定义Servlet程序的访问规范;
GenericServlet抽象类:实现了Servlet接口,做了很多空实现,并持有一个ServletConfig类的引用,并提供了一些ServletConfig的使用方法;
HttpServlet抽象类:实现了service方法,并实现了请求分发处理;
右击项目,选择Add Frameworks Support
选择Web Application,再点击OK
将web目录拖拽到main目录下,并改名为webapp
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
package com.by.servlet;
import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse servletResponse)
throws ServletException, IOException {
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().write("<h1>hello<h1>");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
<!--
配置Servlet
servlet-name:servlet的名称
servlet-class:servlet的全类名
url-pattern: 访问servlet的url
-->
<servlet>
<servlet-name>hello</servlet-name>
<!-- servlet-name要和servlet-mapping所对应,映射的关系-->
<servlet-class>com.by.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
@WebServlet("/hello")
public class HelloServlet implements Servlet {}
<!--打包方式-->
<packaging>war</packaging>
点击“Edit Configurations”
点击"+"
浏览器访问:http://localhost:8080/01_servlet_HelloWorld_war/demo
Servlet的生命周期就是servlet类对象什么时候创建?什么时候调用对应的方法,什么时候销毁。
对象的生命周期:
Student student = new Student(); //创建对象
student.setName("eric"); // 使用对象
student.show();// 使用对象
student = null; // 销毁对象
也就是说自定义对象的生命周期由我们程序员自己手动控制。但是!!!Servlet它不是一个普通的java类。是一个被tomcat服务器调用的。所以Servlet是生命周期是被tomcat服务器去控制的。
构造方法:创建servlet的时候调用。默认情况下,第一次访问servlet的时候,会创建servlet对象。此时会有且只会调用1次构造函数,证明了servlet对象是单实例的。
init方法:创建完servlet对象之后调用,也只是会调用1次。
service方法:提供服务的方法,接收用户的请求,并处理用户的请求,然后响应用户的请求。每次发送请求,都会调用service方法。调用几次,service方法会执行几次。
destroy方法:销毁的方法。销毁servlet对象的时候调用。比如我们停止tomcat服务器或者重新部署tomcat服务器,都会销毁servlet对象,只会调用1次。
1、用户发送请求,tomcat服务器会根据用户发送的请求,解析web.xml配置文件,获取servlet-class的全限定名路径(com.by.servlet.ServletDemo)
2、获取字节码对象,然后通过字节码对象获取对应的实例对象
Class clazz = Class.forName("com.by.servlet.ServletDemo");
Object o = clazz.newInstance();
3、创建ServletConfig对象,然后调用init方法
Method method = clazz.getDeclaredMethod("init",ServletConfig.class);// 获取方法对象
method.invoke(o,config);
4、创建request对象,创建response对象,然后调用service方法
Method m = clazz.getDeclaredMethod("service",ServletRequest.class,ServletResponse.class);
m.invoke(o,request,response);
5、销毁servlet实例对象,也是通过反射的机制实现的
Method m1 = clazz.getDeclaredMethod("destroy",null);
m1.invoke(o,null);
public class LifeCycleServlet implements Servlet {
public ServletDemo(){
System.out.println("LifeCycleServlet has run........");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init method has run........");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service method has run........");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destroy method has run........");
}
}