目录


生命周期

9大对象

常用指令

基本语法

表达式语言(EL)

jstl介绍

常用的jstl标签


生命周期

  我们虽然写的是jsp,代码中包含了html、css、js,以及Java代码,但是真正执行的是一个servlet。当我们把jsp写好之后,经过一些操作之后,会将该jsp转换为一个servlet(将html、css、js当做字符串输出),形成一个java文件,然后进行编译,产生class文件。最终请求该jsp,执行的就是对应servlet的class文件。

  

  jsp的生命周期有一下几个阶段:

  编译阶段

  当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。如果这个文件已经编译过,说上次编译过之后,jsp文件未修改过,则不用再次编译。编译的时候,会先解析jsp文件,将其转换为servlet,然后编译该servlet。

  我们可以随意编写一个jsp,假设命名为demo.jsp,那么转换后的servlet文件名为demo_jsp.java,而编译后生成的是demo_jsp.class。

  初始化阶段

  初始化阶段之前,jsp文件已经被转换为servlet了,此时的初始化操作,就是调用转化后servlet中的jspInit()方法。

  执行阶段

    执行阶段就是调用转换后的servlet中的_jspService,和普通servlet中的service一样接收request和response。

  销毁阶段

  和servlet的destroy一样,调用jspDestroy进行一些清理操作。

9大对象

  可以写一个demo.jsp,查看生成的demo_jsp.java中的代码,你会发现,我们写的jsp代码,其实就是在写对应jsp_servlet中的_jspService方法。

  并且,我们会发现,在生成的demo_jsp.java中,有很多的代码都是自动生成的,生成的代码中包含了9个对象,我们可以在jsp中使用他们。这9个对象分别是:

类型 对象 解释 作用范围
javax.servlet.http.HttpServletRequest request

和servlet中的reqeust对象一样

包含请求信息

一次请求
javax.servlet.http.HttpServletResponse response

和servlet中的response对象一样

响应处理结果

一次请求
javax.servlet.jsp.PageContext pageContext

页面上下文对象(包含jsp所有运行信息)

封装了其他8个内置对象

每一个jsp文件有一个自己的pageContext

每次请求的pageContext都不同。

当前页面

javax.servlet.http.HttpSession session 和servlet中的session一样使用 一次会话
javax.servlet.ServletContext application

就是ServletContext对象,一个项目只有一个,

用于存储用户共享的数据

整个项目
javax.servlet.ServletConfig config

就是servlet中的servletConfig对象

可以获取web.xml中的配置数据(为本servlet配置的数据)

 
javax.servlet.jsp.JspWriter out

jsp内部使用的输出对象(带有缓冲)

相当于servlet中的response.getWriter()

本页面
java.lang.Object page 代表当前jsp对象,相当于转换后的servlet的this 当前页面
javax.lang.Throwable exception

异常对象,存储当前运行的异常信息

需要使用page执行,设置isErrorPage="true"来开启

当前页面

常用指令

  指令可以用来设置jsp页面的属性。指令的形式如下:

<%@ 指令名 key="value" %>

  常用的有三个指令,分别是page、include、taglib:

  page指令

  用于定义网页依赖属性,比如脚本语言、error页面、缓存需求等等;

  比如我们设置当前页面的语言、编码格式、字符集、导入哪些类、是否使用session、设置错误页面、

<%@ page
language="java"
contentType="text/html; charset=utf-8"
errorPage="error.html"
import="java.util.Date"
session="true"
pageEncoding="utf-8"
%>

  

  include指令

  用来包含其他文件,类似于php的include()函数

<%@ include file="demo.jsp" %>

  

  taglib指令

  用来引入标签库的定义,比如要使用jstl标签库,都要使用tablib导入

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

  

基本语法

  java代码使用<%  %>括起来即可,比如下面定义了一个方法,在方法中使用上面介绍的9个内置对象,然后调用方法:

<%
out.println("hello world");
out.println(request.getRequestURL());
%>

  

  如果我们想注释掉jsp中的某些java代码,我们不希望他出现在转换后的servlet中,也不会出现在客户端获取到的响应html中,那么我们可以使用下面这种格式:

