jsp是java web 的动态网页开发技术,jsp可以嵌套java代码,Tomcat在获得jsp后会把它转为servlet。
tomcat在客户端第一次请求的时候编译jsp,tomcat可以自动检查jsp是否被改动,要是有改动,在下一次客户端请求页面的时候再次编译它。
jsp本质上是servlet,所以生命周期和servlet一样。不同的是jsp是先部署后编译,servlet是先编译后部署。
jsp被转为一个继承了org.apache.jasper.runtime.HttpJspBase类、实现了org.apache.jasper.runtime.JspSourceDependent接口的类。
HttpJspBase的源码:
HttpJspBase是HttpServlet的子类,
1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.jasper.runtime;
19
20 import java.io.IOException;
21
22 import javax.servlet.ServletConfig;
23 import javax.servlet.ServletException;
24 import javax.servlet.http.HttpServlet;
25 import javax.servlet.http.HttpServletRequest;
26 import javax.servlet.http.HttpServletResponse;
27 import javax.servlet.jsp.HttpJspPage;
28
29 import org.apache.jasper.compiler.Localizer;
30
31 /**
32 * This is the super class of all JSP-generated servlets.
33 *
34 * @author Anil K. Vijendran
35 */
36 public abstract class HttpJspBase extends HttpServlet implements HttpJspPage {
37
38 private static final long serialVersionUID = 1L;
39
40 protected HttpJspBase() {
41 }
42
43 @Override
44 public final void init(ServletConfig config)
45 throws ServletException
46 {
47 super.init(config);
48 jspInit();
49 _jspInit();
50 }
51
52 @Override
53 public String getServletInfo() {
54 return Localizer.getMessage("jsp.engine.info");
55 }
56
57 @Override
58 public final void destroy() {
59 jspDestroy();
60 _jspDestroy();
61 }
62
63 /**
64 * Entry point into service.
65 */
66 @Override
67 public final void service(HttpServletRequest request, HttpServletResponse response)
68 throws ServletException, IOException
69 {
70 _jspService(request, response);
71 }
72
73 @Override
74 public void jspInit() {
75 }
76
77 public void _jspInit() {
78 }
79
80 @Override
81 public void jspDestroy() {
82 }
83
84 protected void _jspDestroy() {
85 }
86
87 @Override
88 public abstract void _jspService(HttpServletRequest request,
89 HttpServletResponse response)
90 throws ServletException, IOException;
91 }
我们在jsp中写的html,都会在_jspService()方法中用out.write()方法写:
image.png
jsp的语法
包括脚本(javascript、java代码)、指令、标签。
jsp脚本
- javascript方式
- <script></script>标签
- 引入js的wenjian
- java代码方式
- 在<% %>内部写java代码
- 用<%= %>来输出结果
- 在<%! %>中声明全局属性和全局方法
- 注释:
<%-- --%> :jsp注释,
// :java单行注释
/* */ :Java多行注释
<!-- --> :这个注释,会发送到浏览器端的源码中显示
jsp指令
jsp指令是声明一些文档编码方式、文件类型等等。
- JSP指令格式:
<%@ directive {attribute=value}* %>
derective:指令名称
attribute=value:属性=值
*:表示可以写多个
-
directive :
-
page指令:
用来声明JSP页面的属性等。
(ps:page允许的指令在下面介绍)。 -
include指令
<%@ include file="relativeURL"%>include指令会将包含页面的源代码添加到使用include指令的页面中来,然后编译成class文件,是静态包含。 -
taglib指令
用来指明JSP页面内使用的JSP标签库,taglib指令有两个属性,uri为类库的地址,prefix为标签的前缀。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
-
-
当指令为page时,可支持的属性
如<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>这样-
language
解释该JSP文件时采用的语言,一般为java语言,默认为java -
extends
该JSP文件继承哪个类,需要实现Servlet的init、destroy等方法 -
import
引入该JSP中用到的类、包等,import是唯一可以声明多次的page指令属性,一个import可以引用多个类,中间用英文逗号隔开 -
session
取值为TRUE或FALSE,默认为TRUE,如果为true,则内置Session对象,可直接使用,否则反之 -
autoFlush
是否运行缓存,默认为true;如果为true,则用out.println()等方法输出的字符串并不是立刻到达客户端服务器的,而是暂时存到缓存里,缓存满了或者程序执行完毕或者执行out.flush()操作时才到客户端 -
buffer
取值为none或XXXkb,指定缓存大小,当autoFlush设为true时有效,例如<%@ page buffer=10kb%> -
isThreadSafe
是否线程安全,默认为false;如果为true,则运行多个线程同时运行该jsp程序,否则只运行一个线程,其余线程等待 -
isErrorPage
默认为false,指定该页面是否为错误显示页面;如果为true,则该JSP内置有一个Exception对象exception,可直接使用,否则没有 -
errorPage
指明一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面。errorPage指定的页面通常isErrorPage属性为true,且内置的exception对象为未捕捉的异常 -
contentType
客户端浏览器根据该属性判断文档类型,例如 HTML格式为text/html、纯文本格式为text/plain、JPG图像为image/jpeg、GIF图像为image/gif、WORD文档为application/msword,该属性常跟charset设置编码一起,作用是通知服务器和浏览器都使用同一个码表 -
pageEncoding
指定一张码表来对该JSP页面进行编码
-
jsp行为
jsp的标签包括JSP自带内置的标签、通过taglib指令得到的JSP标签库的标签和自定义标签。其中jsp内置的标签就被称为jsp行为。
格式:
<jsp:elements {attribute="value"}* />
jsp:标签的前缀,说明是jsp内置的标签,
elements:行为的名称,
attribute=value:使用键值对来编写属性
*:能指定0个或多个属性对
-
<jsp:include />行为
这个行为将包含的jsp运行的结果包含进来,是动态包含。
include指令是将包含的jsp代码包含进来一起编译,是静态包含。 -
Java bean行为
这是一组与Java Bean 相关的行为,包括useBean行为、setProperty行为、getProperty行为等。
2.1 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
page:只能在当前JSP页面使用,如果不在JSP页面,那么就会失效
request:这个前面学过,A页面请求转发到B页面,那么使用的是同一个request,那么A,B页面都算是request的作用域,也就是通过请求转发的页面都是其作用域
session:该作用域在一个web项目下任何位置应该读访问的到,只要cookie不关闭,并且cookie设置的访问路径为"/",
application:其实就是Servlet中的servletContext,服务器下的所有项目都能访问到。
2.2 setProperty行为
<jsp:setProperty name="beanName" property="propertyName" value="">
作用:对bean对象的属性进行设置。
2.3 getProperty行为
<jsp:getProperty name="beanName" property="propertyName" />
作用:获取JavaBean对象的某个属性值
- <jsp:forward />行为
作用:请求转发
格式:
<jsp:forward page="someServlet">
<jsp:param name="param1" value="value1"/>
<jsp:param name="param2" value="value2"/>
</jsp:forward>
- <jsp:directive/>行为
相当于JSP指令,比如<jsp:directive.page/>相当于<%@ page %>指令
jsp九大内置对象
jsp内置了九个隐藏的对象,可以直接用。
- page:
表示当前JSP页面,是当前JSP编译后的Servlet类的对象,相当于this - config:
标识Servlet配置,跟Servlet中的ServletConfig对象是一样的,能获取该servlet的一些配置信息,能够获取ServletContext - application:
标识web应用上下文,有共享数据、初始化全局参数、获取资源路径、获得指定路径下的所有内容的作用,相当于ServletContext - request:
请求对象 - response:
响应对象 - session:
表示一次会话,在服务器端记录用户状信息的技术 - out:
输出响应体 类型:JspWriter - exception :
表示发生异常对象,类型 Throwable,isErrorPage属性设为true才有exception对象 - pageContext:
表示 jsp页面上下文(jsp管理者) 类型:PageContext
jsp四大作用域
page、request、session、application
pageContext对象的使用
- 获得其它八大内置对象 getXxx()
- 对作用域的属性进行操作(四大作用域)
pageContext.getAttribute(name); //获得page作用域数据
pageContext.getAttribute(name,scope); //获得 指定作用域中的数据
pageContext.setAttribute(name,value); //给page作用域设置内容
pageContext.setAttribute(name,value, scope);//给指定作用域设置内容
pageContext.removeAttribute(name); //给page作用域移除内容
pageContext.removeAttribute(name ,scope) //移除指定作用域的内容
//(page/request/session/application)
- 提供作用域常量
PageContext.PAGE_SCOPE page
PageContext.REQUEST_SCOPE request
PageContext.SESSION_SCOPE response
PageContext.APPLICATION_SCOPE application
- 一次获得指定名称内容
findAttribute(name); //依次从page、request、session、application 获得内容
el表达式底层用的就是 findAttribute(name);
如${user.username}就是依次从page、request、session、application作用域查找user对象,直到找到为止
网友评论