jsp详解

什么是jsp?

很久之前,我们的网页都是静态的,就是我们所看到的页面在编写好之后总是唯一的。后来有人便提出动态页面的概念,相应的就提出了Servlet。Servlet动态网页技术,是可以把Java语言嵌入到HTML页面上。那时候Servlet是个大忙人,它既要处理显示效果,又要处理数据,又要处理页面跳转,耦合度高,不方便代码维护,为了解决这个问题,SUN公司联合其他公司制定了JSP动态网页技术标准。事实上jsp是一个特殊的Servlet实例,它跟其他Servlet一样被Servlet容器执行,在这之前它需要先被jsp容器转换成Servlet,这个过程是在服务器端产生的,在第一次编译之后该Servlet实例便常驻内存。

jsp的运行机制

  1. jsp容器判断URL中对应的Servlet实例是否存在Servlet队列,实则执行第五步,否则执行第二步。
  2. jsp容器将jsp文件转换成Servlet源程序(.java)。
  3. jsp容器将Servlet源程序编译成字节码文件(.class)。
  4. Servlet容器加载字节码,创建该Servlet实例(该实例实际是返回给客户端的显示效果),此时会调用jspInit()进行初始化。
  5. jsp容器将响应返回到到客户端。

jsp基本语法

注释

注释有以下两种:

  • HTML注释:``,这种方法注释在查看HTML源代码时可以被显示
  • jsp注释:<%-- 注释内容 --%>,通过这种方法注释用户是看不到的

jsp指令

jsp指令有以下三种:

  • page指令

  • include指令

  • taglib指令

  • page指令page指令称为页面指令,用来定义jsp页面的全局属性。语法格式如下:
    <%@ page [属性="值" 属性="值"]%>
    比较重要的属性有以下几种:

  • extends:指定jsp继承的父类。

  • import:用于导入jsp需要的Java包。其中Java.lang.*、javax.servlet.*、javax.servlet.jsp.*、javax.servlet.http.*这几个包本身已经被导入,无需再导入。

  • session:指定该jsp页面是否可用session对象。

  • isThreadSafe:指定该jsp页面是否支持多线程。

  • info:设置页面的相关信息。可以用servlet.getServletInfo()获取jsp页面中的文本信息。

  • Errorpage:当jsp页面出错时,会调用该指令指定的错误处理页面。

  • isErrorPage:指定jsp页面能否进行异常处理。

  • contentType:指定页面支持的编码方式和响应的MIMe类型。默认为"text/html; charset = ISO-8859-1".

  • isELIgnored:指定是否支持EL表达式。

PS:导入多个包时用一个import指令,各个包之间用“,”隔开。

  • include指令include指令是加载文件指令,它在jsp被编译前就将文件加载进jsp中合并成一个新的jsp文件,因此当该文件改变时,jsp要重新被编译一次。include指令的格式如下:
    <%@ include file = "path"%>
    该指令只有一个属性file,该指令用于指向要加载的文件的相对地址。

  • taglib指令taglib指令是用来引用标签库并设置标签库前缀,说白了就是自定义自己的jsp标记。格式如下:
    <%@ taglib uri="标签库地址" prefix = "标签库前缀" %>
    使用标记方式如下:
    <标签库前缀:标签名 参数>

jsp脚本元素

jsp脚本元素有以下三种:

  • jsp声明语句

  • jsp表达式

  • jsp Scriptlets

  • jsp声明语句
    jsp声明语句用于声明变量和方法,在jsp声明语句中声明的变量和方法对作为servlet的成员变量,在整个页面都有效。格式如下:
    <%! 声明变量或方法 %>

  • jsp表达式
    jsp表达式要求该表达式存在一个确定的值,该值会被显示在HTML页面上。格式如下:
    <%= 表达式 %>

  • jsp Scriptlets
    jsp Scriptlets是一段java代码段。当需要对页面输出内容进行一些复杂的操作的时候就需要用到jsp Scriptlets,在jsp Scriptlets声明的变量在调用的时候分配内存,调用结束内存释放。jsp Scriptlets格式如下:
    <% java代码片段 %>

jsp动作元素

