JavaWeb之JSP

概念:
1)JSP(Java Server Page)是Java服务器端动态页面技术。是sun公司制订的一种服务器端的动态页面生成技术规范。

2)为什么要使用JSP:因为直接使用Servlet,虽然也可以生成动态页面。但是,编写繁琐(需要使用out.println来输出),并且维护困难(如果页面发生了改变,需要修改Java代码),所以sun指定了JSP规范。

3)与Servlet的关系:JSP其实是一个以.jsp为后缀的文件,容器会自动将.jsp文件转换成一个.java文件(其实就是一个Servlet),然后调用该Servlet。所以,从本质上讲,JSP其实就是一个Servlet。

4)编写:
① 创建一个以“.jsp”为后缀的文件。
②在该文件里面,可以添加如下的内容:
—> HTML(CSS、JS):直接写即可
—> Java代码:
形式一:Java代码片段:<% Java代码 %>
形式二:JSP表达式:<%= Java表达式 %>
形式三:JSP声明:<%! %>
③指令:通知容器,在将.jsp文件转换成.java文件时,作一些额外的处理,比如导包。
—> 语法:<%@指令名称 属性名=属性值 %>
—> import属性:导包。
—> contenType属性:设置response.setContentType的内容。
—> pageEncoding属性:告诉容器.jsp的文件的编码格式,这样,容器在获取jsp文件的内容(即解码)时,不会出现乱码。最好加入,有些容器默认以ISO-8859-1编码。
—> session属性:true/false,缺省值true,如果值为false,则容器不会添加获得session的语句。
—> isELIgnored属性:true/false,缺省值true,如果值为false,则告诉容器不要忽略el表达式。J2EE5.0需要使用isELIgnored=“false",否则EL表达式无效
—> isErrorPage属性:true/false,缺省值false,如果值为true,表示这是一个错误处理页面(即专门用来处理其他JSP产生的异常,只有值为true时,才能使用exception隐含对象去获取错误信息)。
—> include指令:<%@include file="head.jsp" %>

file属性:
①对于页面的公共部分,我们可以使用相同的jsp文件,并使用include指令导入,如此实现代码的优化。
②告诉容器,在将.jsp文件转换成.java文件时,在指令所在的位置插入相应的文件的“内容“(由file属性来指定)。插入的页面并未运行,而是机械的将内容插入。
—> errorPage属性:设置一个错误处理页面。<%@page errorPage="a4.jsp" %>
—> taglib指令:<%@taglib uri="命名空间" prefix="前缀" %>
①uri:在standard.jar/META-INF/c.tld中查找,
②prefix:前缀,用于代表命名空间。
—> jsp:include: <jsp:include page="common/base.jsp" flush=“false"/>
【flush:默认为 false。在同一个 JSP 中,如果不断 include 自己(源文件),在逻辑上会形成死循环。若默认情况下,服务器会等待该文件被读到底端,然后才输出到客户端,并且销毁该次访问的 request 和 response。而当把flush 属性赋为真值时,在缓存累积了一定数据时,服务器会先提供一部分数据给浏览器,并等待后续内容。
由此可以得出结论,在简单页面中,该属性不纳入考虑,而在页面包含大量数据时,为缩短客户端延迟,可将一部分内容先行输出。该属性在 Servlet 中也有对应的应用。】

5)如何运行:
①容器依据.jsp文件生成.java文件(也就是先转换成一个Servlet):
1)HTML(CSS、JS)放到service方法里,使用out.write输出
2)<% %>也放到service方法里,照搬,不改动。
3)<%= %>也会放到service方法里,使用out.print输出。
4)<%! %>给Servlet添加新的属性或者新的方法(转成.java文件后,声明内的部分添加在service方法之外)。 这样就把一个JSP变成了一个Servlet容器。
②容器接下来就会调用Servlet来处理请求了(会将之前生成的.java文件进行编译、然后实例化、初始化、调用相应的方法处理请求)
③隐含对象:
—> 所谓隐含对象(共9个),指的是在.jsp文件里面直接可以使用的对象,比如out、request、response、session、application(ServletContext上下文)、exception、pageContext、config、page。
**exception **:当jsp页面运行时发生了异常,容器会将异常信息封装到该对象,可以使用该对象提供的方法来输出异常的信息。另外,必须在页面设置isErrorPage=“true"指令才能使用该隐含对象。
**pageContext **:容器会为每一个JSP实例(JSP所对应的那个Servlet对象)创建唯一的一个符合pageContext接口的对象,称之为page上下文。该对象会一直存在,除非JSP实例被销毁。它作用:
①绑定数据(绑定的数据只有对应的JSP实例才可以访问):setAttribute、removeAttribute、getAttribute。
②找到其他八个隐含对象
—> 之所以能直接使用这些对象,是因为容器会自动添加创建这些对象的代码。(JSP仅仅是个草稿,最终会变为一个Servlet。)

