您的位置:首页 > Web前端 > JavaScript

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异常处理:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Tag jsp servlet