<%--
out.println("this is comment");
这部分内容不会出现在servlet中,也不会出现在html代码中
--%>

  

  前面已经介绍了,使用指令,可以用下面的格式:

<%@  指令名   key="value" %>

  

  输出数据,虽然我们可以使用out.print()来输出,但是,稍显复杂,可以使用下面的方式:

<% int a = 10;%>

<% out.println(a); %>
等价于
<%= a%>

  

表达式语言(EL)

  其实就是对${ } 的使用。

<%
request.setAttribute("name", "aaaaaaaa");
%> <a>${name}</a>

  

  ${ } 可以对其中的内容进行处理或者计算,可以像对象一样在里面使用.表示访问属性:

${person.name}

  还可以进行数学运算

<h1>${100*2}</h1>

  

  ${ } 可以访问哪些数据?包含以下四个作用域的数据都可以访问,作用域范围从小到大依次是:

pageScope page 作用域
requestScope request 作用域
sessionScope session 作用域
applicationScope application 作用域

  在不加作用域的时候,默认是pageScope作用域。如果要指定访问哪一个作用域的参数,可以使用下面的格式:

${name} 等价于  ${pageScope.name}

${sessionScope.name}  访问sessionScope下的name

  

  下面说明了每一个作用域的使用方法:

<%
String data = "aaaaaaa";
%>
<%= data%> <c:set var="data" value="xxx"></c:set>
${pageScope.data } <%
request.setAttribute("data1", "requestData");
// 或者是在servlet中通过request.setAttribute()来设置的参数
%>
${requestScope.data1} <%
session.setAttribute("data2", "sessionData");
//或者是在servlet中通过request.getSession().setAttribute()设置的参数
%>
${sessionScope.data2} <%
application.setAttribute("data3", "applicationData");
// 或者是在servlet中通过this.getServletContext().setAttribute()设置的参数
%>
${applicationScope.data3}

  

  还有几个用法:

EL 在servlet中相当于

获取请求参数(注意,作用域是page)

${param.key}

${param["key"]}

request.getParameter("key")

${paramValues.key}

${paramValues["key"]}

request.getParameterValues("key")

获取header信息

${header.key}

${header["key"]}

request.getHeader("key") 

${headerValues.key}

${headerValues["key"]}

 request.getHeaders("key")

对于整个application,在web.xml中设置的配置项

${pageContext.key}

