JavaScript
JS是一门弱类型的语言,变量的数据类型由后面的赋值的类型决定。
==
是等于,做简单的字面值的比较;===
是全等于,除了做字面值的比较外,还会比较两个变量的数据类型。
var a = "12";
var b = 12;
a==b;//true
a===b;//false
在JavaScript中,所有的变量都可以作为一个布尔类型的变量来使用。0、null、undefined、“”(空串)都认为是false,但空数组为true。
且运算和或运算:当表达式全为真/假的时候。返回最后一个表达式的值。当表达式中,有一个为假的时候。返回第一个为假/真的表达式的值,有点类似短路逻辑,只是返回的是值,不一定是true和false。
只要我们通过数组下标赋值,那么JavaScript会自动的给数组做扩容。
JavaScript不支持重载,会进行覆盖,以最后一次的函数为准。
可以使用隐形参数arguments来获取传入的参数,使用与数组类似。
可以通过var obj = new Object();
或者var obj = {}
创建对象。
test()
方法用于测试字符串是否符合某个规则,通常和正则表达式一起使用,例如patt.test(name)
,patt是正则表达式。
childNodes()中两个标签之间的空格也算是一个子节点,要注意这个细节。
网页的执行顺序是从上到下,因此使用JS操作HTML对象的时候要注意其是否已经加载。
事件的冒泡是指,父子元素同时监听同一个事件。当触发子元素的事件的时候,同一个事件也被传递到了父元素的事件里去响应。如果需要阻止则在事件函数体内return false。
JQuery
JQuery对象是DOM对象的数组+JQuery提供的一系列功能。
JQuery的页面加载完成早于原生的JS页面加载完成之和,JQuery的页面加载完成之后是浏览器的内核解析完页面的标签创建好DOM对象后就会马上执行,原生JS页面除此之外还要等标签显示时需要的内容加载完成。
原生JS的页面加载完成后,只会执行最后一次的赋值函数,JQuery的页面加载完成是全部把注册的function函数依次顺序执行。
- 传入参数为函数时:在文档加载完成后执行这个函数。
- 传入参数为HTML字符串时:根据这个字符串创建元素节点。
- 对象传入参数为选择器字符串时:根据这个字符串查找元素节点对象。
- 传入参数为DOM对象时:将DOM对象包装为jQuery对象返回
常见事件
函数 | 事件 | 作用 |
---|---|---|
onload | 加载完成事件 | 页面加载完成后,常用于页面JS代码初始化操作 |
onclick | 单击事件 | 常用于按钮的点击响应操作 |
onblur | 失去焦点事件 | 常用于输入框失去焦点后验证其输入内容是否合法 |
onchange | 内容发生改变事件 | 常用于下拉列表和输入框内容发生改变后操作 |
onsubmit | 表单提交事件 | 常用于表单提交前,验证所有表单项是否合法,阻止提交可以通过函数返回false |
基本数据类型
- 数值型:JavaScript不区分整数、小数。
- 字符串:JavaScript不区分字符、字符串;单引号、双引号意思一样。
- 对象类型。
- 布尔型:true、false。
- 函数类型。
window.onload=function(){
updateZJ();
//当页面加载完成,我们需要绑定各种事件
//根据id获取到表格
var fruitTbl = document.getElementById("tbl_fruit");
//获取表格中的所有的行
var rows = fruitTbl.rows ;
for(var i = 1 ; i<rows.length-1 ; i++){
var tr = rows[i];
//1.绑定鼠标悬浮以及离开时设置背景颜色事件
tr.onmouseover=showBGColor;
tr.onmouseout=clearBGColor;
//获取tr这一行的所有单元格
var cells = tr.cells;
var priceTD = cells[1];
//2.绑定鼠标悬浮在单价单元格变手势的事件
priceTD.onmouseover = showHand ;
//3.绑定鼠标点击单价单元格的事件
priceTD.onclick=editPrice;
}
}
Tomcat
xml是可拓展的标志性语言,可以用于保存数据,还可以作为项目或模块的配置文件,还可以作为网络传输网络传输数据的格式(现在以JSON为主)。
xml一定要有根元素,要求唯一且没有父元素。
xml的CDATA语法可以告诉xml解析器该内容为纯文本,不需要解析,例如<![CDATA[纯文本]]>
。
目录结构:bin:可执行文件目录;conf:配置文件目录;lib:存放ib的目录;logs:日志文件目录;webapps:项目部署的目录;work:工作目录;temp:临时目录。
Tomcat一定要安装在C盘,不然会无法运行。点击startup.bat启动项目。
部署项目时只需要webapps下新建目录,然后在该目录下新建名为WEB-INF
文件夹,也可以在conf文件下编写xml文件。
修改端口号在Tomcat目录下的conf目录的server.xml文件。
访问网页时输入的是http
,而不是https
。
在IDEA中可以选中项目,右键选择添加框架的支持
,勾选Web Application
。
先有artifact,后来才添加的mysql.jar。此时,这个jar包并没有添加到部署包中。那么在projectSettings中有一个Problems中会有提示的,我们点击fix选择add to。另外,我们也可以直接把lib文件夹直接新建在WEB-INF下。这样不好的地方是这个lib只能是当前这个moudle独享。
使用request.setCharacterEncoding("UTF-8")
来解决POST返回乱码的问题,GET在Tomcat8前则没有这个问题。需要注意的是,设置编码这一句代码必须在所有的获取参数动作之前。
访问流程
- 用户发请求,action=add
- 在项目中的web.xml中找servlet-mapping的url-pattern = /add
- 找到11行的servlet-name = AddServlet
- 根据11行的找到第七行一致的servlet
- 找到对应的servlet-class
- 用户发送的是post请求,因此Tomcat会执行其中的doPost方法
Servlet
生命周期:1、执行Servlet构造器方法。2、执行init初试方法。3、执行service方法。每次方法都会调用4、执行destroy销毁方法。
一般在实际项目开发中,都是使用继承HttpServlet类的方式去实现Servlet程序。
WEB-INF的HTML页面不能直接访问,但是key通过请求转发的方式访问。
请求转发不能访问工程以外的资源。
输出流有字节流和字符流两种,两者不能同时使用。
base标签确定相对地址参考的路径。
请求重定向的特点是浏览器地址栏会发生变化,不共享Request域中的数据,也不能访问WEB-INF下的资源,但可以访问工程以外的资源。
cttl+shift+t启动测试。
浏览器解析/到端口号,服务器解析/到web目录。
JSP
Jsp的全称是Java server pages,主要作用是替代servlet程序回传HTML页面的数据。
Jsp本质上就是一个servlet程序。当我们第一访问Jsp页面的时候,Tomcat服务器会帮我们把Jsp页面翻译成为一个Java源文件,并且将其编译为.class字节码文件。
当J sp页面中所有代码执行完成后会做以下两个操作: 1、执行out.flush()操作,会把out缓冲区中的数据追加写入到response缓冲区末尾。2、会执行response的刷新操作。把全部数据写给客户端。
out的print方法会将需要输出的数据转换为字符串,然后通过write方法输出,而write方法只能输出字符串。
静态包含直接将被包含的Jsp页面代码拷贝到包含的位置输出,不会进行翻译。动态包含则会将自身的Jsp代码进行翻译。
可以使用一个hidden的input标签返回信息,用于区分是登录处理还是注册处理。
使用BeanUtils工具类可以快速将浏览器的信息进行保存,无需逐个属性进行获取,注入的核心还是调用对应的Set方法。
Listener监听器
监听器的作用是监听某种事物的变化,然后通过回调函数,回馈给程序去做一些相应的处理。
JSTL标签库全称是指JSP Standard Tag Library,是JSP标准标签库,是一个不断完善的开放源代码的SP标签库。EL表达式主要是为了替换jsp中的表达式脚本,而标签库则是为了替换代码脚本。这样使得整个jsp页面变得更佳简洁。
如果访问JSP无法得到数据,那么可以让程序先访问Servlet程序,再转发到JSP页面。注意要按照流程访问,不能直接访问JSP,因为此时JSP页面还没有获取到数据。
EL表达式
EL表达式的全称是:Expression Language,是表达式语言。 EL表达式主要是代替jsp页面中的表达式脚本在jsp页面中进行数据的输出,输出的主要是域对象中的数据。
EL在找对象输出值的时候是找对象的get方法或is方法(布尔类型),而不是访问它的属性,比如一个类并没有该属性,但是有对应的get方法或is方法(布尔类型),仍然可以正常返回结果。
在使用key中包含特殊字符的使用要注意不要使用map.key
来访问数据,而是应当使用map['key']
的方式访问。
文件上传介绍
- 要有一个fonm标签,method=:post请求。
- form标签的encType属性值必须为multipart/form-data值,表示提交的数据,以多段的形式进行拼接,然后以二进制流的形式发送给服务器。
- 在form标签中使用input type=file添加上传的文件。
- 编写服务器代码(Servlet程序)接收,处理上传的数据。
中文乱码问题,IE和谷歌可以使用URLEncoder方法解决,"attachment;filename="+URLEncoder.encode("中国.jpg","UTF-8"))
。
火狐浏览器使用BASE64编解码解决,"attachment;filename==?UTF-8?B?"+new BASE64Encoder().encode("中国.jpg".getBytes("UTF-8"))+"?="
。
书城项目
前台是给普通用户使用,一般不需要权限检查就可以访问的资源。后台是给管理员使用的,需要权限管理。
表单重复提交:当用户提交完请求后,浏览器会记录下最后一次请求的全部信息。当用户按下功能键F5时,就会发起浏览器记录的最后一次请求。此时使用重定向就可以解决该问题,因为重定向是两次请求,最后一次请求是查看操作并不影响。值得注意的是请求转发和重定向的路径的不一样的。
测试方法没有返回值,也没有参数。
javascript语言中提供了一个location.地址栏对象,它有一个属性href.它可以获取浏览器地址栏中的地址。
当你复制粘贴文件的时候,out文件夹可能没有及时更新,或者是浏览器缓存问题,这时我们点击IDEA菜单栏上的构建按钮进行重建或者浏览器清缓存即可。
遇到浏览器不显示的情况可能是HTML网页中引用外部文件有问题,IDEA会将其标红。
在使用谷歌验证码的时候,使用KAPTCHA_SESSIONKEY常量即可获得存入session中的验证码值。
如果想要点击验证码图片刷新,需求每次请求图片的时候增加随机变量,不然部分浏览器可能会直接从缓存中查找,导致没有更新。
在HTTP协议中有一个请求头,叫Referer,它可以将请求发起时,浏览器地址栏的地址发送给服务器。使用 req.getHeader("Referer")
即可获取。
可以使用this.value = this.defaultValue;
恢复输出框中原来的值,defaultValue属性是表单项Dome对象的属性,它表示默认的Value属性值。
要确保所有操作都在一个事务内,就必须要确保所有操作都使用同一个Connection。我们可以使用ThreadLocal对象来确保所有操作都使用同一个Connection对象。
如果是使用事务,DAO层捕获到异常后一定要往外抛,这样上层才能够检测到异常后进行回滚操作。
将所有的异常都交给Tomcat,让Tomcat展示良好的错误信息页面,通过web.xml配置error-page
即可。
ThreadLocal
- ThreadLocal的作用是可以解决多线程的数据安全问题,它可以给当前线程关联一个数据。
- ThreadLocal可以为当前线程关联一个数据。(它可以像Map一样存取数据,key为当前线程)。
- 每一个ThreadLocal对象,只能为当前线程关联一个数据,以最后传入的为准,如果要为当前线程关联多个数据,就需要使用多个ThreadLocal对象实例。
- 每个ThreadLocal对象实例定义的时候,一般都是static类型。
- ThreadLocal中保存数据,在线程销毁后。会由JVM虚拟自动释放。
表单重复提交问题
- 提交完表单。服务器使用请求转来进行页面跳转。这个时候,用户按下功能键F5,就会发起最后一次的请求。造成表单重复提交问题。解决方法:使用重定向来进行跳转。
- 用户正常提交服务器,但是由于网络延迟等原因,迟迟未收到服务器的响应,这个时候,用户以为提交失败,就会着急,然后多点了几次提交操作,也会造成表单重复提交。
- 用户正常提交服务器。服务器也没有延迟,但是提交完成后,用户回退浏览器,重新提交。也会造成表单重复提交。
- 可以使用验证码来解决上述的问题。
cookie和session
在创建cookie之后将新值分配给cookie。如果使用二进制值,则可能需要使用BASE64编码。对于Version0 cookie,值不应包含空格、方括号、圆括号、等号、逗号、双引号、斜杠、问号、at符号、冒号和分号。空值在所有浏览器上的行为不一定相同。
Cookie的path属性可以有效的过滤哪些Cookie可以发送给服务器。哪些不发。 path属性是通过请求的地址来进行有效的过滤。
Session就一个接口(HttpSession)。 Session就是会话,它是用来维护一个客户端和服务器之间关联的一种技术。每个客户端都有自己的一个Session会话。 Session会话中,我们经常用来保存用户登录之后的信息。
Cookie存储在客户端,session存储在服务器端。
session的超时指的是,客户端两次请求的最大间隔时长。
服务器每次创建Session会话的时候都会创建一个Cookie对象。这个 Cookie对象的key永远是:JSESSIONID,值是新创建出来的Session的id值。当使用getSession寻找session时使用的就是Cookie中的JSESSIONNID中的值在服务器的内存中寻找。
session技术,底层其实是基于Cookie技术来实现的。
方法 | 作用 |
---|---|
resp.addCookie() | 通知客户端保存Cookie |
req.getcookies() | 获取Cookies |
setMaxAge() | 设置Cookie的最大生存时间,以秒为单位 |
setPath() | 设置Cookie的path属性 |
getSession() | 第一次是创建session会话,之后都是获取前面创建好的 |
isNew() | 判断是否是刚创建的session会话 |
getId() | 获取session的唯一ID值 |
invalidate() | 使此会话无效 |
filter过滤器
filter过滤器是JavaEE的规范,作用是拦截请求,过滤响应。
拦截请求常见的应用场景有权限检查、日记操作和事务管理等等。
使用时通过实现filter接口的doFilter方法实现,需要到xml文件中配置需要过滤的路径和对应的过滤方法,按照xml配置的先后顺序来决定过滤器的执行顺序。验证成功后,使用filterChain.doFilter()
方法继续往下访问目标资源。
filter生命周期:1、构造器方法;2、init初始化方法;3、doFilter过滤方法;4、destroy销毁方法。前两个方法在web工程启动的时候已经被执行。拦截时调用第三个方法,第四个方法在web工程停止时被执行。
Tomcat每次创建Filter的时候,也会同时创建一个FilterConfig类,这里包含了Filter配置文件的配置信息。 FilterConfig类的作用是获取filter过滤器的配置内容。
FilterChain使得多个过滤器一起工作,它只有一个doFIlter方法,作用是如果有下一个Filter过滤器则继续执行,否则执行目标资源。
多个Filter过滤器执行的特点:所有的filter和目标资源默认都执行在同一个线程中;多个filter共同执行的时候,它们都使用同一个Request对象。
Filter过滤器只关心请求的地址是否匹配,不关心请求的资源是否存在。
JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。JS0N采用完全独立于语言的文本格式,而且很多语言都提供了对json的支持,这样就使得JSON成为理想的数据交换语言。
JSON的存在一般有两种形式:一种是对象,一种是字符串。可以使用JSON.stringify()
将JSON对象转为JSON字符串,JSON.parse()
方法反之。
JSON在Java的使用:JavaBean和JSON的互转、List和JSON的互转、Map和JSON的互转。通过Gson的toJason()
和fromJson()
方法就可以实现相互转换。
AJAX
AJAX(Asynchromous Javascript And XML),异步JavaScript和XML,是指一种创建交互式网页应用的网页开发技术。 ajax是一种浏览器通过js异步发起请求。局部更新页面的技术。
Ajax请求的局部更新,浏览器地址样不会发生变化,局部更新不会舍弃原来页面的内容。
表单序列化serialize()
可以把表单中所有表单项的内容都获取到,并以name=value&name=value的形式进行拼接。