1、什么是JSP?
JSP全称是Java Servlet Pages,它和Servlet技术一样,都是SUN公司定义的一种用于开发动态web页面(资源)的技术。
2、为什么JSP也是一种动态web资源的开发技术呢?
写JSP虽然就像是在写html,但jsp技术允许在页面中编写java代码。并且允许开发人员在页面中获取request、response等web开发常用对象,实现与浏览器的交互,所以,jsp也是一种动态web资源的开发技术。
不管是jsp还是Servlet,虽然都可以用于开发动态web资源,但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把Servlet作为web应中的控制组件来使用,而把jsp技术作为数据显示模板来
使用。
其原因是:程序的数据通常要美化后再输出:
让jsp即用java代码产生动态数据,又做美化会导致页面难以维护。
让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。
因此最好的办法就是根据这两门技术的特点,让他么各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。
JSP语法:
JSP页面可以包含模板元素、脚本元素、指令、EL(Expression Language)表达式、行为元素和注释等内容。有三种类型的脚本元素:JSP脚本片段,JSP表达式和JSP声明,它们内部使用的都是Java脚本代码。
1、JSP模板元素
JSP页面中的HTML内容称之为JSP模板元素
JSP模板元素定义了网页的基本骨架,即定义了页面的结构和外观,例如:<input><input> <font></font>
2、JSP脚本表达式
JSP脚本表达式(expression)用于将程序输出到客户端语法:
<%= 变量或者表达式 %>
例如:当前时间:<%= new java.util .Date()%>
JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(...)将数据输出给客户端。
JSP脚本表达式中的变量或表达式后面不能有分好(;)
<%= %> 脚本表达式,作用就是用于向浏览器输出数据
3、JSP脚本片段
JSP脚本片段(Scriptlet)用于在JSP页面中编写多行Java代码,
语法:
<%
多行java代码
%>
注意:JSP脚本片段中只能出现java代码,不能出现其它模板元素,JSP引擎在翻译JSP页面中,会将JSP脚本片段中的java代码将被原封不动地放到Servlet的_jspServlet方法中。
JSP脚本片段中的java代码必须严格遵循java语法,例如,没执行语句后面必须分号(;)结束。
在一个JSP页面中可以有多个脚本片段,在两个或多个脚本片段之间可以嵌入文本、HTML标记和其他JSP元素。
多个脚本片段中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。
单个脚本片段中的java语句可以使不完整的,但是,多个脚本片段组合后的结果必须是完整的java语句。
4、JSP声明
JSP页面中编写的所以代码,默认会翻译到servlet的service方法中,而jsp声明中的java代码被翻译到_jspServlet方法的外面。语法:
<%!
Java代码
%>
所以jsp声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法。多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。JSP隐式对象的作用范围仅限于Servlet的_jspServlet方法,所以在JSP声明中不能使用这些隐式对象。
5、JSP注释
JSP注释的格式:<%-- 注释信息--%>
JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容。
6、JSP指令
JSP指令是为了JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
在JSP2.0规范中共定于了三个指令:
Page指令,Include指令,taglib指令
JSP指令的基本语法:<%@指令 属性名=”值”%>
如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。
Page的指令:
Page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。
Include指令:
Include指令用于引入其他JSP页面,如果使用include指令引入其他JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet,所以include指令引入通常也称之为静态引入
语法:<%@include file=” relativeURL”%>
其中的file属性用于指定被引入文件的路径,路径以“/”开头,表示代表当前web应用。
细节:
1);被引入的文件必须遵循JSP语法
2);被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见名知意,JSP规范建议使用.jspg(JSP fragments)作为静态引入文件的扩展名。
3);由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servler,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。
例如:在web.xml中写入的配置代码如下:
<error-page>
<exception-type>java.lang.ArithmeticException<exception-type>
<location>/error/error.jsp</location> //路径
</error-page>
<error-page>
<error-page>404<error-page>
<location>/error/404.jsp</location> //路径
</error-page>
7、JSP常用标签
<jsp:include>标签
<jsp:forward>标签
<jsp:param>标签
<jsp:include>标签用于把另外一个资源的输出内容插入进JSP页面的输出内容之中,这种在JSP页面执行时的引入方式称之为动态引入。
<jsp:forward>标签 当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给其他资源时,可以使用<jsp:param>标签向这个资源传递参数。Name属性的用于指定参数名,value属性用于指定参数值,在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。
8、JSP内置对象
JSP运行原理和九大隐式对象
每个JSP页面在第一次被访问时,web容器都会把请求交给JSP引擎 (即一个Java程序),去处理,JSP引擎先将JSP翻译成一个
_jspServlet(实质上也是一个servlet),然后按照servlet的调用方式进行调用。
由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但是第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
JSP引擎在调用JSP对应的_jspServlet使用,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个响应的变量,开发人员在JSP页面中通过这些变量就可以快速获得者9大对象的引用。
为了简化JSP表达式和脚本片段的编写,JSP一共提供了9个预先定义的变量,这些变量也被称之为隐式对象,一些书籍也将它们称之为JSP内部对象,这9大隐式对象分别是:request,response,out,session,application,config,pageContext,page,exception,其中exception对象只能在处理错误的JSP页面中使用.
Application为ServletContext类型的实例对象
Session为HttpSession 类型的实例对象
Config为ServletConfig类型的实例对象
Request为HttpServletRequest类型的实例对象
Response为HttpServletResponse类型的实例对象
Page对象的类型是Object,它被赋值为this,即代表JSP页面所编译成的Servlet对象自身,page对象前的用处不大,它是为了Java不再是唯一的JSP页面编程语言而准备的占位符。
Out隐式对象:
Out隐式对象用于向客户端发送文本数据,
Out对象时通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
只有向out对象中写入了内容,且满足如下任何一个条件时,out返回的Printwriter对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
1):设置page指令的buffer属性关闭了out对象的缓存功能
2):out对象的缓冲区已满
3):整个JSP页面结束
pageContext对象
pageContext对象时JSP技术中最重要的一个对象,它代表JSP页面的运行环境。
1);这个对象不仅封装了对其它8大隐式对象的引用。
2);它自身还是一个域对象,可以用来保存数据
3);并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。
4);findAttribute方法:查找各个域中的属性。
9、引入和跳转到其它资源
PageContext类中定义了一个forward方法和两个include方法分别简化和替代RequestDispatcher.forward方法和include方法。
方法接收到的资源如果以“/”开头,“/”代表当前web应用。
JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。
10、四个域对象:
Web开发接触到4个域对象,这4个域对象时学习web重点,也是笔试经常考察的知识点
pageContext(称之为page域)
Request(称之为request域)
Session(称之为session域)
servletContext(称之为application域)
简单的总结,请博友们提出宝贵意见和建议,非常感谢!