Session是存储在服务器端,Cookie是存储在客户端的:
Session的安全性要比Cookie高;
Session内容不断增加会造成服务器负担;
重要的信息存储在Session中,次要东西存储在Cookie里。
Session创建时机:调用getSession()方式时创建。
Session获取:通过存放在会话Cookie里的Sessionid获取的。
Session销毁时机:
浏览器关闭;
Session过期(默认时间30分钟);
调用invalidate()方法销毁。
Cookie分为两大类,分别为会话Cookie和持久化Cookie。
会话Cookie:存放在客户端浏览器内存中,生命周期和浏览器是一致的;
持久化Cookie存放在客户端磁盘中,持久化Cookie的生命周期在设置Cookie时候设置。
Cookie容量限制:单个Cookie保存数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie。
存储内容:Session可以存储任意类型的数据,而Cookie只能存储字符串。
Servlet生命周期可以分成四个阶段:加载和实例化、初始化、服务、销毁。
当客户第一次请求时,判断是否存在Servlet对象,若不存在,Web容器创建对象;
调用init()方法对其初始化,初始化方法在整个Servlet生命周期中只调用一次;
Web容器调用Servlet对象的service()方法来处理请求。
Web容器关闭或者Servlet对象从容器中被删除时,自动调用destroy()方法。
Web Service是一个能通过Web进行调用的API,调用Web Service的应用程序叫做客户端,而Web Service应用程序叫做服务端。
深层次看,Web Service是建立可互操作的分布式应用程序的新平台,是远程服务调用的一套标准;定义了应用程序如何在Web上实现互操作,可以用任何语言、在任何平台上编写Web Service,只要可以通过Web Service标准对这些服务进行查询和访问即可。
JSP是Servlet技术的扩展,本质上就是Servlet的简易方式,JSP编译后的类是Servlet。
Servlet和JSP的不同点:
Servlet是仅包含Java代码;
JSP是包括Java代码和HTML代码的扩展名为“.jsp”的文件;
JSP侧重于视图,Servlet主要用于控制逻辑;
在MVC设计模式中,JSP位于的视图层,而Servlet位于控制层。
forward即是请求转发:
地址栏显示不变;
发生在服务器端,是服务器内部的操作;
客户端向服务器端发出一次request;
转发页面和转发到的页面可以共享request里面的数据;
可以跳转到Web应用程序内的任何地方,如:WEB-INF目录;
运行效率比较高;
使用方法:request.getRequestDispatcher().forward()。
Redirect即是重定向:
地址栏显示变化;
发生在客户端,是服务器通知客户端,让客户端重新发起请求;
客户端向服务器端发出两次request;
不能共享request里面的数据;
不可以跳转到WEB-INF安全目录下,但是可以跳转到Web应用程序外部网站;
运行效率比较低;
使用方法:response.sendRedirect()。
getParameter()方法是用来接收表单提交过来的参数;
setAttribute()与getAttribute()仅在Web容器内部流转,仅仅是请求处理阶段;
getAttribute()方法返回的是对象,getParameter()方法返回的是字符串;
getAttribute()与setAttribute()一般一起使用,必须setAttribute()设置之后,才能够通过getAttribute()来获取值,传递的是Object类型的数据,必须在同一个request对象中使用才有效。
格式不同:
静态包含:<%@ include file="文件" %>;
动态包含:<jsp : include page = "文件" />。
处理时机不同:
静态包含是先将几个文件合并,然后再被编译,缺点就是如果含有相同的标签,会出错;
动态包含是页面被请求时编译,将结果放在一个页面。
生成的文件不同:
静态包含会生成一个包含页面名字的servlet的class文件;
动态包含会各自生成对应的servlet的class文件。
传递参数不同:
动态包含能够传递参数;
而静态包含不能。
MVC是Model-View-Controller的简写;
Model代表的是应用程序的业务逻辑(通过 JavaBean,Mybatis等框架实现);
View代表的是应用程序的表示层,即:Jsp页面;
Controller代表的是应用程序的处理过程控制(一般是Servlet);
这种设计模型把应用逻辑,处理过程、显示逻辑分成不同的组件实现,这些组件可以进行交互和重用。
JSP有9个内置对象:
request:封装客户端的请求,其中包含来自GET或POST请求的参数;
response:封装服务器对客户端的响应;
pageContext:通过该对象可以获取其他对象;
session:封装用户会话的对象;
servletContext:封装服务器运行环境的对象;
out:输出服务器响应的输出流对象;
config:Web应用的配置对象;
page:JSP页面本身(相当于Java程序中的this);
exception:封装页面抛出异常的对象。
Get是向服务器索取数据的一种请求,而Post是向服务器提交数据的一种请求;
Get 请求的参数会跟在URL后进行传递,Post请求将数据放置在HTML Header内提交;
GET请求数据传递方式:请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,%XX中的XX为该符号以16进制表示的ASCII,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密;
Post请求数据传递方式:以http消息的实际内容发送给web服务器。
Get请求传输的数据有大小限制,因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了,不同的浏览器对URL的长度的限制是不同的;Post请求没有限制提交的数据。
GET请求的数据会被浏览器缓存起来,数据将明文出现在URL上,不安全;Post数据不会出现在URL上,比Get安全,当数据是不敏感的数据,则用Get,对于敏感数据的数据,则用Post。
启动的顺序为:Listener -> Filter -> Servlet;
执行的顺序不会因为三个标签在配置文件中的先后顺序而改变。
监听器类型:
Servlet2.4规范定义,按监听的对象划分:
用于监听应用程序环境对象(ServletContext)的事件监听器
用于监听用户会话对象(HttpSession)的事件监听器
用于监听请求消息对象(ServletRequest)的事件监听器
按监听的事件类型划分:
用于监听域对象自身的创建和销毁的事件监听器;
用于监听域对象中的属性的增加和删除的事件监听器;
用于监听绑定到HttpSession域中的某个对象的状态的事件监听器;
在一个Web应用程序的整个运行周期内, Web容器会创建和销毁三个重要的对象,ServletContext,HttpSession,ServletRequest。
在一个Web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
Web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter()方法被调用时,Web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。
在doFilter()方法中,开发人员如果调用FilterChain对象的doFilter ()方法,web服务器会检查FilterChain对象中是否还有filter,如果有,则调用下一个filter,如果没有,则调用目标资源。
Filter接口中有一个doFilter()方法,Web服务器每次在调用Web资源的service()方法之前,都会先调用filter的doFilter()方法,因此,在该方法内编写代码可达到如下目的:
调用目标资源之前,执行一段代码;
判断是否调用目标资源;
调用目标资源之后,执行一段代码;
Web服务器在调用doFilter()方法时,会传递一个filterChain对象,filterChain对象是filter接口中最重要的一个对象,它也提供了一个doFilter()方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则服务器就会调用目标的service()方法,即Web资源就会被访问,否则Web资源不会被访问。
Session与Session域中的对象一起从内存中被序列化到硬盘上的过程我们称为钝化,服务器关闭时会发生钝化。
Session与Session域中的对象一起从硬盘上反序列化到内存中的过程我们称为活化,服务器再次开启时会发生活化。
保证Session域中的对象能和Session一起被钝化和活化,必须保证对象对应的类实现Serializable接口。
在服务器端创建Session对象,该对象有一个全球唯一的ID。
在创建Session对象的同时创建一个特殊的Cookie对象,该Cookie对象的名字是JSESSIONID,该Cookie 对象的value值是Session对象的那个全球唯一的ID,并且会将这个特殊的Cookie对象携带发送给浏览器,以后浏览器再发送请求就会携带这个特殊的Cookie对象,服务器根据这个特殊的Cookie对象的value 值在服务器中寻找对应的Session对象,以此来区分不同的用户。
Cookie是明文的,不安全;
Cookie对象的数量和大小有限制(不同的浏览器不同);
Cookie对象携带过多费流量;
Cookie对象中的Value值只能是字符串,不能放对象。
原因:服务器端默认使用ISO-8859-1字符集,而中文浏览器默认使用GBK字符集。
解决方案:方法1,设置响应头,对应代码:response.setHeader("Content-Type","text/html;charset=utf-8");
方法2,设置响应的内容类型,对应代码:response.setContentType("text/html;charset=utf-8");
通过以上两种方式可以在响应头中告诉浏览器响应体的字符集是UTF-8;但需要注意的是,两种方法一定要在response.getWriter()方法之前设置。
原因:因为服务器收到数据后,默认以ISO-8859-1字符集进行转换,与请求传递数据的字符集不一致。
解决方案:在获取请求参数之前调用request.setCharacterEncoding("utf-8"); 通知服务器端使用UTF8字符集进行转换。
原因:请求携带的数据字符集与服务器端的默认字符集ISO-8859-1不一致。
解决方案:
第一种方式:
使用URLEncoder和URLDecoder两个类来实现编解码,实现iso-8895-1转换到UTF-8字符集;
第二种方式,使用String类的方法实现字符集转换:
String str = new String (target.getBytes(“iso-8859-1”), ”utf-8” );
第三种方式,更改Tomcat的server.xml 配置文件实现字符集转换:
GET请求是URL地址栏中传递请求参数的,它会被Tomcat服务器自动转换字符集,而Tomcat服务器默认的字符集是ISO-8859-1,所以我们需要修改Tomcat服务器的字符集为UTF-8。
容器启动时,读取在/webapps/WEB-INF/目录下的web.xml文件,对其进行解析,并读取Servlet注册信息。
然后,将每个应用中注册的Servlet类都进行加载,并通过反射的方式实例化。
Servlet注册时配置<load-on-startup></load-on-startup>,如果为正数,则在启动容器时实例化,如果不写或为负数,则第一次请求实例化。
Servlet是使用Java Servlet应用程序接口(API)及相关类和方法的Java程序。所有的Servlet都必须要实现的核心接口是javax.servlet.servlet。每一个Servlet都必须要直接或者间接实现这个接口,或者继承javax.servlet.GenericServlet或 javax.servlet.HTTPServlet。
Servlet主要用于处理客户端传来的HTTP请求,并返回一个响应。
获取请求参数,对应方法:getParameter();
获取当前Web应用的虚拟路径,对应方法: getContextPath();
获取当前Web应用的上下文对象ServletContext,对应方法:getServletContext();
请求转发,对应方法:getRequestDispatcher(路径).forward(request,response);
储存数据,request还是一个域对象。
针对于重复提交的整体解决方案:
用redirect(重定向)来解决重复提交的问题;
点击一次按钮之后,按钮失效;
Loading原理:在点击提交时,生成Loading样式,在提交完成之后隐藏该样式;
自定义重复提交过滤器。
Jsp中的四种作用域包括page、request、session和application,具体来说:
page代表与一个页面相关的对象和属性,对应的对象是:pageContext。
request代表Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域,对应的对象是:request。
session代表某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中,对应的对象是:session。
application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域,对应的对象是:servletContext。
第一步,在JSP页面添加标签库:<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
第二步,进行格式化:<fmt:formatDate pattern="yyyy-MM-dd" value="${t.time }"/>
Ajax是异步JavaScript和xml,用于在web页面中实现异步数据交互。
优点:可以在页面不重复加载的情况下加载局部内容,降低数据传输量。
Json是一种轻量级的数据交互格式。
优点:轻量级,易于阅读和编写,便于解析。
同步:提交请求->等待服务器处理->处理完毕返回,这个期间客户端浏览器不能干任何事。
异步:请求通过事件触发->服务器处理(这时浏览器仍然可以作其他事情)->处理完毕。
工作原理:
客户端通过Javascript提交Ajax请求。
Ajax引擎(XMLHttpRequest对象,包含在浏览器中)服务器发送Http请求。
服务器端处理请求后返回相应(XML/JSON/HTML)格式数据。
Ajax引擎解析数据后,通过DOM+CSS修改页面元素、改变样式,实现局部刷新。
实现步骤:
创建XMLHttpRequest对象。
创建请求,并发送请求。
处理请求回调。
示例代码:
function doAjax() {
var provinceName=document.getElementById("provinceName").value;
var xhr;
try {
// Firefox, Opera 8.0+, Safari
xhr = new XMLHttpRequest();
} catch (e) {
try {
// Internet Explorer
xhr = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}
//使用post方式异步请求
xhr.open("post", "Test/IsExistsByProvinceName?t="+new Date().getTime(), true);
//设置回调函数
xhr.onreadystatechange = function(){
//如果XMLHttpRequest对象读取响应结束
if (xhr.readyState == 4&&xhr.status == 200) {
if(xhr.responseText=="true")
document.getElementById("provinceName_info").innerHTML="该省份已经存在";
else
document.getElementById("provinceName_info").innerHTML="";
}
};
//如果以post方式请求,必须要添加
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
//发送请求
xhr.send("provinceName="+provinceName);
}
创建Http连接。
初始化方法请求。
设置HTTP请求头。
发送请求。
读取请求。
调用方法。
初始化方法响应。
设置HTTP响应头。
发送响应。
关闭连接。
硬件环境不同:
C/S一般建立在专用的网络上,小范围里的网络环境,局域网之间再通过专门服务器提供连接和数据交换服务。
B/S建立在广域网之上的,不必是专门的网络硬件环境,信息自己管理。比 C/S 更强的适应范围,一般只要有操作系统和浏览器就行。
安全要求不同:
C/S一般面向相对固定的用户群,对信息安全的控制能力很强,一般高度机密的信息系统采用C/S结构适宜。
B/S建立在广域网之上,对安全的控制能力相对弱,可能面向不可知的用户。
程序架构不同:
C/S程序可以更加注重流程,可以对权限多层次校验,对系统运行速度可以较少考虑。
B/S对安全以及访问速度的多重的考虑,建立在需要更加优化的基础之上。比C/S有更高的要求,B/S结构的程序架构是发展的趋势。
软件重用不同:
C/S程序的重用性不如B/S的重用性好。
B/S程序构建相对独立的功能,能够相对较好的重用。
系统维护不同:
C/S程序必须整体考察,处理出现的问题以及系统升级都比较难,有可能是再做一个全新的系统;
B/S程序方便个别组件的更换,实现系统的无缝升级、系统维护开销减比较小,客户端无需升级,只针对服务器端维护即可。
处理问题不同:
C/S程序主要处理用户面相对固定、并且在相同区域、安全要求高、与操作系统相关的情况。
B/S建立在广域网上、面向不同的用户群、分散地域,与操作系统平台关系最小。
用户接口不同:
C/S多是建立的Window平台上,开发难度比较大,对程序员普遍要求较高;
B/S建立在浏览器上,开发难度相对较低,开发成本相对较低。
信息流不同:
C/S程序一般是典型的中央集权的机械式处理,交互性相对低;
B/S程序信息流向可变化,更像交易中心。