jsp动作元素有以下几种:

  • <jsp:include>

  • <jsp:forward>

  • <jsp:param>

  • <jsp:plugin>

  • <jsp:useBean>

  • <jsp:setProperty>

  • <jsp:getProperty>

  • <jsp:include>是包含标签,它跟包含指令不一样。包含指令是将包含页面整合进jsp页面中再编译。而包含元素包含的文件和jsp文件是两个独立的文件,在运行时单独对包含文件进行编译,把结果发送到客户端。只有在运行jsp页面的时候才会加载这些包含文件。格式如下:
    <jsp:include page="被包含的页面" flush="true|false"></jsp:include>

    • page:是被包含的文件的相对地址。
    • flush:指定当缓冲区满时,是否将其清空。默认值为false。
  • <jsp:forward>是重定向标签,当代码运行到该标签会想客户端发出响应,让客户端重新链接到指定的地址,之后的代码不被执行。格式如下:
    <jsp:forward page="重定向的地址"></jsp:forward>

  • <jsp:param>是传递参数的标签。它是以"名-值"对的形式来表示参数的。格式如下:
    <jsp:param name="参数名" value="参数值">

  • <jsp:include>包含的文件传递参数

<jsp:include page="page name" flush="false"> 
    <jsp:param name="parameter name" value="parameter value"></jsp:param>
    ...
</jsp:include>
  • <jsp:forward>页面传递参数
<jsp:forward page="forward target"> 
    <jsp:param name="parameter name" value="parameter value"></jsp:param> 
    ...
</jsp:forward>

PS:<jsp:param>传递的参数就会以“名-值”对的形式传递到调用它的页面中,参数的调用方法跟调用成员变量一样直接通过变量名调用。

  • <jsp:plugin>可以将服务器端的javaBean或Applet下载到本地客户端执行。语法格式如下:
<jsp:plugin type="bean|applet" code="classFileName" codeBase="classFileURL">
...
</jsp:plugin>
  • type:指定插件类型。是Bean还是Applet。

  • code:指定执行的类名。必须以扩展名".class"结尾。

  • codeBase:指定被执行的java类所在目录。此外<jsp:plugin>
    相关的参数还有很多,这里只是举例必不可少的三个。

  • <jsp:useBean>用来装载一个将在jsp页面中使用额javaBean。语法格式如下:

<jsp:useBean id="beanInstanceName" class="className" scope="page|request|session|application"></jsp:useBean>
  • id:指定javaBean的实例名。

  • class:指定javaBean的全限类名。

  • scope:指定javaBean的作用域。

    • page:指定javaBean实例只在本页面有限。
    • request:指定JavaBean实例仅在本次请求有效。
    • session:指定javaBean实例在本次会话有效。
    • application:指定javaBean实例在本应用内一直有效。
  • <jsp:setProperty>用于设置Bean内属性的值,它通过调用Bean的setter方法设置属性值。语法格式如下:
    <jsp:setProperty name="beanInstanceName" property="propertyName" value="propertyValue"></jsp:setProperty>

  • <jsp:getProperty>用于获取bean的属性值。语法格式如下:
    <jsp:getProperty name="beanInstanceName" property="propertyName"></jsp:getProperty>

PS:bean中可以没有属性的声明,但必须有setter和getter方法,因为<jsp:getProperty><jsp:setProperty>是通过调用bean实例中的setter方法和getter方法实现取值和赋值工作的。

jsp内置对象

jsp内置对象由jsp规范进行初始化,主要有以下几种:

  • request

  • response

  • pageContext

  • session

  • application

  • out

  • config

  • page

  • exception

  • request对象用于封装请求数据。一般用户在表单填写的数据会被封装成request对象,通过post方法传递给目标页面。request还相应提供了一些方法用于访问这些数据。主要方法有以下几个:

    • void setAttribute(attributeName, attributeValue):用于设置属性值。
    • Object getAttribute(attributeName, attributeValue):用于获取属性值。
    • String getParameter("parameterName"):获取参数值。
    • Enumeration getParameterNames():获取所有的参数名的集合。
    • String[] getParameterValues("parameterName"):获取parameterName的所有属性值的数组。
    • Map getParameterMap():获取所有属性名和属性值的Map对象。
    • void setCharacterEncoding():设置编码格式。

