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等。 

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

  • 相关阅读:
    leetcode 279. Perfect Squares
    leetcode 546. Remove Boxes
    leetcode 312. Burst Balloons
    leetcode 160. Intersection of Two Linked Lists
    leetcode 55. Jump Game
    剑指offer 滑动窗口的最大值
    剑指offer 剪绳子
    剑指offer 字符流中第一个不重复的字符
    leetcode 673. Number of Longest Increasing Subsequence
    leetcode 75. Sort Colors (荷兰三色旗问题)
  • 原文地址:https://www.cnblogs.com/kingcucumber/p/2839034.html
Copyright © 2011-2022 走看看