<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=JSP</id>
	<title>JSP - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=JSP"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=JSP&amp;action=history"/>
	<updated>2026-07-16T03:20:47Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=JSP&amp;diff=70308&amp;oldid=prev</id>
		<title>imported&gt;Hrs81458：​/* top */</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=JSP&amp;diff=70308&amp;oldid=prev"/>
		<updated>2025-09-11T10:54:35Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;top&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{onesource|time=2019-02-24T03:02:16+00:00}}&lt;br /&gt;
{{cleanup-jargon|time=2016-02-22T03:31:46+00:00}}&lt;br /&gt;
{{NoteTA|G1=IT}}&lt;br /&gt;
{{redirect|JSP}}&lt;br /&gt;
{{Infobox file format&lt;br /&gt;
| name          = JSP&lt;br /&gt;
| icon          = &lt;br /&gt;
| mime          = application/jsp&lt;br /&gt;
| extension     = .jsp, .jspx, .jspf&lt;br /&gt;
| standard      = [http://jcp.org/en/jsr/detail?id=245 JSR 245]&lt;br /&gt;
| developer     = [[Eclipse基金会]]&lt;br /&gt;
| type          = [[动态网页]]&lt;br /&gt;
| released      = {{start date and age|1999}}&lt;br /&gt;
| latest release version = [https://jakarta.ee/specifications/pages/3.0/jakarta-server-pages-spec-3.0.pdf 3.0]&lt;br /&gt;
| latest_release_date = {{Start date and age|2020|10|21}}&lt;br /&gt;
| free          = Yes&lt;br /&gt;
| url           = {{Official URL}}&lt;br /&gt;
}}&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;JSP&amp;#039;&amp;#039;&amp;#039;（全称&amp;#039;&amp;#039;&amp;#039;J&amp;#039;&amp;#039;&amp;#039;akarta &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039;erver &amp;#039;&amp;#039;&amp;#039;P&amp;#039;&amp;#039;&amp;#039;ages，曾称为&amp;#039;&amp;#039;&amp;#039;J&amp;#039;&amp;#039;&amp;#039;ava&amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039;erver &amp;#039;&amp;#039;&amp;#039;P&amp;#039;&amp;#039;&amp;#039;ages）是由[[昇陽電腦]]公司主导建立的一种动态网页技术标准。JSP部署于网络服务器上，可以响应客户端发送的请求，并根据请求内容动态地生成[[HTML]]、[[XML]]或其他格式文档的[[Web]]网页，然后返回给请求者。JSP技术以[[Java]]语言作为[[脚本语言]]，为用户的[[HTTP]]请求提供服务，并能与服务器上的其它Java程序共同处理复杂的业务需求。&lt;br /&gt;
&lt;br /&gt;
JSP将Java程序码和特定变动内容嵌入到静态的页面中，实现以静态页面为模板，动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签，用来调用内建功能。另外，可以创建JSP标签库，然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能，而且不受[[跨平台]]问题的限制。JSP文件在运行时会被其编译器转换成更原始的[[Servlet]]程序码。JSP编译器可以把JSP文件编译成用Java程序码写的Servlet，然后再由Java编译器来编译成能快速执行的二进制[[机器码]]，也可以直接编译成二进制码。&lt;br /&gt;
&lt;br /&gt;
== 综述 ==&lt;br /&gt;
{{expand section|time=2018-06-17}}&lt;br /&gt;
JSP从2.0版本开始，增加了[[表达式语言]]（EL），以提供更快更简单的创建新标签的方法，并允许开发者创建[[Apache Velocity|Velocity]]式模板。如旧版本代码“&amp;lt;code&amp;gt;Hello, &amp;lt;%=request.getParameter(&amp;quot;visitor&amp;quot;)%&amp;gt;&amp;lt;/code&amp;gt;”可简化为“&amp;lt;code&amp;gt;Hello, ${param.visitor}”&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== 特点 ==&lt;br /&gt;
* 能以模板化的方式简单、高效地添加动态网页内容。&amp;lt;ref name=&amp;quot;specif_2.3_overview&amp;quot;&amp;gt;{{harvnb|Chung|2013|loc=Overview}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* 可利用[[JavaBean]]和标签库技术复用常用的功能代码（设计好的组件容易实现重复利用，减少重复劳动）。标签库不仅带有通用的内置标签（[[JSTL]])，而且支持可扩展功能的自定义标签。&amp;lt;ref name=&amp;quot;specif_2.3_overview&amp;quot; /&amp;gt;&lt;br /&gt;
* 有良好的工具支持。&amp;lt;ref name=&amp;quot;specif_2.3_overview&amp;quot; /&amp;gt;&lt;br /&gt;
* 继承了Java语言的相对易用性。&amp;lt;ref name=&amp;quot;specif_2.3_overview&amp;quot; /&amp;gt;&lt;br /&gt;
* 继承了Java的[[跨平台]]优势，实现“一次编写，处处运行”。因为支持Java及其相关技术的开发平台多，网站开发人员可以选择在最适合自己的系统平台上进行JSP开发；不同环境下开发的JSP项目，在所有客户端上都能顺利访问。&amp;lt;ref name=&amp;quot;specif_2.3_overview&amp;quot; /&amp;gt;&lt;br /&gt;
* 页面中的动（控制变动内容的部分）／静（内容不需变动的部分）区域以分散但又有序的形式组合在一起，能使人更直观地看出页面代码的整体结构，也使得设计页面效果和程序逻辑这2部分工作容易分离（外观视图与逻辑分离）。从而方便分配人员并发挥各自长处，实现高效地分工合作。&amp;lt;ref name=&amp;quot;specif_2.3_overview&amp;quot; /&amp;gt;&lt;br /&gt;
* 可与其它企业级Java技术相互配合。JSP可以只专门负责页面中的数据呈现，实现[[多层架构|分层开发]]。&amp;lt;ref name=&amp;quot;specif_2.3_overview&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 包含内容 ==&lt;br /&gt;
=== JSP指令 ===&lt;br /&gt;
&lt;br /&gt;
JSP指令控制JSP编译器如何去生成[[servlet]]，以下是可用的指令：&lt;br /&gt;
&lt;br /&gt;
* 包含指令include –包含指令通知JSP编译器把另外一个文件完全包含入当前文件中。效果就好像被包含文件的内容直接被粘贴到当前文件中一样。这个功能和C[[预处理器]]所提供的很类似。被包含文件的扩展名一般都是&amp;quot;jspf&amp;quot;（即JSP &amp;#039;&amp;#039;&amp;#039;Fragment&amp;#039;&amp;#039;&amp;#039;，JSP片段）:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsp&amp;quot;&amp;gt;&amp;lt;%@ include file=&amp;quot;somefile.jsp&amp;quot; %&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 页面指令page –页面指令有以下几个选项：&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; rules=&amp;quot;none&amp;quot; frame=&amp;quot;void&amp;quot; style=&amp;quot;margin-left:50px&amp;quot;&lt;br /&gt;
|----- align=&amp;quot;left&amp;quot;&lt;br /&gt;
| width=&amp;quot;120&amp;quot; valign=&amp;quot;top&amp;quot; | &amp;#039;&amp;#039;&amp;#039;import&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| 使一个JAVA导入声明被插入到最终页面文件。&lt;br /&gt;
|----- align=&amp;quot;left&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;#039;&amp;#039;&amp;#039;contentType&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| 规定了生成内容的类型。当生成非HTML内容或者当前[[字符集]]并非默认字符集时使用。&lt;br /&gt;
|----- align=&amp;quot;left&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;#039;&amp;#039;&amp;#039;errorPage&amp;#039;&amp;#039;&amp;#039; || 处理HTTP请求时，如果出现异常则显示该错误提示信息页面。&lt;br /&gt;
|----- align=&amp;quot;left&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;#039;&amp;#039;&amp;#039;isErrorPage&amp;#039;&amp;#039;&amp;#039; || 如果设置为TRUE，则表示当前文件是一个错误提示页面。&lt;br /&gt;
|----- align=&amp;quot;left&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;#039;&amp;#039;&amp;#039;isThreadSafe&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| 表示最终生成的servlet是否具有[[线程]]安全性。&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsp&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;%@ page import=&amp;quot;java.util.*&amp;quot; %&amp;gt; //example import导入样例&lt;br /&gt;
&amp;lt;%@ page contentType=&amp;quot;text/html&amp;quot; %&amp;gt; //example contentType页面类型样例&lt;br /&gt;
&amp;lt;%@ page isErrorPage=false %&amp;gt; //example for non error page无错误页面样例&lt;br /&gt;
&amp;lt;%@ page isThreadSafe=true %&amp;gt; //example for a thread safe JSP执行序安全JSP样例&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;注意：&amp;#039;&amp;#039;&amp;#039;在同一个JSP文件中只有“import”导入页面指令可以被多次使用。&lt;br /&gt;
&lt;br /&gt;
* 标签库指令taglib –标签库指令描述了要使用的JSP标签库。该指令需要指定一个前缀prefix（和C++的命名空间很类似）和标签库的描述URI:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsp&amp;quot;&amp;gt;&amp;lt;%@ taglib prefix=&amp;quot;myprefix&amp;quot; uri=&amp;quot;taglib/mytag.tld&amp;quot; %&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JSP脚本元素和变量 ===&lt;br /&gt;
&lt;br /&gt;
==== 标准脚本变量 ====&lt;br /&gt;
&lt;br /&gt;
以下是永远可用的脚本变量：&lt;br /&gt;
&lt;br /&gt;
* out：JSPWriter，用来写入响应流的数据&lt;br /&gt;
* page：servlet自身&lt;br /&gt;
* pageContext：一个PageContext实例包括和整个页面相联系的数据，一个给定的HTML页面可以在多个JSP之间传递。&lt;br /&gt;
* request：HTTP request（请求）对象&lt;br /&gt;
* response：HTTP response（响应）对象&lt;br /&gt;
* session：HTTP session（服务端会话）对象&lt;br /&gt;
&lt;br /&gt;
==== 脚本元素 ====&lt;br /&gt;
&lt;br /&gt;
有三个基本的脚本元素，作用是使JAVA代码可以直接插入servlet.&lt;br /&gt;
* 一种是声明标签，在JAVA SERVLET的类体中放入一个变量或方法的定义。静态的数据成员也可以如此定义。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;jsp&amp;quot;&amp;gt;&amp;lt;%! int serverInstanceVariable = 1; %&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 一种是脚本标签，在JAVA SERVLET的类的_jspService()方法中放入所包含的语句。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;jsp&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;% int localStackBasedVariable = 1;  out.println(localStackBasedVariable); %&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* 一种是表达式标签，在JAVA SERVLET的类中放入待赋值的表达式，表达式注意不能以分号结尾。&lt;br /&gt;
*: &amp;lt;syntaxhighlight lang=&amp;quot;jsp&amp;quot;&amp;gt;&amp;lt;%= &amp;quot;expanded inline data &amp;quot; + 1 %&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JSP动作 ===&lt;br /&gt;
&lt;br /&gt;
JSP动作是一系列可以调用内建于网络服务器中的功能的XML标签。JSP提供了以下动作：&lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; rules=&amp;quot;none&amp;quot; frame=&amp;quot;void&amp;quot; style=&amp;quot;margin-left:50px&amp;quot;&lt;br /&gt;
|----- align=&amp;quot;left&amp;quot;&lt;br /&gt;
| width=&amp;quot;120&amp;quot; valign=&amp;quot;top&amp;quot; | &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;jsp:include&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| 和子过程类似，JAVA SERVLET暂时接管对其它指定的JSP页的请求和响应。当处理完该JSP页后就马上把控制权交还当前JSP页。这样JSP代码就可以在多个JSP页中共享而不用复制。&lt;br /&gt;
|----- align=&amp;quot;left&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;jsp:param&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| 可以在jsp:include, jsp:forward或jsp:params块之间使用。指定一个将加入请求的当前参数组中的参数。&lt;br /&gt;
|----- align=&amp;quot;left&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;jsp:forward&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| 用于处理对另一个JSP或SERVLET的请求和响应。控制权永远不会交还给当前JSP页。&lt;br /&gt;
|----- align=&amp;quot;left&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;jsp:getProperty&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| 从指定的[[JavaBeans|JavaBean]]中获取一个属性值。&lt;br /&gt;
|----- align=&amp;quot;left&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;jsp:setProperty&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| 在指定的JavaBean中设置一个属性值。&lt;br /&gt;
|----- align=&amp;quot;left&amp;quot;&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; | &amp;#039;&amp;#039;&amp;#039;&amp;lt;nowiki&amp;gt;jsp:useBean&amp;lt;/nowiki&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| 创建或者复用一个JavaBean变量到JSP页。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 标签样例 ====&lt;br /&gt;
===== jsp:include =====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsp&amp;quot;&amp;gt;&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&amp;lt;jsp:include page=&amp;quot;mycommon.jsp&amp;quot; &amp;gt;&lt;br /&gt;
    &amp;lt;jsp:param name=&amp;quot;extraparam&amp;quot; value=&amp;quot;myvalue&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/jsp:include&amp;gt;&lt;br /&gt;
name:&amp;lt;%=request.getParameter(&amp;quot;extraparam&amp;quot;)%&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== jsp:forward =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsp&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;jsp:forward page=&amp;quot;subpage.jsp&amp;quot; &amp;gt;&lt;br /&gt;
     &amp;lt;jsp:param name=&amp;quot;forwardedFrom&amp;quot; value=&amp;quot;this.jsp&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/jsp:forward&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
在本例中，请求被传递到&amp;quot;subpage.jsp&amp;quot;，而且请求的处理权不会再返回前者。&lt;br /&gt;
&lt;br /&gt;
===== jsp:useBean =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsp&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;jsp:useBean id=&amp;quot;myBean&amp;quot; class=&amp;quot;com.foo.MyBean&amp;quot; scope=&amp;quot;request&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;jsp:getProperty name=&amp;quot;myBean&amp;quot; property=&amp;quot;lastChanged&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;jsp:setProperty name=&amp;quot;myBean&amp;quot; property=&amp;quot;lastChanged&amp;quot; value=&amp;quot;&amp;lt;%= new Date()%&amp;gt;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
scope属性可以是request, page, session or application，它有以下用意：&lt;br /&gt;
* request— 该属性在请求的生命周期内有效，一旦请求被所有的JSP页处理完后，那么该属性就不可引用。&lt;br /&gt;
* page— 该属性只是当前页中有效。&lt;br /&gt;
* session— 该属性在用户会话的生命周期内有效。&lt;br /&gt;
* application— 该属性在各种情况下都有效，并且永远不会被变为不可引用，和全局变量[[global variable]]相同。&lt;br /&gt;
&lt;br /&gt;
上述例子将会用一个创建一个类的实例，并且把该实例存储在属性中，该属性将在该请求的生命周期内有效。它可以在所有被包含或者从主页面（最先接收请求的页面）转向到的JSP页之间共享。&lt;br /&gt;
&lt;br /&gt;
=== JSP标签库 ===&lt;br /&gt;
&lt;br /&gt;
除了JSP预定义动作之外，开发者还可以使用JSP标签扩展API添加他们自定义的&amp;#039;&amp;#039;动作&amp;#039;&amp;#039;。开发者写一种实现一个标签的界面和一个标签库的XML描述文件的JAVA类，这就能指定标签和实现标签的JAVA类&lt;br /&gt;
请看如下JSP：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;jsp&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;%@ taglib uri=&amp;quot;mytaglib.tld&amp;quot; prefix=&amp;quot;myprefix&amp;quot; %&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;myprefix:myaction&amp;gt; &amp;lt;%-- the start tag %&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/myprefix:myaction&amp;gt; &amp;lt;%-- the end tag %&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
JSP编译器将会载入mytaglib.tld这个XML文件，然后可以看到标签&amp;#039;&amp;#039;myaction&amp;#039;&amp;#039;由JAVA类&amp;#039;&amp;#039;MyActionTag&amp;#039;&amp;#039;实现。当该标签首次在文件中使用时，将会创建一个MyActionTag的实例。然后（而且当每次该标签被使用时），当出现开始标签时，将会调用doStartTag()方法，根据开始标签的结果，来决定如何处理标签的主体。主体是指开始标签和结束标签之间的文本。这个doStartTag()方法将会返回如下之一：&lt;br /&gt;
* SKIP_BODY - 标签之间不做处理。&lt;br /&gt;
* EVAL_BODY_INCLUDE - 对标签之内主体进行赋值。&lt;br /&gt;
* EVAL_BODY_TAG - 对标签之内主体进行赋值并把结果输出到流（保存在标签的主体内容属性中）。&lt;br /&gt;
&lt;br /&gt;
:&amp;#039;&amp;#039;&amp;#039;注意：&amp;#039;&amp;#039;&amp;#039;如果标签扩展了BodyTagSupport类，当主体被执行时会在调用doEndTag()之前调用doAfterBody()方法。该方法用于实现循环结构。&lt;br /&gt;
&lt;br /&gt;
当结束标签出现时，它会调用doEndTag()方法，该方法会返回如下两做之一：&lt;br /&gt;
* EVAL_PAGE - 表示JSP文件的剩余部份将会被执行。this indicates that the rest of the JSP file should be processed.&lt;br /&gt;
* SKIP_PAGE - 表示将不会再有更多执行操作。当前JSP页交出控制权。就象在转发动作中的作用一样。&lt;br /&gt;
&lt;br /&gt;
上述myaction标签tag会有一个类似下面例子的用于实现的类：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class MyActionTag extends  TagSupport {&lt;br /&gt;
    //Releases all instance variables.&lt;br /&gt;
    public void release() {...}&lt;br /&gt;
&lt;br /&gt;
    public MyActionTag() { ... }&lt;br /&gt;
&lt;br /&gt;
    //called for the start tag&lt;br /&gt;
    public int doStartTag() { ... }&lt;br /&gt;
&lt;br /&gt;
    //called at the end tag&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 本地化 ==&lt;br /&gt;
&lt;br /&gt;
JSP的[[本地化]]是通过和JAVA应用程序相同的方式完成的，即使用[[资源包]]。&lt;br /&gt;
&lt;br /&gt;
== 模型-视图-控制器 模式 ==&lt;br /&gt;
&lt;br /&gt;
为了把表现层（presentation）从请求处理（request processing）和数据存储（data storage）中分离开来（这样更利于开发、查错和功能扩展），[[升阳公司]]推荐在JSP文件中使用一种称作[[Model-view-controller|模型-视图-控制器]]（MVC）的架构模式。按照此设计，当用户访问网站上的特定网址时，用户的处理请求会先由网站[[服务器]]获取到，然后先交由网站的控制器程序作初步处理。用户的访问请求可能多种多样，比如查询信息或进行数据计算都是常见的网站业务。控制器程序会初步判断用户请求的种类，然后把用户请求转发给与特定业务对应的[[Servlet]]程序或者另一个独立的JSP文件进行业务处理。当请求处理完后，再通过一个专门负责输出信息的JSP页以清晰、美观的方式向用户的浏览器输出结果。简而言之，先由控制器拦截用户请求并做初步判断，再由业务处理程序访问数据（从[[数据库]]中访问）和处理业务，最后由视图组件生成结果页面并发送结果给用户。其中JSP一般用作展示输出结果，可以用于展示经Servlet查询或处理后的结果；也可以用一个JSP文件处理业务逻辑，再用另一个JSP文件展示结果。按功能做这样的文件拆分（而非由一个臃肿的JSP页面包揽所有功能）是为了便于团队分工。MVC本身是一种由来已久的设计思想，基于JSP的技术只是实现MVC架构的流行方案之一。[[Struts]]和[[Spring框架]]等好几种流行的网站建设框架都是基于MVC模式设计的。&lt;br /&gt;
&lt;br /&gt;
== JSP和Servlets ==&lt;br /&gt;
[[File:JSPLife.svg|thumb|400px|一个JSP页面的生命周期]]&lt;br /&gt;
从架构上说，JSP可以被看作是从Servlets高级提炼而作为[[Java Servlet]] 2.1 API的扩展而应用。Servlets和JSP最早都是由[[昇陽電腦]]开发的。从JSP1.2版本以来，JSP处于[[JCP]]开发模式下。[[Java规范请求|JSR]]-53规定了JSP 1.2和Servlet 2.4的规范，JSR-152规定了JSP 2.0的规范。2006年5月，JSP 2.1的规范作为[[Java EE]] 5的一部份，在JSR-245中发布。&lt;br /&gt;
&lt;br /&gt;
静态数据在输入文件中的内容和输出给[[HTTP]]响应的内容完全一致。此时，该JSP输入文件会是一个没有内嵌JAVA或动作的HTML页面。而且，客户端每次请求都会得到相同的响应内容。&lt;br /&gt;
&lt;br /&gt;
=== 样例 ===&lt;br /&gt;
不管JSP编译器是生成SERVLET的JAVA源码，或者是直接发布二进制码，了解一下JSP编译器是如何把文件转换成一个JAVA SERVLET，都是很有帮助的。例如，看一下如下输入JSP和它最后生成的JAVA SERVLET：&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;输入JSP&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;html4strict&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;%@ page errorPage=&amp;quot;myerror.jsp&amp;quot; %&amp;gt;&lt;br /&gt;
&amp;lt;%@ page import=&amp;quot;com.foo.bar&amp;quot; %&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
&amp;lt;%! int serverInstanceVariable = 1;%&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;% int localStackBasedVariable = 1; %&amp;gt;&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;%= &amp;quot;expanded inline data &amp;quot; + 1 %&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;最后生成的JAVA SERVLET&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
package jsp_servlet;&lt;br /&gt;
import java.util.*;&lt;br /&gt;
import java.io.*;&lt;br /&gt;
import javax.servlet.*;&lt;br /&gt;
import javax.servlet.http.*;&lt;br /&gt;
import javax.servlet.jsp.*;&lt;br /&gt;
import javax.servlet.jsp.tagext.*;&lt;br /&gt;
&lt;br /&gt;
import com.foo.bar; //imported as a result of &amp;lt;%@ page import=&amp;quot;com.foo.bar&amp;quot; %&amp;gt;&lt;br /&gt;
import ...&lt;br /&gt;
&lt;br /&gt;
class _myserlvet implements javax.servlet.Servlet, javax.servlet.jsp.HttpJspPage {&lt;br /&gt;
    //inserted as a&lt;br /&gt;
    //result of &amp;lt;%! int serverInstanceVariable = 1;%&amp;gt;&lt;br /&gt;
    int serverInstanceVariable = 1;&lt;br /&gt;
    ...&lt;br /&gt;
&lt;br /&gt;
    public void _jspService( javax.servlet.http.HttpServletRequest request,&lt;br /&gt;
                            javax.servlet.http.HttpServletResponse response )&lt;br /&gt;
        throws javax.servlet.ServletException,&lt;br /&gt;
               java.io.IOException&lt;br /&gt;
    {&lt;br /&gt;
        javax.servlet.ServletConfig config = ...;//get the servlet config&lt;br /&gt;
        Object page = this;&lt;br /&gt;
        PageContext pageContext = ...;//get the page context for this request&lt;br /&gt;
        javax.servlet.jsp.JspWriter out = pageContext.getOut();&lt;br /&gt;
        HttpSession session = request.getSession( true );&lt;br /&gt;
        try {&lt;br /&gt;
             out.print( &amp;quot;&amp;lt;html&amp;gt;\r\n&amp;quot; );&lt;br /&gt;
             out.print( &amp;quot;&amp;lt;head&amp;gt;\r\n&amp;quot; );&lt;br /&gt;
             ...&lt;br /&gt;
             //from &amp;lt;% int localStackBasedVariable = 1; %&amp;gt;&lt;br /&gt;
             int localStackBasedVariable = 1;&lt;br /&gt;
             ...&lt;br /&gt;
             out.print( &amp;quot;&amp;lt;table&amp;gt;\r\n&amp;quot; );&lt;br /&gt;
             out.print( &amp;quot;   &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot; );&lt;br /&gt;
             //note, toStringOrBlank() converts the expression into a string or if&lt;br /&gt;
             // the expression is null, it uses the empty string.&lt;br /&gt;
             //from &amp;lt;%= &amp;quot;expanded inline data &amp;quot; + 1 %&amp;gt;&lt;br /&gt;
             out.print( toStringOrBlank( &amp;quot;expanded inline data &amp;quot; + 1 ) );&lt;br /&gt;
             out.print( &amp;quot;   &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;\r\n&amp;quot; );&lt;br /&gt;
             ...&lt;br /&gt;
        } catch ( Exception _exception ) {&lt;br /&gt;
           //clean up and redirect to error page in &amp;lt;%@ page errorPage=&amp;quot;myerror.jsp&amp;quot; %&amp;gt;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 参见 ==&lt;br /&gt;
* [[JSTL]]&lt;br /&gt;
* [[Java EE|Java企业版]]&lt;br /&gt;
* [[JavaServer Faces]]&lt;br /&gt;
* [[Java Servlet]]&lt;br /&gt;
* [[SSJS]]&lt;br /&gt;
* [[WAR (file format)]]&lt;br /&gt;
* [[EAR (file format)]]&lt;br /&gt;
* [[JAR (file format)]]&lt;br /&gt;
* [[Apache Tomcat|Tomcat服务器]]&lt;br /&gt;
&lt;br /&gt;
== 参考资料 ==&lt;br /&gt;
=== 文内引用 ===&lt;br /&gt;
{{Reflist}}&lt;br /&gt;
&lt;br /&gt;
=== 书目 ===&lt;br /&gt;
* {{cite book |title=JavaServer Pages Specification |author=Kin-man Chung |url= http://download.oracle.com/otn-pub/jcp/jsp-2_3-mrel2-eval-spec/JSP2.3MR.pdf?AuthParam=1521190349_afb5d530a382ea96a037b5029e4bbab8 |format=pdf |publisher=[[甲骨文公司]] |edition=2.3 |ref={{harvid|Chung|2013}} |year=2013 |access-date=2018年3月16日}}&lt;br /&gt;
* {{cite book |title=JavaServer Pages |author=Hans Bergsten |url=http://www.amazon.com/gp/product/0596005636 |publisher=[[O&amp;#039;Reilly]] |location=Sebastopol, California |edition=3 |ISBN=0-596-00563-6 |year=2003 |access-date=2006-07-20 |archive-date=2019-10-17 |archive-url=https://web.archive.org/web/20191017183656/https://www.amazon.com/gp/product/0596005636 |dead-url=no }}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 外部链接 ==&lt;br /&gt;
* [http://java.sun.com/products/jsp/ Sun&amp;#039;s JSP product description]{{Wayback|url=http://java.sun.com/products/jsp/ |date=20100105041505 }}&lt;br /&gt;
* [http://www.jcp.org/en/jsr/detail?id=245 JSR 245]{{Wayback|url=http://www.jcp.org/en/jsr/detail?id=245 |date=20100617225735 }} (JSP 2.1)&lt;br /&gt;
* [http://www.jcp.org/en/jsr/detail?id=152 JSR 152]{{Wayback|url=http://www.jcp.org/en/jsr/detail?id=152 |date=20091023192028 }} (JSP 2.0)&lt;br /&gt;
* [http://www.jcp.org/en/jsr/detail?id=53 JSR 53]{{Wayback|url=http://www.jcp.org/en/jsr/detail?id=53 |date=20100612204354 }} (JSP 1.2)&lt;br /&gt;
&lt;br /&gt;
{{Java (Sun)}}&lt;br /&gt;
{{網頁技術與標準}}&lt;br /&gt;
{{網頁設計}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Java企业平台]]&lt;br /&gt;
[[Category:Java规范请求]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Hrs81458</name></author>
	</entry>
</feed>