@nextleaf
2018-09-20T00:22:31.000000Z
字数 5500
阅读 1005
Java
JSP
Servlet
可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。
一种动态网页开发技术。
它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。
JSP页面可以与处理业务逻辑的 Servlet 一起使用。
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 返回到浏览器中。
编译为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
为请求提供任何服务
前调用jspInit()
方法。
void _jspService(HttpServletRequest request,HttpServletResponse response){}
_jspService()方法在每个request中被调用一次并且负责产生与之相对应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等
4. 销毁阶段:
调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例
public void jspDestroy(){}
JSP指令用来设置与整个JSP页面相关的属性。例如:
指令 | 描述 |
---|---|
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" ...%> | 定义网页依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include attribute="value" %> | 包含其他文件 |
<%@ taglib attribute="value" %> | 引入标签库的定义 |
一个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指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。
<%@ include file="文件相对 url 地址" %>
Taglib指令引入一个自定义标签集合的定义,包括库路径、自定义标签。
<%@ taglib uri="uri" prefix="prefixOfTag" %>
uri属性确定标签库的位置,prefix属性指定标签库的前缀。
<% 代码片段 %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%= 表达式 %>
,编译时转为out.println()
一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。
语法格式:
<%! declaration; [ declaration; ]+ ... %>
示例:
<%! int i = 0; %>
<%! int a, b, c; %>
<%! Circle a = new Circle(2.0); %>
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 | 用于封装模板数据 |
所有的动作要素都有两个属性:id属性和scope属性。
<jsp:include>
动作元素语法:
<jsp:include page="相对 URL 地址" flush="true" />
插入文件的时间是在页面被请求的时候。
flush,定义在包含资源前是否刷新缓存区。
<jsp:useBean>
动作元素加载一个将在JSP页面中使用的JavaBean。
<jsp:useBean id="name" class="package.class" />
<jsp:setProperty>
动作元素jsp:setProperty
用来设置已经实例化的Bean对象的属性,
<jsp:useBean id="myName" ... />
...
<jsp:setProperty name="myName" property="someProperty" value="可选" param="可选"/>
或
<jsp:useBean id="myName" ... >
<!--此时,jsp:setProperty只有在新建Bean实例时才会执行,如果是使用现有实例则不执行jsp:setProperty。-->
<jsp:setProperty name="myName" property="someProperty" .../>
</jsp:useBean>
<jsp:getProperty>
动作元素jsp:getProperty
动作提取指定Bean属性的值,转换成字符串,然后输出。语法格式如下:
<jsp:useBean id="myName" ... />
...
<jsp:getProperty name="myName" property="someProperty" .../>
<jsp:forward>
动作元素jsp:forward
动作把请求转到另外的页面。jsp:forward标记只有一个属性page。
<jsp:forward page="相对 URL 地址" />
<jsp:element>
、 <jsp:attribute>
、 <jsp:body>
动作元素<jsp:element>
、 <jsp:attribute>
、 <jsp:body>
动作元素动态定义XML元素。
<jsp:text>
动作元素<jsp:text>
动作元素允许在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对象是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中的相关属性:
pageContext.removeAttribute("attrName", PAGE_SCOPE);
If…else块
<%! int day = 3; %>
<body>
<h3>IF...ELSE 实例</h3>
<% if (day == 1 | day == 7) { %>
<p>今天是周末</p>
<% } else { %>
<p>今天不是周末</p>
<% } %>
</body>
switch…case块略
for,while,和 do…while。
<%! int fontSize; %>
<body>
<h3>For 循环实例</h3>
<%for ( fontSize = 1; fontSize <= 3; fontSize++){ %>
<font color="green" size="<%= fontSize %>">
教程
</font><br />
<%}%>
</body>