JSP本质上就是一个Servlet,只不过无需配置映射路径,Web Server会根据路径查找对应的.jsp文件,如果找到了,就自动编译成Servlet再执行。
JSP在执行前首先被编译成一个Servlet。在Tomcat的临时目录下,可以找到一个hello_jsp.java的源文件,这个文件就是Tomcat把JSP自动转换成的Servlet源码:
package org.apache.jsp;
import ...
public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent,org.apache.jasper.runtime.JspSourceImports {
...
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {
...
out.write("<html>\n");
out.write("<head>\n");
out.write(" <title>Hello World - JSP</title>\n");
out.write("</head>\n");
out.write("<body>\n");
...
}
...
}
JSP语法
JSP注释: <%–这是注释–%>
快捷输出变量值:<%=表达式%>(实际上就是调用输出流打印到页面上) out.print(表达式)
JAVA片段:<%JAVA语句%> 这些语句会原封不动的被服务器翻译到对应的Servlet的_jspService方法中
JSP的3个指令
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
JSP指令格式:<%@ 指令名称 属性1=“属性值1” 属性2=“属性值2”。。。%>
page指令(用来声明JSP页面的属性等)
属性名称 | 取值 | 作用 |
---|---|---|
language | java | JSP文件采用的语言 |
extends | 全类名 | 编译该JSP文件时继承哪个类 |
import | 任何包名、类名 | 引入java包或类 |
session | boolean | JSP内是否内置Session对象 |
autoFlush | boolean | 为true,则使用out.println()等方法输出的字符串不是立刻到达客户端服务器的,而是暂时存到缓存里 |
buffer | 数字kb | 指定缓存大小,当autoFlush设为true时有效 |
isThreadSafe | boolean | 是否线程安全,如果为true,则运行多个线程同时运行该jsp程序 |
isErrorPage | boolean | 该JSP是否内置Exception对象 |
errorPage | 某个JSP页面的相对路径 | 如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面 |
contentType | 有效的文档类型 | 客户端浏览器根据该属性判断文档类型 |
info | 任意字符串 | 指明JSP的信息,该信息可以通过Servlet.getServletInfo()方法获取到 |
trimDirective Whitespaces | boolean | 是否去掉指令前后的空白字符 |
pageEncoding | UTF-8,ISO-8859-1等 | 该JSP页面编码方式 |
include指令
<%@ include file=“relativeURL”%>
relativeURL:本应用程序内另一个JSP文件或者HTML文件的路径,例如,网址内所有页面均有一个统一风格的导航栏和页脚版权,那么就可以使用该指令将其包含进来。
taglib指令
<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>
用来指明JSP页面内使用的JSP标签库,taglib指令有两个属性,uri为类库的地址,prefix为标签的前缀
JSP行为
动态包含
<jsp:include page="/include/header.jsp"></jsp:include>
include行为用于运行时包含某个文件,如果被包含的文件为JSP程序,则先会执行JSP程序,然后在把执行的结果包含进来
JAVA bean行为
是一组与Java Bean 相关的行为,包括useBean行为、setProperty行为、getProperty行为等
- useBean行为
<jsp:useBean id=“beanObject” class=“className” scope=“Value”>
作用:在jsp中定义一个java bean对象
属性:
id:指明Java Bean对象的名称,JSP中可以使用该名称引用该Java Bean对象,相当于给new出来的对象取一个变量名
class:Java Bean类的全名
scope:该java bean对象的作用范围,可以写的就四个,也就是JSP的四大作用域,page、request、session、application
- setProperty行为
<jsp:setProperty name=“beanName” property=“propertyName” value="">
作用:对Java Bean对象进行属性的赋值
属性:
name:java bean对象的名称,也就是在useBean行为中的id
property:对象中的属性名
value:要对其属性进行赋值的值
- getProperty行为
<jsp:getProperty name=“beanName” property=“propertyName” />
作用:获取JavaBean对象的某个属性值
属性:
name:java bean 对象的名称,也就是在useBean行为中的id
property:对象的属性名
请求转发行为
实现请求转发功能,Servlet中通过request.getRequestDispatcher(“someServlet”).forward(request,response);而在JSP中也能够实现相同的功能,只不过用的是<jsp:forward />行为,实际上forward行为就是对其进行了封装。
<jsp:forward page="someServlet">
<jsp:param name="param1" value="value1"/>
<jsp:param name="param2" value="value2"/>
</jsp:forward>
属性:
page:需要跳转到的页面或者servlet
jsp:param/向request中携带键值对参数
JSP九大内置对象
request, response, session, config, application对象用法与servlet中的对象相同
pageContext(重要)
它是JSP页面的管理者(上下文),能够获取到其他JSP内置对象
pageContext对象的api如下:
-
获得其它八大内置对象 getXxx()
在普通类中可以通过PageContext获取其他JSP隐式对象
pageContext.getOut(); //获得out对象
pageContext.getApplication(); //获得application对象
… -
对指定作用域的属性进行操作
Object getAttribute(String name, [ int Scope ]); //获得 指定作用域中的数据
void setAttribute(String name,Object o, [ int Scope ]); //给指定作用域设置内容
void removeAttribute(String name, [ int Scope ]); // 移除指定作用域的内容[]的内容可缺省,默认即为paga作用域
提供的作用域常量:
- PageContext.PAGE_SCOPE page
- PageContext.REQUEST_SCOPE request
- PageContext.SESSION_SCOPE response
- PageContext.APPLICATION_SCOPE application
-
一次获得指定名称内容
findAttribute(String name); //自动从page request session application依次查找,找到了就取值,结束查找。
out对象
jsp 输出底层使用 response.getWriter().print(“
out.print()输出的内容
”)exception异常对象
举例:
exception.jsp 抛异常的一个NullPointException,并且跳转到error.jsp错误显示页面 errorPage属性的意思是如果发生未捕捉到的异常,将会跳转到error.jsp页面
error.jsp isErrorPage属性说明该页面是一个错误显示页面,则可以使用exception对象