JSP & EL & JSTL

JSP

Java Server Page

什么是JSP

从用户角度看,就是一个网页。从程序员角度看,就是一个Java类,它继承Servlet,所以可以说JSp就是一个Servlet

JSP存在意义

html多数情况下用来显示静态网页,即只能显示已经写好的内容。但是有时我们需要在网页上显示一些动态数据。例如,根据学生姓名显示该学生所有信息。做这个动作需要访问数据库,才能在网页显示。而html是不支持Java代码的,所有才出现jsp来写Java代码。

JSP的语法

指令写法

格式:<%@ 指令名称 %>

page指令

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="utf-8" session="true" errorPage="error_page.jsp"%>
language属性
language="java"

表示jsp页面可以写Java代码

contentType属性
contentType="text/html; charset=UTF-8"

说明该文件的类型,即使用的编码格式

text/html :MIMEType 这是一个文本,html网页

charset=UTF-8:用utf-8进行编解码

pageEncoding属性
pageEncoding="utf-8"

jsp内容编码

sessioon属性
session="true"

等号后面可选值 true or false

用于控制在这个jsp页面里面,能够直接使用session对象。

具体的区别是,请看翻译后的java文件 如果该值是true , 那么在代码里面会有getSession()的调用,如果是false : 那么就不会有该方法调用,也就是没有session对象了。在页面上自然也就不能使用session了。

errorPage属性
errorPage="error_page.jsp

用来指向发生错误后要显示页面。值为要给错误的页面路径

isErrorPage属性
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>

上面的errorPage 用于指定错误的时候跑到哪一个页面去。 那么这个isErroPage , 就是声明某一个页面到底是不是错误的页面。

extends 属性

用于指定jsp翻译成java文件后,继承的父类是谁,一般不用改。

import属性

导包使用的,一般不用手写。

include 指令

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

用来包含另一个jsp页面内容进来。

把另外一个页面的所有内容拿过来一起输出。 所有的标签元素都包含进来。

即把另一个页面与本页面的内容写在同一个Java类中。

taglib 指令

<%@taglib prefix="" uri=""%>

uri: 标签库路径

prefix : 标签库的别名

JSP动作标签

<jsp:include page=""></jsp:include>
<jsp:param value="" name=""/>
<jsp:forward page=""></jsp:forward>
jsp:include标签
<jsp:include page="other02.jsp"></jsp:include>

用于包含指定页面,这里是动态包含,不拿另一个页面的所有内容,只拿其运行结果。

jsp:forward 标签
<jsp:forward page="other02.jsp"></jsp:forward>

用于跳转指定页面,相当于Servlet中request的请求转发。

<%
//请求转发
request.getRequestDispatcher("other02.jsp").forward(request, response);
%>
jsp:param 标签
<jsp:param value="" name=""/>

用于在跳转或包含其他页面时,加入指定参数,与上面两个标签联合使用。

eg:

 <jsp:include page="other02.jsp">

	<jsp:param value="18" name="gx"/>

</jsp:include>

<jsp:forward page="other02.jsp">

	<jsp:param value="18" name="gx"/>

</jsp:forward>

在other02.jsp中获取参数

<br>收到的参数是:<br>

<%= request.getParameter("address")%>

JSP内置对象

所谓内置对象,就是JSP本身存在的对象,不需要创建

  • pageContext
  • request
  • session
  • application

以上4个是作用域对象 ,

  • 作用域

表示这些对象可以存值,他们的取值范围有限定。 setAttribute 和 getAttribute

	使用作用域来存储数据<br>

	<%
pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%> 取出四个作用域中的值<br> <%=pageContext.getAttribute("name")%>
<%=request.getAttribute("name")%>
<%=session.getAttribute("name")%>
<%=application.getAttribute("name")%>

作用域范围大小:

pageContext – request — session – application

四个对象的作用域的区别

pageContext对象【PageContext】

作用域仅限当前页面

可获得其他的8个内置对象。

request对象 【HttpServletRequest】

作用域仅限一次请求,只要与服务器进行交互使服务器作出响应值就失效