PS:setAttribute和getAttribute方法在转发时使用,当转发一个页面并传递参数时使用该方法设置和接受参数;其他方法主要用于获取表单数据。

  • response对象用于封装响应数据,其作用域是本页面。相关方法如下:

    • void addCookie(Cookie cookie):添加一个Cookie对象,用于在客户端保存特定信息。
    • void addHeader(name, value):添加一个HTTP头信息,该头信息会被发送到客户端。
    • void containsHeader(name):判断是否含有名为"name"的头信息。
    • void sendError(int):向客户端发送错误的状态码。
    • void sendRedirect(url):向客户端发送重定向的url链接,让客户端跳转到该链接。
    • void setContentType(contentType):设置MIME类型和编码方式。
    • pageContext对象不仅可以设置page范围的属性,还可以设置其他范围内的属性。通过pageContext可以访问request、response、out等对象。
  • session对象是会话对象,用来记录每个客户端的访问状态。session对象主要方法如下:

    • Object getAttribute(name):获取session范围内名为name的属性值。
    • void setAttribute(name, value):设置session范围内的属性。
    • void removeAttribute(name):删除session范围内名为name的属性。
    • Enumeration getAttributeNames():获取session中保存的所有属性名。
    • long getCreationTime():返回session被创建的时间。
    • String getId():返回session被创建时jsp容器分配的唯一标识。
    • long getLastAccessedTime():返回最后一次通过session发送请求的时间。
    • int getMaxInactiveInterval():返回session的失效时间,即两次请求间隔多长时间该session被取消,单位为秒。
    • boolean isNew():判断是否是新的session。
    • void invalidate():清空session内容。
  • application对象用于获取和设置servlet相关信息,application的生命周期是从服务器启动直到服务器关闭。主要方法如下:

  • void setAttribute(name, value):以"键-值"对的形式将一个对象的值存入application对象中。

  • Object getAttribute(name):获取application中保存的属性的值。

  • out对象是一个缓冲的输出流,用来向客户端返回信息。由于向客户端输出信息总是要连接,所以向客户端输出总是采用缓冲的形式。主要方法有以下几个:

    • public abstract void clear() throws java.io.IOException:清除缓冲区的内容,但不将缓冲区的内容输出到客户端。
    • public abstract void clearBuffer() throws java.io.IOException:清除缓冲区的内容,且将缓冲区的内容输出到客户端。
    • public abstract void close() throws java.io.IOException:关闭输出流并输出缓冲区的数据。 - public abstract void flush() throws java.io.IOException:输出缓冲区的数据。
    • public int getBufferSize():获取缓冲区大小。
    • public abstract int getRemaining():获取剩余缓冲区大小。
    • public boolean isAutoFlush():缓冲区是否进行自动清除。
    • public abstract void newLine() throws java.io.IOException:输出一个换行符。
    • public abstract void print(String) throws java.io.IOException:打印信息。
    • public abstract void println(String) throws java.io.IOException:打印信息并换行。
  • config对象是ServletConfig类的一个实例,在servlet初始化时可以通过config对象想servlet传递信息。config常用的方法如下:

    • String getServletName():获得servlet名称。
    • ServletContext getServletContext():获得一个包含服务器相关信息的ServletContext对象。
    • String getInitParameter(name):获得servlet初始化参数。 - Enumeration getInitParameterNames():获得servlet初始化时所有参数的名字的枚举对象。
  • page对象是指当前的jsp页面本身,他是java.lang.Object类的对象,通过page对象可以很方便地调用servlet中定义的方法。常用方法如下:

    • class getClass():返回当前的类名。
    • int getHashCode():返回当前类的哈希码。
    • String toString():将此对象转换成字符串。
    • boolean equals(object):比较两个对象是否是相等。
    • void copy(object):将该对象复制到指定的object对象中。
  • exception对象java.lang.Throwable类的对象,用来处理页面错误和异常。常用方法如下:

    • String getMessage():返回异常对象的异常信息。
    • String getLocalizedMessage():返回本地化语言的异常信息。
    • void printStackTrace():打印异常的栈反向追踪痕迹。
    • String toString():返回异常的简单描述。

PS:使用异常对象时,应将page的isErrorPage属性设置为"true"。

javaBean的使用

javaBean是java语言描述的软件组件模型,其实际是一个java对象,通过将业务逻辑和对数据库的相关操作封装成javaBean对象,实现了java代码的复用,节省了程序员大量的宝贵时间。

javaBean的语法特征

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

推荐阅读更多精彩内容

  • 前面讲了servlet入门实践现在开始介绍jsp入门实践,开发环境的搭建请参考我前面的tomcat的文章,jsp入...
    伊豚wall阅读 3,361评论 2 56
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • JSP(Java Server Pages),其根本是一个简化的 Servlet 设计,实现了在 Java 当中使...
    静候那一米阳光阅读 465评论 0 1
  • 一. Java基础部分.................................................
    wy_sure阅读 3,805评论 0 11
  • 丑奴儿·思夫山湖畔处 【作者】霍锦威 【朝代】21st 白发尽识愁滋味?厌上新舟。 厌上新舟。为守旧念强弃优。 孤...
    霍锦威Focus阅读 255评论 0 4