JSP

jsp:include

<html><head></head><body><jsp:include page="mycommon.jsp" >
    <jsp:param name="extraparam" value="myvalue" /></jsp:include>
name:<%=request.getParameter("extraparam")%></body></html>

jsp:forward

<jsp:forward page="subpage.jsp" >
     <jsp:param name="forwardedFrom" value="this.jsp" /></jsp:forward>
在本例中，请求被传递到"subpage.jsp"，而且请求的处理权不会再返回前者。

jsp:plugin

<jsp:plugin type=applet height="100%" width="100%"
            archive="myjarfile.jar,myotherjar.jar"
            codebase="/applets"
            code="com.foo.MyApplet" >
    <jsp:params>
        <jsp:param name="enableDebug" value="true" />
    </jsp:params>
    <jsp:fallback>
        Your browser does not support applets.
    </jsp:fallback></jsp:plugin>
上述plugin例子说明了一种在网页中嵌入applet的统一方法。在<OBJECT>标签出现之前，并没有一种嵌入applets的通用方法。这个标签设计得并不好，但有希望在以后加入动态属性（height="${param.height}", code="${chart}"等）和动态参数的新功能。当前jsp:plugin标签不允许动态调用applets。例如，你如果有一个图表applet需要数据点以参数形式被传入，除非数据点的数量是一个常量，否则你就不能使用ResultSet循环来创建jsp:param标签，你不得不手写每个jsp:param标签的代码。而每个上述jsp:param标签可以有一个动态命名和动态值。

本地化

JSP的本地化是通过和JAVA应用程序相同的方式完成的，即使用资源包。

模型-视图-控制器 模式

为了把表现层（presentation）从请求处理（request processing）和数据存储（data storage）中分离开来（这样更利于开发、查错和功能扩展），升阳公司推荐在JSP文件中使用一种称作模型-视图-控制器（MVC）的架构模式。按照此设计，当用户访问网站上的特定网址时，用户的处理请求会先由网站服务器获取到，然后先交由网站的控制器程序作初步处理。用户的访问请求可能多种多样，比如查询信息或进行数据计算都是常见的网站业务。控制器程序会初步判断用户请求的种类，然后把用户请求转发给与特定业务对应的Servlet程序或者另一个独立的JSP文件进行业务处理。当请求处理完后，再通过一个专门负责输出信息的JSP页以清晰、美观的方式向用户的浏览器输出结果。简而言之，先由控制器拦截用户请求并做初步判断，再由业务处理程序访问数据（从数据库中访问）和处理业务，最后由视图组件生成结果页面并发送结果给用户。其中JSP一般用作展示输出结果，可以用于展示经Servlet查询或处理后的结果；也可以用一个JSP文件处理业务逻辑，再用另一个JSP文件展示结果。按功能做这样的文件拆分（而非由一个臃肿的JSP页面包揽所有功能）是为了便于团队分工。MVC本身是一种由来已久的设计思想，基于JSP的技术只是实现MVC架构的流行方案之一。Struts和Spring框架等好几种流行的网站建设框架都是基于MVC模式设计的。

JSP和Servlets

从架构上说，JSP可以被看作是从Servlets高级提炼而作为JAVA Servlet 2.1 API的扩展而应用。Servlets和JSP最早都是由Sun Microsystems（太阳公司）开发的。从JSP1.2版本以来，JSP处于Java Community Process（有人译为：Java社区组织）开发模式下。JSR-53规定了JSP 1.2和Servlet 2.4的规范，JSR-152规定了JSP 2.0的规范。2006年5月，JSP 2.1的规范作为Java EE 5的一部分，在JSR-245中发布。
静态数据在输入文件中的内容和输出给HTTP响应的内容完全一致。此时，该JSP输入文件会是一个没有内嵌JAVA或动作的HTML页面。而且，客户端每次请求都会得到相同的响应内容。

样例

不管JSP编译器是生成SERVLET的JAVA源码，或者是直接发布二进制码，了解一下JSP编译器是如何把文件转换成一个JAVA SERVLET，都是很有帮助的。例如，看一下如下输入JSP和它最后生成的JAVA SERVLET：
Input JSP
<%@ page errorPage="myerror.jsp" %>
<%@ page import="com.foo.bar" %>

<html><head><%! int serverInstanceVariable = 1;%>
...
<% int localStackBasedVariable = 1; %>
<table>
    <tr><td><%= "expanded inline data " + 1 %></td></tr>
    ...
Resulting servlet
package jsp_servlet;import java.util.*;import java.io.*;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;import javax.servlet.jsp.tagext.*;import com.foo.bar; //imported as a result of <%@ page import="com.foo.bar" %>import ...class _myserlvet implements javax.servlet.Servlet, javax.servlet.jsp.HttpJspPage {
    //inserted as a
    //result of <%! int serverInstanceVariable = 1;%>
    int serverInstanceVariable = 1;
    ...

    public void _jspService( javax.servlet.http.HttpServletRequest request,
                            javax.servlet.http.HttpServletResponse response )
        throws javax.servlet.ServletException,
               java.io.IOException
    {
        javax.servlet.ServletConfig config = ...;//get the servlet config
        Object page = this;
        PageContext pageContext = ...;//get the page context for this request
        javax.servlet.jsp.JspWriter out = pageContext.getOut();
        HttpSession session = request.getSession( true );
        try {
             out.print( "<html>\r\n" );
             out.print( "<head>\r\n" );
             ...
             //from <% int localStackBasedVariable = 1; %>
             int localStackBasedVariable = 1;
             ...
             out.print( "<table>\r\n" );
             out.print( "   <tr><td>" );
             //note, toStringOrBlank() converts the expression into a string or if
             // the expression is null, it uses the empty string.
             //from <%= "expanded inline data " + 1 %>
             out.print( toStringOrBlank( "expanded inline data " + 1 ) );
             out.print( "   </td></tr>\r\n" );
             ...
        } catch ( Exception _exception ) {
           //clean up and redirect to error page in <%@ page errorPage="myerror.jsp" %>
        }
    }}