session对象 【HttpSession】

作用域限于一次会话(多次请求和响应)中。

application对象 【ServletContext】

整个工程都可以访问, 服务器关闭后就不能访问了。

其他对象

out对象【JspWriter】

用于输出

response对象 【HttpServletResponse】

在该对象输出内容是无论其位置是在out对象的前还是后,该对象的输出先出现。

exception 对象 【Throwable】

用于输出错误信息

page对象 【Object】 —就是这个jsp翻译成的java类的实例对象

相当于this

final java.lang.Object page = this;
config 【ServletConfig】

EL表达式

为了简化jsp代码中的Java代码

格式

${表达式}

如果从作用域中取值,会先从作用域小的开始取。如果没有,再找下一个作用域,直到把四个作用域取完。如果四个作用域都没有值。则不显示。

使用方法

1.取四个作用域中的值

<%
pageContext.setAttribute("name", "pageContext");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%>
<br>使用EL表达式取值<br>
${pageScope.name }
${requestScope.name }
${sessionScope.name }
${applicationScope.name }

2.取数组中的值

<% String[] a = {"gx","hh","fx"};
//先要把值存入作用域中
pageContext.setAttribute("a", a);
%>
<br>使用EL表达式取数组的值<br>
${a[0] } ${a[1] } ${a[2] }

3.取单列集合的值(List)

<% List list = new ArrayList();
list.add(1);
list.add(3);
list.add(5);
list.add(6);
//先要把值存入作用域中
pageContext.setAttribute("list", list);
%>
<br>使用EL表达式取数组的值<br>
${list[0] } ${list[1] } ${list[2] } ${list[3] }

4.取双列集合的值(Map)

<% Map map = new HashMap();
map.put("name", "gx");
map.put("age", "fx");
map.put("hh", "wf");
map.put("c", "hh");
pageContext.setAttribute("map",map);
%>
${map.name } ${map.age } ${map.hh } ${map.c }

注意:map集合的键不能是基本数据类型,如果是基本数据类型,就会报错或什么都不显示。

如果是

map.put("name.aa", "gx");

那么

${map.[name.aa] }

使用 [] 进行取值。

取值的细节

1.从域中取值。 得先存值。

<%
pageContext.setAttribute("name","gx");
session.setAttribute("age",18);
%>

1.指定到某个作用域取值

${pageScope.age }

2.若不指定所取作用域,则先从page里面找,没有去request找,去session,去application

${ name }

3.指定从session中取值

${ sessionScope.name }

2.取值方式

1.如果这份值是有下标的,那么直接使用[]

<% String[] a = {"gx","hh","fx"};
pageContext.setAttribute("a", a);
%> ${a[0] } ${a[1] } ${a[2] }

这里a说的是attribute的name

public void setAttribute(String name, Object value)

2.如果没有下标, 直接使用 .的方式去取

<% User u = new User(18,"gx");
pageContext.setAttribute("u",u);
%>
${u.name } ${u.age }

User为自定义对象,其中有name和age两个成员变量。

一般使用EL表达式,用的比较多的,都是从一个对象中取出它的属性值,比如取出某一个学生的姓名。

EL表达式的11个内置对象

内置对象,即不用声明直接可以使用的对象

${ 对象名.成员 }

pageContext

作用域相关

pageScope

requestScope

sessionScope

applicationScope

头信息相关

header

headerValves

参数信息相关

param

paramValues

全局初始化参数

initParam

JSTL

全称:JSP Standard Tag Library jsp标准标签库

作用:简化jsp的代码编写。 替换 <%%> 写法。 一般与EL表达式配合

如何使用

  1. 导入jar文件到工程的WebContent/Web-Inf/lib jstl.jar standard.jar
  2. 在jsp页面上,使用taglib 指令,来引入标签库
  3. 注意: 如果想支持 EL表达式,那么引入的标签库必须选择1.1的版本,1.0的版本不支持EL表达式。
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

此处的prefix="c"中的c只是一个别名,其实只要是一个字符串即可,不过为了简便,及和core匹配,所有有c作为别名。

