J2EE——之JSP篇

本篇知识点

  • 静态网页与动态网页
  • JSP工作原理及具体学习

了解了servlet,接下来进入学习jsp,jsp其实就是特殊的servlet,在Tomcat容器中最后是转化为servlet后再运行的,关于servlet的学习可看我的另外一篇文章。

一、JSP相关概念

当前Web开发的两大平台:
①.Net平台:是一组用于建立web服务应用程序和windows桌面应用程序的软件组件构成,包括.Net框架、.Net开发工具和Asp.Net。
②JavaEE平台:Sun公司推出的一项中间件技术,旨在简化和规范多层次企业级应用系统的开发和部署。注:Sun公司现已被oracle公司收购。

Jsp Web开发是JavaEE开发的基础。如下图架构:

J2EE——之JSP篇_第1张图片
图片.png

静态网页与动态网页

什么是静态网页?
就是使用html来编写的,文件后缀由.html来命名,页面无交互性。
优点:访问响应速度快,且容易被搜索引擎收录。
缺点:缺乏交互性,维护工作大。
什么是动态网页?
就是页面可根据用户的选择、输入等操作做出迅速响应和动态的改变内容,页面有交互性。
优点:具有很好的用户交互性,可方便地处理用户请求且访问服务器端的数据库。
缺点:不利于搜索引擎的信息收集。

两者区别如下:
一个动态网页会被服务器当做是一个程序来执行,而其中的静态内容服务器不会当成程序执行,直接输出给客户端,而动态部分的代码会被服务器识别并执行。

动态网页技术

ASP、PHP、JSP三种。本文仅介绍JSP技术。
Jsp的优点:一次编译,到处执行。采用“先编译后执行”的工作方式

Jsp工作原理

在html中嵌入Java脚本代码,由web服务器中的Jsp引擎来编译和执行嵌入的Java代码,然后生成页面返回响应给客户端。

J2EE——之JSP篇_第2张图片
工作流程.png
注意:web容器在处理Jsp文件请求会经过3个阶段
①翻译阶段:.jsp->.java
②编译阶段:.java->.class
③执行阶段

若第二次同样的请求,web服务器会复用编译好的.class字节码,就是所谓的:一次编译,到处执行。不过若改变了jsp文件,web服务器就需要对jsp文件重新翻译和编译。

二、JSP具体使用

J2EE——之JSP篇_第3张图片
图片.png
JSP指令元素:page、include、taglib三个,它们的基本语法为<%@ 指令元素 属性="值" %>
  • page指令用法详解
    一般写在jsp页面开头,一般语法为
<%@page language="java" import="需要导入的包,多个则用分号分开" info="定义jsp页面的信息,比如版权或者公司名或者编写日期"
pageEncoding="utf-8" contentType="text/html;charset=utf-8" 
isErrorPage="是否为错误页面 true|false" errorPage="发生异常时需要跳转的错误页面 "
%>

在java脚本中可通过<%= getServletInfo() %>获取定义的info信息
pageEncoding与contentType的区别:
①pageEncoding是JSP页面本身的编码,contentType是服务器端发送给客户端时的内容编码。jsp页面的字符编码决定顺序一般由pageEncoding--->contentType里的charset-->前两者都没有再使用默认的ISO-8859-1。
②JSP要经过两次编码,第一阶段“翻译”用的是pageEncoding,此时若设定错可能会出现中文乱码;第二阶段“编译”用的是utf-8统一编码,即在这阶段不管之前jsp页面使用什么字符编码都将转化为统一utf-8的java源码,javac再以utf-8编码读取java代码,编译为.class字节码;第三阶段“执行”,即Tomcat返回的网页用的是contentType。

  • include指令注意事项
    <%@include file="文件相对路径或绝对路径" %>,称为静态包含,是在JSP容器把jsp页面翻译为servlet程序时,把指定文件嵌入到servlet程序中。file里面不允许以index.jsp?name="小江"的方式传参。且包含的页面含有page指令时,则页面之间的编码需要一致,否则会翻译错误。
  • taglib指令一般用来引入一些标准标签库或者扩展标签库或者自己定义标签库。
    比如<%@taglib uri="http://java.sun.com/jstl/core" prefix="c"%>

jsp声明元素 <%! 类成员变量或者方法%>
定义java脚本 <% %>
jsp表达式元素 <%= 一般是结果变量%>

J2EE——之JSP篇_第4张图片
图片.png


  

flush=“true”表示在包含文件前先刷新当前页面的输出缓冲区。主要是用在为动作传参,用在其他地方会报错。俗称动态包含,当该jsp动作执行后,是请求转发到被包含页面,并将执行结果输出到浏览器,而静态包含是先把被包含页面原封不动的加到当前页面,然后再一起编译。

