JSP在本质上就是SERVLET,但是两者的创建方式不一样
Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观
JSP由HTML代码和JSP标签构成,可以方便地编写动态网页
因此在实际应用中采用Servlet来控制业务流程,而采用JSP来生成动态网页
简单的说,SUN首先发展出SERVLET,其功能比较强劲,体系设计也很先进,只是,它输出HTML语句还是采用了老的CGI方式,是一句一句输出,所以,编写和修改HTML非常不方便。 后来SUN推出了类似于.NET中的ASP的镶嵌型的JSP,把JSP TAG镶嵌到HTML语句中,这样,就大大简化和方便了网页的设计和修改。新型的网络语言如ASP,PHP,JSP都是镶嵌型的SCRIPT语言。
1 jsp经编译后就变成了Servlet
(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
2 jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
3 Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。
而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
通过代码来解释一下:
login.jsp文件内容:
登录测试用户名 | |
密码 | |
这个jsp文件在编译后会变成java文件login_jsp.java 如下:
这个java类继承了HttpJspBase 而HttpJspBase继承了HttpServlet 也就是说被编译成了一个servlet
/** Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/7.0.82
* Generated at: 2018-06-26 03:54:34 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.*/
packageorg.apache.jsp;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;public final class login_jsp extendsorg.apache.jasper.runtime.HttpJspBaseimplementsorg.apache.jasper.runtime.JspSourceDependent {private static final javax.servlet.jsp.JspFactory _jspxFactory =javax.servlet.jsp.JspFactory.getDefaultFactory();private static java.util.Map_jspx_dependants;private volatilejavax.el.ExpressionFactory _el_expressionfactory;private volatileorg.apache.tomcat.InstanceManager _jsp_instancemanager;public java.util.MapgetDependants() {return_jspx_dependants;
}publicjavax.el.ExpressionFactory _jsp_getExpressionFactory() {if (_el_expressionfactory == null) {synchronized (this) {if (_el_expressionfactory == null) {
_el_expressionfactory=_jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}return_el_expressionfactory;
}publicorg.apache.tomcat.InstanceManager _jsp_getInstanceManager() {if (_jsp_instancemanager == null) {synchronized (this) {if (_jsp_instancemanager == null) {
_jsp_instancemanager=org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}return_jsp_instancemanager;
}//servlet中的init
public void_jspInit() {
}//servlet中的destory
public void_jspDestroy() {
}//servlet中的service
public void _jspService(final javax.servlet.http.HttpServletRequest request, finaljavax.servlet.http.HttpServletResponse response)throwsjava.io.IOException, javax.servlet.ServletException {finaljavax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session= null;finaljavax.servlet.ServletContext application;finaljavax.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;//我们在js页面上写的html标签
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("
\r\n");out.write("
登录\r\n");out.write("\r\n");
out.write("
\r\n");out.write("
\r\n");out.write("
out.write("
\r\n");out.write("
用户名\r\n");out.write("
\r\n");out.write("
\r\n");out.write("
\r\n");out.write("
密码\r\n");out.write("
\r\n");out.write("
\r\n");out.write("
\r\n");out.write("
\r\n");out.write("
\r\n");out.write("
\r\n");out.write("
\r\n");out.write("\r\n");
out.write("\r\n");
}catch(java.lang.Throwable t) {if (!(t instanceofjavax.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 newServletException(t);
}
}finally{
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
通过代码我们发现 jsp文件在编译的时候 会编译成servlet来交给jvm去执行 所以我们可以得出一个结论也就是我们文章开头说的:jsp在本质上就是一个servlet。