[关闭]
@nextleaf 2018-09-20T00:22:31.000000Z 字数 5500 阅读 1025

2018-09-14 工作日志

Java JSP Servlet


JSP

可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。
一种动态网页开发技术。
它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。
JSP页面可以与处理业务逻辑的 Servlet 一起使用。

JSP处理流程

Web 服务器是这样使用JSP来创建网页的:
1. 浏览器发送一个 HTTP 请求给服务器。
2. Web服务器识别出这是一个对 JSP 网页的请求,并且将该请求传递给 JSP 引擎。
3. JSP 引擎将JSP文件转化为Servlet。这种转化只是简单地将所有模板文本改用println()语句,并且将所有的 JSP 元素转化成 Java 代码
4. JSP引擎将Servlet编译成可执行类,并且将原始请求传递给Servlet引擎。
5. Web服务器的某组件将会调用Servlet引擎,然后载入并执行Servlet类。在执行过程中,Servlet产生HTML格式的输出并将其内嵌于HTTP response中上交给 Web 服务器。
6. Web 服务器将 HTTP response 返回到浏览器中。

JSP生命周期:

  1. 编译阶段:
    当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。三个步骤:
    • 解析JSP文件。
    • 将JSP文件转为servlet。
    • servlet容器编译servlet源文件,生成servlet类

编译为servlet时的主要过程

1. 查看指令,得到转换时可能需要的信息
2. 创建一个HttpServlet子类
3. 如果有import指令,它会在package之下,类文件上面写import语句
    <%@ page import="java.util.*" %>
    contenType属性——>response.setContenType()
4. 如果有声明,容器将这些声明写至类声明下,并在服务方法之前
    <%! int count = 1; %>
5. 建立服务方法,服务方法具体名是_jspService()。由servlet超类被覆盖的service()方法调用,要接收HttpServletRequest和HttpServletResponse参数在建立这个方法时,容器会声明并初始化所有隐式对象
6. 将普通的html、scriptlet、表达式写至服务方法中,完成格式化,并写至PintWrite输出
    html-->out.write
    scriptlet-->java
    表达式-->out.println
  1. 初始化阶段:
    加载与JSP对应的servlet类,创建其实例,并在为请求提供任何服务前调用jspInit()方法。
    一般来讲程序只初始化一次,servlet也是如此。通常情况下可以在jspInit()方法中初始化数据库连接、打开文件和创建查询表。
  2. 执行阶段:
    调用与JSP对应的servlet实例的服务方法
  1. void _jspService(HttpServletRequest request,HttpServletResponse response){}

_jspService()方法在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等
4. 销毁阶段:
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例

  1. public void jspDestroy(){}

JSP指令

JSP指令用来设置与整个JSP页面相关的属性。例如:

指令 描述
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" ...%> 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include attribute="value" %> 包含其他文件
<%@ taglib attribute="value" %> 引入标签库的定义

Page指令

一个JSP页面可以包含多个page指令。
与Page指令相关的属性:

属性 描述
buffer 指定out对象使用缓冲区的大小
autoFlush 控制out对象的 缓存区
contentType 指定当前JSP页面(响应报头)的MIME类型和字符编码
errorPage 指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage 指定当前页面是否可以作为另一个JSP页面的错误处理页面
extends 指定servlet从哪一个类继承
import 导入要使用的Java类
info 定义JSP页面的描述信息
isThreadSafe 指定对JSP页面的访问是否为线程安全
language 定义JSP页面所用的脚本语言,默认是Java
session 指定JSP页面是否使用session
isELIgnored 指定是否执行EL表达式
isScriptingEnabled 确定脚本元素能否被使用

Include指令

include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。
<%@ include file="文件相对 url 地址" %>

Taglib指令

Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。

JSP语法

脚本程序

<% 代码片段 %>

中文编码

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

JSP表达式

<%= 表达式 %>,编译时转为out.println()

JSP声明

一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。
语法格式:
<%! declaration; [ declaration; ]+ ... %>
示例:

  1. <%! int i = 0; %>
  2. <%! int a, b, c; %>
  3. <%! Circle a = new Circle(2.0); %>

JSP行为(动作元素)

JSP行为标签使用XML语法结构来控制servlet引擎。利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码。JSP动作元素在请求处理阶段起作用。行为标签基本上是一些预先就定义好的函数。

