JavaEE之JSP

JSP

概述

在动态网页开发中,经常需要动态生成 HTML 内容,例如,一篇新闻报道的测览次数需要动 态生成。这时,如果使用 Servlet 来实现 HTML 页面数据的改变,需要调用大量的输出语 句,从而使静态内容和动态内容混合在一起,导致程序非常臃肿。为了克服 Servlet 的这些 缺点,Oracle(Sun)公司推出了 JSP 技术。

什么是JSP

JSP 全名是 Java Server Page,它是建立在 Servlet 规范之上的动态网页开发技术。 在 JSP 文件中,HTML 代码与 Java 代码共同存在,其中,HTML 代码用来实现网页中静态内 容的显示,Java 代码用来实现网页中动态内容的显示。为了与普通 HTML 有所区别 JSP 文件 的扩展名为.jsp

JSP快速了解

创建 JSP 界面

  • 创建新的项目,然后再项目的 WebContent 目录下新建 simple.jsp 文件,如下 eclipse 提供了新建 jsp 界面的功能,在 WebContent 目录右键,New-JSP File

  • 新建好界面后,在 节点里面添加如下代码:

  • 访问 jsp 界面,其中输出了时间信息,其中每次查看时间都不同,会显示当前时间,这 是因为 simple.jsp 是一个动态网页,它的效果实际上是有服务器程序实现的。

分析 JSP 所生成的 Servlet 代码

当用户第一次访问 JSP 页面时,该页面都会被 JspServlet 翻译成一个 Servlet 源文件,然后 将源文件编译为 .class 文件。 Servlet 源文件和 .class 文件都放在硬盘
\Workspace\eclipse.metadata.plugins\org.eclipse.wst.server.core\tmp1\work\Catalina\localhost\ Things\org\apache\jsp

JSP基础语法

JSP 界面可以按照编写 HTML 的方式来编写其中可以包含 HTML 文件的所有静态内容,在 静态的 HTML 内容之中可以嵌套 JSP 的其它各种元素来产生动态内容和执行业务逻辑,JSP 页面中的静态 HTML 内容被称为 JSP 模板元素,JSP 模板元素定义了网页的基本骨架,即定 义了页面的结构和外观。

JSP表达式

JSP 表达式用于将程序数据输出到客户端
语法
<%= %>
将=号后面的变量或者表达式计算结果转成一个字符串,然后插入 JSP 页面输出结果的相应
位置处,如刚刚编写的代码
<%=new Date().toLocaleString() %>

JSP脚本片段

JSP 脚本片段是值嵌套在<% 和 %>之中的一条或者多条 Java 程序代码,这些 Java 程序代码 必须严格遵守 Java 语法规范,否则编译会报错。

  • 简单的脚本片段
    <%
    int x = 10;
    out.print(x);
    %>

  • 分开写,单个脚本中的语句可以是不完整的,但是多个脚本片段组合后的结果必须是完 整的 Java 语句
    <%
    int y = 20;
    %>
    <%
    out.print(y);
    %>

JSP声明

JSP 脚本片段编写的代码都被放到了一个叫_jspService()的方法里面,变量成为了局部变量,
有时候我们希望定义的变量是成员变量,这是后就可以使用 JSP 声明。

JSP 声明中定义的都是成员方法、成员变量、静态方法、静态属性、静态代码块

语法
<%
java语法
%>

JSP注释

<%--这是注释内容--%>

需要注意的是:JSP 页面中格式为<%– 注释信息 –%> 内容不会发布到客户端

JSP指令

为了设置 JSP 页面中的一些信息,Sum 公司提供了 JSP 指令 page、include、taglib 三种指令

page属性

  • 格式

    <%@ page 属性名 1= “属性值 1” 属性名 2= “属性值 2” …%>

  • 常用属性如下:

    language:jsp 脚本中可以嵌入的语言种类
    pageEncoding:当前 jsp 文件的本身编码
    contentType:response.setContentType(text/html;charset=UTF-8)
    import:指定 JSP 页面翻译成 Servlet 资源文件中导入的包或者类
    session:是否 jsp 在翻译时自动创建 session
    errorPage:当当前页面出错后跳转到哪个页面
    isErrorPage:当前页面是一个处理错误的页面

include指令

有时候,需要在 JSP 页面静态包含一个文件,例如 HTML 文件、文本文件等,这时,可以通过 include 指令来实现
- 语法