常用标签

<c:set></c:set>
<c:if test=""></c:if>
<c:forEach></c:forEach>

1.c:set

<!-- 声明一个对象name, 对象的值 zhangsan , 存储到了page(默认) , 指定是session -->
<c:set var="name" value="zhangsan" scope="session"></c:set> ${sessionScope.name }

var ----- 对象名称

value ------ 对象的值

scope ------- 存储的作用域,默认为page(不写该属性的情况下)在此被指定为session作用域。

target ------ 要修改的属性所属的对象

property ------- 要修改的属性

如果指定了target属性,那么property属性也需要被指定。

2.c:if

判断test里面的表达式是否满足,如果满足,就执行c:if标签中的输出 , c:if 是没有else的。

<c:set var="age" value="18" ></c:set>
<c:if test="${ age > 26 }">
年龄大于了26岁...
</c:if> <c:if test="${ age <= 26 }">
年龄小于了26岁...
</c:if>
<c:set var="gx" value="18" ></c:set>
<c:if test="${gx >5 }" var="falg" scope="session">
年龄大于5...
</c:if>
<br>${sessionScope.falg }

test ------ 条件

var -------- 于存储条件结果的变量 结果为true or false

scope ---- var属性的作用域

3.c:forEach

从1 开始遍历到10 ,得到的结果 ,赋值给 i ,并且会存储到page域中, step , 增幅为2,
<c:forEach begin="1" end="10" var="i" step="2">
${i }
</c:forEach>
<% user u1 = new user(18,"gx");
user u2 = new user(13,"wf");
user u3 = new user(88,"hh");
ArrayList<user> u = new ArrayList();
u.add(u1);u.add(u2);u.add(u3);
pageContext.setAttribute("u",u);
%>
遍历自定义的对象集合
<c:forEach var="user" items="${u }">${user.name } --- ${user.age }<br></c:forEach>

items ------ 要被循环的信息

begin ----- 开始的元素(0=第一个元素,1=第二个元素)

end ----- 最后一个元素(0=第一个元素,1=第二个元素)

step ------ 每一次迭代的步长

var -------- 代表当前条目的变量名称

varStatus --------- 代表循环状态的变量名称

c:forTokens标签与c:forEach标签有相似的属性,不过c:forTokens还有另一个属性:

其他标签

c:out

用于在JSP中显示数据,就像<%= … >

c:remove

用于删除数据

c:catch

用来处理产生错误的异常状况,并且将错误信息储存起来

c:choose

本身只当做c:when和c:otherwise的父标签

c:when

c:choose的子标签,用来判断条件是否成立

####c:otherwise

c:choose的子标签,接在c:when标签后,当c:when标签判断为false时被执行

c:import

检索一个绝对或相对 URL,然后将其内容暴露给页面

c:param

用来给包含或重定向的页面传递参数

c:redirect

重定向至一个新的URL

c:url

使用可选的查询参数来创造一个URL

总结:

  • JSP

    三大指令

    	page
    include
    taglib 三个动作标签
    <jsp:include>
    <jsp:forward>
    <jsp:param>

    九个内置对象

      四个作用域
    pageContext
    request
    session
    application out
    exception
    response
    page
    config

EL

${ 表达式 }

取4个作用域中的值

${ name }

有11个内置对象。

pageContext

pageScope
requestScope
sessionScope
applicationScope header
headerValues param
paramValues cookie
initParam

JSTL

使用1.1的版本, 支持EL表达式, 1.0不支持EL表达式

拷贝jar包, 通过taglib 去引入标签库

<c:set>
<c:if>
<c:forEach>

