JSP基础语法
什么是JSP
Java Server Page:运行在服务器中的Java写的HTML页面。
JSP的特点:
有HTML的优点,看起来是一个页面,方便美化。同时又可以在页面中写Java代码,有动态页面的功能。只要Servlet可以实现的功能,JSP都可以实现。
JSP的执行过程
- JSP的生命周期的方法:
生命周期 | 方法 | 作用 |
---|---|---|
实例化 | 构造方法 | 创建一个JSP对象 |
初始化 | _jspInit() | 调用1次,执行_jspInit() |
服务 | _jspService() | 用来处理每次请求,每次都会调用 |
销毁 | _jspDesotry() | Web容器关闭的时候执行1次 |
- 过程:
1. 翻译:将JSP页面翻译成Servlet代码
2. 编译:将Servlet编译成字节码文件
3. 运行的是字节码文件
JSP文件中的HTML代码和Java代码在翻译后的Servlet中是如何分别被执行的?
查看工作目录:c:\apache-tomcat-7.0.70\work\Catalina\localhost\day40-jsp\org\apache\jsp\
其实JSP就是一个Servlet,继承了HttpServlet
public abstract class HttpJspBase extends
HttpServlet
也就是在Servlet中:
- HTML代码: 原来的HTML代码,使用out.write来输出
- Java代码:直接放在了翻译以后的Servlet中
学习目标:
- JSP的脚本元素
- JSP的注释
- JSP的三大指令
- JSP的九个内置对象
- JSP的动作标签
1. 总结四个作用域
JSP的脚本元素
JSP页面的七个组成部分:
静态内容
- 写在JSP上面的HTML 与之前一样
JSP脚本
- 在JSP页面上写Java代码
<%
Java代码;
%>
1) 语法: <% Java代码; %>
2) 作用:直接在JSP中运行Java代码
。
JSP表达式
- 在JSP页面上直接输出变量或表达式
<%
String str ="元旦快乐";
%>
<%=str%><br/>
<%=3 * 8 %><br/>
1) 语法:<%= 变量名或表达式 %>
2) 作用: 直接在页面上输出变量名或表达式
3) 格式:前面有等于号,后面没有分号。。在Servlet中翻译成了out.print输出
JSP声明
- 在JSP上声明全局变量或方法(加个感叹号)
<%!
声明变量或方法
%>
- 演示:
- 在脚本中创建一个字符串,使用表达式输出。
- 在声明中也创建一个同名的字符,表达式输出,会不会有问题?
- 在声明中创建一个方法,输出一句话。
<!-- JSP脚本 -->
<%
String str ="元旦快乐";
%>
<!-- 声明部分 -->
<%!
String str = "新年快乐";
/**
声明方法,使用不多,以后我们主要将方法写在业务层
*/
public String sayHello(String name) {
return "Hello! " + name;
}
%>
<%=str%><br/>
<%=this.str%><br/>
<%=sayHello("Rose")%><br/>
4) 结论:
JSP脚本中的变量都是写在_jspService()方法中的局部变量,而声明中的变量是类中的成员变量。
- JSP指令
- 设置JSP页面的属性
<%@指令名 属性名="属性值" %>
- JSP动作
- action,每个动作都有自己的功能,用来代替部分Java代码。也叫内置标签。
<jsp:动作名 属性名="属性值" />
- JSP注释
- 注释的作用
“`
<%– 注释文本 –%>
“`
JSP中的三种注释:
HTML:
与HTML一样<!-- 注释 -->
- 在浏览器的源代码和生成的Servlet中都存在
Java:与Java中的注释一样
// 单行注释
/* 多行注释 */
- 在浏览器上不存在,在生成的Servlet中存在
JSP:
<%-- 注释 --%>
- 在浏览器与生成的Servlet中都不存在
面试题:如果使用HTML注释JSP脚本元素会怎么样?
如:<!-- <% session.setAttribute("key", "value");%> -->
Java代码还是会执行,但执行结果被注释了。HTML的注释,不会影响Java代码的执行。
不让运行要这种注释<%-- Java代码 --%>
JSP的三大指令
作用:设置JSP页面的属性
- 三大指令分别是:page、taglib、include
- 指令的格式:<%@指令名 属性名=”属性值” %>
taglib指令
1) 作用:导入标准标签库,在页面上使用外部的标签
2) 格式:<%@taglib uri=”固定URI地址” prefix=”前缀” %>include指令
1) 作用:用于在当前的JSP中包含另一个JSP页面
静态包含:如果A页面包含B页面,相当于把B页面中的源代码复制到A页面中。包含的是B中的代码。2) 语法:<%@include file=”被包含的页面地址” %>
- page指令
- 作用:告诉JSP如何翻译成Servlet,设置JSP页面上的各种属性
- 位置:可以再现在JSP页面中的任意部分,建议放在页面最开始的位置。
page指令
导包的属性:
- language=”java” 指定页面使用的语言,默认是Java语言
- import=”java.util.*” 导入在页面上会使用的包
1)方式一:
在一个import属性中一次导入多个包,使用逗号分隔。import="java.sql.*,java.util.*"
2) 方式二:写多个import, 每个import 导入1个包。
<%@page import="java.util.Date"%> <%@page import="java.sql.Timestamp"%>
与编码相关的属性
- contentType=”text/html; charset=utf-8”
设置当前JSP使用的MIME类型和字符集,在Servlet中生成
response.setContentType("text/html; charset=utf-8");
- pageEncoding=”utf-8”
设置页面的编码
- 功能与contentType相同
- 设置JSP文本文件的编码:
- 设置翻译成Servlet的文本文件编码。
结论: 一般只需要设置pageEncoding属性就可以解决JSP文件汉字乱码的问题
与错误相关的属性
属性:errorPage=”error.jsp” 指定当前页面出错的时候跳转到的页面,使用的是转发。
isErrorPage=”false/true” 指定当前的JSP页面是否是错误页面。与普通页面的区别是:可以使用exception内置对象,普通页面不能使用这个对象的。
错误信息的跳转方式:
1)方式一:使用errorPage=”url” 指定出错跳转到的页面
2)方式二:在web.xml中配置
<!-- 指定错误码和跳转的页面 -->
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
3)方式三:
<!-- 指定错误类型和跳转的页面 -->
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/null.jsp</location>
</error-page>
page指令属性小结:
属性名 | 作用 |
---|---|
language=”java” | 指定页面的语言 |
import=”{package.class | package.*}, …” ] | 导入包 ,方式一:一条import导入多个包,使用逗号隔开 |
. | 方式二:每条import导入1个包 |
errorPage=”relative_url” | 指定要跳转的错误页面 |
isErrorPage=”true|false” | 当前这个页面是否是错误页面,可以使用exception对象,但是404错误的exception是null,不能使用exception的getmessage方法,会出错 |
contentType=”mimeType [ ;charset=characterSet ]” | 指定页面的MIME类型和字符集 |
isELIgnored=”true | false” | 页面是否可以使用EL表达式,设置为false表示可用 |
session=”true|false” | 当前页面是否可以使用session对象,false表示不可使用 |
buffer=”none|8k” | 指定JSP页面的缓存,默认是8k |
pageEncoding=”characterSet” | 1)与contentType的功能相同 |
. | 2)指定JSP的文件编码 |
. | 3)指定Servlet的文件编码 |
动作标签
- jsp的标准动作 action
1) 作用:用于动态包含一个网页
2) 语法:
include动作与include指令的区别
. | include指令 | include动作 |
---|---|---|
语法格式 | <%@include file=”url” %> | |
包含的方式 | 静态包含,包含的是页面的内容。先将被包含的页面所有的内容复制到当前的页面来,再编译执行。包含代码 | 动态包含,包含是页面的运行结果。先执行被包含的页面,得到结果,再包含进来。包含结果 |
生成Servlet个数 | 只生成1个Servlet | 生成2个Servlet |
- 进行页面的转发,功能与
request.getRequestDispatcher(“/url”).forward(request,response)
相同 - 语法:
<jsp:forward page=”地址”/>
- 用于给forward和include**提供参数**
<!-- 转发还可以传递参数 -->
<jsp:forward page="/05-forward.jsp">
<jsp:param value="rose" name="aaa"/>
<jsp:param value="jack" name="bbb"/>
</jsp:forward>
- 转发到的页面:
<body>
得到请求的参数:
<%=request.getParameter("aaa") %><br/>
<%=request.getParameter("bbb") %><br/>
</body>
JSP的9个内置对象
概念:
在JSP页面上,有9个在Servlet中比较常用的对象,我们可以直接在页面上使用,而不用实例化。称为内置对象。
- 查看生成的Servlet源码:
所有的内置对象都是在_jspService()方法中进行实例化的。
javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
java.lang.Throwable exception = null;
javax.servlet.ServletContext application;
javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
java.lang.Object page = this;
九个内置对象
对象名 | 对应的类型 | 功能描述 |
---|---|---|
request | HttpServletRequest | 代表一个请求的对象 |
response | HttpServletResponse | 代表响应对象 |
out | JspWriter | 有缓存的字符输出流 |
session | HttpSession | 会话对象 |
application | ServletContext | 上下文对象 |
config | ServletConfig | 得到配置信息 |
exception | Throwable | 异常对象 |
page | this | Servlet实例化的对象 |
pageContext | PageContext | 页面上下文对象,访问页面中的一些信息 |
PageContext对象的作用
概述:
1) 作用域对象:页面作用域,可以向页面域中添加和获取数据
2) 通过pageContext的get方法得到其它8个内置对象,得它得天下。
输出请求对象:<%=request%><br/>
输出请求对象:<%=pageContext.getRequest()%><br/>
输出上下文对象:<%=pageContext.getServletContext()%><br/>
输出上下文对象:<%=application%><br/>
```
---