JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
一、jsp调用和执行原理
jsp页面执行时是通过调用servlet的,即使访问的是以XXX.jsp结尾的页面。jsp引擎(引擎本身也是servlet)先把jsp页面翻译成servlet,jsp翻译成的servlet在tomcat目录下的work\Catalina\主机名\...\...\jsp\_页面名称_.java。
原jsp代码如下:
打开查看xxx.java源码可以发现原先jsp中编写的代码:
还可以看到通过<%%>写的java代码被直接带入xxx.java中; jsp说白了就是servlet。
不管是JSP还是Servlet,虽然都可以用于开发动态web资源,但由于这2门技术各自的特点,在长期实践中,逐渐把servlet作为web应用中的控制组件使用,把jsp技术作为数据显示模板使用;其原因为,程序的数据通常需要美化在输出;
二、JSP语法基础
-
jsp模板元素:
在jsp页面中的html内容称为模板元素;模板元素定义网页的基本骨架; -
jsp脚本表达式
语法<%= 表达式或变量 %>,这条语句的作用就是用于向浏览器输出数据,这条语句在源代码中将被翻译成out.print( 变量或表达式 )
JSP脚本片断:<% JAVA代码内容 %>,脚本片断中只能出现java代码;在多个脚本片断之间可以嵌入文本,HTML标记等,片断之间的内容也将被应用到页面中;比如:<% for(int i=1;i<5;i++){ %> <p>这是p标签</p> <% } %>
那么这个p标签将会重复5次;需要注意,单个脚本片断可以是不完整的java代码,但多个脚本片断组合后的结果必须是完整的java代码;
- jsp注释
jsp注释:<%-- 注释内容 --%> html注释:<!-- 注释内容 -->
两者的区别在于,html注释的内容将被输出到浏览器中,而jsp注释的内容则不会,过多使用html注释会增加传输的流量,增大数据传输的压力; - jsp指令
jsp指令并不直接产生任何可见输出,知识告诉jsp引擎如何处理jsp页面的其余内容;
jsp页面中不陌生的<%@ page %>就是一条指令;
指令page:<%@ page %>
page指令定义jsp页面的各种属性,在习惯中page指令最好放在整个jsp页面的起始位置;
page指令完整语法:<%@ page [language="java"] 告诉jsp引擎嵌入的代码是java代码 [extends="package.class"] 翻译后的servlet继承的类 [import="{package.class|package.*},..."] 导包;JSP引擎自动导入下面的包: java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.* [serssion="boolean"] 是否存入session对象 [buffer="none|8kb|size kb"] 缓冲大小 默认是8kb [autoFlush="boolean"] 为true时缓冲满就自动刷新 [isTheadSafe="boolean"] 为true时servlet线程不安全 [info="text"] 带入的信息 [errorPage="relative_url"] 错误处理页面的url,errorPage属性的设置必须使用相对路径; [isErrorPage="boolean"] 说明当前页面是否为错误处理页面 [contentType="mimeType[;charset="charcterSet"]"] MIME类型一般为text/html [pageEncoding="charcterset"] 页面字符编码 [isELIgnored="boolean"] 是否忽略EL表达式,false为忽略 %>
指令include:<%@ include file="页面相对路径"%>
include指令可以包含页面,当网站内多个网页用了同样的部分时使用,比如淘宝、京东等网页的底部内容大多数网页都存在,几乎没有变动内容,就可以通过include插入相同的部分。
include指令(静态包含(编译时包含),它包含的所有jsp会编译成一个servlet);
注:动态包含(运行时包含): 在java代码里 request.getRequestDispatcher(url).include(request,response);
静、动态包含取舍:建议使用静态包含,因为动态包含是运行时包含,性能上会差一点;
taglib指令:后续补充; - jsp标签
常用jsp标签:<jsp:forawrd page="/.../"></jsp:forward> <jsp:include page="/.../"></jsp:include> <jsp:param name="param_name" value="xxxx"></jsp:param> <!--<jsp:forawrd>和<jsp:include>都是动态包含,开发中最好多用静态包含,而不是动态包含 当使用<jsp:forawrd> 和 <jsp:include>引入或请求其他资源时,通过<jsp:param>传递参数,参数还可以是脚本表达式 <jsp:param name="param_name" value="param_value | <%= expression %>"> -->
- jsp内置对象
创建jsp页面时,web应用汇给jsp传递九大对象即内置对象,分别是,
内置对象名 类型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext
out对象:
out隐式对象用于向客户端发送文本数据。out对象是通过调用ageContext对象的getOut方法返回的,与ServletResponse.getWriter方法返回的printWriter对象相似,jspWriter相当于一种带缓存功能的PringtWriter,设置JSP页面的page指令的buffer属性可以调整他的缓存大小,甚至关闭。
只有向out对象写入内容,并满足以下之一时,out对象才调用ServletResponse.getWriter方法,通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到servlet 引擎提供的缓存区中;
1.设置age命令的buffer属性关闭了out对象的缓存功能;
2.out对象的缓存区已满
3.整个jsp页面结束
pageContext对象:
这个对象是jsp中最重要的一个对象,它代表jsp页面的运行环境;
这个对象不仅封装了对其他8大隐式对象的应用,它自身还是一个域对象,可以用来保存数据。丙炔,这个对象还封装了web'开发中经常涉及的一些常用操作, 例如引入和跳转其他资源、检索其他域对象中你的属性等。
通过pageContext获得其他对象:
getException方法返回exception隐式对象;
getPage方法返回page隐式对象;
getResponse方法返回response隐式对象;
getServletConfig方法返回config隐式对象;
getServletContext方法返回application隐式对象;
getSession方法返回session隐式对象;
getOut方法返回out隐式对象;
pageContext取得八大对象的方法在开发中有着特殊意义,这个技术用在自定义标签开发中,因为jsp页面中不应该出现任何一行java代码,如果没有这个技术那么为了获取数据就可能无法避免在jsp页面中的使用java代码,这样的jsp将会是格式不良好的jsp。
pageContext对象还是一个域对象:
在四大域中pageContext域的作用范围是:整个jsp页面。它是四个域中范围最小的一个域。
---关于四大域的知识总结链接---