JavaWeb之JSP & EL & JSTL

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>
原文地址:https://www.cnblogs.com/wf614/p/11673839.html