JSP基础
一、入门
可以在jsp中使用不同脚本实现不同功能,主要有以下三个脚本 <%%> 脚本区域 跟平时写java代码要求差不多,不可以定义方法 <%= %>输出区域 可以输出变量、对象、方法返回值、表达式结果 <%!%> 声明区域 可以定义成员变量、成员方法 补充:jsp中的注释写法 <%-- --%> 快捷键是ctrl + shift + /
本质:JSP的本质是特殊的Servlet
二、核心
三大指令
① page指令 <%@page 属性名="值" 属性名="值" %> 控制整个jsp页面的配置信息 language="java" 支持的语言 contentType="text/html; charset=UTF-8" 内容类型 pageEncoding="UTF-8" 页面的编码格式 import="java.util.List,java.util.ArrayList" 导入jar ② include指令 主要作用:可以将页面公共的部分提取出来,让每个页面包含这个公共的页面,一是减少代码量,二是易于维护。 页面包含说的是一个页面可以包含另一个页面的内容,并且能正常加载。 语法:<%@include file=”被包含的页面名称” %> ③ taglib指令 后面使用JSTL标准标签库时使用。 语法:<%@taglib prefix="前缀" uri="引入外部标签库的路径" %>
九大内置对象
内置对象:也称隐式对象,在jsp中,已经初始化好并且封装好了,不需要程序员创建,可以直接使用的对象就是内置对象。 对象名 功能 类型 Out 页面输出对象 JspWriter Exception 异常处理对象 Throwable Page 描述页面的对象 Object PageContext 页面对象【作用域】 PageContext Request 请求对象【作用域】 HttpServletRequest Response 响应对象 HttpServletResponse Session 会话对象【作用域】 HttpSession Config 配置 ServletConfig Application 服务器对象【作用域】 ServletContext 这些内置对象在Jsp页面都是存在的,我们可以直接使用; 这里默认能显示的内置对象共8个,还有一个特殊的对象Exception关于异常的,只有在page指令中设置isErrorPage="true"时才会显示。 可以通过以下方式获取: pageContext.getException() //获取异常对象 对象详解: 1.application相当于之前的ServletContext 对象可将信息保存在服务器中,直到服务器关闭。 2.request 代表了客户端的请求信息,主要接受通过HTTP协议传送到服务器的数据。request对象的作用域为一次请求。 3.response 代表客户端的响应信息,主要是将JSP容器处理过的对象信息返回到客户端。 4.config 对象的主要作用是取得服务器的配置信息。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。 5.page:当前jsp页面的实例,相当于this关键字。 6.session:会话对象。session 对象是由服务器自动创建与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。其作用范围为一次会话。 7.exception对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用。 8.out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。JSP中的out对象是JspWriter类型。 9.pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的, 可以获取项目的根目录,还可通过getXXX()获取其他内置对象 jsp中一共有四个域对象 pageContext request session application Servlet一共有三个域对象 request session ServletContext 在Servlet中能够直接使用的对象 只有request、response cookie属于浏览器(客户端),不属于servlet
四大域对象
为了在页面、请求、和用户之间传递和共享数据,JSP提供了四个不同的作用域:pageContext(页面作用域)、request(请求作用域)、session(会话作用域)、application(应用程序作用域),这些作用域就规定了数据可以传递和共享的范围以及数据的存活时间。 作用域详解: 1.application 作用域 如果把变量放到application里,就说明它的作用域是application,它的有效范围是整个应用。 整个应用是指从应用启动,到应用结束。 application作用域上的信息传递是通过ServletContext实现的,它提供的主要方法如下所示: Object getAttribute(String name) //从application中获取信息; void setAttribute(String name, Object value) //向application作用域中设置信息。 2.session作用域 如果把变量放到session里,它的有效范围是当前会话。所谓当前会话,就是指从用户打开浏览器开始,到用户关闭浏览器这中间的过程。 Object HttpSession.getAttribute(String name) //从session中获取信息。 void HttpSession.setAttribute(String name, Object value)//向session中保存信息。 HttpSession HttpServletRequest.getSession() //获取当前会话session对象。 3.request作用域 一它的有效范围是当前请求周期。 所谓请求周期,就是指从http请求发起,到服务器处理结束,返回响应的整个过程。在这个过程中可能使用forward的方式跳转了多个jsp页面,在这些页面里你都可以使用这个变量。 Servlet之间的信息共享是通过HttpServletRequest接口的两个方法来实现的: void setAttribute(String name, Object value)//将对象value以name为名称保存到request作用域中。 Object getAttribute(String name) //从request作用域中取得指定名字的信息。 4.pageContext作用域 page对象的作用范围仅限于用户请求的当前页面,对于page对象的引用将在响应返回给客户端之后被释放,或者在请求被转发到其他地方后被释放。page里的变量只要页面跳转了,它们就不见了。如果把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里。从把变量放到pageContext开始,到jsp页面结束,你都可以使用这个变量。
三、EL表达式
简介
EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。 ${} $
作用
是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)通过以下方式: 在JSP页面的任何'静态部分'均可通过:${expression}来获取到指定表达式的值 el表达式可以获取四个作用域中的值 包含以下几种方式: ${绑定名} 获取javaBean对象或者其他类型数据 ${绑定名.属性名} 获取javaBean中对应的属性名 ${绑定名[索引值]} 获取集合或者数组中对应的值 ${绑定名["key"]} 通过key的值获取在Map中对应的value值 同样也可以在el表达式内部做一些简单的运算:
原理
依次从四大作用域对象检索对应的绑定名,如果在某一个对象中获取到了,则不再去其他对象检索,否则继续检索,如果都没有查找到则返回的是一个空字符串,而不是null 如果如下操作时:以表达式${user.name}为例 EL表达式会根据name去User类里寻找这个name的get方法,此时会自动把name首字母大写并加上get前缀,一旦找到与之匹配的方法,El表达式就会认为这就是要访问的属性,并返回属性的值。 所以,想要通过EL表达式获取对象属性的值,那么这个属性就必须有与之对应的get方法。 可以通过指定检索四大作用域对象来提升检索速度,如下: application-->applicationScope session-->sessionScope request-->requestScope pageContext-->pageScope 比如: ${requestScope.user} 表示直接去request对象中获取user绑定名对应的值
四、JSTL标签库
简介
JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库。它主要提供给JavaWeb开发人员一个标准通用的标签,开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。 需要注意的是:jstl中需要获取值的地方一般都要配合EL表达式去使用
使用
1) 导入 jstl.jar standard.jar 两个包 2) 引入 将标签库引入 页面中 <%-- 引入标签库 --%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 3) 常用标签 1.<%--声明变量标签--%> <c:set var="name" value="柳岩"></c:set> var:声明的变量名 value:变量的值 2.<%--输出标签--%> <c:out value="${name}" ></c:out> value:要输出的变量的值,需要通过el表达式获取 3.<%--删除声明变量--%> <c:remove var="name"></c:remove> var:删除要删除的变量的名字 4.<%--if单分支标签--%> <c:if test="${empty name}">测试if分支标签1</c:if> test:当值为true的时候显示标签内部的值,否则不显示 5.<%--choose多分支标签--%> <c:choose> <c:when test="${1>2}">第一个条件的标签内容</c:when> <c:when test="${3>2}">第二个条件的标签内容</c:when> <c:otherwise>以上条件都不满足的标签内容</c:otherwise> </c:choose> 当when标签的test的值为true的时候,显示标签内容,否则不显示,当多个when标签都为true的时候,值显示第一个为true的when标签内容,如果以上when标签都为false则显示otherwise的标签内容 注意: when标签出现至少一个 otherwise标签最多出现一个 6.<%--集合或者数组的遍历标签--%> <c:forEach items="" var="" > </c:forEach> items:要遍历的集合或者数组对象,需要通过el表达式获取 var:循环变量,可以理解为集合或者数组中的每一个值或者对象,名称自定义
五、Http服务器调用JSP文件步骤:【面试】
1、Http服务器将JSP文件内容【编辑】为一个Servlet接口实现类(.java) 2、Http服务器将Servlet接口实现类【编译】class文件(.class) 3、Http服务器负责创建这个class的实例对象,这个实例对象就是Servlet实例对象 4、Http服务器通过Servlet实例对象调用_jspService方法,将jsp文件内容写入到响应体
六、Http服务器【编辑】与【编译】JSP文件位置(面试)
标准答案:我在【work】文件夹下看到这个证据 C:\Users\[登录windows系统用户角色名]\.IntelliJIdea2018.2\system\tomcat\[网站工作空间]\work\Catalina\localhost\[网站别名]\org\apache\jsp C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.3\tomcat\d19608dd-f0d4-426a-9083-b8b5c6b23cfc\work
户角色名].IntelliJIdea2018.2\system\tomcat[网站工作空间]\work\Catalina\localhost[网站别名]\org\apache\jsp
C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2020.3\tomcat\d19608dd-f0d4-426a-9083-b8b5c6b23cfc\work