1. jsp简介:jsp是一种基于文本的程序,其特点是HTML代码与Java程序共存,执行时jsp会被tomcat自动翻译,这个过程对开发者是透明的,不需要关注的,编译后的jsp和httpservlet一样,都是javax.servlet.Ser vlet接口的子类,因此jsp是另一种形式的servlet。
2. Jsp概述:jsp全称是Java server page,是为了简化servlet的工作而出现的替代品,sun公司1997年推出了 servlet API以及第一款Java web 服务器,早期的java web层体系结构中只有servlet,接受用户请求,处理业务逻辑,生成HTML显示结果都是在HTML中完成的,虽然servlet可以胜任所有的工作,但是servlet不能像php,asp等镶嵌HTML代码,输出HTML代码比较困难,而且部署过程也比较复杂。为了克服servlet的这些弱点,sun公司在1999年推出了jsp,作为对servlet的补充,jsp在生成HTML代码上比servlet要简单许多,而且不需要特殊部署,只需要复制到服务器下面即可运行,jsp包括很多技术,包括Javabean,自定义标签,El表达式,JSTL标准标签类库等,这些强大成熟的技术使得jsp在视图层有很大的优势。
3. Jsp工作原理:jsp是一种servlet,但是与httpservlet的工作方式不一样,httpservlet是先由源代码编译成.class文件在部署到服务器下,先编译后部署,而jsp则是先部署再编译成.class文件,先部署后编译的jsp会在客户端第一次请求jsp文件是被编译成httpjsppage类,该类会被服务器临时存放在服务器工作目录里面,由于jsp只会在客户端第一次请求时被编译,所以第一次请求jsp是会比较慢,而之后的请求由于不用编译,所以会比较快。
4. Jsp生命周期:jsp也是servlet,运行时只有一个实例,跟servlet一样,jsp实例初始化,销毁是会调用servlet的init()和destory()方法,另外jsp还有自己的初始化方法和销毁方法_jspinit()与_jspdestory()。
5. Jsp语法:jsp是HTML代码与Java代码的混合体,其中HTML部分遵循HTML语法,Java部分遵循Java语法。
(1) Jsp元素与模板数据:
元素:就是jsp的java部分,包括脚本,指令,与标签,元素决定着程序的流程,
模板数据:就是jsp中的HTML部分,它的内容是固定的,无论程序怎么运行,模板数据输出到客户端时都不会发生变化,模板数据不会控制程序的流程,也不会影响程序的运行结果,模板数据写的是什么输出来就是什么。
(2) jsp脚本:jsp脚本必须使用“<%”和%>括起来,否则被视为模板元素,且中间的代码必须遵循Java语法,否则会发生编译错误,共有三种格式:
<% %>:其中可以写语句
<%! %>:其中可以写类,方法,变量,枚举
<%= %>:输出变量的值
(3) jsp指令:jsp指令用来输出jsp页面的一些属性等,例如编码方式,文档类型,,jsp指令以<%@开始,以%>结束,常见的指令有三种:
page,taglib,include等。
Page指令:最常见的指令,用来声明页面的属性,jsp指令的多个属性可以写在一个page指令里,也可以写在多个page里。但要注意,无论在哪个page指令里的属性都只能出现一次,否则会出现编译错误,import属性除外,可以出现多次。
Include指令:比较简单,只有一种形式,<%@include file=”relativeURL” %>,relativeURL为本应用程序内的另一个jsp文件,jsp还有另外一种包含文件的行为,<% jsp:include page=”relativeURL” %>该命令与include指令的用法基本一致,作用也一样,不同的是,include指令是先包含,后编译,在被编译后的jsp中已经包含被include的文件内容了,而include行为是先运行后包含,在被编译的jsp中没有被include的内容。
Taglib指令:jsp支持标签技术,使用标签功能可以实现视图代码重用,很少量的代码就能实现很复杂的显示效果,要使用标签必须先声明标签库以及标签前缀,taglib指令用来指明jsp页面内使用的jsp标签库,taglib指令有两个属性,url为类库的地址,prefix为标签的前缀。
6. jsp内置对象:
l out输出流对象:是javax.servlet.jsp.JspWrite类的实例,服务器向客户端输出的字符类内容可以通过out对象输出。
l request请求对象:代表着客户端的请求,request包含客户端的信息以及请求的信息,如请求的哪个文件,附带的地址栏参数等,每次客户端请求都会产生一个request实例。
l response响应对象:代表着客户端的响应,服务器端的任何输出都会通过response发送到客户端浏览器,每次服务端都回产生一个response实例。
l config配置对象:servletconfig封装在了配置在web.xml中初始化jsp的参数,每个jsp文件共有一个config对象。
l session会话对象:session和cookie是记录客户访问信息的两种机制,session用于在服务端保存用户信息,cookie用于在客户端保存用户信息,每个用户对应一个session对象。
l application应用程序对象:application封装了jsp所在的web应用程序的信息,每个web应用程序对应一个application对象。
l page页面对象:代表当前jsp页面,是当前jsp编译后servlet的对象,page相当于普通Java类中的this对象。
l pagecontext页面上下文对象:代表当前jsp编译后的内容,通过Pagcontext可以获取jsp中的资源。
7. Session机制:session是一种记录客户状态的机制,保存在服务器上,客户端浏览访问服务器时,服务器把客户端信息以某种形式记录在服务器上,服务器把信息以某种形式记录在服务器上,这就是session,客户端浏览器再次访问时只需要从该session中查找该客户的状态即可。
(1) session的生命周期:session在用户第一次访问服务器的时候自动创建,需要注意只有访问jsp,servlet等程序时才会创建session,只访问HTML,image等静态资源时,不创建session,如果未生成session,也可以使用request.getsession(true)来强制生成session,session生成后,只要用户继续访问,服务器就会更新session的最后访问时间,并继续维护该session,用户每访问服务器一次,无论是否读写session,服务器都会认为该用户的session活跃(active)了一次。
(2) session的有效期:由于会有越来越多的用户访问服务器,因此session会越来越多,为防止内存溢出,服务器会把长时间没有活跃的session从内存中删除
这个时间就是session的超时时间。如果超过了超时时间没访问过服务器,session就自动失效了。Session的超时时间是MaxInactiveInterval属性,通过setMaxInactiveInterval()来设置或修改。也可以在web.xml修改,另外,通过调用session的session.invalidate()来使session失效。
(3) session的方法:
public void invalidate()
使此会话无效,然后取消对任何绑定到它的对象的绑定。
public void removeAttribute(Stringname)
从此会话中移除与指定名称绑定在一起的对象。如果会话没有与指定名称绑定在一起的对象,则此方法不执行任何操作。
Public void setAttribute(String name, Object value)
使用指定名称将对象绑定到此会话。如果具有同样名称的对象已经绑定到该会话,则替换该对象。
Public Object getAttribute(String name)
返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回 null。
getAttributeNames()
返回包含绑定到此会话的所有对象的名称的 String 对象的 Enumeration。
getCreationTime()
返回创建此会话的时间,该时间是用自格林威治标准时间1970 年 1月 1 日午夜起经过的毫秒数来测量的。
getId()
返回包含分配给此会话的唯一标识符的字符串。标识符是由 servlet 容器分配的,并且是与实现相关的。
getLastAccessedTime()
返回客户端上一次发送与此会话关联的请求的时间(该时间是自格林威治标准时间 1970 年 1 月 1 日午夜起经过的毫秒数),并用容器接收该请求的时间标记它。
setMaxInactiveInterval(int interval)
指定在 servlet 容器使此会话失效之前客户端请求之间的时间间隔,以秒为单位。负数时间指示会话永远不会超时。
getMaxInactiveInterval()
返回 servlet 容器在客户端访问之间将使此会话保持打开状态的最大时间间隔,以秒为单位。在此间隔之后,servlet 容器将使会话无效。可使用 setMaxInactiveInterval 方法设置最大时间间隔。负数时间指示会话永远不会超时。
isNew()
如果客户端还不知道该会话,或者客户端选择不加入该会话,则返回 true。例如,如果服务器仅使用基于 cookie 的会话,而客户端已经禁止了 cookie 的使用,则每个请求上的会话都将是新会话。
getServletContext()
返回此会话所属的 ServletContext。
(4) session对浏览器的要求:
虽然session保存服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持,这是因为session需要cookie作为识别标志。HTTP协议是无状态的,session不能依据HTTP连接来判断是否是同一用户,因此服务器向客户端浏览器发送一个名为JSESSIONID的cookie,它的值为session的id,session依据该cookie判断是否是同一用户。
8. Cookie机制:cookie实际上是一段小的文本信息,客户端请求服务器,如果服务器要求客户端记录该用户状态,就使用response向客户端浏览器发送一个cookie,客户端浏览器会把cookie保存起来,当浏览器再请求服务器时,浏览器会把请求的网址连同cookie一起发给服务器。服务器检查该cookie,以此来辨认用户状态,服务器还可以根据需要修改cookie的内容。
(1) cookie的不可跨域名性:根据Cookie规范,浏览器访问谷歌只会携带谷歌的cookie,访问百度只会携带百度的cookie,cookie在客户端是由浏览器来管理的,浏览器能够保证Google只操作Google的Cookie,从而保证客户的隐私安全,浏览器判断一个网站是否能操作另一个网站的cookie是根据域名来判断。
(2) Cookie的方法:
l Cookie(String name, Stringvalue)
构造带指定名称和值的cookie。
l setMaxAge(int expiry)
设置 cookie 的最大生存时间,以秒为单位。正值表示 cookie 将在经过该值表示的秒数后过期。注意,该值是 cookie 过期的最大生存时间,不是 cookie 的当前生存时间。
l getMaxAge()
返回以秒为单位指定的cookie 的最大生存时间,默认情况下,-1 指示该 cookie 将保留到浏览器关闭为止。
l getName()
返回 cookie 的名称。名称在创建之后不得更改。
l setPath(String uri)
指定客户端应该返回cookie 的路径。
l getPath()
返回浏览器将此cookie 返回到的服务器上的路径。cookie 对于服务器上的所有子路径都是可见的。
l setValue(String newValue)
在创建 cookie 之后将新值分配给cookie。如果使用二进制值,则可能需要使用 BASE64 编码。
l getValue()
返回 cookie 的值
9.session和cookie的比较:
Cookie和session都可以进行会话跟踪,但是实现额原理大不一样,一般情况下二者都可以满足需求,但有时候不可以使用cookie,有时候不可以使用session:
(1) 从存取方式上比较:cookie只能保存ASCII字符串,如果需要存取Unicode字符或者二进制数据,需要进行UTF-8,GBK,Base64等方式的编码,cookie中也不能直接存取Java对象,若要存储稍微复杂的信息,使用cookie是比较困难的。而session中可以存取任何类型的数据,包括而不限于String,Integer,map,list等,session中也可以直接保存Javabean乃至任何Java类,对象等,使用起来非常方便,可以把session看作是一个Java容器类。
(2) 从隐私安全上比较:cookie存储在客户端浏览器中,对客户端是可见的,客户端的一些程序可能会窥探,复制,甚至修改cookie的内容,而session存储在服务器上,对客户端是透明的,不存在泄漏敏感信息的危险。如果选用cookie,比较好的办法是敏感的信息如账号密码等尽量不要写到cookie中,最好将cookie内容进行加密,提交到服务器后再进行解密,保证cookie的内容只有自己能读得懂。
(3) 从有效期上进行比较:使用过Google的人都知道,如果登陆过Google,则Google的登陆信息长期有效,用户不必每次访问都重新登陆,Google会长期的记录客户的登陆信息,要达到这种效果,选择cookie会比较好,使用Session也可以达到这种效果,但容易造成服务器内存溢出。
(4) 从服务器的负担上比较:Session是保存在服务器端的,每个用户都会产生一个cookie,如果并发访问的用户非常多,会产生非常多的session,消耗大量的内存,而cookie保存在客户端,不占用服务器资源。
(5) 从浏览器支持上比较:cookie是需要客户端浏览器支持的,如果客户端禁用cookie,或者不支持cookie,则会话跟踪会失效,对于wep的应用,常规的cookie 就配不上用场了。
(6) 从跨域名上比较:cookie支持跨域名而session不支持。
9. 过滤器Filter:Filter和Listener是servlet规范里的两个高级特性,不同于servlet,他们不用于处理客户端请求,只用于对request和response进行修改或者对context,session,request事件进行监听。
(1) Filter概述:Filter意为滤镜或者过滤器,用于在servlet之外对request或者response进行修改,Filter提出了滤镜链(FilterChain)的概念,一个FilterChain中包含多个Filter,客户端请求request在抵达servlet之前会经过FilterChain里的所有Filter,服务器响应response在抵达客户端浏览器之前也会经过FilterChain里的所有Filter。
(2) Filter接口:
destroy()
由 Web 容器调用,指示将从服务中取出的过滤器。此方法仅在过滤器的 doFilter 方法中的所有线程都已退出之后调用一次,或者在过了超时期之后调用。在调用此方法之后,Web 容器不会再对此过滤器实例调用 doFilter 方法。
doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException
每次由于对链末尾的某个资源的客户端请求而通过链传递请求/响应对时,容器都会调用 Filter 的 doFilter 方法。传入此方法的 FilterChain 允许 Filter 将请求和响应传递到链中的下一个实体。
init(FilterConfig filterConfig) throws ServletException
由 Web 容器调用,指示将放入服务中的过滤器。servlet 容器只在实例化过滤器之后调用一次 init 方法。在要求过滤器做任何过滤工作之前,init 方法必须成功完成。
(3) Filter配置:Filter需要配置在web.xml中才能生效,一个Filter需要配置<Filter>和<Filter-Mapping>标签。<Filter>配置Filter名称,实现类以及初始化参数,可同时配置多个初始化参数,<Filter-Mapping>配置什么规则下使用该Filter,<Filter>的Filtername和<FilterMapping>的Filtername必须匹配。
<url-pattern>配置URL的规则,可以同时配置多个,可以使用通配符(*)。
10. JSTL标签库:JSTL全称为jspstandrd tag library ,即jsp标准标签库。
(1)什么是标签