JSP学习笔记

我们知道客户端浏览器的html页面都是服务器端发回来的响应数据经由浏览器解析出来的,而我们平常所看到的网站的html页面是相当的复杂,而且当我们需要动态生成网页时,去使用servlet进行out.println()输出,很显然比较麻烦。因此为了简化servlet的工作,JSP技术作为页面表现被广泛使用。我们可以将jsp看成生成servlet的“草稿”文件,因为每个jsp页面都会被翻译成servlet。jsp比较简单,他的特点是在html页面中加入java代码片段,或使用各种jsp标签,包括使用用户自定义的标签,从而可以动态地提供页面内容。

jsp的本质是servlet,在实例初始化、销毁时也会调用Servlet的init()与destroy()方法,jsp还有自己的初始化方法与销毁方法_jspInit()与_jspDestroy()。当用户向指定servlet发送请求时,servlet利用输出流动态生成html页面,包括每一个静态的html标签和所有在html页面中出现的内容。jsp在客户端第一次请求时被编译成HttpJspPage类,该类会被服务器临时存放在服务器工作目录里面,由Web容器将其装载进虚拟机并构造出一个实例对象,余下的都是Servlet的处理流程了。

jsp文件必须在jsp服务器中运行,每个jsp页面在第一次访问时会很慢,主要是因为要将其编译成servlet,jsp页面的访问者无须安装任何客户端,甚至不需要可以运行java的运行环境,因为jsp页面输送到客户端的是标准的HTML页面。

1)jsp语法

注释: 一种是html注释 <!--注释内容-->,一种是 <%--注释内容--%> ,前者能在html源码文件中看到,因此不建议使用。

声明:<%! 声明部分 %> ,

表达式: <%= 表达式 %> ,提供一种输出表达式值的简单方法,其实是调用了out.println()

脚本: <%  脚本部分 %> 脚本中可以包含任何可执行的java代码

三个编译指令: page:该指令是针对当前页面的指令;include:用于指定包含另一个页面;taglib:用于定义好而访问自定义标签。使用时的语法格式为

<%@ 编译指令 属性名=“属性值........” %>  属性值可以有很多种

七个动作指令:

jsp:forward:执行页面转向,将请求的处理转发到下一个页面

  jsp:param:用于传递参数,必须与其他支持参数的标签一起使用

jsp:include: 用于动态引入一个jsp页面

jsp:plugin: 用于下载JavaBean或Applet转到客户端执行

jsp:useBean: 创建一个JavaBean的实例

jsp:setProperty: 设置JavaBean实例的属性值

jsp:getProperty:  输出JavaBean实例的属性值

九个隐式对象:

application:javax.servlet.ServletContext的实例,该实例代表JSP所属的Web应用本身,可用于jsp页面,或者在Servlet之间交换信息。

config:javax.servlet.ServletConfig的实例,该实例代表该JSP的配置信息。

out: javax.servlet.jsp.JspWriter的实例,该实例代表JSP页面的输出流,用于输出内容,形成HTML页面。

page: 代表该页面本身,通常没有太大用处。也就是Servlet中的this,其类型就是生成的Servlet类,能用page的地方就可用this。

pageContext:javax.servlet.jsp.PageContext的实例,该对象代表该Jsp页面的上下文,使用该对象可以访问页面中的共享信息。

request: javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端的请求参数都被封装在该对象里。这是一个常用的对象,获取客户端请求参数必须使用该对象。

response: javax.servlet.http.HttpServletResponse的实例,代表服务器对客户端的响应,通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符响应。而response对象常用于重定向。

session:javax.servlet.http.HttpSession的实例,该对象代表一次会话。当客户端浏览器与站点建立连接时,胡话就开始了,当客户端关闭浏览器是,会话就结束。

exception:java.lang.Throwable的实例,该实例代表其他页面中的异常和错误,只有当页面是错误处理页面,即编译指令page的isErrorPage属性为true时,该对象才可以使用。

 2)jsp配置

配置jsp同配置Servlet形式完全一样,只是servlet使用<servlet-class>标签,而Jsp使用<jsp-file>标签,如下配置:

<servlet>

     <servlet-name>jspTest</servlet-name>
      <jsp-file>/jspTest.jsp</jsp-file>
    </servlet>
    <servlet-mapping>
 <servlet-name>jspTest</servlet-name>
         <url-pattern>/jspTest</url-pattern>

       </servlet-mapping> 

还可以在web.xm中使用<jsp-config>标签进行对jsp批量配置,<jsp-config>标签包括两个子标签,<taglib>与<jsp-property-group>,下面例子可以说明配置方法:

