JSP

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。JSP,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

16.JSP
16.1.介绍
  • JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP/Servlet规范。
  • JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
16.2.JSP原理
  • JSP本质上也是一个个的Servlet,使用”继承于”顶级输出字符流接口Write流的PrintWrite的write函数,将html代码打印到Client
  • JSP页面的代码执行:先找到jsp页面,然后tomcat会生成一个jsp对应的java文件编译成class字节码文件。然后加载class字节码文件。调用jsp的 service方法。然后产生结果,并把结果写回到client
    1. 当浏览器请求一个jsp页面时,如 http://localhost/app/index.jsp 时,请求会交给一个叫做jsp的servlet来处理,即jsp引擎。
    2. 将其翻译成一个java文件(将jsp里面的一些特殊语法标签转成对应的java语法,对于前端部分的代码html、css、js等,它是不做任何处理的,直接写出去,交给浏览器来处理),该java文件本质上来说就是servlet
    3. java文件经过编译,形成class文件
    4. 执行这个class文件的service方法
    5. service方法执行(其实就是往响应报文里面写入html标签以及java程序运行的值),呈现出最终的页面到客户端
16.3.JSP体系结构
java.lang.Object
    |
    |___java.servlet.GerericServlet
        |
        |___javax.servlet.http.HttpServlet
            |
            |___org.apache.jsper.runtime.HttpJspBase
  • 证明了其本质上就是一个Servlet
  • 一般使用servlet做逻辑处理,然后运算得到结果,将这个结果放入request域、session域、context域,转发、刷新等到jsp页面,
16.4.JSP使用语法
  1. JSP指令
    • 作用:用于配置JSP页面,导入资源文件
    • 格式:
      • <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 … %>,如<%@ page contentType=“text/html;charset=gb2312”,language=“java” %>
    • 分类:
      1. page:配置JSP页面的
        • page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。
        • contentType:等同于response.setContentType()
          1. 设置响应体的mime类型以及字符集
          2. 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
        • import:导包
        • errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
        • isErrorPage:标识当前也是是否是错误页面。
          • true:是,可以使用内置对象exception
          • false:否。默认值。不可以使用内置对象exception
      2. include:页面包含的。导入页面的资源文件
        • include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
        • 语法:<%@ include file=“被包含组件的绝对URL或相对URL”%>,如:<%@include file=“top.jsp”%>
        • 其中的file属性用于指定被引入文件的路径。路径以“/”开头,表示代表当前web应用
        • 细节:
          • 被引入的文件必须遵循JSP语法。
          • 被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见名知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
          • 由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)
      3. taglib:导入资源
      • 语法:<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
      • prefix:前缀,自定义的
  2. JSP表达式
    • JSP表达式(expression)用于将程序数据输出到客户端
    • 语法:<%= 变量或表达式 %>:如<%= new java.util.Date() %>
      • JSP引擎在翻译JSP表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…) 将数据输给客户端。
      • JSP表达式中的变量或表达式后面不能有分号
  3. JSP脚本片段
    • 可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。
    • 语法:<% 代码片段 %>
      • JSP脚本片断中只能出现java代码,不能出现其它模板元素
      • JSP引擎在翻译JSP页面中,会将JSP脚本片断中的Java代码将被原封不动地放到Servlet的jspService方法中。
      • JSP脚本片断中的Java代码必须严格遵循Java语法,例如,每执行语句后面必须用分号结束。
      • 多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况
      • 单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句
      <%for (int i=1; i<5; i++) {%>
      	<H1>this is H1 title</H1>
      <%}%> 
      
  4. JSP声明
    • 一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用
    • 语法:<%! declaration; [ declaration; ]+ … %>
      <%! int i = 0; %> 
      <%! int a, b, c; %> 
      <%! Circle a = new Circle(2.0); %> 
      
      • JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法
      • JSP页面中编写的所有代码,默认会翻译到servlet的service方法中, 而Jsp声明中的java代码被翻译到_jspService方法的外面
      • 多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中
      • JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象
  5. 注释:
  6. html注释:
    只能注释html代码片段
  7. jsp注释:推荐使用 :<%– –%>可以注释所有
  8. 内置对象
  • 在jsp页面中不需要创建,直接使用的对象,一共有9个,俗称九大隐式对象:
