JSP基础杂碎知识记录



一、JSP语法
1.JSP模版元素:直接书写在jsp页面当中的HTML内容就是jsp的模版元素 ---> 在被翻译成Servlet的过程中,直接调用out对象

writer出去。最终被原封不懂的写到浏览器页面中进行显示。
2.JSP表达式 :<%= java表达式%>  其中要求的是一个java表达式,java表达式后一定不要跟上分号  ---> 在翻译成Servlet的过程

中,将java 表达式的值进行计算后直接输出到浏览器上。
3.JSP脚本片断:<% 若干java语句%> 其中要的是若干java语句,所有的java语句后都必须跟上分号 ----> 在翻译成Servlet 的过程

中,直接被复制到了对应的位置上,直接执行。
 在一个JSP页面中可以有多个脚本片断,在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他JSP元素。多个脚本片断

中的代码可以相互访问
 单个脚本片断中的Java语句可以是不完整的,但是,多个脚本片断组合后的结果必须是完整的Java语句
 
4.JSP声明:<%! java语句 %> ----->在翻译成Servlet 的过程中,其中书写的代码都被翻译到了和Service方法同级的位置上,可以

利用它,为翻译过来的Servlet 增加类成员变量、成员方法、静态代码块、内部类、构造代码块

5.JSP注释:<%-- 注释内容 --%>  jsp注释将在jsp被翻译成Servlet的过程中被遗弃掉,在翻译过来的Servlet中并没有jsp注释的内


     //java注释          java注释会被挡住普通的java内容被翻译到Servlet中,在此

Servlet.java被编译的过程中java注释被遗弃。
     <!--html注释-->     html注释被当作普通的jsp模版元素被out输出到浏览器端,浏览

器接受到html注释后,浏览器认识这是一个注释,虽然收到了,但是不予显示。
6.JSP指令:<%@ 指令 属性名="值" %>    JSP指令(directive)是为JSP翻译引擎而设计的,它们并不直接产生任何可见输出,而

只是告诉引擎如何处理JSP页面中的其余部分
  (1)page指令:page指令用于定义JSP页面的各种属性
    
  (2)include指令:可以用进行请求包含操作,这种请求包含是一种静态包含。
    *静态包含:是在源文件级别的包含,多个jsp页面在进行静态包含是,多个jsp页面会被jsp翻译

引擎翻译为一个Servlet,最终由这一个Servlet提供输出。只有使用include指令做的包含才是静态包含,所有其他方式实现的包含

都是动态包含。
    *动态包含:是在输出级别的合并,多个jsp页面在进行动态包含时,多个jsp页面会被jsp翻译引

擎翻译为各自的Servlet,最终由各自Servlet提供输出,将多个Servlet的输出进行和并后输出给浏览器。
    静态包含效率相对来说高于动态包含,尽量使用静态包含。
    在进行页面包含是,被包含的页面可以不是一个格式良好的html,但是要保证整个include完成

后进行输出的页面应该是一个格式良好的html
  (3)taglib指令:在jsp中引入第三方标签库。
     
二、JSP中的九大隐式对象
  config
  application
  response
  request
  session
  page
  out
  Exception
  pageContext
1.out

 可以把out隐式对象理解为response.getWriter()获取到的PrintWriter.唯一不同的是out隐式对象有一个自带的缓冲区。

使用out对象输出的内容将被先写入到out的缓冲区当中,直到out缓冲区被写满或整个jsp页面结束或out缓冲区被禁用时,out缓冲区

中的数据会被刷出到response缓冲区当中。
 在jsp页面尽量不要自己获取response.getWriter进行输出,防止输出顺序混乱的问题,直接使用out即可。
