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就是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大内置对象分别如下:

内置对象名 类型 request httpServletRequest response HttpServletResponse ServletConfig ServletConfig application ServletContext session HttpSession exception Throwable page Object(this) out JspWriter pageContext PageContext
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");  //清除数据
  • 作用范围
域对象 作用范围 page域对象 page域的作用范围最小,只能在当前页面中使用 ,只能在当前页面 request对象 request只能在同一个请求中使用 ,只能在转发中应用 session对象 session只能在同一个会话(session)中使用,不同JSESSIONID独有 context域对象 context只能在同一个web应用中使用 ,全局
0 0
原创粉丝点击