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
- 当浏览器请求一个jsp页面时,如
http://localhost/app/index.jsp
时,请求会交给一个叫做jsp的servlet来处理,即jsp引擎。 - 将其翻译成一个java文件(将jsp里面的一些特殊语法标签转成对应的java语法,对于前端部分的代码html、css、js等,它是不做任何处理的,直接写出去,交给浏览器来处理),该java文件本质上来说就是servlet
- java文件经过编译,形成class文件
- 执行这个class文件的service方法
- service方法执行(其实就是往响应报文里面写入html标签以及java程序运行的值),呈现出最终的页面到客户端
- 当浏览器请求一个jsp页面时,如
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使用语法
- JSP指令
- 作用:用于配置JSP页面,导入资源文件
- 格式:
- <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 … %>,如<%@ page contentType=“text/html;charset=gb2312”,language=“java” %>
- 分类:
- page:配置JSP页面的
- page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。
- contentType:等同于response.setContentType()
- 设置响应体的mime类型以及字符集
- 设置当前jsp页面的编码(只能是高级的IDE才能生效,如果使用低级工具,则需要设置pageEncoding属性设置当前页面的字符集)
- import:导包
- errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
- isErrorPage:标识当前也是是否是错误页面。
- true:是,可以使用内置对象exception
- false:否。默认值。不可以使用内置对象exception
- 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和导包除外)
- taglib:导入资源
- 语法:<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
- prefix:前缀,自定义的
- page:配置JSP页面的
- JSP表达式
- JSP表达式(expression)用于将程序数据输出到客户端
- 语法:<%= 变量或表达式 %>:如<%= new java.util.Date() %>
- JSP引擎在翻译JSP表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…) 将数据输给客户端。
- JSP表达式中的变量或表达式后面不能有分号
- 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> <%}%>
- 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声明中不能使用这些隐式对象
- 注释:
- html注释:
只能注释html代码片段 - jsp注释:推荐使用 :<%– –%>可以注释所有
- 内置对象
- 在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方法 (重点,查找各个域中的属性:从下往上找)
- pageContext对象的方法
16.5.JSP EL表达式
- 概念:Expression Language 表达式语言
- 作用:替换和简化jsp页面中java代码的编写
- 语法:${表达式}
- 注意:
- jsp默认支持el表达式的。如果要忽略el表达式
- 设置jsp中page指令中:isELIgnored=“true” 忽略当前jsp页面中所有的el表达式
- ${表达式} :忽略当前这个el表达式
- jsp默认支持el表达式的。如果要忽略el表达式
- 使用:
- 运算:
- 运算符:
- 算数运算符: + – * /(div) %(mod)
- 比较运算符: > < >= <= == !=
- 逻辑运算符: &&(and) ||(or) !(not)
- 空运算符: empty
- 功能:用于判断字符串、集合、数组对象是否为null或者长度是否为0
- ${empty list}:判断字符串、集合、数组对象是否为null或者长度为0
- ${not empty str}:表示判断字符串、集合、数组对象是否不为null 并且 长度>0
- 运算符:
- 获取值
- el表达式只能从域对象中获取值
- 语法:
- ${域名称.键名}:从指定域中获取指定键的值
- 域名称:
- pageScope –> pageContext
- requestScope –> request
- sessionScope –> session
- applicationScope –> application(ServletContext)
- 举例:在request域中存储了name=张三
- 获取:${requestScope.name}
- 域名称:
- ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止。
- 获取对象、List集合、Map集合的值
- 对象:${域名称.键名.属性名}
* 本质上会去调用对象的getter方法
- List集合:${域名称.键名[索引]}
- Map集合:
- ${域名称.键名.key名称}
- ${域名称.键名[“key名称”]}
- 对象:${域名称.键名.属性名}
- ${域名称.键名}:从指定域中获取指定键的值
- 隐式对象:
- el表达式中有11个隐式对象
- pageContext:
- 获取jsp其他八个内置对象
- ${pageContext.request.contextPath}:动态获取虚拟目录
- 获取jsp其他八个内置对象
- pageContext:
- el表达式中有11个隐式对象
- 运算:
16.6.JSTL
- 概念:JavaServer Pages Tag Library JSP标准标签库
- 是由Apache组织提供的开源的免费的jsp标签 <标签>
- 作用:用于简化和替换jsp页面上的java代码
- 使用步骤:
- 导入jstl相关jar包
- 引入标签库:taglib指令: <%@ taglib %>
- 使用标签
- 常用的JSTL标签
- if:相当于java代码的if语句
- 属性:
- test 必须属性,接受boolean表达式
- 如果表达式为true,则 显示if标签体内容,如果为false,则不显示标签体内容
- 一般情况下,test属性值会结合el表达式一起使用
- test 必须属性,接受boolean表达式
- 注意:c:if标签没有else情况,想要else情况,则可以在定义一个c:if标签
- 属性:
- choose:相当于java代码的switch语句
- 使用choose标签声明 相当于switch声明
- 使用when标签做判断 相当于case
- 使用otherwise标签做其他情况的声明 相当于default
- if:相当于java代码的if语句
- foreach:相当于java代码的for语句
- 练习:
- 需求:在request域中有一个存有User对象的List集合。需要使用jstl+el将list集合数据展示到jsp页面的表格table中
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/181051.html