JSP 快速入门
目录
生命周期
我们虽然写的是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 快速入门的更多相关文章
- JSP内置标签 JSP中JavaBean标签 JSP开发模式 EL和JSTL快速入门
2 JSP内置标签(美化+业务逻辑) 1)为了取代<%%>脚本形式,使用JSP标签/JSP动作,目的:与JSP页面的美化,即JSP面页都是由标签组成,不再有其它的内容 2)JSP内 ...
- JAVA WEB快速入门之从编写一个JSP WEB网站了解JSP WEB网站的基本结构、调试、部署
接上篇<JAVA WEB快速入门之环境搭建>,在完成了环境搭建后(JDK.Tomcat.IDE),现在是万事具备,就差写代码了,今天就来从编写一个JSP WEB网站了解JSP WEB网站的 ...
- 快速入门系列--MVC--01概述
虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...
- struts2框架快速入门小案例
struts2快速入门: index.jsp------>HelloAction--------->hello.jsp struts2流程 1.导入jar包 struts2的目录结构: a ...
- SpringMvc_快速入门,深入分析
目录 一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 ...
- Spring MVC 教程,快速入门,深入分析
http://elf8848.iteye.com/blog/875830/ Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: ...
- Spring_MVC_教程_快速入门_深入分析
Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf Spring ...
- 【个人笔记】002-PHP基础-01-PHP快速入门-02-PHP语言相关介绍输
002-PHP基础-01-PHP快速入门 02-PHP语言相关介绍 1.PHP是什么 Hypertext Preprocessor超文本预处理器 是一种通用开源脚本语言 Personal Home P ...
- Java Web快速入门——全十讲
Java Web快速入门——全十讲 这是一次培训的讲义,就是我在给学生讲的过程中记录下来的,非常完整,原来发表在Blog上,我感觉这里的学生可能更需要. 内容比较长,你可以先收藏起来,慢慢看. 第一讲 ...
随机推荐
- shell的case用法
今天给大家简单介绍一下结构条件语句的用法,实际上就是规范的多分支if语句,如下: case语法: case "字符串变量" in 值1)指令1... ;; 值2)指令2... ;; ...
- 几个常用dos网络命令
ping www.baidu.com 测试网络的同时,查看ip地址 1. 如图:百度的ip为 14.215.177.39.浏览器直接输入ip即可进入百度首页. 另外还有,14.215.177.38 ...
- IIS 发布ASP.NET MVC 4.0 错误500.21解决办法
由VS2013 写好的MVC 4.0 发布在服务器IIS 上报错500.21,解决办法:尝试多种网上介绍的办法,最后发现还是模块问题.
- [福大软工] Z班 团队第一次作业—团队展示成绩公布
[福大软工] Z班 团队第一次作业-团队展示成绩公布 作业地址 http://www.cnblogs.com/easteast/p/7511264.html 作业要求 队员姓名与学号(标记组长),其中 ...
- 【APIO2018】铁人两项
[APIO2018]铁人两项 题目描述 大意就是给定一张无向图,询问三元组\((s,c,f)\)中满足\(s\neq c\neq f\)且存在\((s\to c\to f)\)的简单路径(每个点最多经 ...
- Visual Studio Code 支持TensorFlow配置支持
首先选择解释器 选择TensorFlow版本的conda版本 (当然你如果是通过python单独安装的TensorFlow也可以) 编辑器输入代码,进行测试 import tensorflow as ...
- CSAPP:第一章计算机系统漫游
CSAPP:计算机系统漫游 关键点:上下文.程序运行.计算机系统抽象. 信息就是位+上下文一个程序的运行过程系统的硬件组成编译系统是如何工作的?一个程序的运行过程(c语言举例)计算机系统中的抽象 信息 ...
- KazaQ's Socks (找规律)
#include<iostream> using namespace std; #define ll long long ll n, m; ll t; int main(){ while ...
- zabbix 应用监控作业笔记 ansible-playbook
目录 目录结构 zabbix-web.yaml zabbix-backup.yaml zabbix-nfs.yaml zabbix-mysql.yaml zabbix-server.yaml zabb ...
- multi函数
def multi(*a): sum = 1 for i in a: sum = sum *i return sum 若干个参数 百度了一下