三、JSP隐含对象

  • out对象:用来输出信息的对象。如下记录一些out隐式对象的常用方法:
    out.print():向页面输出打印信息,在客户端返回时不换行。
    out.println():向页面输出打印信息,在客户端返回时换行,但要注意向页面输出打印信息时同样是不换行的,若想在页面换行就得加上out.print("
    ")
    或者使用out.newLine()表示输出一个回车换行符。
    out.flush():用来刷新流,把流对象缓冲区中的信息传递到目标对象处理,若缓冲区满了则自动调用刷新。out.write()用来把信息暂时存储到流对象缓冲区中。当先调用out.close()把流对象关闭了,则此时再调用刷新或者其他操作会报IOException异常。
    out.isAutoFlush():返回一个boolean值,判断缓冲区是否自动刷新。
    out.clear():用来清除缓冲区中的信息,如果缓冲区是空的则抛出异常,与out.chearBuffer()作用一样,只是后者当缓冲区是空的不会抛出异常。
    out.getBufferSize():返回缓冲区的大小,单位是字节,若没有缓冲区则返回0。
    out.getRemaining():返回缓冲区剩余的空闲空间,单位字节。
  • request对象:用来处理客户端的请求。如下记录一些request隐式对象的常用方法:
    request.getParameter(String string):获取单值参数
    request.getParameterNames():获取所有参数名
    服务端的两个jsp页面需要交换数据时可通过request作用范围变量来实现,request.setAttribute()设置request范围属性,request.getAttribute()获取request范围属性,request.removeAttribute()删除request范围属性。把属性对象与JSP隐藏对象绑定在一起,也由此具有生命周期和范围,除了request,还有page,session,application对象。
  • response对象:用于响应客户端请求并向客户端输出信息。如下记录一些response隐式对象的常用方法:
    response.flushBuffer():刷新输出缓冲区,返回信息到客户端。
    response.sendError(int status,"自定义错误信息"):参数是状态码,向客户端发送错误信息。
    response.isCommited():判断缓冲区的响应信息是否已经提交。
    response.setBufferSize(int size):设置输出缓冲区的大小。
  • application对象:操作全局的数据,作用域是整个应用程序,生命周期直到服务器停止运行就结束。
    可用来实现访客计数小程序,只要服务器没关,application的生命周期就不会消失。
  • session对象:用来存储有关用户会话的所有信息,包括其中的多次请求、响应过程。实现session跟踪,从登陆系统到注销退出系统所经历的时间称为一次session会话周期。如下记录一些response隐式对象的常用方法:
    session.isNew():判断session对象是否为新建的,返回true表示新创建的。
    session.getId():返回session对象的ID号。
    session.invalidate():使当前session失效,session作用范围变量也随之失效。
    session.setMaxInactiveInterval(int time):设置session超时时间,超过设置时间就删除掉session对象,Tomcat默认为30分钟。对应有session.getMaxInactiveInterval()获取超时时间。
    session.setAttribute(String name,String value):设置范围变量,对应有session.getAttribute(String name)获取范围变量。
    session.removeAttribute(String name):解除指定名字的数据对象与session的绑定关系,就是删除一个指定名字的session属性。
  • config对象:常用来给servlet程序传送初始化参数。
  • exception对象:jsp页面发生异常,系统生成一个exception对象,封装着对应的异常信息。
  • page对象:表示当前servlet程序对象,相当于java的“this”关键字。
  • pageContext对象:在jsp页面的servlet实现类中调用Jsp.getPageContext()获取一个pageContext对象。

四、Javabean

什么是Javabean?什么是POJO?

其实就是一种组件技术,也是一个java类。这个java类有一定的规范,而且常用来做封装数据和业务逻辑处理。而POJO类则是一个特殊一个特殊的Javabean,即只用来封装数据对象用。

Javabean的规范

  • Javabean必须是一个public类
  • Javabean内的属性必须是private(私有的),其他类只能通过setter和getter方法对属性进行间接操作
  • Javabean必须有一个public的无参构造方法
  • 拥有完成特定功能的方法

JSP使用Javabean的2种方式

  • 直接使用 ,通过<% %>嵌入脚本直接newJavabean对象
  • 使用jsp动作
    J2EE——之JSP篇_第5张图片
    图片.png

五、4个作用域及资源引用

pageContext作用域:当前页面,作用域最小,解决当前页面内的数据共享问题,获取其他内置对象。
request作用域:一次请求,一次请求的servlet数据共享。通过请求转发,将数据传递给下一个servlet。
session作用域:一次会话,一个用户的不同请求的数据共享,将数据从一次请求流转到其他请求。
application作用域:项目内,不同用户的数据共享。将数据从一个用户流转到其他用户。
关于资源引用?
可采用相对路径,即../这种方式寻找上一级目录,但是缺点是这样的话资源的位置就不可随意修改,而且如果目录层级很多,就会使相对路径书写很繁琐,不建议使用。
采用绝对路径,即/虚拟项目名/项目资源路径,这种方式引用。/表示从服务器根目录开始,在Tomcat中对应着localhost:8080/

六、JSP小回顾

  • 牢记JSP的九大内置对象、三大指令、七大动作。

你可能感兴趣的:(J2EE——之JSP篇)