这节我们讲讲jsp和servlet的关系,servlet是jsp的基础,那么什么是servlet呢?Servlet是一种基于web的Java组件,它由容器管理,并动态生成其内容。Servlet是与平台无关的Java类,他们被编译成字节码,这些字节码可以被web服务器动态加载。当Web刚开始被用来传送服务时,服务提供者就已经意识到了动态内容的需要。Applet是为了实现这个目标的一种最早的尝试,它主要关注使用客户端平台来交付动态用户体验。与此同时,开发人员也在研究如何使用服务器平台实现这个目标。开始的时候,公共网关接口脚本是生成动态内容的主要技术。虽然使用得非常广泛,但CGI脚本技术有很多的缺陷,这包括平台相关性和缺乏可扩展性。为了避免这些局限性,Servlet技术因应而生,它能够以一种可移植的方法来提供动态的、面向用户的内容。与传统的CGI和许多其他类似CGI的技术相比,Java Servlet具有更高的效率,更容易使用,功能更强大,具有更好的可移植性,更节省投资。在未来的技术发展过程中,Servlet有可能彻底取代CGI ,而且Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程) ,在性能优化方面,Servlet也比CGI有着更多的选择 。Servlet具有的完善的API,Servlet可以自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等,上面我们介绍了Servlet的概念和作用以及特点。那么下面我们先讲一讲Servlet和jsp的比较。
JSP是一种实现静态HTML和动态HTML混合编码的技术,JSP代码更加直观Servlet使用Java代码生成HTML页面,它更适合实现逻辑功能。
我们通过两幅图来说明jsp和servlet的关系。
Sun公司最初用html+servlet的模式,可以说成功的替代了html+CGI的模式,前台用html显示给用户,后台用servlet进行处理,然后把处理的结果显示给用户。从上面两幅图我们可以看出servlet就是纯粹的java程序,上图也反映了jsp转化成serlvet的过程,那么jsp到底是如何转换为servlet的呢,这个不用你操心了,既是服务器又是容器的tomcat已经提供转换机制了,上一节我们写了first.jsp。我们可以进入tomcat的安装目录,可以看到work的子目录,D:\tomcat5.5.122\apache-tomcat-5.5.12\work\Catalina\localhost\jspfirst\org\apache\jsp(我的tomcat安装在D盘)你会发现文件夹里有first_jsp.java,first_jsp.class两个文件。first_jsp.java这个就是servlet的源文件,first_jsp.class是编译后的字节码。当我们在浏览器的地址栏里http://localhost:8080/jspfirst/first.jsp 敲入这个的时候,我们访问的就是这个first—jsp.class。然后转换为html文件显示给用户。
我们在来看看第一节的那幅jsp访问过程图
我们在这节和前两节已经把http和jsp转化成servlet(translated java source)和生成字节码,最终生成html显示给用户。
那么有人会问,sun公司就用servlet就行了,为什么还提出jsp标准干嘛,请看如下代码:
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("<html>\r\n");
out.write("<head><title>百家拳软件项目研究室</title></head>\r\n");
out.write("<body>\r\n");
out.write('\r');
out.write('\n');
out.print(name);
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
大家会发现有out.write();这是输出html的标记,装入浏览器以后,浏览器就可以根据标记对html进行解释,把数据显示给用户。如果要输出50000个数据给用户看,那么就的有50000个out.write();语句,那么这样做肯定不利于代码的维护,所以sun公司推出了jsp标准,jsp将html和java代码分离。显示给用户的那部分完全可以用html,而不像servlet那样转换为html。有的人还会提出这样的疑问,既然jsp比servlet好的多,为什么有时候还用servlet呢,因为servlet在逻辑方面的作用很大。以后如果大家学习mvc模式,大家会发现servlet在其中只作为控制器来用,负责控制请求和响应的。用jsp作为表现层,用来将响应显示给用户。我们这里简单的给大家讲解一下servlet的知识以及如何在tomcat中发布servlet应用程序。
我们写个简单的servlet代码,从代码中我们讲解servlet中的详细方法。
import java.io.* ;
// HttpServlet属于javax.servlet.http包下
// ServletException属于javax.servlet包下
import javax.servlet.* ;
// HttpServletRequest、HttpServletResponse存放在javax.servlet.http包下
import javax.servlet.http.* ;
public class SimpleServlet extends HttpServlet
{
// 表示处理get请求
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
{
PrintWriter out = response.getWriter() ;
out.println("<HTML>") ;
out.println("<HEAD>") ;
out.println("<TITLE>THE FIRST SERVLET</TITLE>") ;
out.println("</HEAD>") ;
out.println("<BODY>") ;
out.println("<H1>Hello World!!!</H1>") ;
out.println("</BODY>") ;
out.println("</HTML>") ;
out.close() ;
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException
{
this.doGet(request,response) ;
}
};
例子下载
这里有个doGet方法和doPost方法。doGet方法是处理客户端的请求的。doPost方法是发送信息的。这个代码是写完了,那么我们如何发布servlet程序呢。
首先我们进入tomcat的安装目录,在webapps中创建一个文件夹叫做simpleservlet,和发布jsp的文件一样将ROOT中的WEB-INF和lib复制到simpleservlet中,再在WEB-INF下创建一个classes文件夹,把SimpleServlet.java文件放到这个文件夹里。对SimpleServlet.java进行编译,你可以ant工具进行编译,但我不提倡用它。你可以直接编译SimpleServlet.java文件,但是你会发现提示很多的错误(找不到HttpServletRequest、HttpServletResponse类)这是因为你没有载入servlet-api.jar的包,里面存有HttpServletRequest、HttpServletResponse类。而servlet-api.jar包放在tomcat的安装里的\common\lib中,你可以将servlet-api.jar复制粘贴到你的jdk的安装目录\jre\lib\ext中,这次你再调用就可以成功编译了。因为这个java文件没有在web应用程序里,我们上节提到了web-xml但没有详讲,其实他的用处之一就是用来配置servlet的,我们记事本将它打开,然后敲入以下代码:
<?xml version="1.0" encoding="utf-8"?>
<servlet>//声明一个servlet开始
<servlet-name>simple</servlet-name>//servlet的名字是simple
<servlet-class> SimpleServlet</servlet-class>//对应的类名,如果你将类文件放入包中你可以包名.类名
</servlet>
<servlet-mapping>//一个servlet映射的开始
<servlet-name>simple</servlet-name>//servlet的名字是simple,这名字必须和上面的名字一样,如果不一样就无法关联在一起了。
<url-pattern>/demo</url-pattern>//访问servlet的路径
</servlet-mapping>//一个servlet映射的结束
例子下载
这时,我们再启动tomcat服务器,打开浏览器在地址栏里敲入URL:http://localhost:8080/simpleservlet/demo 你可以成功的访问servlet了。注意:每一次修改web-xml,你都的重新启动tomcat服务器,重新发布web应用程序。
Servlet的知识,我们就简单的讲这么多,其实servlet还有很多问题,像servlet的生命周期,过滤器,监听器等等。如果大家想研究这个我可以提供学习资料。
下一节我们讲一讲jsp的基础,讲一讲jsp的基本语法。