JSP(1)

1、JSP简介

(1)JSP的全称是Java Server Pages(运行在服务器端的页面),实际就是Servlet(学习JSP的关键就是时刻联想到Servlet)

(2)JSP、Servlet各自作用

==> Servlet:一般作为控制组件,处理业务逻辑

==> JSP:一般作为显示组件,显示数据

(3)书写JSP就相当于书写html代码,只不过里面可以镶嵌java代码,为用户提供动态数据

(4)更改了jsp页面,新增了jsp页面都不需要重新部署启动服务器,直接访问即可

(5)JSP包括:

==> 静态部分(html)

==> 动态部分

指令(page、include、taglib)

脚本[脚本(<% %>)、表达式(<%= %>)、声明(<%! %>)、注释(<%-- --%>)]

动作(jsp)

2、JSP的原理

(1)JSP会被Tomcat翻译成一个Servlet。该Servlet在 Tomcat安装目录workcatalinalocalhostweb项目名orgapachejsp

==> 如:1.jsp最终会被翻译成_1_jsp.java(a.jsp翻译成a_jsp.java) 当第一次访问时就会编译出一个_1_jsp.class

==> .java和.class文件在同一目录,即上面的目录

==> 第一次访问速度慢,之后访问就相对快些,是第一次编译成.class文件需要时间,之后就不需要编译了

(2)浏览器访问JSP页面时,Web服务器调用并执行一个jsp页面相当于执行一个Servlet

(3)JSP包括html排版标签和java代码。

==> html排版标签是在对应的.java文件中的_jspService()方法中通过out.write("html代码")输出的,它还输出回车( )、换行( )和空格等排版

==> java代码就直接放到_jspService()方法中

(4)Web服务器在调用jsp时,会给jsp提供一些java对象(之后会细讲)

3、JSP的语法

(1)JSP的模板元素:

==> 就是JSP中的那些HTML标记

==> 作用:页面布局和美化

(2)JSP的Java脚本表达式:

==> 作用:输出数据到页面上

==> 语法:<%=表达式 %>(实际上就是调用输出流打印到页面上,即out.print()打印的,所以后面不能加分号)

(3)JSP中的Java脚本片段:(实际开发中,应做到JSP中不能出现一行Java脚本片段)

==> 作用:书写Java代码逻辑

==> 语法:<% 语句1; 语句2; %>

==> 原理:其中的语句会原封不动的被服务器翻译到对应的Servlet的service方法中。

(4)JSP的声明:(了解其原理)

==> 作用:定义类的成员

==> 语法:<%! Java代码 %>

(5)JSP的注释:

==> 作用:注释Java脚本代码

==> 语法:<%--这是注释--%>

==> 注释说明:

<%--这里的注释不会被翻译到.java的文件中--%>

<% //这里的会被编译到.java文件中 /*这里的也会被编译到.java文件中*/ %>

4、示例

源码如下,由翻译得到的.java代码可得到以下信息:

(1)jsp默认会导入这3个包javax.servlet.*;javax.servlet.http.*;javax.servlet.jsp.*;

(2)jsp的本本质是servlet:可看出翻译得到的.java中包含_jspInit()、_jspDestroy()、_jspService(HttpServletRequest request, HttpServletResponse response)这几个方法。

其实是从tomcat源代码中可以看到org.apache.jasper.runtime.HttpJspBase时继承了httpservlet(所以下面的_1_jsp也继承了httpservlet),并且HttpJspBase是个抽象类,他有Init()、Destroy()、Service()方法。

并且对应在里面调用了_jspInit()、_jspDestroy()、_jspService(),在HttpJspBase本身没有实现这三个方法,此时在_1_jsp.java中实现了

(3)jsp的9大内置隐士对象是在_jspService()方法中什么的局部变量,所以每个jsp页面有自己的内置对象(后面会详讲)

	1.jsp源码:
	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

	<!DOCTYPE HTML>
	<html>
	  <head> 
		<title>jsp获取本地时间</title>      
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
	  </head>
	  
	  <body>
	   现在的时间是:  
	  <% 
	  Date now = new Date();
	  //这个注释会被翻译到.java的文件中
	  
	  /*
	   *这个注释也会被翻译到.java的文件中
	   */
	  %>

	  <%=now.toLocaleString()%> <!-- 其中不能加分号,因为最终会被翻译成out.print(now.toLocaleString()); -->
	  
	  <%--
		这个注释不会被翻译到.java的文件中
	  --%>
	  
	  </body>
	</html>
	---------------------------------------------------------------
	翻译成的_1_jsp.java代码:
	package org.apache.jsp.jspjianjie;

	import javax.servlet.*;
	import javax.servlet.http.*;
	import javax.servlet.jsp.*;
	import java.util.*;

	public final class _1_jsp extends org.apache.jasper.runtime.HttpJspBase
		implements org.apache.jasper.runtime.JspSourceDependent {

	  private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();

	  private static java.util.List _jspx_dependants;

	  private javax.el.ExpressionFactory _el_expressionfactory;
	  private org.apache.AnnotationProcessor _jsp_annotationprocessor;

	  public Object getDependants() {
		return _jspx_dependants;
	  }

	  public void _jspInit() {
		_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
		_jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class.getName());
	  }

	  public void _jspDestroy() {
	  }

	  public void _jspService(HttpServletRequest request, HttpServletResponse response)
			throws java.io.IOException, ServletException {

		PageContext pageContext = null;
		HttpSession session = null;
		ServletContext application = null;
		ServletConfig config = null;
		JspWriter out = null;
		Object page = this;
		JspWriter _jspx_out = null;
		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("
");
		  out.write("
");
		  out.write("<!DOCTYPE HTML>
");
		  out.write("<html>
");
		  out.write("  <head> 
");
		  out.write("    <title>jsp获取本地时间</title>      
");
		  out.write("	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
");
		  out.write("	<meta http-equiv="description" content="This is my page">
");
		  out.write("  </head>
");
		  out.write("  
");
		  out.write("  <body>
");
		  out.write("   现在的时间是:  
");
		  out.write("  ");

		  Date now = new Date(); 
		  //这个注释会被翻译到.java的文件中
	  
		  /*
		   *这个注释也会被翻译到.java的文件中
		   */

		  out.write("
");
		  out.write("  
");
		  out.write("  ");
		  out.print(now.toLocaleString());
		  out.write(" <!-- 其中不能加分号,因为最终会被翻译成out.print(now.toLocaleString()); -->
");
		  out.write("  
");
		  out.write("  ");
		  out.write("
");
		  out.write("  
");
		  out.write("  
");
		  out.write("
");
		} catch (Throwable t) {
		  if (!(t instanceof 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 log(t.getMessage(), t);
		  }
		} finally {
		  _jspxFactory.releasePageContext(_jspx_page_context);
		}
	  }
	}
	-------------------------------------------------------------------
	访问http://127.0.0.1:8080/testJsp/jspjianjie/1.jsp
	结果为:
	现在的时间是: 2014-11-14 20:52:49






原文地址:https://www.cnblogs.com/oldinaction/p/5167477.html