jsp基本语法及运行原理
一、jsp简介
JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它 是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术有点类似ASP技术,它是在传统的网页HTML(标准通用标记语言的子集)文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。
它实现了Html语法中的java扩张(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端的就是一个HTML文本,因此客户端只要有浏览器就能浏览。(360百科)
二、jsp优缺点
优点
(1)一次编写,到处运行。除了系统之外,代码不用做任何更改。
(2)系统的多平台支持。基本上可以在所有平台上的任意环境中开发,在任意环境中进行系统部署,在任意环境中扩展。相比ASP/.net的局限性是显而易见的。
(3)强大的可伸缩性。从只有一个小的Jar文件就可以运行Servlet/JSP,到由多台服务器进行集群和负载均衡,到多台Application进行事务处理,消息处理,一台服务器到无数台服务器,Java显示了一个巨大的生命力。
(4)多样化和功能强大的开发工具支持。这一点与ASP很像,Java已经有了许多非常优秀的开发工具,而且许多可以免费得到,并且其中许多已经可以顺利的运行于多种平台之下。
(5)支持服务器端组件。web应用需要强大的服务器端组件来支持,开发人员需要利用其他工具设计实现复杂功能的组件供web页面调用,以增强系统性能。JSP可以使用成熟的JAVA BEANS 组件来实现复杂商务功能。
缺点
(1) 与ASP一样,Java的一些优势正是它致命的问题所在。正是由于为了跨平台的功能,为了极度的伸缩能力,所以极大的增加了产品的复杂性。
(2) Java的运行速度是用class常驻内存来完成的,所以它在一些情况下所使用的内存比起用户数量来说确实是“最低性能价格比”了。从另一方面,它还需要硬盘空间来储存一系列的.java文件和.class文件,以及对应的版本文件。
三、jsp运行原理
jsp本质上是一种简化的servlet,jsp页面运行时首先由编译成servlet,然后再响应用户请求,返回给用户一个HTML页面。
因而可以知道,第一次访问时速度较慢,需要等待jsp编译完。
例如下面是一个jsp页面
<%@page import="java.util.UUID"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%-- <a href="${pageContext.request.contextPath }/Cookie">${pageContext.request.contextPath }</a> --%>
<%
System.out.println(session.getId());
String uuid = UUID.randomUUID().toString().replace("-", "");
session.setAttribute("seUUID", uuid);
%>
<form action="${pageContext.request.contextPath }/Cookie?oper=login" method="post">
<input type="hidden" name="reUUID" value="<%=uuid%>"> <br>
<br> <input type="text" name="username"><br>
<br> <input type="password" name="password"><br> <br>
<input type="submit" value="提交">
</form>
</body>
</html>
以下是编译成servlet后的代码
/*
* Generated by the Jasper component of Apache Tomcat
* Version: Apache Tomcat/7.0.79
* Generated at: 2017-08-16 02:12:01 UTC
* Note: The last modified time of this file was set to
* the last modified time of the source file after
* generation to assist with modification tracking.
*/
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import java.util.UUID;
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 volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
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;
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;
//html标签编译后的内容
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write('\r');
out.write('\n');
out.write(' ');
//<%%>编译后的内容
System.out.println(session.getId());
String uuid = UUID.randomUUID().toString().replace("-", "");
session.setAttribute("seUUID", uuid);
out.write("\r\n");
out.write("\t<form action=\"");
out.write((java.lang.String) org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate("${pageContext.request.contextPath }", java.lang.String.class, (javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
out.write("/Cookie?oper=login\" method=\"post\">\r\n");
out.write("\t\t<input type=\"hidden\" name=\"reUUID\" value=\"");
out.print(uuid);
out.write("\"> <br>\r\n");
out.write("\t\t<br> <input type=\"text\" name=\"username\"><br>\r\n");
out.write("\t\t<br> <input type=\"password\" name=\"password\"><br> <br>\r\n");
out.write("\t\t<input type=\"submit\" value=\"提交\">\r\n");
out.write("\t</form>\r\n");
out.write("</body>\r\n");
out.write("</html>");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
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);
}
}
}
编译后的文件保存在tomcat的work\Catalina\localhost\项目名\org\apache\jsp\目录下
eclipse下可以添加tc插件,百度云连接
解压后将links和tc_server两个目录复制到eclipse安装目录下就可以使用了
使用方法在server窗口单击鼠标右键即可进入wtpwebapps目录,work目录在其上一级目录

