Jsp基础
来源:互联网 发布:网络机器人大战 编辑:程序博客网 时间:2024/06/03 23:54
Jsp基础
- Jsp基础
- Jsp概念
- Jsp的特点
- Jsp运行原理
- Jsp执行过程
- Jsp语法
- Jsp模板
- Jsp表达式
- Jsp脚本
- Jsp的声明
- Jsp的注释
- Jsp的三大指令
- include指令
- page指令
- Jsp内置对象
- Jsp内置对象原理
- 什么是Jsp内置对象
- Jsp的9大内置对象
- out对象解析
- Jsp页面缓冲机制与out对象之间的关系
- pageContext对象
- pageContext作为域对象的特殊性
- 总结Jsp中的四个域对象
- Jsp基础
Jsp概念
Jsp就是Servlet,那我们就觉得很奇怪了,已经学习了Servlet,怎么还要再学习Jsp,它不是还是Servlet技术吗?不一样,随着进一步的学习会明白其中的原因。Jsp实际上也是用Java语言开发动态资源的技术。
Jsp的特点
- Jsp的运行必须要交给tomcat服务器,和Servlet完全的一样,其中work目录是tomcat服务器存放Jsp运行时的临时文件
- Jsp页面既可以写html代码,也可以写Java代码,这点和Servlet存在小小的差别
- 可以把Jsp代码当做html代码来访问
Jsp运行原理
Jsp执行过程
访问localhost:8080/project_name/example.jsp ,在服务器中究竟经过了什么样的步骤才能显示出我们想要的效果呢?要经过下面的过程
- 访问到example.jsp页面,tomcat服务器扫描到其实一个Jsp的文件,把Jsp文件翻译成一个Java的源文件(在$tomcat_home/work目录下完成翻译工作),就变成了_example_jsp.java文件
- 接着Java编译器就将.java文件编译成_example_jsp.class文件
- tomcat服务器构造_example_jsp类对象,也就是实例化_example_jsp类的对象
- 最后tomcat服务器就会调用_example_jsp中的类里面的方法,返回内容返回到浏览器
注意
- 第1次访问Jsp要走上面的四个步骤
- Jsp文件中的源代码修改之后,或者Jsp的临时文件被删除之后,要重新进行翻译和编译的过程
- 第n次访问Jsp页面时,不走翻译和编译的过程,只走第4步
疑问
- 为什么Jsp就是Servlet呢?
答案: 查看_example_jsp.java,会发现其继承了org.apache.jasper.runtime.httpJspBase类,发现该类继承了javax.servlet.http.HttpServlet类,所以Jsp的类实际上就是Servlet,从而我们说Jsp就是一个Servlet程序。其生命周期和Servlet的生命周期是一样的。
- Servlet技术可以用在Jsp的技术中吗?
答案:可以,但是Jsp的技术并不是全部适用于Servlet程序,可以这样理解Servlet就是Jsp的一个子集。
- 每次修改完Jsp的代码是否需要重新部署呢?
答案:不需要。
Jsp语法
Jsp模板
Jsp页面中的html代码就是Jsp的模板。
Jsp表达式
语法:<%=常量或者变量或者表达式%>,作用:可以向浏览器输出一个变量的值或者表达式计算的结果。
<% String name = 'eric'%><%=name%> <!--向浏览器输出name变量-->
Jsp脚本
语法:<%java代码%>,作用就是执行Java代码,所有的Java代码都能出现在其中,但是在脚本中不能声明方法,因为所有的脚本中的内容都会原封不动的翻译成Service方法中的内容,Service方法是Servlet声明周期的方法。
穿插html代码
<% for(int i = 1; i< 6 ; i++){ %><h<%=i%>>标题<%=i%></h<%=i%>><% }%>
Jsp的声明
语法:<%! 变量或者方法 %>,作用:声明Jsp的变量或者方法。如果声明的是变量会翻译成成员变量(全局变量),如果声明的是方法会被翻译成成员方法。
<!--声明变量,会翻译成成员变量--><%! String name = "eric"%><!--声明方法--><%! public String getName(){ return name; }%>
Jsp的注释
存在下面的两种注释方法:
- <!–html注释–>
- <%–jsp注释–%>
注意:在Jsp中的注释我们推荐使用Jsp的注释方法,因为很多情况下,如果我们的Jsp代码中含有Jsp的标签,那么使用html注释该标签将会不起作用。
Jsp的三大指令
在Jsp中会用到下面的三个指令,有且仅有这三条指令会被用到,分别是:
- include指令
- page指令
- tablib指令
include指令
- include指令作用
主要的作用是用来在当前页面包含其它Jsp页面,语法如下:
<%@ include file="要包含的页面" %>
- include指令原理
原理就是将被包含页面的Jsp代码拷贝到包含页面中,合并翻译成一个Java的源文件,最后对其进行编译运行,这种包含叫作静态包含(源码包含)。,如果使用静态包含,在被包含的页面(一个页面包含另外的一个页面,其中页面叫作被包含页面,另外的一个页面叫作包含页面)不需要出现一些全局的html标签,如html、head、body。
page指令
- page指令作用
主要作用是告诉tomcat服务器如何翻译Jsp文件。其语法如下:
<%@ page language="java" <%--告诉tomcat服务器使用说明动态语言来翻译jsp文件,目前只能支持Java--%> import="java.util.*,java.text.*,..." <%--告诉服务器Java文件使用什么包,多个包之间用逗号分隔,导入之后就能在脚本中写任意的Java源代码 --%> pageEncoding="utf-8" <%--告诉服务器使用什么编码来翻译Jsp文件成为Java源文件,也就是在翻译时起作用,在Eclipse和MyEclipse中只要写该条指令就能将编辑文件时保存的编码、翻译时指定的编码、向浏览器输出时的编码全部和该参数一致--%> contentType="text/html;charset=utf-8" <%--服务器发送给浏览器的数据类型和内容编码,该条指令指定的是输出到浏览器的编码方式,上述的两个编码方式要保持一致,通常都是utf-8,这个属性可以省略,当我们使用Eclipse和MyEclipse等开发工具时,其编码值在做翻译时会参考pageEncoding的值--%> errorPage="error.jsp" <%--指定当前Jsp页面的错误处理页面,在后续部分讲解了怎么配置全局的errorPage页面--%> isErrorPage="true" <%--指定当前页面是否为错误处理页面,当值为false代表不是错误处理页面,如果是true则为错误处理页面,当该值为true时,可以使用<%=exception.getMessage()%>抛出具体的错误,当值为false时不能使用exception对象,exception为内置对象--%> buffer="8kb" <%--Jsp页面的缓冲区的大小,初学者不用掌握--%> session="true/false" <%--表示是否开启session功能,如果值为true,在Jsp脚本中就能使用session域对象,比如使用session.setAttribute("name","eric"),在Jsp中我们称为内置对象--%> isELIngnored="false" <%--是否忽略EL表达式,初学者建议不用掌握--%>%>
- 全局配置errorPage页面,在web.xml中配置
<!--在web.xml中配置全局错误处理页面--><error-page> <error-code>500</error-code> <!--500错误我们通常使用jsp页面去指定错误,服务器的错误又很多种,静态html不能表达所有的错误--> <location>/common/500.jsp</location></error-page><error-page> <error-code>404</error-code> <!--404是客户端错误,我只需要使用html即可,没有动态的资源需要加载--> <location>/common/404.html</location></error-page>
Jsp内置对象
Jsp内置对象原理
内置对象的原理其实很简单,在将Jsp翻译为Java代码的过程中,会自动的创建这类内置对象。
什么是Jsp内置对象
在Jsp开发中,会频繁使用到一些对象,例如HttpSession,ServletContext、HttpServletRequest,当我们在每次使用时都去创建这些对象,就会使得编程变得十分的麻烦,Jsp既然是Servlet,并对Servlet进行了更加高级的封装,于是引入了内置对象,tomcat服务器已经为我们做了创建对象的工作,不需要我们去创建对象,直接用在Servlet中涉及到的对象即可。sun公司在涉及Jsp时,在Jsp页面加载完毕之后就会自动帮助开发者创建好这些对象,而开发者只需要直接使用即可,这些创建好的对象我们称为内置对象。
Jsp的9大内置对象
9大内置对象分别如下:
out对象解析
out对象类型是JspWriter类,JspWriter类相当于之前在Servlet中学习的带缓冲的PrintWriter,而之前的PrintWriter本身不带缓冲。JspWriter中包含write方法,该方法是向Jsp缓冲区写出内容。
Jsp页面缓冲机制与out对象之间的关系
当用户访问一个Jsp页面时,我们使用out去写内容,该方法不会直接将内容写到浏览器,而是将其写入到一个JspWriter的缓冲区中,当缓冲器满了之后,才会将缓冲区的内容写入到PrintWriter中,当然我们也会手动的刷新缓冲区或者关闭缓冲器或者执行完Jsp页面时,都会将缓冲区的内容写入到PrintWriter中,然后PrintWriter会将内容直接写入到浏览器中,相比之前之间使用printWriter的方法,现在的Jsp多了一层缓冲层,必须要掌握该缓冲机制。
<%--创建一个Jsp页面并写入下面的内容,缓冲区的大小默认是8kb,在page指令中配置--%><% out.write("abc"); response.getWriter.write("123");%>
此时我们会发现输出的结果为:123abc,因为abc不够8kb,所以全部都缓冲到缓冲区中,而PrintWriter对象会立即输出结果,但是当我们手动的刷新缓冲后是什么情况呢?
<%--创建一个Jsp页面并写入下面的内容,缓冲区的大小默认是8kb--%><% out.write("abc"); out.flush(); response.getWriter.write("123");%>
此时的输出情况是:abc123,当然我们也可以关闭缓冲区,关闭缓冲区我们只需要在page中将buffer=”0kb”即可,这种情况下输出的结果也为:abc123。缓冲区慢的情况请自行验证。
pageContext对象
pageContext我们称其为Jsp的上下文对象,它的存在是为了让我们更加方便的使用其它的8个对象,pageContext对象的用途:
- 可以获取其它的8个内置对象
pageContext.getOut();pageContext.getSession();<%--都可以通过get方法获取到其它的8个内置对象--%>
在自定义标签的时候,pageContext对象会频繁的使用
pageContext本身也是一个域对象
ServletContext context域对象HttpServletRequest request域对象HttpSession session域对象PageContext pageContext域对象
- pageContext域对象,作用范围仅仅在写pageContext对象的页面中,其它页面一律不能获取
pageContext.setAttribute("message","hello!");//pageContext保存数据的只能作用在该Jsp页面中String message = (String)pageContext.getAttribute("message"); //获取域对象保存的数据out.write(message);
pageContext作为域对象的特殊性
当pageContext作为域对象时,同样可以获取到其它三个域对象当中的数据,分为以下几种情况:
- 默认情况下,从page域获取
pageContext.getAttribute("name");
- 可以保存到其它的四个域对象中
pageContext.setAttribute("name","eric",PAGE_SCOPE);pageContext.setAttribute("name","eric",SESSION_SCOPE);pageContext.setAttribute("name","eric",APPLOCATION_SCOPE);pageContext.setAttribute("name","eric",REQUEST_SCOPE);
- 与上面保存时相对应,可以使用下面的语句获取域对象中的数据
pageContext.getAttribute("name",PAGE_SCOPE);pageContext.getAttribute("name",SESSION_SCOPE);pageContext.getAttribute("name",APPLOCATION_SCOPE);pageContext.getAttribute("name",REQUEST_SCOPE);
- 同时pageContext域对象提供了findAttribute方法自动搜索数据
pageContext.findAttribute("name");
搜索的顺序是:page域-request域-session域-context域(application域)
总结Jsp中的四个域对象
- 域对象的作用
保存数据和获取数据,用于数据的共享
- 域对象方法
setAttribute("name","value"); //保存数据getAttribute("name"); //获取数据removeAttribute("name"); //清除数据
- 作用范围
- jsp基础
- jsp 基础
- JSP基础
- JSP基础
- JSP基础
- Jsp基础
- JSP基础!
- JSP基础
- JSP基础
- JSP基础
- JSP基础
- JSP基础
- JSP基础
- JSP基础
- JSP基础
- JSP基础
- jsp基础
- JSP基础
- 外键(学生表是从表,班级表示主表)
- Objective-C如何使自定义对象类作为NSDictionary的key
- LeetCode 66. Plus One
- 嵌入式开发第42天(ARM的体系结构)
- 友录联系人板块
- Jsp基础
- light oj 1189 - Sum of Factorials (数学)
- LR中Vuser的init、action和end之间的区别
- Spring tool suite中自带Maven有问题,解决方案流程
- 龙尚3G、4G模块嵌入式Linux系统使用说明
- 革命之路
- 《算法竞赛入门经典训练指南》第一章1.1,1.2
- STM32F407的RAM调试
- Android.mk编译控制