持续更新
• JavaEE(Java Enterprise Edition),Java企业版,是一个用于企业级web开发(不需要使用控制台)平台。最早由Sun公司定制并发布,后由Oracle负责维护。
• JavaEE平台规范了在开发企业级web应用中的技术标准。
• 在JavaEE平台共包含了13个技术规范(随着JavaEE版本的变化所包含的技术点的数量会有增多)。它们分别是:JDBC、JNDI、EJB、RMI、Servlet、JSP、XML、JMS、Java IDL、JPA、JTA、JavaMail和JAF。
JavaEE与JavaSE的对比,可以发现:
1. JavaEE要使用到浏览器、服务器(Tomcat)、数据库。
2. JavaEE程序不是通过main方法来运行,而是要放在服务器(Tomcat)来运行。
3. JavaEE要使用到Servlet和jsp两个东西,而且多了一个web.xml文件做配置。
4. JavaEE是将结果给打印到了浏览器上,而不是控制台上!
5. JavaEE可以让更多的人去访问它、使用它!
B/S架构:浏览器和服务器架构
B/S架构和C/S架构的定义和区别(不同点)
1. 介绍
在计算机网络中进行数据传输、文件共享必须遵守特定的标准。
如果网络通信时只有一个标准,将会导致内容过多,增加了复杂性。所以为了简化网络设计的复杂性,通信标准采用分层结构。
通过分层结构可以带来:
1. 灵活度高。只要保证各层之间的接口不变,每层内容可以灵活修改
2. 实现简单。分层后每层只专注于所在层功能,不需要关心其他层的内容。因为把一个大的功能分成了几层,所以每层实现起来更加简单
OSI七层模型及各层功能概述
太厉害了,终于有人能把TCP/IP 协议讲的明明白白了
TCP三次握手和四次挥手最通俗解释说明案例
三次握手:
形象直观的的描述:
这个过程中总共有四个动作,
1.你招手
2.妹子点头微笑
3.妹子招手
4.你点头微笑
其中妹子连续进行了两个动作,先是点头微笑(回复对方),然后再次招手(寻求确认),实际上我们可以将这两个动作合成一个动作,招手的同时点头和微笑(syn+ack)。于是这四个动作就简化成了三个动作。
1.你招手
2.妹子点头微笑并招手
3.你点头微笑
这就是三次握手的本质,中间的一次动作是两个动作的合并。通过这个案例,不知你对TCP三次握手,有没有进一步的理解。
握手完就可以开始数据传输了。
❀TCP/IP协议面试题总结❀
网页从输入url到页面加载发生了什么⭐⭐
1.DNS解析
2.TCP连接
3.发送HTTP请求
4.服务器处理请求并返回HTTP报文
5.浏览器解析并渲染页面————>1.解析文档构建dom树。2.构建渲染树。3.布局与绘制渲染树。
6.连接结束
P 协议(超文本传输协议)
浏览器与服务器之间发送数据的时候,是要有格式的,是双方约定好的格式。这样双方才能认识对方发送的数据!
这个格式我们称之为协议(在互联网中主机与主机之间进行访问沟通都需要使用特定的协议),
这里我们访问的是Tomcat,想访问Tomcat,就必须知道http协议!
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,
HTTP是万维网(WWW:World Wide Web)的数据通信的基础。
HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应
• 支持客户端/服务器模式(B/S)
• 简单快速
• 灵活(传输的数据类型多样)
• 短链接是指每次请求响应完成后,连接会自动断开。从http1.1开始,我们使用的是长连接,长连接是每次请求响应完成后,连接会保持一小段的存活时间,供之后的请求使用。长连接要比短连接的效率高!
• 单向性 服务端永远是被动的等待客户端(浏览器)的请求。
• 无状态 无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大,用户体验度也不好。为了解决HTTP协议无状态,于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。
URL(Uniform Resource Location统一资源定位符),可以帮助我们唯一定位互联网上的某一个资源,相当于是互联网资源的身份证号。URL由五个元素组成:
http://192.168.26.106:8080/index.jsp?id=1
• 传送协议
• 域名或者IP地址
• 端口号(以数字方式表示,若为HTTP的默认值“:80”可省略)
• 请求资源路径
• 传递数据(在URL中传递数据是以key=value的结构进行数据绑定,以“?”字符为起点,每个参数以“&”隔开通常以UTF8的URL编码,避开字符冲突的问题)
URI:(Uniform Resource Identifier),
统一资源标识符,是一个用于标识某一互联网资源名称的字符串。
URI是一个特别抽象的概念,
URI包含了URL
在Java中,当获取请求URI时,常是一级路径/二级路径。
URI,Uniform Resource Identifier,统一资源标识符。
URL,Uniform Resource Location,统一资源定位符。 URI 简单来理解就是标识/定义了一个资源,而 URL 在定义/标识资源的同时还需要描述如何访问到该资源。可以认为 URL 是 URI 的一个子集。一个URI可以包含多个URL.
http协议就是用来规范请求与响应的数据格式的。
Request 消息分为3部分:
• 第一部分叫Request line 请求行
• 第二部分叫Request header 请求头
• 第三部分是Request body 请求体
GET和 POST区别
• GET 向指定的资源发出“显示”请求。 GET请求中会将请求中传递的数据包含在URL中并在浏览器的地址栏中显示。 GET请求传递数据时要求数据必须是ASCII字符。 GET请求可以被浏览器缓存。
• POST 向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。 数据被包含在请求体中。 POST请求传递数据时,数据可以是ASCII字符也可以是字节型数据,默认为字符型。 POST请求默认情况下不会被浏览器所缓存。
• bin:用来存放Tomcat服务器的可执行程序,主要有两大类,一类是以.sh结尾的(linux命令),另一类是以.bat结尾的(windows命令)。
• conf:用来存放Tomcat服务器的配置文件
• lib:用来存放Tomcat服务器的jar包
• logs:用来存放Tomcat服务器运行时输出的日志信息
• temp:用来存放Tomcat服务器运行时产生的临时数据
• webapps:用来存放Tomcat服务器部署的工程
• work:是Tomcat工作时的目录,用来存放Tomcat运行时jsp翻译为Servlet的源码和编译后的文件
Tomcat的启动与关闭需要执行bin目录中的命令脚本。 注意: 如果启动时闪退,是因为JDK的环境变量配置不规范,需要重新配置。
Tomcat启动 运行startup.bat文件。
Tomcat关闭 运行shutdown.bat文件或者直接关闭掉启动窗口(不推荐)。
访问Tomcat 访问Tomcat的URL格式:http://ip:port 访问本机Tomcat的URL格式:http://localhost:8080
Tomcat 的配置文件由4个xml组成,在conf文件夹,分别是 context.xml、web.xml、server.xml、tomcat-users.xml。
每个文件都有自己的功能与配置方法。
context.xml context.xml 是 Tomcat 公用的环境配置。 Tomcat 服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器 。
web.xml Web应用程序描述文件,都是关于是Web应用程序的配置文件。所有Web应用的 web.xml 文件的父文件。
server.xml 是 tomcat 服务器的核心配置文件,server.xml的每一个元素都对应了 tomcat中的一个组件(pojo对象),通过对xml中元素的配置,实现对 tomcat中的各个组件和端口的配置。
tomcat-users.xml 配置访问Tomcat的用户以及角色的配置文件。
• Servlet(Server applet)是运行在服务端的一个小程序(容器)
• Servlet指的是一个接口规范,具体的体现为接口及其接口的实现类。该接口的名字就是Servlet
• Servlet的作用:接收客户端请求并处理,将处理的结果响应给客户的容器
• Servlet是JavaWeb开发的三大组件之一(另外两个是过滤器filter与监听器listener)
1. 自定义一个类,继承HttpServlet
2. 重写service方法(写的就是业务处理的代码)
3. 在web.xml中对Servlet进行配置
创建一个包:com.jf.controller
编写一个类HelloServlet继承HttpServlet,并重写service方法
web.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">
<!--xml:可扩展的标记语言,从html引申出来的一种新的文本格式-->
<!--其作用是自定义配置,或者传输数据时使用-->
<!--向tomcat注册servlet容器-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.jf.servlet.HelloServlet</servlet-class>
</servlet>
<!--
servlet-name:这个servletname必须和上面的容器名字一致 否则它就报错
url-pattern: 是url的映射路径,实际就是在网页地址栏中输入的uri
url-pattern:标签内的uri名字 我们可以自己随意定义,定义了客户端访问该servlet容器的URI
ss*123_: 不要这么起名字 没这么干的 不符合咱们的命名规则
servlet-name 与 url-pattern可以重名
servlet-name: 可以随意起名字 但是也是要遵守命名规范
-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
1. update resources:表示当你是修改了静态资源,比如HTML、css等,就可以使用它来启动
2. update classes and resources:对类的修改使用它不生效,所以不建议使用
3. Redeploy:重部署,这个适合于你修改了配置文件、修改了代码,可以重新部署项目到服务器
4. restart server:重启服务器,当你修改了web.xml,最好重启服务器
1.启动Tomcat服务器(以下动作只在服务器启动的时候执行):
1)解析web项目的web.xml文件
2)通过反射创建所有的Servlet对象
反射创建
Class clazz=Class.forName(“包名+类名”);
Servlet servlet= clazz.newInstance();
将创建好的Servlet对象放到Map集合中:
key是web.xml配置文件中的映射路径(url-pattern)
value是Servlet对象
2.Tomcat服务器接收请求
请求地址: http://localhost:8080/demo/HelloServlet
3.Tomcat服务器解析请求:
Tomcat服务器解析请求后,会诞生两个对象分别为: HttpServletRequest对象:存储此次请求的所有相关信息(行、头、体),每次请求重新创建 HttpServletResponse对象:存储了此次请求的响应流对象,每次请求重新创建
4.Tomcat服务器查找请求的资源
Tomcat服务器根据请求地址从map集合中获取要调用的Servlet对象 Servlet servlet=map.get(“/HelloServlet”);
5.Tomcat服务器调用Servlet对象的过程:
Class clazz= servlet.getClass();
Method method = clazz.getMethod(“service”,HttpServletRequest.class,HttpServletResponse.class);
method.invoke(servlet,request,response);
注意: 该流程由Tomcat底层接收请求后自动执行,我们是看不到的,我们需要做的是将实现了Servlet接口的代码提前放到Tomcat服务器中,这样请求被接收后就可以反射调用了。
1、默认欢迎页的设置(掌握)
默认欢迎页就是指,浏览器发出的请求路径中没有指定具体的访问资源时,默认就会访问的页面。
在Tomcat中的conf/web.xml中配置了全局的几个默认欢迎页。
欢迎页可以配置多个,匹配优先级自上而下。
<welcome-file-list>
<welcome-file>index.htmlwelcome-file>
<welcome-file>index.htmwelcome-file>
<welcome-file>index.jspwelcome-file>
welcome-file-list>
一般在我们项目中要设置默认欢迎页的话,在自己项目的web.xml中设置即可!不要改Tomcat中的conf/web.xml进行设置。
<welcome-file-list>
<welcome-file>hello.htmlwelcome-file>
welcome-file-list>
我们知道,浏览器发起请求后达到Tomcat服务器;
服务器会解析请求信息得到HttpServletRequest和HttpServletResponse两个对象;
然后服务器再通过反射去调用Servlet的service方法去处理请求。
显然,Servlet对象在创建、初始化并使用后不应该销毁。如果使用完(请求处理完)就销毁,那么下次过来请求又得去创建Servlet对象,这样效率并不高!!
我们自始至终都使用同一个Servlet对象去处理请求,如果同时有10个请求过来访问Tomcat服务器,服务器会创建10个线程来处理请求,因为service方法不涉及到全局变量的修改操作,所以也不会有线程安全问题的。
由问题1,我们可以了解到,Servlet对象只会被创建及初始化一次。之后会驻留在内存当中。
Servlet的创建与初始化的时机有两个:
1. 延迟加载 : Servlet在第一次被浏览器访问的时候创建与初始化的(目前我们的代码用的就是这种方式,默认就是这种)
2. 预加载 : Servlet在启动服务器的时候被创建与初始化的(该方式需要做一些配置,告诉Tomcat服务器在启动的时候就创建Servlet对象)
Servlet对象是由Tomcat服务器创建的,之后就一直驻留在内存中处理请求。直到服务器停止后,Servlet才会被销毁!
2. 配置了load-on-startup的情况:
服务器启动的时候就会执行:构造方法,然后执行初始化方法。
之后有请求过来,就直接走service方法进行处理。
服务器停止的时候,执行销毁方法。
1. 打开IDEA
2. 在IDEA中创建一个Java Enterprise项目
3. 在项目的src目录下创建一个com.jf.controller包,在包中创建自己的类继承HttpServlet
4. 重写service方法,在service方法中写的就是处理请求的业务逻辑代码
5. 在web.xml中配置映射关系
6. 启动tomcat服务器
7. 在浏览器输入路径访问Servlet
<servlet-mapping>
<servlet-name>helloservlet-name>
<url-pattern>/hellourl-pattern>
<url-pattern>/UserServleturl-pattern>
<url-pattern>*.dourl-pattern>
<url-pattern>/user/UserServleturl-pattern>
<url-pattern>/*url-pattern>
<url-pattern>/url-pattern>
servlet-mapping>
• tomcat服务器是支持Servlet规范的。我们写的代码要想被服务器调用到,也必须遵守Servlet规范
• 在Java中提到规范,其实就是接口,及接口的一系列实现类
• 之前我们写的Servlet类并没有去直接实现Servlet接口,是因为该接口中方法较多,而我们一般只关注service方法,而Servlet接口有它的一系列实现类,我们继承这些实现类即可,也就相当于间接的实现了Servlet接口
1.1 service方法的作用
在service方法中编写处理请求的业务逻辑代码,浏览器发送请求后由tomcat服务器自动调用执行。
1.2 service方法的方法体
service方法中写业务逻辑代码的话,大概是如下三步:
1. 获取请求数据
2. 处理请求数据
3. 响应结果
request对象的特点
1. 在tomcat服务器接收请求后,对请求进行解析后创建的
2. 每次请求,tomcat服务器都会重新创建
3. request对象存储了此次请求的所有数据(http协议中的请求行、头、体)
request对象的使用
1. request对象获取请求行数据
2. request对象获取请求头数据
3. request对象获取请求体数据
4. request对象获取其他数据
public class UserServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求行信息
//获取请求方式
String method = req.getMethod();
System.out.println("请求方式是:" + method);
//获取请求的URI
String uri = req.getRequestURI();
System.out.println("请求的URI是:" + uri);
//获取请求协议
String scheme = req.getScheme();
System.out.println("请求的协议是:" + scheme);
//获取请求头信息,根据键名去获取
//获取请求的主机信息
String host = req.getHeader("host");
System.out.println("请求的主机信息是:" + host);
//获取浏览器信息
String userAgent = req.getHeader("User-Agent");
System.out.println("用户的浏览器信息是:" + userAgent);
System.out.println("================所有请求头信息==================");
//获取所有的请求头信息
//拿到所有请求头的名字
Enumeration<String> headerNames = req.getHeaderNames();
while(headerNames.hasMoreElements()){
String key = headerNames.nextElement();
String value = req.getHeader(key);
System.out.println(key + ":" + value);
}
//获取请求体数据, getParameter()方法的参数必须和请求中的参数名一致!!!
String name = req.getParameter("name");
System.out.println("名字是:" + name);
String age = req.getParameter("age");
System.out.println("年龄是:" + age);
//getParameterValues()方法可以获取多个参数名一样的数据,会得到一个数组
String[] hobbies = req.getParameterValues("hobby");
System.out.println("爱好是:" + Arrays.toString(hobbies));
//获取其他数据
//获取项目路径, 格式是 /项目名
String contextPath = req.getContextPath();
System.out.println("项目路径是:" + contextPath);
//获取请求的url地址
String url = req.getRequestURL().toString();
System.out.println("请求的url地址是:" + url);
//获取服务器的ip
String serverName = req.getServerName();
System.out.println("服务器的ip地址是:" + serverName);
//获取服务器的端口
int serverPort = req.getServerPort();
System.out.println("服务器的端口是:" + serverPort);
}
}