JavaWeb之JSP & EL & JSTL的更多相关文章

  1. JavaWeb 补充(JSP&EL&JSTL)

    1. JSP:     1. 指令     2. 注释     3. 内置对象 2. MVC开发模式 3. EL表达式 4. JSTL标签 5. 三层架构 JSP: 1. 指令     * 作用:用于 ...

  2. JavaEE之动态页面技术(JSP/EL/JSTL)

    动态页面技术(JSP/EL/JSTL) JSP技术 jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%= ...

  3. jsp&el&jstl mvc和三层架构

    jsp:java在html中插入java 一.JSP技术 1.jsp脚本和注释 jsp脚本:(翻译成servlet,源码位置apache-tomcat-7.0.52\work\Catalina\loc ...

  4. 动态页面技术JSP/EL/JSTL

    本节内容: jsp脚本和注释 jsp运行原理 jsp指令(3个) jsp内置/隐式对象(9个) jsp标签(动作) EL技术 JSTL技术 JavaEE的开发模式 动态页面技术:就是在html中嵌入j ...

  5. 《JavaWeb从入门到改行》JSP+EL+JSTL大杂烩汤

    title: Servlet之JSP tags: [] notebook: javaWEB --- JSP是什么 ? JSP就是Servlet,全名是"JavaServer Pages&qu ...

  6. javaweb(3)之JSP&EL&JSTL

    JSP(Java Server Page) 介绍 什么是 JSP ? 从用户角度看,JSP 就是一个网页. 从开发者角度看,它其实就是一个继承了 Servlet 的 java 类,所以可以直接说 JS ...

  7. JavaWeb之动态页面技术JSP/EL/JSTL

    一.JSP技术 1.jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%=java变量或表达式> - ...

  8. 回锅的美食:JSP+EL+JSTL大杂烩汤

    title: Servlet之JSP tags: [] notebook: javaWEB --- JSP是什么 ? JSP就是Servlet,全名是"JavaServer Pages&qu ...

  9. request+response+jsp+el+jstl

    response: 1.设置响应行的状态码: response.setStatus(int sc); 2.设置response缓冲区的编码:response.setCharacterEncoding( ...

随机推荐

  1. C# 使用WM_COPYDATA传输数据(两个窗体间通信)

    //发送方 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data ...

  2. Slickflow.NET 开源工作流引擎高级开发(五) -- 引擎和外部事件的交互

    前言:引擎组件的基本职责是负责流程流转,但是在流转过程中,除了对内部控制逻辑进行实现外,也不可避免的要去调用或者响应外部事件.本文主要描述外部事件的类型,以及调用方法过程. 1. 外部事件的类型 外部 ...

  3. Selenium(十四):自动化测试模型介绍、模块化驱动测试案例、数据驱动测试案例

    1. 自动化测试模型介绍 随着自动化测试技术的发展,演化为了集中模型:线性测试.模块化驱动测试.数据驱动测试和关键字驱动测试. 下面分别介绍这几种自动化测试模型的特点. 1.1 线性测试 通过录制或编 ...

  4. javaWeb综合案例

    商城案例 分模块:用户模块→ 分类模块 → 商品模块→购物车模块(最难)→ 订单模块 后台模块(往前台的数据的增删改查) 今日任务: 1用户注册 a注册完成 b给注册人发邮件 2用户激活 a 去邮箱激 ...

  5. Use a Multiline Editor for String Properties 对字符串属性使用多行编辑器

    In this lesson, you will learn how to display a multiline editor for string properties. For this pur ...

  6. Android 列表对话框 使用数组

    添加一个数组 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt ...

  7. [靶场实战]:SQL注入-显错注入

    SQL注入的本质:就是将用户输入的数据当作代码带入执行. 注入条件: 1.用户能控制输入 2.能够将程序原本执行的代码,拼接上用户输入的数据进行执行 首先检查是否存在注入点 Rank1: 构造语句 ? ...

  8. JVM-1-HotSpot server client

    64位JDK 默认只能工作在Server模式下 是无法切换到Client模式的   Hot Spot虚拟机Server

  9. Day10 - Python基础10 socketserver 实现并发

    本节内容: 1.实例tcp的并发 2.看源代码继承关系 3.详解:ThreadingTCPServer的过程 4.tcp和udp的request 不同 5.基于udp的并发实现 1.实例tcp并发 s ...

  10. 201871010126 王亚涛 《面向对象程序设计(java)》 第一周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/wyt0455820/ ...