目录


生命周期

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. 教你用Python Jupyter Notebook 制作代码分享 PPT

    PPT 是个强大的工具,但是笔者的 PPT 制作技术不咋地,所以之前的分享习惯使用 Jupyter Notebook + RISE,这样使用简单的 markdown 格式加上代码就足够做一次代码分享了 ...

  2. 【NOI2018模拟5】三角剖分Bsh

    [NOI2018模拟5]三角剖分Bsh Description 给定一个正 n 边形及其三角剖分,共 2n - 3 条边 (n条多边形的边和n-3 条对角线),每条边的长度为 1. 共 q 次询问,每 ...

  3. docker学习笔记(三)-通过network理解docker,在同一网桥里搭建docker容器

    创建test1 test2 两个network namespace 两个network namespace没有被启动 启动了但是有没有与network关联 创建两个veth,用于关联两个network ...

  4. Linux三剑客-SED

    1.Sed是什么 Sed:字符流编辑器,Stream Editor 2.Sed功能与版本 处理日志文件,日志,配置文件等 增加.删除.修改.查询 sed --version 可以通过man sed 来 ...

  5. ASP.NET 应用程序遭遇Server Application Unavailable问题的解决的方法

    公司服务器有.NET2的应用在执行,而我使用了.NET4平台开发,本机測试没问题,扔服务器发现要么我的新平台不好使,要么.NET2的旧平台不好使,各种重新启动IIS服务和WWW服务都无济于事 当我意识 ...

  6. centos7下kubernetes(3。部署kubernetes)

    环境:三个centos7 K8s2是Master;K8s1是node1:K8s3是node2 官方文档:https://kubernetes.io/docs/setup/independent/ins ...

  7. centos7下安装docker(15.7容器跨主机网络---calico)

    Calico是一个纯三层的虚拟网络方案,Calico为每个容器分配一个IP,每个host都是router,把不同host的容器连接起来.与vxlan不同的是:calico不对数据包进行封装,不需要NA ...

  8. AlexeyAB大神版yolo 待完善

    目录 darknet优化经验 1. AlexeyAB改进项 2. Linux下编译选项 3. 训练经验 4. 提升检测效果 5. 总结 6. AlexeyAB大神改进 darknet优化经验 主要来自 ...

  9. maven 标签classifier 研究一下

    研究一下maven的标签: <dependency> <groupId>io.netty</groupId> <artifactId>netty-tcn ...

  10. 【vue-waring】element UI 由版本1.4.12 升级到element-ui@2.0.10

    遇到的问题:element UI   由版本1.4.12 升级到element-ui@2.0.10    cnpm run dev 运行后的waring 状态:解决(相关资料的方法对我没什么用) 解决 ...