变量名 真实类型 作用
pageContext PageContext 当前页面共享数据,还可以获取其他八个内置对象
request HttpServletRequest 一次请求访问的多个资源(转发)
session HttpSession 一次会话的多个请求间
application ServletContext 所有用户间共享数据
response HttpServletResponse 响应对象
page Object 当前页面(Servlet)的对象 this
out JspWriter 输出对象,数据输出到页面上
config ServletConfig Servlet的配置对象
exception Throwable 异常对象
  • out隐式对象
    • out隐式对象用于向客户端发送文本数据。
    • out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
    • JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
    • 只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
      • 设置page指令的buffer属性关闭了out对象的缓存功能
      • out对象的缓冲区已满
      • 整个JSP页面结束,提交响应
  • pageContext隐式对象
    • pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,检索其它域对象中的属性等。
    • 通过pageContext获得其他对象
      • getException方法返回exception隐式对象
      • getPage方法返回page隐式对象
      • getRequest方法返回request隐式对象
      • getResponse方法返回response隐式对象
      • getServletConfig方法返回config隐式对象
      • getServletContext方法返回application隐式对象
      • getSession方法返回session隐式对象
      • getOut方法返回out隐式对象
    • pageContext作为域对象
      • pageContext对象的方法
        • public void setAttribute(java.lang.String name,java.lang.Object value)
        • public java.lang.Object getAttribute(java.lang.String name)
        • public void removeAttribute(java.lang.String name)
      • pageContext对象中还封装了访问其它域的方法**
        • public java.lang.Object getAttribute(java.lang.String name,int scope)
        • public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
        • public void removeAttribute(java.lang.String name,int scope)
      • scope代表各个域的常量
        • PageContext.APPLICATION_SCOPE
        • PageContext.SESSION_SCOPE
        • PageContext.REQUEST_SCOPE
        • PageContext.PAGE_SCOPE
      • findAttribute方法 (重点,查找各个域中的属性:从下往上找)
16.5.JSP EL表达式
  1. 概念:Expression Language 表达式语言
  2. 作用:替换和简化jsp页面中java代码的编写
  3. 语法:${表达式}
  4. 注意:
    • jsp默认支持el表达式的。如果要忽略el表达式
      1. 设置jsp中page指令中:isELIgnored=“true” 忽略当前jsp页面中所有的el表达式
      2. ${表达式} :忽略当前这个el表达式
  5. 使用:
    1. 运算:
      • 运算符:
        1. 算数运算符: + – * /(div) %(mod)
        2. 比较运算符: > < >= <= == !=
        3. 逻辑运算符: &&(and) ||(or) !(not)
        4. 空运算符: empty
          • 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
          • ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
          • ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
    2. 获取值
      1. el表达式只能从域对象中获取值
      2. 语法:
        1. ${域名称.键名}:从指定域中获取指定键的值
          • 域名称:
            1. pageScope –> pageContext
            2. requestScope –> request
            3. sessionScope –> session
            4. applicationScope –> application(ServletContext)
          • 举例:在request域中存储了name=张三
          • 获取:${requestScope.name}
        2. ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
        3. 获取对象、List集合、Map集合的值
          1. 对象:${域名称.键名.属性名}
            * 本质上会去调用对象的getter方法
            
          2. List集合:${域名称.键名[索引]}
          3. Map集合:
            • ${域名称.键名.key名称}
            • ${域名称.键名[“key名称”]}
    3. 隐式对象:
      • el表达式中有11个隐式对象
        • pageContext:
          • 获取jsp其他八个内置对象
            • ${pageContext.request.contextPath}:动态获取虚拟目录
16.6.JSTL
  1. 概念:JavaServer Pages Tag Library JSP标准标签库
    • 是由Apache组织提供的开源的免费的jsp标签 <标签>
  2. 作用:用于简化和替换jsp页面上的java代码
  3. 使用步骤:
    1. 导入jstl相关jar包
    2. 引入标签库:taglib指令: <%@ taglib %>
    3. 使用标签
  4. 常用的JSTL标签
    1. if:相当于java代码的if语句
      1. 属性:
        • test 必须属性,接受boolean表达式
          • 如果表达式为true,则 显示if标签体内容,如果为false,则不显示标签体内容
          • 一般情况下,test属性值会结合el表达式一起使用
      2. 注意:c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签
    2. choose:相当于java代码的switch语句
      1. 使用choose标签声明 相当于switch声明
      2. 使用when标签做判断 相当于case
      3. 使用otherwise标签做其他情况的声明 相当于default
  5. foreach:相当于java代码的for语句
  6. 练习:
    • 需求:在request域中有一个存有User对象的List集合。需要使用jstl+el将list集合数据展示到jsp页面的表格table中

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/181051.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!