jsp教程上:我们一定学了servlet,也学习了jsp,那么jsp与servlet的区别是什么呢,jsp与servlet又有什么关系呢?下面我们先创建一个demo.jsp的页面,然后tomcat运行,看看jsp编译之后是怎么样的呢?
<%@page import="java.text.SimpleDateFormat"%> <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>jsp演示代码</title> </head> <body> <% SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); out.write("输出当前时间:"+sf.format(new Date())); %> </body> </html>
demo.jsp代码运行的结果是:
输出当前时间:2017-02-08 22:09:10
上面的代码已经运行之后,我们再到tomcat服务器的work\Catalina文件夹里面去查看编译后生成的demo_jsp.java这个文件,看看demo.jsp文件被编译之后变成java文件之后是什么样子的。
package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import java.text.SimpleDateFormat; import java.util.*; public final class demo_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { //删除了部分代码 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.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("\r\n"); String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; out.write("\r\n"); out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n"); out.write("<html>\r\n"); out.write(" <head>\r\n"); out.write(" <base href=\""); out.print(basePath); out.write("\">\r\n"); out.write(" \r\n"); out.write(" <title>jsp演示代码</title>\r\n"); out.write(" </head>\r\n"); out.write(" <body>\r\n"); out.write(" "); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); out.write("输出当前时间:"+sf.format(new Date())); out.write("\r\n"); out.write(" </body>\r\n"); out.write("</html>\r\n"); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { if (response.isCommitted()) { out.flush(); } else { out.clearBuffer(); } } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else throw new ServletException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } } }
你会发现上面的demo.jsp文件被编译成了servlet的代码,其实jsp和servlet的区别就是表现形式不一样,本质却是一样的,servlet是完全可以替代这个demo.jsp来输出这个页面,但是为什么又需要jsp呢?
这是因为在实际项目中,jsp有网页标签,适合做网页界面的设计,如果所有的js和css都通过servlet来write输出的话,代码会变得非常繁琐,所以实际项目中servlet主要负责网站后台逻辑的实现,jsp主要负责的是页面的布局和后台数据的获取。
jsp和servlet的关系实际上就是一种互补的关系,只是职责不一样,完整学习jsp教程,请看下一篇:10分钟学会使用jsp内置对象域对象及el表达式