zoukankan      html  css  js  c++  java
  • 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等。 

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

  • 相关阅读:
    使用Apache Commons-email邮件客户端发邮件
    Jfinal开发代码碎片_导出报表_配置druid数据源_使用guava_获取当前操作系统_JDK版本_jfinal-utils_jfinal验证码
    Memcached缓存集群_创建多实例
    HttpClient取得自定义的状态码302,并获取Header中的参数Location
    对象序列化和反序列化
    【校园电子书城】测试及部署
    mysql导入txt文件
    【校园电子书城】部分代码及数据库设计
    【校园电子书城】需求分析
    Domain logic approaches
  • 原文地址:https://www.cnblogs.com/kingcucumber/p/2839034.html
Copyright © 2011-2022 走看看