四、jsp基本语法
(1)HTML
与中html使用方法一样
(2)指令
page指令 <%@page language="java" contentType="text/html; charset=UTF-8" extends="" import="" session="true" errorPage="" pageEncoding="utf-8" buffer="8kb" autoFlush="true" isThreadSafe="true" info="" isErrorPage="false"%>
- page 指令主要是告诉jsp引擎如何解析jsp文件。
- 可能会用到的属性
- import 用来导包
- language指定jsp文件被翻译为哪种语言 ,该属性只有一个值就是 java
- contentType 指定当前网页的编码 ,"text/html;charset=utf-8", 给浏览器看的(相当于响应编码)
- pageEncoding 指定当前页面的编码,jsp引擎会根据该编码解析jsp文件, 给服务器看的(相当于请求编码)
- errorPage 指定页面出现错误以后转发到的页面,这个属性的地址不加项目名。
- isErrorPage 当前页面是否为一个错误页面,如果为true则可以在页面中使用exception对象。
- 基本不使用的属性
- autoFlush 是否自动刷新缓存,默认值是true,一般不去修改这个属性
- buffer 缓存的大小 默认8kb 一般不修改
- extends 指定jsp对应的java类所要基础的父类。
- info 设置当前jsp的信息,可以通过Servlet.getServletInfo()获取,jsp可以直接使用getServletInfo()获取
- isELIgnored 是否自动忽略EL表达式,默认为false,不忽略,一般不修改
- session 是否可以直接使用session对象,默认值为true,一般不修改
include指令<%@ include file="" %>
- 静态包含指令(不会被filter拦截)
- include指令主要用来将其他网页包含进当前JSP页面
- 他会将被包含页面原封不动复制到目标页面的指定位置。
- 它只会翻译目标页面,而不会翻译被包含页面
- 比如 1.jsp include 2.jsp, 相当于将2.jsp复制进1.jsp的指定位置,然后只会翻译包含了2.jsp的1.jsp(动态包含会翻译两个jsp然后再包含)
taglib指令
用于定义和访问自定义标签,如jstl标签<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
(3)声明
<%! java代码 %>可以声明属性和方法,正常java代码,需要结尾的分号 ;
(4)程序代码
<% java代码 %>java代码,正常java代码,需要结尾的分号 ;
(5)表达式
<%= java表达式 %>不需要结尾的分号 ;
(6)注释
<%-- --%>
- jsp注释中的内容不会被翻译到jsp对应java文件中
- 在JSP中可以使用三种注释
- html注释 java注释 jsp注释
<!-- 片段 --> //java注释! <%-- --%>
- 三种注释的可见范围
|
jsp源码 |
java源文件 |
网页的源码 |
|
|
html注释 |
可见 |
可见 |
可见 |
|
java注释 |
可见 |
可见 |
不可见 |
|
jsp注释 |
可见 |
不可见 |
不可见 |
五、jsp动作指令
(1)jsp:forward指令:执行页面转向,将请求的处理发到下一个页面
(2)jsp:param指令:用于传递参数,必须和其他支持参数的标签一起使用,如jsp:include指令传入被导入的页面,jsp:forward指令传入被指向的页面,jsp:plugin传入页面中的JavaBean实例或Applet实例
(3)jsp:include:用于动态引入一个jsp页面
(4)jsp:plugin:用于下载JavaBean或Applet到客户端执行
(5)jsp:useBean:创建一个JavaBean实例
(6)jsp:setProperty:设置JavaBean实例的属性值
(7)jsp:getProperty:输出JavaBean实例的属性值
六、jsp九大内置对象
在JSP中一共有9个隐含对象,这个9个对象我可以在JSP中直接使用。
因为在service方法已经对这个九个隐含对象进行声明及赋值,所以可以在JSP中直接使用。
- pageContext
类型:PageContext
代表:当前页面的上下文
作用:可以获取到页面中的其他隐含对象,同时它还是一个域对象。
- request
类型:HttpServletRequest
代表:请求
作用:可以获取用户发送的请求信息,它也是一个域对象。
- session
类型:HttpSession
代表:当前会话
作用:可以作为域对象,用来共享数据。
- application
类型:ServletContext
代表:代表整个WEB应用
作用:是JavaWeb中最大的域对象。
- response
类型:HttpServletResponse
代表:响应
作用:向浏览器发送响应信息
- out
类型:JspWriter
代表:输出流
作用:可以向页面输出内容
- config
类型:ServletConfig
代表:当前JSP的配置信息
作用:可以获取到Servlet标签中初始化参数
- page
类型:Object 在service方法中有如下代码 Object page = this;
代表:代表当前JSP的对象
作用:通常能用page的地方就可以用this,因而通常没什么作用
- exception
类型:Throwable
代表:异常信息
作用:获取页面中的异常
jsp基本语法及运行原理的更多相关文章
- Unit04: JSP基本语法 、 JSP运行原理
Unit04: JSP基本语法 . JSP运行原理 hello.jsp <%@page pageEncoding="utf-8"%> <!doctype html ...
- jsp学习--JSP运行原理,九大隐式对象和JSP常用标签
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- JSP起源、JSP的运行原理、JSP的执行过程
JSP起源 在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变. 如果使用Servlet程序来输出只有局部内容需要动态改变的网页,其中所有的静态内容也需要程序员用Java程序 ...
- JavaWeb(二)jsp运行原理,九大内置对象
JSP运行原理: 每个JSP页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ...
- JSP基本语法总结【1】(jsp工作原理,脚本元素,指令元素,动作元素)
时隔半年,回头对jsp复习整理一下,温故而知新. jsp工作原理: jsp服务器管理jsp页面分两个阶段:转换阶段(translation phase)和执行阶段(execution phase). ...
- jsp jsp运行原理
JSP的运行原理 每个jsp页面在第一次被访问时,WEB容器都会把请求交给jsp引擎(一个java程序).Jsp 引擎先将jsp翻译成一个_jspServlet实质上也是一个servlet,然后按照 ...
- Tomcat之JSP运行原理之小试牛刀
最近空闲看了下JSP/Servlet,以前只知道用JSP,但是对其运行原理知之甚少,今在此做些笔记,以备查阅. 首先简要描述下其运行过程,然后结合Tomcat源码作简要分析. JSP运行过程: 第一步 ...
- html、JSP运行原理
HTML运行原理 1.本地运行 所谓本地运行就是直接用 浏览器打开 2.远程访问的原理示意图: 何为协议?计算机互相通信(网络)的规则.常见的协议有 http .smtp. ftp.pop等 ...
- JSP语法,运行机理等
JSP是几年前就接触了,但是用归用,很多实际的意义含义等还是不太明白,借此机会,梳理一下. 1.JSP运行原理:当浏览器web应用服务器请求一个JSP页面时,Web应用服务器将其转换成一个Servle ...
随机推荐
- Klass与Oop
前段时间,一直在看<Hotspot实战>,顺便编译了一份OpenJDK的源码,然后就在eclipse里面调试起来. 虽然我的入门语言是c/c++,但是被Java拉过来好几年了,现在再看源码 ...
- 教你做一个单机版人事管理系统(Winform版)treeview与listview使用详情
------------------------------------------------------------------部门部分------------------------------ ...
- 华为OJ之自动售货系统
本题主要难点有两部分: 1,找零算法.如何找零应该是最具技巧性的部分,根据已有的硬币金额分布,对应的解决办法可能会有不同.本题中的1,2,5,10这种情况满足贪心性质,故我们简单的用贪心算法的思想来解 ...
- SpringMVC源码情操陶冶-AbstractHandlerExceptionResolver
springmvc支持服务端在处理业务逻辑过程中出现异常的时候可以配置相应的ModelAndView对象返回给客户端,本文介绍springmvc默认的几种HandlerExceptionResolve ...
- 存储结构比较vector,list,dequeue,stack(转)
vector适用:对象数量变化少,简单对象,随机访问元素频繁list适用:对象数量变化大,对象复杂,插入和删除频繁最大的区别是,list是双向的,而vector是单向的.因此在实际使用时,如何 ...
- [学习笔记] Splay Tree 从入门到放弃
前几天由于出行计划没有更博QwQ (其实是因为调试死活调不出来了TAT我好菜啊) 伸展树 伸展树(英语:Splay Tree)是一种二叉查找树,它能在O(log n)内完成插入.查找和删除操作.它是由 ...
- 初学 Python(十三)——匿名函数
初学 Python(十三)--匿名函数 初学 Python,主要整理一些学习到的知识点,这次是匿名函数. # -*- coding:utf-8 -*- #关键字lambda定义的函数都是匿名函数 #做 ...
- Python LeetCode
Python不熟悉 不同的做法 404. Sum of Left Leaves 这是我的做法,AC. class Solution(object): res = 0 def recursive(sel ...
- 25. leetcode 217. Contains Duplicate
217. Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your ...
- linux下U盘挂载
linux下挂载U盘 一.Linux挂载U盘:1.插入u盘到计算机,如果目前只插入了一个u盘而且你的硬盘不是scsi的硬盘接口的话,那它的硬件名称为:sda1,可以用"fdisk -l&qu ...