${pageContext["key"]

在servlet中使用

 this.getServletContext().getInitParameter("key")

jstl介绍

  jstl可以用来简化我们平时开发中的很多复杂操作,比如条件判断、循环、输出。

  需要使用taglib指令来引入标签库

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

  

<c:set>

  在jsp页面中设置变量,可以指定作用域,默认是pageScope。

<c:set var="变量名" scope="作用域" value="值"/>

  

<c:out>

  输出内容,相当于<%= value %>,不过可以指定默认值。

<c:out value="${sessionScope.name}" default="xyz"></c:out>
<c:out value="${pageScope.name }"></c:out>

  

<c:remove>

  删除某个作用域中的参数值

<c:remove var="age" scope="request"/>

  

<c:if>

<c:if test="${param.age > 18}">
<c:out value="bigger than 18"></c:out>
</c:if>

  

<c:choose>

  相当于switch~case、if~else

<c:choose>
<c:when test="${param.age > 9}">
bigger than 9
</c:when>
<c:when test="${param.age == 9 }">
equal with 9
</c:when>
<c:otherwise>
smaller than 9
</c:otherwise>
</c:choose>

  

<c:forEach>

for (int index = 0; index < data.length; index++) {
System.out.println(data[index]);
}
使用jstl实现的方式如下:
<c:forEach var="index" begin="0" end="${data.length}" step="1">
<c:out value="${data[index]}"></c:out>
</c:forEach> List<Person> list = new ArrayList<>();
for (Person person : list) {
System.out.println(person.name);
System.out.println(person.age);
}
使用jstl实现的方式如下:
<c:forEach items="${list}" var="person">
<c:out value="${person.name}"></c:out>
<c:out value="${person.age}"></c:out>
</c:forEach>

  

  

JSP 快速入门的更多相关文章

  1. JSP内置标签 JSP中JavaBean标签 JSP开发模式 EL和JSTL快速入门

    2 JSP内置标签(美化+业务逻辑)   1)为了取代<%%>脚本形式,使用JSP标签/JSP动作,目的:与JSP页面的美化,即JSP面页都是由标签组成,不再有其它的内容   2)JSP内 ...

  2. JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构、调试、部署

    接上篇<JAVA WEB快速入门之环境搭建>,在完成了环境搭建后(JDK.Tomcat.IDE),现在是万事具备,就差写代码了,今天就来从编写一个JSP WEB网站了解JSP WEB网站的 ...

  3. 快速入门系列--MVC--01概述

    虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...

  4. struts2框架快速入门小案例

    struts2快速入门: index.jsp------>HelloAction--------->hello.jsp struts2流程 1.导入jar包 struts2的目录结构: a ...

  5. SpringMvc_快速入门,深入分析

    目录  一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 ...

  6. Spring MVC 教程,快速入门,深入分析

    http://elf8848.iteye.com/blog/875830/ Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: ...

  7. Spring_MVC_教程_快速入门_深入分析

    Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf Spring ...

  8. 【个人笔记】002-PHP基础-01-PHP快速入门-02-PHP语言相关介绍输

    002-PHP基础-01-PHP快速入门 02-PHP语言相关介绍 1.PHP是什么 Hypertext Preprocessor超文本预处理器 是一种通用开源脚本语言 Personal Home P ...

  9. Java Web快速入门——全十讲

    Java Web快速入门——全十讲 这是一次培训的讲义,就是我在给学生讲的过程中记录下来的,非常完整,原来发表在Blog上,我感觉这里的学生可能更需要. 内容比较长,你可以先收藏起来,慢慢看. 第一讲 ...

随机推荐

  1. Tomcat配置自定义JAVA环境

    Tomcat的bin目录下 在setclasspath.sh(Linux系统,Windows系统为setclasspath.bat)文件的开头添加: export JAVA_HOME=/usr/lib ...

  2. 4.6Python数据处理篇之Matplotlib系列(六)---plt.hist()与plt.hist2d()直方图

    目录 目录 前言 (一)直方图 (二)双直方图 目录 前言 今天我们学习的是直方图,导入的函数是: plt.hist(x=x, bins=10) 与plt.hist2D(x=x, y=y) (一)直方 ...

  3. eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(一)

    eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(一) 本篇博客主要包含五个内容: 1.CXF换将搭建以及eclipse配置CXF. 2.eclipse创建w ...

  4. Java多线程(一) 什么是线程

    声明:本系列大多是翻译自https://www.javatpoint.com,加上自己的增删改,尽力写的系统而通俗易懂,后文不再重复声明. 点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更 ...

  5. 【汤鸿鑫 3D太极】肩与膀的细分

  6. 发现一种写法,类似callback&&callback()

    与callback&&callback()异曲同工 return data && { title: `To-do (${data.length})`, componen ...

  7. P1279 字串距离 dp 洛谷

    题目描述 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“abcb□cd”,“□a□bcbcd□”和“abcb□cd□”都是X ...

  8. Centos 7 安装JAVA环境 jdk1.8

    在Linux环境(Centos 7)安装jdk1.8,有以下两种方式 方式一.安装openjdk #   yum install java-1.8.0-openjdk* -y 方式二.使用wget下载 ...

  9. 搭建golang学习环境,并用chrome headless获取网页内容

    想用go练练手(我是win7系统,已从https://studygolang.com/dl 下载了go安装包并安装,比较简单,不详述. 但作为边民,没法go get ,又不敢用梯子,幸亏有爱心大牛们的 ...

  10. 安装 Kivy

    Kivy 是基于Python编程语言的一种用于开发跨平台GUI客户端程序的框架.可以打包成iOS.Android.Windows.OSX等多种平台.目前已经实现一次编码,到处运行的目的. Kivy框架 ...