zoukankan      html  css  js  c++  java
  • 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
    






  • 相关阅读:
    人不成熟的六个特征
    qq申请器,有源码,用post提交
    有的公司,在不断创新,我们时刻能感受到
    Java中 堆 栈,常量池等概念解析(转载)
    Jquery获得相同id的元素
    强大Jquery插件,table排序
    和计算机沟通
    千万级架构设计诀窍(zz)(
    强大Jquery插件,table排序之二
    原文作者乔纳森·丹尼可(Jonathan Danylko)是一位自由职业的web架构师和程序员,编程经验已超过20年,涉足领域有电子商务、生物技术、房地产、医疗、保险和公用事业。正如乔纳 森在文中所言,本文适合刚毕业的大学生和刚入门的程序员。如果你已是高级
  • 原文地址:https://www.cnblogs.com/oldinaction/p/5167477.html
Copyright © 2011-2022 走看看