java Web jsp

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脚本
  1. javascript方式
    • <script></script>标签
    • 引入js的wenjian
  2. java代码方式
    • 在<% %>内部写java代码
    • 用<%= %>来输出结果
    • 在<%! %>中声明全局属性和全局方法
    • 注释:
<%-- --%>  :jsp注释,
//  :java单行注释
/*  */  :Java多行注释
<!-- -->   :这个注释,会发送到浏览器端的源码中显示
jsp指令

jsp指令是声明一些文档编码方式、文件类型等等。

  • JSP指令格式:
    <%@ directive {attribute=value}* %>
    derective:指令名称
    attribute=value:属性=值
    *:表示可以写多个
  1. 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"%>

  2. 当指令为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个或多个属性对
  1. <jsp:include />行为
    这个行为将包含的jsp运行的结果包含进来,是动态包含。
    include指令是将包含的jsp代码包含进来一起编译,是静态包含。

  2. 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对象的某个属性值

  1. <jsp:forward />行为
    作用:请求转发
    格式:

<jsp:forward page="someServlet">

   <jsp:param name="param1" value="value1"/>

   <jsp:param name="param2" value="value2"/>

</jsp:forward>

  1. <jsp:directive/>行为
    相当于JSP指令,比如<jsp:directive.page/>相当于<%@ page %>指令

jsp九大内置对象

jsp内置了九个隐藏的对象,可以直接用。

  1. page:
    表示当前JSP页面,是当前JSP编译后的Servlet类的对象,相当于this
  2. config:
    标识Servlet配置,跟Servlet中的ServletConfig对象是一样的,能获取该servlet的一些配置信息,能够获取ServletContext
  3. application:
    标识web应用上下文,有共享数据、初始化全局参数、获取资源路径、获得指定路径下的所有内容的作用,相当于ServletContext
  4. request:
    请求对象
  5. response:
    响应对象
  6. session:
    表示一次会话,在服务器端记录用户状信息的技术
  7. out:
    输出响应体 类型:JspWriter
  8. exception :
    表示发生异常对象,类型 Throwable,isErrorPage属性设为true才有exception对象
  9. pageContext:
    表示 jsp页面上下文(jsp管理者) 类型:PageContext
jsp四大作用域

page、request、session、application

pageContext对象的使用
  1. 获得其它八大内置对象 getXxx()
  2. 对作用域的属性进行操作(四大作用域)
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)
  1. 提供作用域常量

PageContext.PAGE_SCOPE  page

PageContext.REQUEST_SCOPE  request

PageContext.SESSION_SCOPE  response

PageContext.APPLICATION_SCOPE  application

  1. 一次获得指定名称内容
findAttribute(name);  //依次从page、request、session、application 获得内容

el表达式底层用的就是 findAttribute(name);
如${user.username}就是依次从page、request、session、application作用域查找user对象,直到找到为止

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容

  • 1.学习内容 JSP技术入门和常用指令 JSP的内置对象&标签介绍 EL表达式&EL的内置对象 2.JSP技术入门...
    WendyVIV阅读 2,036评论 1 18
  • JSP总结(经典) day1 JSP 定义: 1)Java Server Page, Java EE 组件,本...
    java日记阅读 3,310评论 0 13
  • JSP是在HTML文档中嵌入java代码的技术,本质上是一个servlet类,因为在服务器端会被编译为一个serv...
    shawXXQ阅读 356评论 0 0
  • 一、JSP基础 1.1什么是JSP JSP(Java ServerPage)是Java服务器端动态页面技术。是su...
    晨星资源阅读 1,101评论 0 6
  • 在一段德育学习之后,我对管理学生渐渐摸索了一条道路,下面做一个小小的分享: 1.营造一种家庭式的和谐班级氛围,让班...
    临朐1172马晓君阅读 98评论 0 0