jsp是servlet的扩展,在没有jsp之前,就已经出现了servlet。servlet是利用输出流动态生成html页面,包括每个html标签和每个在html页面中出现的内容。
jsp通过在标准的html页面中插入java代码,其静态的部分无需java程序控制,只有那些需要从数据库读取并根据程序动态生成信息时,才使用java脚本控制.
简单说,jsp是servlet的一种特殊形式,每个jsp页面就是一个servlet实例,因为jsp页面由系统编译成servlet,servlet再负责响应用户请求。jsp也可以说成是servlet的一种简化,因为使用jsp时,其实还是使用servlet,因为web应用中的每个jsp页面都会由servlet容器生成对应的servlet。具体流程如下图所示:
以Tomcat为例,对于Tomcat而言,jsp页面生成的servlet放在work路径对应的web应用下。
例如之前做过的商城SSH,因为我用的是myeclipse自带的Tomcat,对应的路径如下图:
当启动Tomcat之后,可以在Tomcat的\work\Catalina\localhost\***\org\apache\jsp目录下找到如下文件:**_jsp.java和**_jsp.class。这两个文件都是Tomcat生成的,Tomcat根据JSP页面生成对应Servlet的Java文件及class文件。如下图:
查看**_.java文件,可以看出上文提到的输出流生成页面。
bottom.jsp的代码:
<%@ page language="java" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">
<!-- body { background-color: #FFFFFF; margin: 0px;}
body,td,th { font-size: 12px; color: #000000; }
-->
</style>
</HEAD>
<body MS_POSITIONING="GridLayout">
<table width="100%" border="0" cellspacing="0" cellpadding="10" height="64">
<tr>
<td align="center" width="100%" style= valign="top" background="${pageContext.request.contextPath}/images/bt_02.jpg">商城管理平台 <br>
<font class="font12">
<a class="a03" target="_blank" href="mailto:sarft@chinasarft.gov.cn">
<font color="#000000"><br>
��</font></a></font></td>
</tr>
</table>
</body>
</HTML>
bottom_jsp.java的代码:
package org.apache.jsp.admin;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class bottom_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();
private static java.util.List _jspx_dependants;
private javax.el.ExpressionFactory _el_expressionfactory;
private org.apache.AnnotationProcessor _jsp_annotationprocessor;
public Object getDependants() {
return _jspx_dependants;
}
public void _jspInit() {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
}
public void _jspDestroy() {
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
response.setContentType("text/html;charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\r\n");
out.write("<html>\r\n");
out.write("\t<head>\r\n");
out.write("\t\t<meta http-equiv=\"Content-Language\" content=\"zh-cn\">\r\n");
out.write("\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
out.write("\t\t<style type=\"text/css\">\r\n");
out.write("\t\t<!-- body { background-color: #FFFFFF; margin: 0px;}\r\n");
out.write("\t\tbody,td,th { font-size: 12px; color: #000000; }\r\n");
out.write("\t\t--> \r\n");
out.write("\t\t</style>\r\n");
out.write("\t</HEAD>\r\n");
out.write("\t<body MS_POSITIONING=\"GridLayout\">\r\n");
out.write("\t\t<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"10\" height=\"64\">\r\n");
out.write("\t\t\t<tr>\r\n");
out.write("\t\t\t\t<td align=\"center\" width=\"100%\" style= valign=\"top\" background=\"");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${pageContext.request.contextPath}", java.lang.String.class, (PageContext)_jspx_page_context, null, false));
out.write("/images/bt_02.jpg\">商城管理平台 <br>\r\n");
out.write("\t\t\t\t<font class=\"font12\">\r\n");
out.write("\t\t\t\t<a class=\"a03\" target=\"_blank\" href=\"mailto:sarft@chinasarft.gov.cn\">\r\n");
out.write("\t\t\t\t<font color=\"#000000\"><br>\r\n");
out.write("��</font></a></font></td>\r\n");
out.write("\t\t\t</tr>\r\n");
out.write("\t\t</table>\r\n");
out.write("\t</body>\r\n");
out.write("</HTML>");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try { out.clearBuffer(); } catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
根据上面的JSP页面工作原理图,可以得到如下结论: JSP文件必须在JSP服务器内运行。JSP文件必须生成Servlet才能执行。每个JSP页面的第一个访问者速度很慢,因为必须等待JSP编译成Servlet。JSP页面的访问者无须安装任何客户端,甚至不需要可以运行Java的运行环境,因为JSP页面输送到客户端的是标准HTML页面。**.jsp页面中的每个字符都由index.java文件的输出流生成.
【jsp和servlet的比较】
1.两者构成方式不同,其实主要是在比较代码风格,因为servlet完全是java程序代码构成,jsp由html代码和jsp标签构成。
2.单看代码也可以看出,jsp更像是在html页面中插入java代码,而servlet更像是在java逻辑代码中拼接页面,所以jsp侧重页面的显示,servlet侧重控制逻辑。
3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
4.jsp本质上就是servlet,jsp是Servlet的一种简化。jsp经编译后就是一种类Servlet。
5.Servlet主要用于转向,将请求转向到相应的jsp页面。