**注释: **

<c:when test="">
</c:when>
...
<c:otherwise>
</c:otherwise>
</c:choose>

  【注意:when和otherwise必须要放到choose标签里面才能使用;when可以出现1次或者多次,otherwise可以出现0次或者1次,表例外】


 —> forEach :
   1)遍历集合: <c:forEach var="" items="" carStatus=""></c:forEach> 
    ① items 属性:用来指定要遍历的集合,可以使用EL表达式。
    ② var 属性:指定绑定名,绑定范围是pageContext,绑定值是从集合中取出的某个元素。
    ③ carStatus 属性:指定绑定名,绑定范围是pageContext,绑定值是一个由容器创建的一个对象,该对象封装了当前迭代的状态。比如,该对象提供了getIndex、getCount方法,其中,getIndex会返回当前迭代的元素的下标(从0开始),getCount会返回当前迭代的次数(从1开始)。
   2)指定位置迭代: <c:forEach var="" begin="" end=“"></c:forEach> 
      ① begin :如果指定了items,那么迭代就从items[begin]开始进行迭代;如果没有指定items,那么就从begin开始迭代。它的类型为整数。
      ② end :如果指定了items,那么就在items[end]结束迭代;如果没有指定items,那么就在end结束迭代。它的类型也为整数。
      【注意:forEach还一个属性为 step=“" :迭代的步长。】

—> url : <c:url value=""> 
     ①当用户禁止cookie以后,会自动在地址后面添加sessionId。
     ②当使用绝对路径时,会自动在地址前添加应用名。
      ③ value 属性:指定地址,在表单提交、链接当中,可以使用该标签。

—>  set : <c:set var="" scope="" value=“”> , 绑定一个对象到指定的范围。 
      // value 属性:绑定值。 

—> remove : <c:remove var="" scope=“"> , 解除绑定。 

—> catch : <c:catch var=“"> , 处理异常,会将异常信息封装成一个对象,绑定到pageContext对象上。 

—> import : <c:import url=“"> 
   * url 属性:指定一个 jsp 文件的地址, jsp 会在运行时调用这个 jsp 。 

—> redirect : <c:redirect url=“"> ,重定向到另外一个地址。 
   * url 属性:指定重定向的地址。 

—> out : <c:out value="" default="" escapeXml=“"> , 用于输出 el 表达式的值。
  * value 属性:指定输出的值。
  * default 属性:指定缺省值
  * escapeXml 属性:设置成 true ,会将 value 中的特殊字符替换成相应的实体。缺省值就是 true 。

**JSP标签运行原理:**
  容器依据命名空间找到标签的描述文件( .tld 文件),接下来,依据标签的名称找到标签类的类名,然后将该标签实例化,最后,调用标签实例的相应的方法。
【注意:容器会从 WEB-INF 下查找,如果找不到,还会查找 WEB-INF\lib 下的 jar 文件。】

** 自定义标签:**
  1) 写一个 Java 类(标签类),且必须继承 SimpleTagSupport 类
 2)在 doTag 方法里面(覆盖 doTag 方法),编写相应的处理逻辑。标签有哪些属性,则标签类也有哪些属性,并且类型要匹配。此外,这些属性必须提供相应的 set 方法
 3)在 .tld 文件当中,描述该标签。 .tld 文件可以放在 WEB-INF 下(或它的子文件夹下),也可以放到 META-INF 下,可以参考 c.tld 文件来写。

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

推荐阅读更多精彩内容

  • 1.学习内容 JSP技术入门和常用指令 JSP的内置对象&标签介绍 EL表达式&EL的内置对象 2.JSP技术入门...
    WendyVIV阅读 2,116评论 1 18
  • 一、JSP基础 1.1什么是JSP JSP(Java ServerPage)是Java服务器端动态页面技术。是su...
    晨星资源阅读 1,137评论 0 6
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,567评论 18 399
  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,397评论 0 10
  • 关于这个想法,睡觉前听着歌闭着眼突然就有了,一个年轻有活力的妈妈(我)蹲在一个可爱的萌宝宝(我女儿/儿子)面前喃喃...
    喜喜可乐阅读 248评论 3 1