前端技术:
一个设计优良的网页一般我们要分成三个部分:结构、表现、行为。
结构、表现、行为要求三者分离。
结构、表现、行为,分别对应了三个技术。
结构:HTML
表现:CSS
行为:JavaScript jQuery (重点)
JavaScript
- 浏览器端的脚本语言
- JS也是一门面向对象的语言,但是它和Java不同,
Java的面向对象时基于类的,而JS的面向对象是基于原型的。
- 对于JS来说,主要需要我们掌握的就是DOM编程。
- DOM指Document Object Model(文档对象模型)
- DOM实际上就是通过JS去操作网页。
- Document 文档:
指的是整个的HTML文档。
- Object 对象
指的是将网页中所有的内容都转换为了对象。
- Model 模型
使用模型来表示这些节点之间的关系。
- JavaScript中已经为我们提供了一个document对象,它代表整个HTML文档,
HTML中所有的节点都是他的后代节点。我们可以通过document对象来查询节点。
- 通过document查询元素节点的方法
- 通过id查询一个元素节点对象:document.getElementById(id);
- 通过标签名查询一组元素节点对象:document.getElementsByTagName(标签名);
- 通过name属性查询一组元素节点对象: document.getElementsByName(name属性);
> jQuery
- jQuery是目前最受欢迎的JavaScript库。
- jQuery用来简化JavaScript的开发,并且解决了一些浏览器之间的兼容性问题。
- 目前jQuery主要有两个版本1.X和2.X
2.X主要用于移动端的开发(不支持IE8以下的浏览器)
1.X主要用于PC端的开发(支持IE6 、7、8)
- jQuery的核心函数:
- $是jQuery中核心函数
- jQuery的大部分功能都需要通过核心函数来实现
- 核心函数根据参数的不同主要有4种功能:
- 传一个函数作为参数
$(function(){}) --> 作用和window.onload = function(){}类似,会在整个文档加载完毕之后执行
- 传一个选择器的字符串
$(选择器) --> 作用可以根据选择器从页面查找指定的元素
选择器:
1.基本选择器
2.层级选择器
3.过滤选择器
- 传一段HTML代码
$("<li>广州</li>") --> 可以根据HTML代码去创建对象
- 传一个DOM对象
$(DOM对象) --> 可以将DOM对象转换为jQuery对象
- DOM对象和jQuery对象的转换
DOM --> jQuery
var $obj = $(obj);
jQuery --> DOM
var obj = $obj[0];
XML
XML实际上就是一种表示数据的格式,使用不同的XML标签来定义不同的数据。
实际开发中我们使用XML,主要是做一些配置文件。
对于XML来说解析是一个难点,面试时候有可能会问到。
解析XML主要分为两个体系:DOM和SAX
DOM(Document Object Model)
- DOM解析是一次性将整个文档都加载进内存中,生成一棵DOM树,然后我们通过操作这棵树,来解析文档。
- 优点:
- 纯面向对象的解析方式,使用起来比较简单
- 一次性将整个文档都加载进内存中,我们可以反复操作。
- 可以对XML文档进行增删改查的操作
- 缺点:
- 一次性将文档都加载进内存,解析性能较差,并且会占用较多的内存
- 扩展:
- 由DOM扩展出来dom4j,他是JavaEE开发首选的方式。
> SAX(Simple API for XML)
- SAX是基于事件的回调的方式,一个节点一个节点的解析,同一时刻只会解析一个节点。
- 优点:
- 一次只解析一个节点,解析性能好,占用内存小
- 缺点:
- 基于事件回调的方式,使用起来相对要麻烦一些
- SAX解析完一个节点以后,将会将节点内容丢弃,不能反复解析某个节点,
如果想重复解析,则需要重新再解析一遍
- SAX解析只能进行查询的操作
- SAX解析一旦开始就不能手动停止,必须等到解析结束
- 扩展:
- 由SAX扩展出PULL,解决SAX不能手动停止的问题,Android内置的解析方式。
Http协议:
HTTP协议规定的是浏览器和服务器之间通信的报文的格式
报文的格式:
- get请求报文
请求首行
请求头
- post请求报文
请求首行
请求头
空行
请求体
- 响应报文
响应首行
响应头
空行
响应体
> get请求和post请求
1.get请求没有请求体,post请求有请求体
2.get请求通过url地址来发送请求参数,post请求通过请求体发送请求参数
3.get请求通过url发送请求参数,大小有限制255个字符
post请求通过请求体发送请求参数,大小没有限制
4.get请求发送的请求参数可以通过地址栏看见,
post请求的参数不能通过地址栏看见
post相比于get请求稍微安全一些。
5.除了表单的method属性设置为post时,其他的全都是get请求。(没有考虑AJAX)
6.一般开发中提交表单时,全都使用post请求。
Servlet
Servlet的生命周期:
- 从Servlet实例被创建到被销毁的过程
- Servlet的生命周期方法:
1.构造器 –> 第一次处理请求时调用,用来创建Servlet实例,只会调用一次。
2.init –> 构造器调用之后马上被调用,用来初始化Servlet,只会调用一次。
3.service –> 每次处理请求的时候都会调用。会调用多次。
4.destroy –> servlet对象被销毁前调用(Servlet对象会在项目卸载的时候销毁),只会调用一次。
- Servlet的实例默认是在第一次处理请求时创建的,
我们可以在servlet标签中通过load-on-startup标签来设置Servlet的启动时机,
当我们为load-on-startup设置一个大于等0的数时,它会在服务器一启动的时候就创建实例,
同时数值越小,越先创建。
- 转发和重定向:
1.转发时浏览器发送了1次请求,重定向时浏览器发送了2次请求。
2.转发是在服务器内部进行的,重定向是在浏览器端进行的。
3.转发时地址栏不会发生改变,重定向时地址栏会发生改变。
4.转发时request域中的属性不会丢失,重定向时request域中的属性会丢失。
5.转发:
request.getRequestDispatcher("路径").forward(request,response);
重定向:
response.sendRedirect("路径");
- 路径问题:
- 在开发中我们使用绝对路径,尽量不适用相对路径。
- 绝对路径使用 / 开头。
- 绝对路径分两种:
1. 由浏览器解析的绝对路径:
- 它是以服务器的根目录为绝对路径的
http://localhost:8080/
- 需要加上项目名
- 主要情况:
1) html标签中的路径
2) 重定向时的路径
2. 由服务器解析的绝对路径
- 它是以项目的根目录为绝对路径
http://localhost:8080/项目名/
- 不需要加上项目名
- 主要情况:
1) 转发时的路径
2) url-pattern的路径
JSP
- JSP本质就是一个Servlet
- 我们在访问一个JSP时,服务器会将JSP翻译为一个Servlet,然后在调用Servlet来处理请求。
- jsp –翻译–> java –编译–> class
- JSP中的隐含对象
- 隐含对象指可以在JSP中直接使用的对象
- JSP中一共有9个隐含对象
pageContext
- 类型 PageContext
request
- 类型 HttpServletRequest
session
- 类型 HttpSession
application
- 类型 ServletContext
out
- 类型 JspWriter
page
- 类型 Object
response
- 类型 HttpServletResponse
exception
- 类型 Throwable
config
- 类型 ServletConfig
- 在JavaWeb中一共有四个域对象pageContext 、 request 、session 、 application
- 在JSP可以获取全部四个域对象,在Servlet中只能获取三个,获取不到PageContext。
- EL表达式
语法:${表达式}
- 作用:代替JSP表达式,主要用来向页面中输出一个对象的
initParam 全部应用程序参数名组成的集合
cookie 所有cookie组成的集合
header HTTP请求头部,字符串
headerValues HTTP请求头部,字符串集合
param 所有请求参数字符串组成的集合
paramValues 所有作为字符串集合的请求参数
pageContext 当前页面的javax.servlet.jsp.PageContext对象
pageScope 页面范围内所有对象的集合
requestScope 所有请求范围的对象的集合
sessionScope 所有会话范围的对象的集合
applicationScope 应用程序范围内的scoped变量组成的集合
- JSTL
- 作用: 用来代替JSP脚本片段的。
- JSTL的标准由sun公司制定的,有Apache公司来实现的,所以在使用JSTL时,需要导入两个jar包:
taglibs-standard-impl-1.2.1.jar
taglibs-standard-spec-1.2.1.jar
- 常用库
1.核心标签库(c标签)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
2.函数标签库
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
3.国际化标签库
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
会话控制
- Http协议是一个无状态的协议,服务器不能通过报文来区分出多次次请求是否发送自同一个用户。
所以我们需要一个技术来做会话控制。会话控制我们主要有两个技术Cookie和Session
- Cookie:
Cookie实际上就是一个头。
Cookie由服务器创建,以响应头的形式发送给浏览器
浏览器收到Cookie之后,会将Cookie保存
下次访问服务器时,浏览器会以请求头的形式将Cookie发回
服务器就可以根据浏览器发回的Cookie来识别不同的请求。
Cookie的不足:
1.Cookie由服务器创建由浏览器保存,每次浏览器发送请求时,都需要带着Cookie,
如果Cookie中信息过多的话,会占用大量的网络资源,性能会很差。
2.各个浏览器对Cookie的数量和大小都有限制,所以我们不能在Cookie中保存过多的信息。
3.Cookie中的内容都是纯文本的,不太安全。
- HttpSession:
- HttpSession为了解决Cookie的不足而出现。
- HttpSession的对象是保存到服务器中。
- 每一次会话都对应一个HttpSession对象。
- 每一个HttpSession都有一个唯一的ID,当服务器创建好Session对象以后
会将Session对象以id为键保存到一个SessionMap中,
然后会将Session的id以Cookie的形式发送给浏览器,
浏览器再访问服务器时,它会带回这个Cookie,
这样服务器就可以根据id找到对应的HttpSession对象。
- session对象创建时机:
session对象会在getSession方法第一次调用时创建。
- token
- token(令牌),用来防止表单的重复提交
- token的流程:
1.服务器创建一个唯一的标识作为token,然后将token保存到session中
2.将token放入到表单的隐藏域中,和请求一起发送
3.检查request中token和session中的token是否一致
4.一致,处理请求
5.不一致,转到错误页面
6.token是一次性,用完了要从session中移除
Filter
- Filter过滤器的意思。
- Filter的作用:
1.Filter可以请求到目标资源之前进行拦截。
2.Filter还可以放行请求,使请求到达目标资源。
3.Filter可以在响应到达浏览器之前做一些处理。
- Filter的创建:
1.创建一个类并实现Filter接口
2.在web.xml文件中配置Filter
<filter>
<filter-name></filter-name>
<filter-class></filter-class>
</filter>
<filter-mapping>
<filter-name></filter-name>
<url-pattern></url-pattern>
</filter-mapping>
- Filter的生命周期方法:
构造器:服务器一启动就会调用,用来创建Filter的实例,只会调用一次,Filter也是单例。
init:构造器调用之后马上被调用,用来初始化Filter,只会调用一次
doFilter:每次拦截请求时都会调用,会调用多次
destroy:Filter被销毁前(项目卸载时)调用,用来做一些收尾工作,只会调用一次
JSON
- JSON和XML类似,它也是一种数据格式。
- 但是JSON存储和传输数据的性能比XML更好。
- 例子:
{“name”:”孙悟空”,”age”:18,”gender”:”男”}
<student>
<name>孙悟空</name>
<age>18</age>
<gender>男</gender>
</student>
- XML更方便阅读,而JSON更方便传输。
- 在开发中一般使用XML作为配置文件,
使用JSON来传输数据。
- JSON的格式:
1.JSON对象
{"属性名1":属性值1,"属性名2":属性值2,"属性名3":属性值3}
2.JSON数组
[属性值1,属性值2,属性值3,属性值4]
- JSON中可以使用的数据类型:
1.字符串
2.数字
3.布尔值
4.null
5.对象
6.数组
servlet运行流程
首先Servlet被部署到Web容器中,当客户端发送调用这个Servlet的请求到达Web容器时,
Web容器会先判断所调用的Servlet实例是否存在。
如果不存在,就装载当前所调用的Servlet并调用构造方法生成这个Servlet的实例,
其次再调用这个实例的init()方法(init()这个方法只会在Servlet初始化的时候调用一次,
除非这个Servlet被重新部署)进行初始化,然后新创建一个线程,并在新建线程中调用这个实例的service()方法,
service()方法再根据请求的具体类型调用doGet()、doPost()等方法,然后生成动态的回复内容,
最后服务器发送回复内容给客户端的浏览器。
如果存在,就直接新创建一个线程,并在新建线程中调用这个实例的service()方法,service()方法再根据请求的具体类型调用doGet()、doPost()等方法,
然后生成动态的回复内容,最后服务器发送回复内容给客户端的浏览器。
当Servlet不再需要使用的时候,比如其所在的Web应用被卸载或Web服务器关闭时,它就会被卸载掉,卸载前调用destory()方法,完成所有相关资源的释放。