jsp初步认识 与其servlet编译原理
2016-07-27 23:48
369 查看
前面只是介绍一点概念。
JSP的编译原理:
jsp实际上一个Servlet对象
参看tomcat目录下的各项目的work目录,生成的jsp编译成的.java文件
jsp页面:
<span style="color:#000000;"><%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>login</title> <script type="text/javascript"> /* function imgUpdate(){ var imgNode= document.getElementsByTagName("img").item(0); //浏览器的缓存,对相同url的请求无效,改变参数来达到刷新 var t=new Date().getTime(); imgNode.src="/WebStudy/Captcha?"+t; }*/ onload=function(){ var value=document.getElementById("has").value; if(value=="true"){ alert("用户已存在"); } var value=document.getElementById("add").value; if(value=="true") alert("用户创建成功"); else if(value=="false") alert("用户创建失败"); }; </script> </head> <body> <!-- /WebStudy/Captcha 对servelt的请求,需要在web.xml配置servel的路径映射url-pattern <img src="/WebStudy/Captcha"/><a href="javascript:imgUpdate()">看不清</a> <a href="OneServelt">一次转发</a> <a href="/WebStudy/OneServelt">一次转发</a> <a href="">多次转发</a> <a href="ChongServelt">重定向</a>--> <form action="LoginServlet" method="post"> 姓名:<input type="text" name="name"/> 密码:<input type="password" name="pwd"/> <input type="submit" value="提交"> <input type="hidden" value="<%=request.getAttribute("has") %>" id="has"> <input type="hidden" value="<%=request.getParameter("add") %>" id="add"> </form> <a href="LoginServlet">查看所有用户</a> <a href="MyServletConfig">配置参数</a> <a href="MyConTextServlet">留言板</a> <a href="PicServlet">picDown</a> <a href="RequestServlet">request</a> <form action="RequestServlet" method="post" enctype="application/x-www-form-urlencoded"> Name:<input type="text" name="name"/><br/> Age:<input type="text" name="age"/><br/> 爱好: <input type="checkbox" name="hoby" value="MUSIC"/>音乐 <input type="checkbox" name="hoby" value="MTV"/>电视 <input type="checkbox" name="hoby" value="driver"/>开车<br/> 性别: <input type="radio" name="sex" value="0" checked="checked"/>男 <input type="radio" name="sex" value="1"/>女 <input type="submit" value="提交"/> </form> <form action="UploadServlet" method="post" enctype="multipart/form-data"> Name:<input type="text" name="name"/><br/> Age:<input type="text" name="age"/><br/> 爱好: <input type="checkbox" name="hoby" value="MUSIC"/>音乐 <input type="checkbox" name="hoby" value="MTV"/>电视 <input type="checkbox" name="hoby" value="driver"/>开车<br/> 性别: <input type="radio" name="sex" value="0" checked="checked"/>男 <input type="radio" name="sex" value="1"/>女 上传文件: <input type="file" name="txtFile"> <input type="file" name="imgFile"> <input type="submit" value="提交"/> </form> <a href="cookieServlet">Cookie</a> <a href="show.jsp">图片</a><br/> <a href="jsCookie.jsp">js操作Cookie</a><br/> <a href="sessionServlet">session</a> <form action="getServlet" method="post"> Name:<input type="text" name="name"/><br/> Age:<input type="text" name="age"/><br/> <input type="submit" value="提交"/> </form> 验证码: <form action="validateServlet" method="post"> Name:<input type="text" name="name"/><br/> Age:<input type="text" name="age"/><br/> <img src="bufImgServlet"><input type="text" name="validate"/><br/> <input type="submit" value="提交"/> </form> </body> </html></span>
编译后的.java文件
<span style="color:#000000;">package org.apache.jsp; import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import java.util.*; public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory(); private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants; private javax.el.ExpressionFactory _el_expressionfactory; private org.apache.tomcat.InstanceManager _jsp_instancemanager; public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; } public void _jspInit() { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } public void _jspDestroy() { } </span><pre name="code" class="java"> public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { <span style="color:#FF0000;"> 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;</span> 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"); 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(" <title>login</title>\r\n"); out.write("\t<script type=\"text/javascript\">\r\n"); out.write("\t /* function imgUpdate(){\r\n"); out.write("\t var imgNode= document.getElementsByTagName(\"img\").item(0);\r\n"); out.write("\t //浏览器的缓存,对相同url的请求无效,改变参数来达到刷新\r\n"); out.write("\t var t=new Date().getTime();\r\n"); out.write("\t imgNode.src=\"/WebStudy/Captcha?\"+t;\r\n"); out.write("\t }*/\r\n"); out.write("\t onload=function(){\r\n"); out.write("\t var value=document.getElementById(\"has\").value;\r\n"); out.write("\t if(value==\"true\"){\r\n"); out.write("\t alert(\"用户已存在\");\r\n"); out.write("\t }\r\n"); out.write("\t var value=document.getElementById(\"add\").value;\r\n"); out.write("\t \r\n"); out.write("\t if(value==\"true\")\r\n"); out.write("\t alert(\"用户创建成功\");\r\n"); out.write("\t else if(value==\"false\")\r\n"); out.write("\t alert(\"用户创建失败\");\r\n"); out.write("\t \r\n"); out.write("\t };\r\n"); out.write("\t</script>\r\n"); out.write(" </head>\r\n"); out.write(" \r\n"); out.write(" <body>\r\n"); out.write(" <!-- /WebStudy/Captcha 对servelt的请求,需要在web.xml配置servel的路径映射url-pattern \r\n"); out.write(" <img src=\"/WebStudy/Captcha\"/><a href=\"javascript:imgUpdate()\">看不清</a>\r\n"); out.write(" <a href=\"OneServelt\">一次转发</a>\r\n"); out.write(" <a href=\"/WebStudy/OneServelt\">一次转发</a>\r\n"); out.write(" <a href=\"\">多次转发</a>\r\n"); out.write(" <a href=\"ChongServelt\">重定向</a>-->\r\n"); out.write(" <form action=\"LoginServlet\" method=\"post\">\r\n"); out.write(" 姓名:<input type=\"text\" name=\"name\"/>\r\n"); out.write(" 密码:<input type=\"password\" name=\"pwd\"/>\r\n"); out.write(" <input type=\"submit\" value=\"提交\">\r\n"); out.write(" <input type=\"hidden\" value=\""); out.print(request.getAttribute("has") ); out.write("\" id=\"has\"> \r\n"); out.write(" <input type=\"hidden\" value=\""); out.print(request.getParameter("add") ); out.write("\" id=\"add\"> \r\n"); out.write(" </form>\r\n"); out.write(" <a href=\"LoginServlet\">查看所有用户</a>\r\n"); out.write(" <a href=\"MyServletConfig\">配置参数</a>\r\n"); out.write(" <a href=\"MyConTextServlet\">留言板</a>\r\n"); out.write(" <a href=\"PicServlet\">picDown</a>\r\n"); out.write(" <a href=\"RequestServlet\">request</a>\r\n"); out.write(" <form action=\"RequestServlet\" method=\"post\" enctype=\"application/x-www-form-urlencoded\">\r\n"); out.write(" Name:<input type=\"text\" name=\"name\"/><br/>\r\n"); out.write(" Age:<input type=\"text\" name=\"age\"/><br/>\r\n"); out.write(" 爱好:\r\n"); out.write(" <input type=\"checkbox\" name=\"hoby\" value=\"MUSIC\"/>音乐 \r\n"); out.write(" <input type=\"checkbox\" name=\"hoby\" value=\"MTV\"/>电视 \r\n"); out.write(" <input type=\"checkbox\" name=\"hoby\" value=\"driver\"/>开车<br/>\r\n"); out.write(" 性别:\r\n"); out.write(" <input type=\"radio\" name=\"sex\" value=\"0\" checked=\"checked\"/>男 \r\n"); out.write(" <input type=\"radio\" name=\"sex\" value=\"1\"/>女\r\n"); out.write(" <input type=\"submit\" value=\"提交\"/>\r\n"); out.write(" </form>\r\n");
out.write(" <form action=\"UploadServlet\" method=\"post\" enctype=\"multipart/form-data\">\r\n"); out.write(" Name:<input type=\"text\" name=\"name\"/><br/>\r\n"); out.write(" Age:<input type=\"text\" name=\"age\"/><br/>\r\n"); out.write(" 爱好:\r\n"); out.write(" <input type=\"checkbox\" name=\"hoby\" value=\"MUSIC\"/>音乐 \r\n"); out.write(" <input type=\"checkbox\" name=\"hoby\" value=\"MTV\"/>电视 \r\n"); out.write(" <input type=\"checkbox\" name=\"hoby\" value=\"driver\"/>开车<br/>\r\n"); out.write(" 性别:\r\n"); out.write(" <input type=\"radio\" name=\"sex\" value=\"0\" checked=\"checked\"/>男 \r\n"); out.write(" <input type=\"radio\" name=\"sex\" value=\"1\"/>女\r\n"); out.write(" 上传文件:\r\n"); out.write(" <input type=\"file\" name=\"txtFile\">\r\n"); out.write(" <input type=\"file\" name=\"imgFile\">\r\n"); out.write(" <input type=\"submit\" value=\"提交\"/>\r\n"); out.write(" </form>\r\n"); out.write(" <a href=\"cookieServlet\">Cookie</a>\r\n"); out.write(" <a href=\"show.jsp\">图片</a><br/>\r\n"); out.write(" <a href=\"jsCookie.jsp\">js操作Cookie</a><br/>\r\n"); out.write(" <a href=\"sessionServlet\">session</a>\r\n"); out.write(" <form action=\"getServlet\" method=\"post\">\r\n"); out.write(" Name:<input type=\"text\" name=\"name\"/><br/>\r\n"); out.write(" Age:<input type=\"text\" name=\"age\"/><br/>\r\n"); out.write(" <input type=\"submit\" value=\"提交\"/>\r\n"); out.write(" </form>\r\n"); out.write(" 验证码:\r\n"); out.write(" <form action=\"validateServlet\" method=\"post\">\r\n"); out.write(" Name:<input type=\"text\" name=\"name\"/><br/>\r\n"); out.write(" Age:<input type=\"text\" name=\"age\"/><br/>\r\n"); out.write(" <img src=\"bufImgServlet\"><input type=\"text\" name=\"validate\"/><br/>\r\n"); out.write(" <input type=\"submit\" value=\"提交\"/>\r\n"); out.write(" </form>\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 { 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); } } }
我们可以看出jsp编译后是一个public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
jsp页面中的html代码全部以PrintWrite.wirte()打印流输出。将jsp页面的java代码复制到_jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)这个函数的相应的位置运行
下来看一下org.apache.jasper.runtime.HttpJspBase是否是一个Servlet?
package org.apache.jasper.runtime; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.HttpJspPage; import org.apache.jasper.compiler.Localizer; <span style="color:#FF0000;">public abstract class HttpJspBase extends HttpServlet</span> implements HttpJspPage { private static final long serialVersionUID = 1L; public final void init(ServletConfig config) throws ServletException { super.init(config); jspInit(); _jspInit(); } public String getServletInfo() { return Localizer.getMessage("jsp.engine.info"); } public final void destroy() { jspDestroy(); _jspDestroy(); } public final void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { _jspService(request, response); }</span> public void jspInit() { } public void _jspInit() { } public void jspDestroy() { } protected void _jspDestroy() { } public abstract void _jspService(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse) throws ServletException, IOException; }
可以发现org.apache.jasper.runtime.HttpJspBase这就是一个抽象的servlet,那么是servlet,就会调用其中的service方法,而HttpJspBase覆盖了,调用_jspService方法,显然我们的jsp编译后形成的servlet是一个实现了httpjspbase的方法,因此调用了我们子类自己的_jspService方法。
既然jsp编译运行时就是一个servlet,那么在看servlet中有什么
隐含对象?为什么Java代码的对象变量不需要什么声明定义就能使用?
<span style="color:#000000;"> public void _jspService(final javax.servlet.http.HttpServletRequest <span style="color:#FF0000;">request</span>, final javax.servlet.http.HttpServletResponse <span style="color:#FF0000;">response</span>) throws java.io.IOException, javax.servlet.ServletException { final javax.servlet.jsp.PageContext <span style="color:#FF0000;">pageContext;</span> javax.servlet.http.HttpSession <span style="color:#FF0000;">session</span> = null; final javax.servlet.ServletContext <span style="color:#FF0000;">application</span>; final javax.servlet.ServletConfig <span style="color:#FF0000;">config</span>; javax.servlet.jsp.JspWriter <span style="color:#FF0000;">out</span> = null; final java.lang.Object <span style="color:#FF0000;">page</span> = this; javax.servlet.jsp.JspWriter <span style="color:#FF0000;">_jspx_out</span> = null; javax.servlet.jsp.PageContext <span style="color:#FF0000;">_jspx_page_context</span> = 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;</span>
在编译后的文件中,我们发现。原来这些变量,tomcat早已经帮我声明定义好了,并非不定义(java代码是强类型语句,绝对没有一个变量不定义就可以用)
因此我们就可以使用这些jsp的九大变量了。
既然jsp是一个servlet,我们可以自己定义session,config,servletcontext等等对象变量了
JSP的语法:
我们知道jsp中可以有多段<% %>java代码,实际上就是将这些代码复制到_jspservice方法中去,此处定义的全是该函数的局部变量
如果想在jsp中添加函数,即:在servlet写函数,那么需要<%! %>此处代码不会复制到jspservice方法中,而是定义成类成员变量
注释:<%-- --%>
快速输出:<%= %>,我们常疑惑,变量为什么不加;号。因为在编译时会将其中的代码复制到out.print()函数中作为函数参数,一个函数参数怎么能有;号?
<%@ %>这个有三大属性:page,include,taglib
静态导入和动态导入区别:
1:静态:调入的界面是将代码复制到调用jsp页面中,编译时只生成一个servlet;动态采取req,resp的传参,编译时生成各自的servlet文件
2:局部变量在静态导入是共享的,动态不共享局部变量
3: 静态包含发生成编译时。动态包含发生在运行时。由于静态包含最终编译成一个Servlet文件,所以在执行时,它的执行效率要高于动态包含。
请求转发:
jsp异常处理:
相关文章推荐
- JSP/PHP基于Ajax的分页功能实现
- 开发阶段Jetty运行Jsp报错且响应空白
- jsp简单实现页面之间共享信息的方法
- Apache Web让JSP“动”起来
- JSP学习经验小结分享
- JSP 多条SQL语句同时执行的方法
- jsp登录会话的简单实现
- 在jsp页面中响应速度提高的7种方法分享
- (jsp/html)网页上嵌入播放器(常用播放器代码整理)
- 使用JSP制作一个超简单的网页计算器的实例分享
- JSP上传excel及excel插入至数据库的方法
- 浅析JSP的9大内置对象和4大作用域对象
- JSP中文乱码常见3个例子及其解决方法
- jsp实现将动态网页转换成静态页面的方法
- JSP基于Bootstrap分页显示实例解析
- JSP避免Form重复提交的三种方案
- 纯jsp实现的倒计时动态显示效果完整代码