<%@ include file=”被包含的文件地址”%>

JSP隐式对象

在 JSP 页面中,有一些对象需要频繁使用,如果每次创建这些对象则会非常麻烦,为此,JSP 提供了 9 个隐式对象,它们是 JSP 默认创建的,可以直接在 JSP 页面使用,例如刚开始演示 的 out 对象

out 对象

在 JSP 页面中,经常需要向客户端发送文本内容,这时,可以使用 out 对象来实现

使用示例
<%
    out.print(new java.util.Date().toLocaleString());
    response.getWriter().println("使用 response 对象输出");
%>

pageContext 对象

pageContext获取隐式对象

在 JSP 中,想要获取 JSP 隐式对象,可以使用 pageContext 对象,pageContext 对象时 Javax.servlet.jsp.PageContext 类的实例对象,它代表当前 JSP 页面的运行环境,并提供了一些 列用于获取其他隐式对象的方法。

示例:使用 pageContext 获取 request 对象
<%
    HttpServletRequest httpServletRequest = (HttpServletRequest)
    pageContext.getRequest();
    String ip = request.getRemoteAddr();
    out.print(ip);
%>

pageContext

  • pageContext 对象的作用范围有 4 个值

    pageContext.PAGE_SCOPE:表示页面范围
    pageContext.REQUEST_SCOPE:表示请求范围
    pageContext.SESSION_SCOPE:表示会话范围
    pageContext.APPLICATION_SCOPE:表示 Web 应用程序范围


使用 findAttribute()方法来查找属性是,会依次从 page、request、session、application 的顺序进行查找,找到立刻返回实际的值,找不到返回 null。
示例
<%
    pageContext.setAttribute("company", "jf", pageContext.PAGE_SCOPE);
    Object name = pageContext.getAttribute("company",
    pageContext.PAGE_SCOPE);
    out.print("公司名称为:" + name);
%>

JSP 四个域范围

![](https://i.imgur.com/py4EnI8.png)
  • page:表示当前页,通常没用。jsp 标签底层使用
  • request:表示一次请求。通常一次请求就一个页面,但如果使用请求转发,可以涉及多个页面。
  • session:表示一次会话。可以在多次请求之间共享数据
  • application:表示一个 web 应用(项目)。可以整个 web 项目共享,多次会话共享数据

JSP 标签

JSP 标签元素用来控制 JSP 的行为,执行一些常用的 JSP 页面动作。通过标签元素可以实现 使用多行 Java 代码能够实现的效果,如包含页面文件,实现请求转发等

标签

在 JSP 页面中,为了把其他资源的输出内容插入到当前 JSP 页面的输出内容中,JSP 技术提 供了标签
语法:

page 属性用于指定被引入资源的相对路径, flush 属性用于指定是否将当前页面的输出内容 刷新到客户端,默认情况下,fush 属性的值为 false
使用示例
在项目下新建两个 jsp,分别是 included.jsp 和 dynamicInclude.jsp,其中 dynamicInclude.jsp 引入了 included.jsp
- included.jsp

   
  <% Thread.sleep(5000);%>
  included.jsp 中的内容;
   
  • dynamicInclude.jsp
      
    dynamicInclude.jsp 中的内容


注意:虽然 include 指令和标签都能够包含一个文件,但是它们 4 之间有很大的区别:
  • < isp:include>标签中要引入的资源和当前 JSP 页面是两个彼此独立的执行实体,即被动 态引入的资源必须能够被 Web 容器独立执行。而 include 指令只能引入遵循 JSP 格式 的文件,被引入文件与当前 JSP 文件需要共同合并才能翻译成一个 Servlet 源文件
  • 标签中引入的资源是在运行时才包含的,而且只包含运行结果。而 include 指令引入的资源是在编译时期包含的,包含的是源代码
  • 标签运行原理与 RequestDispatcher.include()方法类似,即被包含的页面不 能改变响应状态码或者设置响应头,而 include 指令没有这方面的限制。

标签

在 JSP 页面中,经常需要将请求转发给另外一个资源,这时,除了 RequestDispatcher 接口 的 forward() 方法可以实现外,还可以通过标签来实现,标签的 具体语法格式如下所示:

page 属性用于指定请求转发到的资源的相对路径,该路径是相对于当前的 JSP 页面的 URL
- jspforward.jsp

     
  • welcome.jsp

你可能感兴趣的:(Java)