语法 描述
jsp:include 在页面被请求的时候在当前页面中包含静态或动态资源
jsp:useBean 寻找和初始化一个JavaBean组件
jsp:setProperty 设置 JavaBean组件的值
jsp:getProperty 将 JavaBean组件的值插入到 output中
jsp:forward 把请求转到一个新的页面。
jsp:plugin 根据浏览器类型为Java插件生成OBJECT或EMBED标记。
jsp:element 动态创建一个XML元素
jsp:attribute 定义动态创建的XML元素的属性
jsp:body 定义动态创建的XML元素的主体
jsp:text 用于封装模板数据

JSP行为de常见属性

所有的动作要素都有两个属性:id属性和scope属性。

<jsp:include>动作元素

语法:

  1. <jsp:include page="相对 URL 地址" flush="true" />

插入文件的时间是在页面被请求的时候。
flush,定义在包含资源前是否刷新缓存区。

<jsp:useBean>动作元素

加载一个将在JSP页面中使用的JavaBean。
<jsp:useBean id="name" class="package.class" />

<jsp:setProperty>动作元素

jsp:setProperty用来设置已经实例化的Bean对象的属性,

  1. <jsp:useBean id="myName" ... />
  2. ...
  3. <jsp:setProperty name="myName" property="someProperty" value="可选" param="可选"/>

  1. <jsp:useBean id="myName" ... >
  2. <!--此时,jsp:setProperty只有在新建Bean实例时才会执行,如果是使用现有实例则不执行jsp:setProperty。-->
  3. <jsp:setProperty name="myName" property="someProperty" .../>
  4. </jsp:useBean>

<jsp:getProperty>动作元素

jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出。语法格式如下:

  1. <jsp:useBean id="myName" ... />
  2. ...
  3. <jsp:getProperty name="myName" property="someProperty" .../>

<jsp:forward>动作元素

jsp:forward动作把请求转到另外的页面。jsp:forward标记只有一个属性page。

  1. <jsp:forward page="相对 URL 地址" />

<jsp:element><jsp:attribute><jsp:body>动作元素

<jsp:element><jsp:attribute><jsp:body>动作元素动态定义XML元素。

<jsp:text>动作元素

<jsp:text>动作元素允许在JSP页面和文档中使用写入文本的模板

JSP隐含对象

JSP容器为每个页面提供的Java对象

九个自动定义的变量

对象 描述
request javax.servlet.http.HttpServletRequest类的实例
response HttpServletResponse类的实例
out javax.servlet.jsp.PrintWriter类的实例,用于把结果输出至网页上
session javax.servlet.http.HttpSession类的实例
application javax.servlet.ServletContext类的实例,与应用上下文有关
config javax.servlet.ServletConfig类的实例
pageContext javax.servlet.jsp.PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问
page 页面实例的引用,类似于Java类中的this关键字
Exception Exception类的对象,代表发生错误的JSP页面中对应的异常对象

pageContext 对象

pageContext对象是javax.servlet.jsp.PageContext 类的实例,用来代表整个JSP页面。
这个对象主要用来访问页面信息,同时过滤掉大部分实现细节。
这个对象存储了request对象和response对象的引用。application对象,config对象,session对象,out对象可以通过访问这个对象的属性来导出。
pageContext对象也包含了传给JSP页面的指令信息,包括缓存信息,ErrorPage URL,页面scope等。
PageContext类定义了一些字段,包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE。它也提供了40余种方法,有一半继承自javax.servlet.jsp.JspContext 类。
其中一个重要的方法就是removeArribute(),它可接受一个或两个参数。比如,pageContext.removeArribute("attrName")移除四个scope中相关属性,但是下面这种方法只移除特定scope中的相关属性:

  1. pageContext.removeAttribute("attrName", PAGE_SCOPE);

判断语句

If…else块

  1. <%! int day = 3; %>
  2. <body>
  3. <h3>IF...ELSE 实例</h3>
  4. <% if (day == 1 | day == 7) { %>
  5. <p>今天是周末</p>
  6. <% } else { %>
  7. <p>今天不是周末</p>
  8. <% } %>
  9. </body>

switch…case块略

循环语句

for,while,和 do…while。

  1. <%! int fontSize; %>
  2. <body>
  3. <h3>For 循环实例</h3>
  4. <%for ( fontSize = 1; fontSize <= 3; fontSize++){ %>
  5. <font color="green" size="<%= fontSize %>">
  6. 教程
  7. </font><br />
  8. <%}%>
  9. </body>

JSP 字面量

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注