7图解JSP与Servlet的关系.docx
- 文档编号:13710993
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:13
- 大小:68.21KB
7图解JSP与Servlet的关系.docx
《7图解JSP与Servlet的关系.docx》由会员分享,可在线阅读,更多相关《7图解JSP与Servlet的关系.docx(13页珍藏版)》请在冰点文库上搜索。
7图解JSP与Servlet的关系
图解JSP与Servlet的关系
Servlet是Java提供的用于开发Web服务器应用程序的一个组件,运行在服务器端,由Servlet容器所管理,用于生成动态的内容。
Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。
如图所示,Java提供一系列接口类(所谓接口类就是类中所有方法只提供方法声明,不提供任何的方法实现,这些类的实现就留给后继者去做。
):
Servlet、ServletConfig、Serializable,然后通过多重继承产生一个最通用的Servlet实现类(图中GernericServlet类),接下来,通过一个多重继承与实现,产生一个新的实现类HttpServlet,用户在开发Servlet程序时只需继承这个类,从而产生一个自己的类(图中Hello_Servlet类),然后根据实际开发功能与信息处理需要,去实现该类中的相关方法即可。
这就是前面提到的按照Servlet规范编写一个Java类,从而编写一个Servlet。
至于JSP(JavaServletPage)从图中可以看出,实际上它也是从Servlet继承而来。
只不过它在Servlet当中又添加/修改了一些方法,作了新的封装。
具体到TomcatWeb应用服务器中,它通过一个多重继承,分别从Java的HttpJspPage和HttpServlet两个类那里继承和实现一些方法,然后封装一个叫做HttpJspBase的类从而实现了一个通用化的JSP类,用户在开发自己的JSP时,只需要从HttpJspBase继承一个自己的类(如图中Hello_jsp类),然后根据需要去实现相应的方法即可。
因此这也是为什么JSP的代码中总是闪现Servlet代码框架影子的原因,其实它们只是为实现同样的功能而进行了不同封装的组件而已,血脉里留着的是一样的血。
“既生瑜何生亮?
”呵呵,因为JSP确实比Servlet要更胜一筹,所谓“青出于蓝胜于蓝”,既然Sun公司要在Servlet基础上推出JSP技术,那肯定是因为JSP有它更高明的地方。
使用Servlet产生动态网页,需要在代码中打印输出很多HTML的标签,此外,在Servlet中,我们不得不将静态现实的内容和动态产生内容的代码混合在一起。
使用Servlet开发动态网页,程序员和网页编辑人员将无法一起工作,因为网页编辑人员不了解Java语言,无法修改Servlet代码,而Java程序员可能也不是很了解网页编辑人员的意图,以至于无法修改和实现网页功能。
为了解决这些问题,Sun公司就推出了JSP技术。
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而言,JSP页面生成的Servlet放在work路径对应的Web应用下。
以apache-tomcat-7.0.37\webapps\myapp\index.jsp为例,
Nowtimeis:
<%=newjava.util.Date()%>
当启动Tomcat之后,可以在Tomcat的apache-tomcat-7.0.37\work\Catalina\localhost\myapp\org\apache\jsp目录下找到如下文件:
indexd.java和index.class。
这两个文件都是Tomcat生成的,Tomcat根据JSP页面生成对应Servlet的Java文件及class文件。
index.java
//JSP页面经过Tomcat编译后默认的包
packageorg.apache.jsp;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjavax.servlet.jsp.*;
//继承HttpJspBase类,该类其实是个Servlet的子类
publicfinalclassindex_jspextendsorg.apache.jasper.runtime.HttpJspBase
implementsorg.apache.jasper.runtime.JspSourceDependent{
privatestaticfinaljavax.servlet.jsp.JspFactory_jspxFactory=
javax.servlet.jsp.JspFactory.getDefaultFactory();
privatestaticjava.util.Map
privatejavax.el.ExpressionFactory_el_expressionfactory;
privateorg.apache.tomcat.InstanceManager_jsp_instancemanager;
publicjava.util.Map
return_jspx_dependants;
}
publicvoid_jspInit(){
_el_expressionfactory=_jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
_jsp_instancemanager=org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
publicvoid_jspDestroy(){
}
//用于响应用户的方法
publicvoid_jspService(finaljavax.servlet.http.HttpServletRequestrequest,finaljavax.servlet.http.HttpServletResponseresponse)
throwsjava.io.IOException,javax.servlet.ServletException{
finaljavax.servlet.jsp.PageContextpageContext;
javax.servlet.http.HttpSessionsession=null;
finaljavax.servlet.ServletContextapplication;
finaljavax.servlet.ServletConfigconfig;
//获得页面输出流
javax.servlet.jsp.JspWriterout=null;
finaljava.lang.Objectpage=this;
javax.servlet.jsp.JspWriter_jspx_out=null;
javax.servlet.jsp.PageContext_jspx_page_context=null;
//开始生成响应
try{
//设置输出的页面格式
response.setContentType("text/html");
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("
\r\n");out.write("
out.write("Nowtimeis:
");
out.print(newjava.util.Date());
out.write("\r\n");
out.write("
out.write("\r\n");
out.write("");
}catch(java.lang.Throwablet){
if(!
(tinstanceofjavax.servlet.jsp.SkipPageException)){
out=_jspx_out;
if(out!
=null&&out.getBufferSize()!
=0)
try{out.clearBuffer();}catch(java.io.IOExceptione){}
if(_jspx_page_context!
=null)_jspx_page_context.handlePageException(t);
elsethrownewServletException(t);
}
}finally{
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
JSP页面中内置了几个对象,如pageContext、application、config、page、session、out等_jspService()方法,这几个内置对象就是在这里定义的。
根据上面的JSP页面工作原理图,可以得到如下结论:
JSP文件必须在JSP服务器内运行。
JSP文件必须生成Servlet才能执行。
每个JSP页面的第一个访问者速度很慢,因为必须等待JSP编译成Servlet。
JSP页面的访问者无须安装任何客户端,甚至不需要可以运行Java的运行环境,因为JSP页面输送到客户端的是标准HTML页面。
index.jsp页面中的每个字符都由index.java文件的输出流生成.
servlet是在web服务器上的java程序,它提供服务,由它来传递给你html的格式。
ServletAPI为Servlet提供了统一的编程接口
Servlet必须部署在Servlet容器,才能响应客户端的请求 对外提供服务。
要对外统一接口,由容器来调用。
jsp侧重显示;servlet侧重控制逻辑。
MVC模式:
Jsp+Servlet+ JavaBean。
M-JavaBeanV-JspC-Servlet
小应用程序(Applet)是指采用Java创建的基于HTML的程序。
浏览器将其暂时下载到用户的硬盘上,并在Web页打开时在本地运行。
们可以直接嵌入到网页或者其他特定的容器中,并能够产生特殊的效果。
所有基于Java的服务器端编程都是构建在Servlet之上的。
在J2EE中Servlet已经是一个标准的组件。
目前,Servlet引擎一般是第三方的插件,它通过一定的方法连接到Web服务器,Servlet引擎把它识别为Servlet请求的那些HTTP请求截获下来处理,而其他的HTTP请求由Web服务器按照通常的方式来处理,Servlet引擎会装载合适的Servlet到内存中,如果Servlet还没有运行的话,会分配一个可以使用的线程来处理请求,再把Servlet的输出返回到发出请求的Web客户机。
JavaServlet和JavaApplet正好是相对应的两种程序类型,Applet运行在客户端,在浏览器内执行,而Servlet在服务器内部运行,通过客户端提交的请求启动运行。
同样的Servlet完全可以在Apache,IIS等不同Web服务器上执行,不管底层的操作系统是Windows,Solaris,Mac,Linux。
JavaServlet有着十分广泛的应用。
使用Servlet还可以实现大量的服务器端的管理维护功能,以及各种特殊的任务,比如,并发处理多个请求,转送请求,代理等。
典型的Servlet运行环境有JSWDK,Tomcat,Resin等,。
它们都自带一个简单的HTTPServer,只需简单配置即可投入使用,你也可以把它们绑定到常用的Web服务器上,如Apache,IIS等,提供小规模的Web服务。
还有一些商业的大中型的支持Servlet和JSP的Web服务器,如JRun,WebSphere,WebLogic等等,配置比较复杂,并不适合初学者。
但是功能较为强大,有条件的读者可以一试。
importjava.io.*;
importjava.util.*;
importjavax.servlet.http.*;
importjavax.servlet.*;
//导入必要的包
publicclassHelloServletextendsHttpServlet{
//所有Servlet必须从HttpServlet派生
publicvoiddoGet(HttpServletRequestreq,HttpServletResponseres)
throwsServletException,IOException
//doGet()是这个Servlet的核心,真正处理请求的地方
{
res.setContentType("text/html");
//设置相应的类型为text/html
PrintWriterpw=res.getWriter();
//从HttpServletResponse得到输出流
pw.println("
DOCTYPEHTMLPUBLIC""-//W3C//DTDHTML4.0Transitional//EN"">");
pw.println("
"); pw.println("
pw.println("
--TheServletexpressiontagsinterpolatescriptvariablesintotheHTML-->");
pw.println("
pw.println("");
pw.println("
pw.println("
Hello,world!
");
pw.println("