2.pageContext
 代表整个jsp页面的运行环境(整个jsp页面)
 (1)可以作为入口对象,获取其他八大隐式对象。
  getException方法返回exception隐式对象
  getPage方法返回page隐式对象
  getRequest方法返回request隐式对象
  getResponse方法返回response隐式对象
  getServletConfig方法返回config隐式对象
  getServletContext方法返回application隐式对象
  getSession方法返回session隐式对象
  getOut方法返回out隐式对象
 (2)作为域对象来使用(最小的域)。别且还是四大作用域的入口对象,操作四大作用域中的数据。
  生命周期:在jsp页面被访问到时创建,对jsp页面的访问结束是销毁。
  作用范围:整个jsp页面
  
  操作pageContext域中属性的方法:
  public java.lang.Object getAttribute(java.lang.String name)
  public void setAttribute(java.lang.String name,java.lang.Object value)
  public void removeAttribute(java.lang.String name)
 
  操作指定域中的属性
  public java.lang.Object getAttribute(java.lang.String name,int scope)
  public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
  public void removeAttribute(java.lang.String name,int scope)
 
  可以在四大作用域中搜寻指定名称的属性,从最小的域开始向最大的域搜寻(pageContext  request  session 

sevletContext),一旦找到就不再继续搜寻直接找到的属性的值返回,如果搜寻完四大作用于仍然搜寻不到,返回一个null
  *findAttribute(String name)
 (3)提供了javaee开发中常用的一些便捷操作
  forward
  request.getRequestDispatcher("/index.jsp").forward(request,response);
   pageContext.forward("/index.jsp");
   
  include
   request.getRequestDispatcher("/index.jsp").include(request,response);
   pageContext.include("/index.jsp");
   
   
