目录


生命周期

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. shell的case用法

    今天给大家简单介绍一下结构条件语句的用法,实际上就是规范的多分支if语句,如下: case语法: case "字符串变量" in 值1)指令1... ;; 值2)指令2... ;; ...

  2. 几个常用dos网络命令

    ping www.baidu.com 测试网络的同时,查看ip地址 1. 如图:百度的ip为  14.215.177.39.浏览器直接输入ip即可进入百度首页. 另外还有,14.215.177.38 ...

  3. IIS 发布ASP.NET MVC 4.0 错误500.21解决办法

    由VS2013 写好的MVC 4.0 发布在服务器IIS 上报错500.21,解决办法:尝试多种网上介绍的办法,最后发现还是模块问题.

  4. [福大软工] Z班 团队第一次作业—团队展示成绩公布

    [福大软工] Z班 团队第一次作业-团队展示成绩公布 作业地址 http://www.cnblogs.com/easteast/p/7511264.html 作业要求 队员姓名与学号(标记组长),其中 ...

  5. 【APIO2018】铁人两项

    [APIO2018]铁人两项 题目描述 大意就是给定一张无向图,询问三元组\((s,c,f)\)中满足\(s\neq c\neq f\)且存在\((s\to c\to f)\)的简单路径(每个点最多经 ...

  6. Visual Studio Code 支持TensorFlow配置支持

    首先选择解释器 选择TensorFlow版本的conda版本 (当然你如果是通过python单独安装的TensorFlow也可以) 编辑器输入代码,进行测试 import tensorflow as ...

  7. CSAPP:第一章计算机系统漫游

    CSAPP:计算机系统漫游 关键点:上下文.程序运行.计算机系统抽象. 信息就是位+上下文一个程序的运行过程系统的硬件组成编译系统是如何工作的?一个程序的运行过程(c语言举例)计算机系统中的抽象 信息 ...

  8. KazaQ's Socks (找规律)

    #include<iostream> using namespace std; #define ll long long ll n, m; ll t; int main(){ while ...

  9. zabbix 应用监控作业笔记 ansible-playbook

    目录 目录结构 zabbix-web.yaml zabbix-backup.yaml zabbix-nfs.yaml zabbix-mysql.yaml zabbix-server.yaml zabb ...

  10. multi函数

    def multi(*a): sum = 1 for i in a: sum = sum *i return sum 若干个参数   百度了一下