Java web开发中的jsp知识总结

 

1.  jsp简介:jsp是一种基于文本的程序,其特点是HTML代码与Java程序共存,执行时jsp会被tomcat自动翻译,这个过程对开发者是透明的,不需要关注的,编译后的jsphttpservlet一样,都是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不能像phpasp等镶嵌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实例初始化,销毁是会调用servletinit()destory()方法,另外jsp还有自己的初始化方法和销毁方法_jspinit()_jspdestory()

5.  Jsp语法:jspHTML代码与Java代码的混合体,其中HTML部分遵循HTML语法,Java部分遵循Java语法。

(1)      Jsp元素与模板数据:

元素:就是jspjava部分,包括脚本,指令,与标签,元素决定着程序的流程,

模板数据:就是jsp中的HTML部分,它的内容是固定的,无论程序怎么运行,模板数据输出到客户端时都不会发生变化,模板数据不会控制程序的流程,也不会影响程序的运行结果,模板数据写的是什么输出来就是什么。

(2)      jsp脚本:jsp脚本必须使用“<%”和%>括起来,否则被视为模板元素,且中间的代码必须遵循Java语法,否则会发生编译错误,共有三种格式:

<% %>:其中可以写语句

<%! %>:其中可以写类,方法,变量,枚举

<%= %>:输出变量的值

(3)      jsp指令:jsp指令用来输出jsp页面的一些属性等,例如编码方式,文档类型,,jsp指令以<%@开始,以%>结束,常见的指令有三种:
pagetaglibinclude等。

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会话对象:sessioncookie是记录客户访问信息的两种机制,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,只访问HTMLimage等静态资源时,不创建session,如果未生成session,也可以使用request.getsession(true)来强制生成sessionsession生成后,只要用户继续访问,服务器就会更新session的最后访问时间,并继续维护该session,用户每访问服务器一次,无论是否读写session,服务器都会认为该用户的session活跃(active)了一次。

(2)      session的有效期:由于会有越来越多的用户访问服务器,因此session会越来越多,为防止内存溢出,服务器会把长时间没有活跃的session从内存中删除
这个时间就是session的超时时间。如果超过了超时时间没访问过服务器,session就自动失效了。Session的超时时间是MaxInactiveInterval属性,通过setMaxInactiveInterval()来设置或修改。也可以在web.xml修改,另外,通过调用sessionsession.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连接来判断是否是同一用户,因此服务器向客户端浏览器发送一个名为JSESSIONIDcookie,它的值为sessionidsession依据该cookie判断是否是同一用户。

8.  Cookie机制:cookie实际上是一段小的文本信息,客户端请求服务器,如果服务器要求客户端记录该用户状态,就使用response向客户端浏览器发送一个cookie,客户端浏览器会把cookie保存起来,当浏览器再请求服务器时,浏览器会把请求的网址连同cookie一起发给服务器。服务器检查该cookie,以此来辨认用户状态,服务器还可以根据需要修改cookie的内容。

(1)      cookie的不可跨域名性:根据Cookie规范,浏览器访问谷歌只会携带谷歌的cookie,访问百度只会携带百度的cookiecookie在客户端是由浏览器来管理的,浏览器能够保证Google只操作GoogleCookie,从而保证客户的隐私安全,浏览器判断一个网站是否能操作另一个网站的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 的值

9sessioncookie的比较:

   Cookiesession都可以进行会话跟踪,但是实现额原理大不一样,一般情况下二者都可以满足需求,但有时候不可以使用cookie,有时候不可以使用session

(1)      从存取方式上比较:cookie只能保存ASCII字符串,如果需要存取Unicode字符或者二进制数据,需要进行UTF-8GBKBase64等方式的编码,cookie中也不能直接存取Java对象,若要存储稍微复杂的信息,使用cookie是比较困难的。而session中可以存取任何类型的数据,包括而不限于StringIntegermap,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.  过滤器FilterFilterListenerservlet规范里的两个高级特性,不同于servlet,他们不用于处理客户端请求,只用于对requestresponse进行修改或者对contextsessionrequest事件进行监听。

(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)什么是标签

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值