JSP(1) - JSP简介、原理、语法 - 小易Java笔记
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安装目录\work\catalina\localhost\web项目名\org\apache\jsp
==> 如: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代码")输出的,它还输出回车(\r)、换行(\n)和空格等排版
==> 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("\r\n");
out.write("\r\n");
out.write("<!DOCTYPE HTML>\r\n");
out.write("<html>\r\n");
out.write(" <head> \r\n");
out.write(" <title>jsp获取本地时间</title> \r\n");
out.write("\t<meta http-equiv=\"keywords\" content=\"keyword1,keyword2,keyword3\">\r\n");
out.write("\t<meta http-equiv=\"description\" content=\"This is my page\">\r\n");
out.write(" </head>\r\n");
out.write(" \r\n");
out.write(" <body>\r\n");
out.write(" 现在的时间是: \r\n");
out.write(" "); Date now = new Date();
//这个注释会被翻译到.java的文件中 /*
*这个注释也会被翻译到.java的文件中
*/ out.write("\r\n");
out.write(" \r\n");
out.write(" ");
out.print(now.toLocaleString());
out.write(" <!-- 其中不能加分号,因为最终会被翻译成out.print(now.toLocaleString()); -->\r\n");
out.write(" \r\n");
out.write(" ");
out.write("\r\n");
out.write(" \r\n");
out.write(" \r\n");
out.write("\r\n");
} 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
JSP(1) - JSP简介、原理、语法 - 小易Java笔记的更多相关文章
- servlet(6) - servlet总结 - 小易Java笔记
垂阅前必看: 这都是我总结的我觉得是学习servlet应该掌握的,我在学习期间也做了一个博客项目来让所学的知识得以巩固.下面就是博客项目链接.前面的servlet相关的笔记总汇,还有就是我把觉得在学习 ...
- JSP(3) - 9个JSP内置对象 - 小易Java笔记
1.9个JSP内置对象 内置对象引用名称 对应的类型 request HttpServletRequest response HttpServletResponse config Servle ...
- JSP(2) - JSP指令 - 小易Java笔记
JSP指令是给JSP引擎用的,即给服务器用的.作用是告诉服务器,该如何处理JSP中除了指令之外的内容.包括page.include.taglib三种 基本的语法格式:<%@ 指令名称 属性1=& ...
- servlet(4) - servletAPI - 小易Java笔记
Servlet规范核心类图 1.请求和响应对象 ==> HTTP协议包含请求和响应部分. ==> HttpServletRequest就代表着请求部分 ==> HttpServlet ...
- servlet(2) - 利用MyEclipse新建一个servlet - 小易Java笔记
1.Tomcat在MyEclipse中集成 ==> Window-preferences-MyEclipse-Servers-Tomcat-Tomcat 6.x-点击右侧的Browse,选择你的 ...
- servlet(3) - servlet知识点 - 小易Java笔记
1.servlet的生命周期 (1)容器最终要调用service方法为客户进行服务.(此处“容器”指java运行的环境,tomcat是jsp/servlet的容器) ==> 在内存中一个Serv ...
- servlet(5) - Cookie和session - 小易Java笔记
1.会话概述 (1)会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. (2)会话过程中的数据不宜保存在request和servle ...
- servlet(1) - 手写第一个servlet程序 - 小易Java笔记
声明:如tomcat的安装目录为D:\Java\tomcat6,下面要根据tomcat的安装目录而定 1. 建立程序的文件结构 ==>找到tomcat的安装目录,在webapps目录下新建一个名 ...
- JSP第一篇【JSP介绍、工作原理、生命周期、语法、指令、行为】
什么是JSP JSP全名为Java Server Pages,java服务器页面.JSP是一种基于文本的程序,其特点就是HTML和Java代码共同存在! 为什么需要JSP JSP是为了简化Servle ...
随机推荐
- python基础训练营04-函数
任务四 函数的关键字 函数的定义 函数参数与作用域 函数返回值 一.函数的关键字: def 二.函数的定义: 在Python中,定义一个函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号 ...
- 教你如何用Docker快速搭建深度学习环境
本教程搭建集 Tensorflow.Keras.Coffe.PyTorch 等深度学习框架于一身的环境,及jupyter. 本教程使用nvidia-docker启动实例,通过本教程可以从一个全新的Ub ...
- mysql创建用户并手授权
--创建用户CREATE USER 'test'@'%' IDENTIFIED BY 'test'; --授权GRANT ALL ON *.* TO 'test'@'%'; --修改密码SET PAS ...
- DFS(7)——poj1011Sticks
一.题目回顾 题目链接:Sticks 题意:给出一定数量的小木棒的长度,它是由等长的若干木棒随意砍断所得到的.对于给定的一组小木棒,请求出原始木棒的最小长度. 二.解题思路 DFS+剪枝 本题剪枝不到 ...
- DPDK Qos之报文处理流水线
原创翻译,转载请注明出处. 下面是一个支持Qos的复杂报文处理流水线的图: 流水线是通过DPDP可重用的软件库构建出来的.在流水线里实现QoS主要是如下模块:policer,dropper,shced ...
- No node available for block: blk
刚才利用hadoop和mahout运行kmean是算法,一开始利用了10个节点,一个master,9个slave,运行了7分钟,我为了看速度的变化,就改用伪分布的形式,但是一开始运行就报错了: 17/ ...
- linux基本操作2
将当前用户目录下的文件清单输出到文件list1.txt(当前用户目录下)中ls -l > list1.txt 利用管道命令将根(/)下所有修改日期在4月16日的文件清单输出到list2.txt( ...
- 健康领域今年开始井喷了,养老地产和私人医生这两个领域目测成为下一轮BAT在健康领域布局的竞争方向
医疗行业做了六年多的时间,今年到了井喷的阶段,腾讯先是入股了丁香园,然后又一亿美金融资挂号网,春雨医生获得5000万美元的C轮融资,这是要上市的节奏.. 从互联网战略上,健康网和医疗网都是做资料刚开始 ...
- PokeCats开发者日志(五)
现在是PokeCats游戏开发的第八天的上午,来记录一下将PokeCats上传到360移动开放平台的过程. 首先点创建游戏. 会弹出这个东东. 个人只能创建免费游戏啊,TAT.算了,反 ...
- [Elasticsearch] 多字段搜索 (二) - 最佳字段查询及其调优(转)
最佳字段(Best Fields) 假设我们有一个让用户搜索博客文章的网站,就像这两份文档一样: PUT /my_index/my_type/1 { "title": " ...