三、jsp杂项知识
 (1)在web.xml文件中可以像配置一个Servlet一样为jsp配置对外访问路径
   <servlet>
    <servlet-name>Demo5</servlet-name>
    <jsp-file>/jsp/Demo5.jsp</jsp-file>
   </servlet>
   <servlet-mapping>
    <servlet-name>Demo5</servlet-name>
    <url-pattern>/jsp/Demo5/*</url-pattern>
   </servlet-mapping>

=======================================================================================================
JSP标签技术

1.JSP标签库:SUN公司提供的标签库:jsp标签库是jsp原生的标签库,不需要导入任何开发包都可以直接使用
 <jsp:include page="/index.jsp"></jsp:include>:用来实现页面包含
 <jsp:forward page="/index.jsp"></jsp:forward> :用来实现请求转发
 <jsp:param name="name" value="张"/>:在以上两个标签中可以使用jsp:param标签,设置在执行上面两个操作时要带过去的请求

参数,使用此标签的好处在于,参数的值将会进行URL编码后传输。
   
2.EL表达式:用来替换jsp页面中的脚本表达式 ${表达式}
 
 (1)获取数据:
   !EL表达式只能用来获取数据,不能用来设置数据。
   !EL表达式只能用来获取域中的数据
   !使用中括号的地方都可以使用点来替代,除了中扩号中为数字或包含特殊字符的情况.-
   !如果中括号中书写的值有引号,则el表达式直接使用该值。如果中扩中的值没有引号,则el表达式将其

作为一个变量到域中搜寻变量的值,找到的变量的值作为关键字使用

 (2)执行运算:
   算数运算
   比较运算
   逻辑运算
   empty
   三元表达式
 (3)获取web开发常用对象(11内置对象,可以直接在el中使用):
  pageContext
  
  pageScope
  requestScope
  sessionScope
  applicationScope
  
  param:所有请求参数组成的map:Map<String ,String>
  paramValues:所有请求参数组成的map:<String ,String[]>
  
  header:所有请求头所组成的map:Map<String,String>
  headerValues:所有请求头锁组成的map:Map<String,String[]>
 
  cookie:所有cookie信息锁组成的map,Map<String(Cookie的名字),Cookie对象 >
 
  initParam:封装了整个web应用初始化信息组成的map,Map<String,String>
 
 (4)调用Java方法:(可以被调用的java方法必须是静态公有的方法)
   1)写一个静态方法
   2)在tld描述文件中对此方法进行一下描述
   3)在jsp页面中使用taglib指令导入刚才写好的tld文件,再在jsp页面中使用其中描述的方法
  
  *会调用sun提供的EL函数库

3.JSTL标签库
在javaee4.0需要导入JSTL相关的jar包,在javaee5.0开始,默认已经包含了此jar包。还要需要用<%@ taglib%>指令引入标签库
  3.1介绍
   JavaServer Pages Standard Tag Library
    由JCP(Java Community Process)指定标准
   提供给 Java Web 开发人员一个标准通用的标签函数库
   和 EL 配合来取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性、维护性

和方便性
   一般我们使用JSTL1.1以上的版本,应为从这个版本开始支持EL表达式
   JSTL1.0默认不支持el表达式,不建议使用
  3.2JSTL标签库
   ****核心标签库 (core)  --- c
   国际化标签 fmt
   数据库标签 sql --Servlet
   XML标签  xml
   JSTL函数(EL函数) el
  3.3JSTL核心标签库
  <c:out> 标签用于输出一段文本内容到pageContext对象当前保存的“out”对象中。
  <c:set>标签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或

JavaBean类型的属性对象的 属性。 
  <c:remove>标签用于删除各种Web域中的属性
  <c:catch>标签用于捕获嵌套在标签体中的内容抛出的异常,其语法格式如下:<c:catch [var="varName"]>nested

actions</c:catch>
  <c:if test=“”>标签可以构造简单的“if-then”结构的条件表达式
  <c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用

<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
  <c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内

容。
  <c:forTokens>用来浏览一字符串中所有的成员,其成员是由定义符号所分隔的
  <c:param>标签   在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。<c:param>标签可以嵌套

在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。
   <c:import> 标签,实现include操作
   <c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形

式附加在URL地址后面
  <c:redirect>标签用于实现请求重定向


4.自定义标签的开发

  1.自定义标签技术出现的原因:虽然有第三方组织提供了很多标签,但是这些都是一些通用标签,开发中常常需要根据业务需求使

用jsp页面,这个时候通用的标签就不够用了,我们需要自己去开发标签库。
 2.标签处理类生命周期
  2.1传统标签处理类的生命周期:传统标签处理类在标签被第一次使用时创建实例,从此驻留内存为后续请求提供

服务,其中每次标签执行都会依次执行setPageContext(PageContext pc) 、setParent(Tag t) 、doStartTag() 、doEndTag() 、~

在服务器停止之前调用release()
  2.2简单标签的声明周期:setJspContext(JspContext pc) 、setParent(JspTag parent) 如果没有父标签就不调

用、如果有属性就调用对应的setXXX方法如果有el表达式,则计算结果后传入、如果有标签体调用setJspBody(JspFragment

jspBody)  、doTag() 执行标签体处理.每次访问该标签时都创建简单标签实例,每次使用后销毁该实例。


 3.传统标签的继承结构:
JspTag
  (1)传统标签
   Tag接口-----定义了一个标签处理类应具有的最基本的方法和属性(EVAL_BODY_INCLUDE dostart方法返

回表示执行标签体,SKIP_BODY dostart方法用,跳过标签体。EVAL_PAGE
用在doendtag里通知后续页面继续执行,SKIP_PAGE doendtag里通知后续页面不再执行)
   |
   |----IterationTag接口 (提供了doAfterBody() 在标签体执行过后立即执行,并提供EVAL_BODY_AGAIN

供doafterbody方法返回表示要重新执行标签体)
      |
      |----TagSupport类(提供了对pageContext的引用)
      |
      |--BodyTag接口(EVAL_BODY_BUFFERED 在doStartTag方法中返回通知标签处

理器去缓存标签体bodyContent)
        |
        |----BodyTagSupprot类  (getBodyContent()

获取缓存对象bodyContent)
   
  
  (2)简单标签(简单标签的标签体不能包含脚本内容,所以tld文件中配置body-content时不能配置为JSP)
   SimpleTag接口
   |
   |---SimpleTagSupport实现类(getJspContext() 获取代表jsp页面的pageContext,getJspBody() 代表

标签体内容的JspFragment对象)
   
   JspFragment:invoke(Writer out) 此方法一经调用会将标签体输出到对应的流中。如果你直接给一个

null默认输出到pageContext.getOut()中
   如果doTag()方法抛出SkipPageException异常,标签后的jsp页面就不再执行。

  (3)自定义标签声明属性:在标签处理类中提供setXXX方法,并在tld文件中通过<attribute>标签声明属性的特

性即可。

 4.自定义标签应该具有的最基本的功能
   实验1:控制jsp页面某一部分内容是否执行。<c:if>
   实验2:控制整个jsp页面是否执行。
   实验3:控制jsp页面内容重复执行。<c:forEach>
   实验4:修改jsp页面内容输出。<c:out> HTML转义
   实验5:获取属性
 5.tld文件配置自定义标签
 <tag>
  <name>demo10</name>-----定义标签的名字
  <tag-class>cn.itheima.simple.Demo10</tag-class>----标签处理类
  <body-content>scriptless</body-content>----标签体内容JSP表示任意jsp内容,empty代表只能为空、

scriptless带表不能包含脚本内容、tagdependent代表其中的内容是用来给服务器用的,不是输出到浏览器的内容
  <attribute>
   <name>times</name>---属性的名字(名字必须有)
   <required>true</required>---是否是一个必须的属性
   <rtexprvalue>true</rtexprvalue>---是否支持el表达式
   <type>int</type>---属性的类型
  </attribute>
 </tag>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值