<jsp-config>

     <taglib>
         <taglib-uri>taglib</taglib-uri>
         <taglib-location>/WEB-INF/tlds/taglib.tld</taglib-location>
   </taglib>
    <jsp-property-group>
      <url-pattern>/news/*.jsp</url-pattern>
     <el-ignored>true</el-ignored>
     <page-encoding>UTF-8</page-encoding>
     <scripting-invalid>true</scripting-invalid>
     <include-prelude>/head.jspf</include-prelude>
     <include-coda>/foot.jspf</include-coda>
   </jsp-property-group>

</jsp-config> 

3)EL表达式

jsp中可以使用EL(Expression Language)表达式,EL表达式是用"${}"括起来的脚本,用来更方便地读取对象。EL表达式写在jsp的html代码中,而不能写在"<%"与"%>" 引起的jsp脚本中。某些情况下,EL表达式完全可以替代jsp脚本或者jsp行为。下面说明EL的使用:

${标识符}   :  pageContext.findAttribute(),如果在四个域中找不到则返回null。

${person.name} :从javaBean中取属性数据。

${person.address.cirty} : 从javaBean的属性对象中去属性。

若数据较多放在集合中了, ${list[i].name},${map.student.name}

在EL表达式中常用的符号是”. ",也可使用 " [ ] ",我们在写工程名的时候,常采用自动获取的方式, ${pageContext.request.ContextPath},在自动生成的jsp页面中常可以看到。

EL表达式能方便地操作java bean,甚至集合等,并支持简单的运算,但是EL表达式不能直接访问普通的方法,以及静态属性。

4)JSTL标签库 

标签包括标签前缀、标签名称、标签属性以及标签体等,jsp会把简单的jsp标签解释为相应的html代码。在jsp中,EL表达式的确是方便的工具,但是由于其使用的局限性,因此还需要使用jstl标签的支持,而标签因为可读性和维护性较好,而且还可以重复使用,因此推荐使用。jstl全称 JSP Standard Tag Library,是一套标签库解决方案。jstl库中提供了一系列的jsp标签,实现了最基本的功能,如集合的遍历、数据的输出、字符串的处理、数据的格式化等等。

JSTL标签库使用需要两个jar包,jstl.jar和standard.jar,并且要讲响应的tld文件加入到/WEB-INF/下面,常见的标签有 核心标签库C,fmt(国际化),fn(函数),sql(数据库),x(xml文件)

JSTL的核心标签库标签共13个,从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。使用这些标签能够完成JSP页面的基本功能,减少编码工作。

(1)表达式控制标签:out标签、set标签、remove标签、catch标签。

(2)流程控制标签:if标签、choose标签、when标签、otherwise标签。

(3)循环标签:forEach标签、forTokens标签。

(4)URL操作标签:import标签、url标签、redirect标签。

在JSP页面引入核心标签库的代码为: <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

  JSTL标签提供了对国际化(I18N)的支持,它可以根据发出请求的客户端地域的不同来显示不同的语言。同时还提供了格式化数据和日期的方法。实现这些功能需要I18N格式标签库(I18N-capable formation tags liberary)。引入该标签库的方法为:

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
I18N格式标签库提供了11个标签,这些 标签从功能上可以划分为3类如下:
(1)数字日期格式化。formatNumber标签、formatData标签、parseNumber标签、parseDate标签、timeZone标签、setTimeZone标签。
(2)读取消息资源。bundle标签、message标签、setBundle标签。
(3)国际化。setlocale标签、requestEncoding标签。

JSTL提供了一些方法,例如字符串查找,截取之类。常见有contains,containsIgnoreCase,endsWith,startsWith,escapeXml,indexOf,split,join,length等 

JSTL提供了与数据库相关操作的标签,可以直接从页面上实现数据库操作的功能,SQL标签库从功能上可以划分为两类:设置数据源标签、SQL指令标签。引入SQL标签库的指令代码为:   <%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>。

JSTL提供了操作xml文件的标签库,使用xml标签库可以省去使用Dom和SAX标签库的繁琐,能轻松的读取xml文件的内容。 

5)自定义标签

JSTL标签库只提供了简单的功能,如果我们要使用复杂的功能,则需要自己编写标签,来完成想要实现的功能。

编写自定义标签的方法:

(1):  编写相关的java类,该类实现Tag接口或者继承TagSupport类。

(2) : 编写tld文件,并在tld文件中像类似配置servlet一样将java类配置进去,设置相关的参数。

(3) : 将tld文件放在/WEB-INF/xxx.tld,标签声明好以后,要绑定到URI上去,使用jsp的taglib编译指令引入并设置前缀,类似 <%@taglib uri="xxxxxxxx" prefix="yyyyyyy",这样便可以使用了。

至于自定义的标签带不带标签体,带不带参数,带多少参数,要不要嵌套等这些都可以自己设置,实现Tag接口或者继承自TagSupport类,我们要自己根据需要来重写doStartTag,doEndTag,在最后的时候标签处理类会调用release方法释放。由于这样太复杂,jsp2.x中使用SimpleTag就可实现相同的功能,只需要doTag()方法,类似面向切面编程一样,在invoke之前之后插入逻辑,对象结束后就摧毁了。

常用到的方法有 setJspBody,getJspBody,setBodyContent,doAfterBody等。 

本博文有些内容来自书上,有些是自己的笔记,还有些来自网上。

posted on 2012-12-29 23:51  糊涂先生  阅读(345)  评论(0编辑  收藏  举报