jsp
在JSP中既可以书写java代码,同时还可以书写html标签
-
jsp中的注释:<%–注释内容–%>,添加注释的快捷键是:ctrl+/;
-
在jsp中书写代码有三种方式,我们这里先介绍一种,格式:
<% java代码 %>
-
<% %>中书写的代码被直接解析成java代码
-
jsp之所以可以编写html代码,其实本质上也是类似我们使用Servlet直接输出的。也就是说底层还是像我们之前做法一样进行标签拼接。html部分都被out.write(“”)方法以字符串的形式拼接,然后响应给浏览器
-
在这个java文件中有个_jspService,这个方法有两个参数request,response
-
由于我们自己编写的代码全部都落入到了service方法内部一开始就已经声明了request,response,session,application(ServletContext)等对象了,这些对象成为之jsp内置对象
jsp底层机制:
jsp文件 => .java文件 => .class文件
jsp文件 : 继承HttpServlet
JSP:书写java代码的三种方式
方式1:JSP脚本片段
脚本片段指的是一段java代码。书写格式:<% java 代码 %>
方式2:JSP脚本声明
脚本片段虽然可以嵌入java代码,但是如果要给当前的jsp中定义一些成员方法或者成员变量,就需要一个新的方式:脚本声明
说明:通过查看jsp的源代码发现,脚本片段的代码都会存在service方法中,而方法中是不可以定义一个方法的。
脚本声明的格式:<%! 书写Java代码 %>
方式3:JSP脚本表达式
虽然脚本声明和脚本片段已经可以书写Java代码了,但是如果要向页面输出一些内容,还是需要使用原来的response对象来实现,这种方式比较繁琐。
JSP脚本表达式可以代替response向页面输出内容
JSP脚本表达式的格式:<%= 向浏览器输出的内容 %>
等价于:out.print( 向浏览器输出的内容)
示例:在页面输出信息
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%="传智播客"%>
<%="上海黑马"%>
<%
response.getWriter().print("response");
%>
</body>
</html>
注意:
上面代码中,我们书写代码的顺序是先:
<%="传智播客"%>
<%="上海黑马"%>
再:
response.getWriter().print("response");
可是浏览器查看数据的结果是
response 传智播客 上海黑马
原因:response.getWriter()获取的输出流是:PrintWriter。而脚本表达式<%=%> 等价于:out.print( 向浏览器输出的内容),并且这种方式获取的输出流是:JspWriter。其实导致上述输出结果前后顺序就是PrintWriter和JspWriter。
JspWriter:将输出的内容先放到jsp内置的缓冲区中,然后再刷新输出。
PrintWriter:是不使用jsp内置的缓冲区,直接将内容写到网页中。
结论:
1. 不要同时使用脚本表达式和response同时往页面输出信息,会出现顺序不一致。现象:response会出现在最前面(使用一种输出即可)
-
脚本表达式
<%= str %>
:在页面输出内容,在service方法中起作用 -
脚本片段
<% %>
:在service方法中,原样输出的代码片段;属于局部为,放在_jspService方法中 -
脚本声明:
<%! String str = "黑马程序员" %>
:定义成员变量
JSP:三大指令
指令概述
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出效果,而只是告诉引擎如何处理JSP页面中的其余部分。
指令用来声明JSP页面的一些属性,比如编码方式,文档类型。我们在servlet中也会声明我们使用的编码方式和响应的文档类型的,而JSP就是用指令来声明的。
JSP页面的三大指令:
- page指令
- taglib指令
- include指令
指令的格式:
<%@指令名 属性名="属性值"%>
page指令
作用:
page是jsp中必须使用的一个指令,用于设置JSP上各种页面的属性,告诉tomcat如何将一个JSP翻译成Servlet
书写格式:
<%@ page 属性名="属性值" %>
示例:
<%@ page contentType="text/html;charset=utf-8" %>
//说明:声明jsp页面的编码方式 //response.setContentType("text/html;charset=utf-8")
可以放在JSP中任何位置,一般建议放在页面的最顶部
taglib指令
作用:
用于在JSP页面中导入JSTL标签库
书写格式:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
解释说明:表示引入外部的jstl标签库的
prefix="c" 表示前缀
uri="http://java.sun.com/jsp/jstl/core" 表示jstl标签库的地址
include指令
作用:
在一个JSP页面中静态包含另外一个JSP页面
书写格式:
<%@ include file="URL" %> //指定要导入页面的地址
使用示例:
需求:课后的原型中的页面放到web文件夹下面。然后打开主页index.jsp.在主页中引入header.jsp页面
<!--引入头部-->
<div id="header">
<%@ include file="header.jsp"%>
</div>
JSP:page指令
page是jsp中必须使用的一个指令,用于设置JSP上各种页面的属性,告诉tomcat如何将一个JSP翻译成Servlet
语法格式:<%@page 属性名="属性值" %>
//通常书写在页面的顶部
page指令属性:导包
导包属性:
<%@page import="java.util.*"%> //导入java.util下所有类
作用:相当于导包
**方式1:**每个page指令导入一个类
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
**方式2:**一个page指令的import属性导入所有的包,包之间使用逗号分隔
<%@page import="java.util.Date,java.text.SimpleDateFormat"%>
page指令属性:编码
编码属性:
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
作用:设置响应编码
response.setContentType("text/html;charset=UTF-8");
page指令属性:错误页跳转
相关属性:
<%@ page language="java" errorPage="error.jsp"%>
errorPage="错误页面的URL" : 用于指定如果当前页面出错,转发到哪个页面去
<%@ page isErrorPage="true"%>
isErrorPage="false":默认是false,指定true表示是错误页面
当前这个页面是否是一个错误页面,错误页面可以多使用一个内置对象:exception
错误页面跳转的3种设置:
1、通过page指令的errorPage属性指定:如果页面出错,转发到error.jsp这个页面
<%@ page errorPage="error.jsp"%>
代码演示:
<%--跳转到错误页面--%>
<%@page errorPage="../error.jsp" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
int i = 1 / 0;
%>
hello world
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--声明是错误页面--%>
<%@page isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>错误页面</h2>
<%=exception.getMessage()%>
</body>
</html>
页面效果:
2、通过web.xml文件指定错误码:响应状态码为404则跳转到404.jsp页面
可以在web.xml进行配置跳转到更加好看一些的页面。
<!-- 指定错误页面 -->
<error-page>
<!-- 指定错误码 -->
<error-code>404</error-code>
<!-- 出错以后跳转到哪个页面 -->
<location>/404.jsp</location>
</error-page>
404.jsp页面代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<img src="/404.jpg"/>
</body>
</html>
3、通过web.xml文件指定错误类型:发生空指针,则跳转到null.jsp页面
<!-- 指定错误的类型 -->
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/null.jsp</location>
</error-page>
小结
属性名 | 作用 |
---|---|
language=“java” | 指定JSP页面使用语言 |
import=“java.util.Date” | 导入包: 1. 每个import包入一个包 2. 一个import导入多个包,使用逗号分隔 |
errorPage=“relative_url” | 当前页面出错,转发到哪个错误页面 |
isErrorPage=“true|false” | 当前是否是一个错误页面 |
contentType=“文档类型;charset=编码表名称” | 指定页面类型和编码,不指定会有乱码 |
补充知识点:JSP内置对象
-
内置对象:在JSP页面中不需要获取和创建,可以直接使用的对象
-
JSP一共有9个内置对象
内置对象名 作用 pageContext 域对象(当前页面中共享数据) request 域对象(一次请求中共享数据) session 域对象(一次会话中共享数据) application 域对象(整个web应用中共享数据) 【ServletContext】 response 响应对象 page 当前页面对象(Servlet) out 输出对象(JspWriter) config Servlet配置对象(ServletConfig) exception 异常对象
EL:概述
EL概述
表达式语言(Expression Language)
lambda表达式
xpath路径表达式 (XML)
正则表达式
表达式: 以简短的符号表示复杂的内容
EL也是表达式的一种,EL全称: Expression Language(中文的意思是EL表达式)
EL作用:代替jsp中脚本表达式<%=输出内容%>的功能,简化对java代码的操作
书写语法:${表达式}
<%
String msg = (String) request.getAttribute("msg");
%>
<div>
<font color="red"><%=msg%></font>
<!-- 使用EL表达式 -->
<font color="red">${msg}</font>
</div>
EL表达式可以从域对象中取值
EL:jsp的四大域对象
jsp四大域对象
JSP的四大域对象指的是:page域,request域,session域,application域。使用EL表达式从这4个域对象中取值。
域对象信息:
域对象 | 在EL中的对象名称 | 在servlet中的对象名 | 说明 |
---|---|---|---|
page域 | pageScope | pageContext,属于javax.servlet.jsp.PageContext类的对象 | page域指的是当前JSP页面,其中存储的数据只在当前页面有效,因为jsp本质是servlet,所以page域只在一个servlet中有效。 |
request域 | requestScope | request,属于javax.servlet.http.HttpServletRequest接口的对象 | request域:一次请求或请求链中request域 |
session域 | sessionScope | session,属于javax.servlet.http.HttpSession接口的对象 | session域:一次会话过程中,session域 |
application域 | applicationScope | application,属于javax.servlet.ServletContext接口的对象 | application域:服务启动后整个项目对应的ServletContext域 |
小结
- 在jsp页面中存在4个域对象:(从小到大排列)
- page域对象: pageContext
- request域对象: request //HttpServletRequest
- session域对象:session //HttpSession
- application域对象: application //ServletContext
- jsp中的4大域对象,在EL表达式中的体现:
- 页面域: ${pageScope.key}
- 请求域: ${requestScope.key}
- 会话域: ${sessionScope.key}
- 应用程序域: ${applicationScope.key}
EL:el表达式从四大域中取值
EL表达式从域对象取值方式
EL表达式从指定的域中取值的方式如下:
域对象 | 取值方式 |
---|---|
page域 | ${pageScope.key} |
request域 | ${requestScope.key} |
session域 | ${sessionScope.key} |
application域 | ${applicationScope.key} |
小结
- 在使用el表达式时,可以不用指定具体的域对象,直接使用:${key} ,此时就会依次从:pageContext 、request、session、application域中取出对应key的数据 (从小到大)
EL:el表达式从Cookie中取值
- 问题:如何使用EL表达式,获取Cookie的值?
- 答案: ${cookie.cookie中的name名称.value}
JSTL:jstl标签的应用
jsp页面引入标签库
在JSP页面中通过以下标签,通过taglib标签引入JSTL资源:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
注意:
- prefix:是jstl标签在使用的时候的前缀;
- uri:是标签库的资源路径;
c:if标签介绍
<c:if test="判断条件"></c:if>
标签的作用相当于java中的if判断语句
test:if的判断条件
c:foreach标签的属性
解释说明:
- var:
- 在不循环对象的时候,保存的是控制循环的变量;在循环对象的时候,保存的是被循环对象中的数据。就是集合或者数组中的数据
- items:
- 定要循环的对象。(就是数组或者集合名字)
- varStatus:
- 保存了当前循环过程中的信息(循环的开始、结束、步长、次数等)
- begin:
- 设置循环的开始。起始索引,例如 int i=0
- end:
- 设置循环的结束.就是结束的值。例如:i<=arr.length-1中的arr.length-1
- step:
- 设置步长——间隔几次循环,执行一次循环体中的内容。例如:i++
在使用<c:forEach>
标签时,需要注意如下几点说明:
- 如果指定begin属性,其值必须大于或等于零
- 如果指定步长(step属性),其值必须大于或等于1
- 如果items属性的值为null,则要处理的集合对象为空,这时不执行迭代操作
- 如果指定的begin属性的值大于或等于集合对象的长度,不执行迭代操作
- 如果指定的end属性的值小于begin属性的值,不执行迭代操作;