JSP_EL_JSTL

一.jsp技术

1.作用:

将内容的生成和显示进行分离 

JSP技术,Web页面开发人员可以使用HTML或者XML标识来设计和格式化最终页面,并使用JSP标识或者小脚本来生成页面上的动态内容

2.jsp脚本:

<%java代码%>:翻译到servlet中service方法中

<%=变量/表达式%>:翻译到servlet中service方法中的out.print();

<%!java代码%>:翻译成servlet中的全局部分

3.jsp注释:

html注释:<!-- 注释内容 -->  可见范围:jsp源码----翻译后的servlet----页面源码 都可见

java注释:在脚本中  //   /**/   /***/   可见范围:jsp源码 ---- 翻译后是servlet

jsp注释:<%-- jsp注释 --%>  可见范围:jsp源码

4.jsp的指令

三种jsp的指令 page  taglib  include

<%@ page %> 决定jsp的一些属性

language 页面使用的语言

import 导包

pageEncoding/content-type 决定页面编码

isErrorPage 可以获得页面的Exception对象

<%@ include %> 静态包含 , 两个页面会生成一个Java文件. 两个页面可以共享代码.

file 指定需要包含的页面路径

                        <%@ include file=""%>

<%@ taglib %> 引入EL函数库 或 JSTL标签库

prefix 前缀

uri 导包

                            <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>   引入JSTL函数库

5.JSP的九个内置对象

内置对象     类型

request          HttpServerletRequest 

response        HttpServerletResponse

session           HttpSession

exception       Throwable

application     ServletContext

config            ServletConfig


page Object

out JspWriter

pageContext PageContext(可见范围:就在该jsp中)

                        1> 本身是一个域对象

2> 还可以控制其他3个域

3> 引用了其他8个内置对象

                           pageContext的findAttribute(name) ---- 从四个域中寻找  顺序:page域--->request域--->session域--->application域

内置对象out与response的getWriter流的区别

out会在代码编写的地方输出

response流会在html标签之前进行输出

<%

    response.getWriter().write("a");

    out.print("b");

    response.getWriter().write("c");

    out.print("d");

     %>

输出结果:ac bd  

6.

 是用来存放数据

不同域: 共享数据的范围不同

    request: 一次请求范围内共享数据

    session: 一次会话范围内

    application: 整个项目内

     pageContext:当前页面中,页面对应的的servlet的service方法中

    域的本质: 本质就是Map.不同的域无非就是在不同的对象中放置的map.

page域    

    page域: 用来存放共享数据

    范围: 当前页面中.页面对应的servlet的service方法中.

    本质: pageContext对象的一个map.

1>. 操作: 

//设置域

    pageContext.setAttribute("name", "tom");

//获得域

    pageContext.getAttribute("name");

//删除域

    pageContext.removeAttribute("name");

2.> page域可以操作其他三个域

可以利用pageContext对象向request、session、application域中存取数据

通过pageContext操作request域向其中添加2个键值对

<%

      pageContext.setAttribute("name", "Tom", PageContext.REQUEST_SCOPE);

      pageContext.setAttribute("name02", "Sony", pageContext.REQUEST_SCOPE);

 %>

//获取request域中键为name的value值

      <%=pageContext.getAttribute("name",PageContext.REQUEST_SCOPE) %>

      <%=pageContext.getAttribute("name02",pageContext.REQUEST_SCOPE) %>

//获取request域中所有的键

      <%=pageContext.getAttributeNamesInScope(pageContext.REQUEST_SCOPE) %>

//删除request域中的键值对

      <% pageContext.removeAttribute("name", pageContext.REQUEST_SCOPE); %>

3.>

pageContext引用了其他八个内置对象    

    <%

    pageContext.getRequest();

    pageContext.getResponse();

    pageContext.getSession();

    pageContext.getServletContext();

    pageContext.getServletConfig();

    pageContext.getOut();

    pageContext.getPage();

    pageContext.getException();   

    %>

7. jsp动作标签

什么是标签及其作用

JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。

Jsp中常用动作标签

jsp:forward

<jsp:forward>标签是用来做请求转发,它与RequestDispatcher接口的forward()方法一样,唯一不同的是它是在jsp页面中使用。

jsp:include

<jsp:include>标签的作用使用来包含其他jsp页面,之前学习的include指令属于静态包含,而include动作标签是动态包含,它和RequestDispatcher接口的include()方法一样,是运行级别的包含

jsp:param

<jsp:param>标签作为<jsp:forward>标签和<jsp:include>标签的子标签,用来给转发或包含的页面传递数据。

包含:

<jsp:include page="/index.jsp"></jsp:include>

<%

      //request.getRequestDispatcher("").include(request, response);

      %>

转发:

<jsp:forward page="/page01/demo02.jsp"></jsp:forward>

<%

//request.getRequestDispatcher("/index.jsp").forward(request, response);

%>

二.EL表达式

EL表达式的作用:

    1.取得域中的数据.

    2.EL表达式中内置了11个对象

    3.EL表达式支持的简单运算  

EL的语法: ${表达式内容}

<%
     	//准备数据
     	request.setAttribute("name", "requestTom");
     	session.setAttribute("name", "sessionTom");
     	application.setAttribute("name", "applicationTom");
     	pageContext.setAttribute("name", "pageTom");
     	
      %>
      EL的从域中取值:<br>
      	
      	request域:${requestScope.name}<br>
     	session域:${sessionScope.name}<br>
     	application域:${applicationScope.name}<br>
       	page域:${pageScope.name}<br>
       	
       	从小域到大域自动查找名为name的键值对:${name}<br>
       	从小域到大域自动查找名为name的键值对:<%=pageContext.findAttribute("name") %>
       	<hr>
       	使用EL表达式.如果取到的值为null,那么不输出: ${abc}<br>
       	<%=request.getAttribute("abc") %><br>

JSP_EL_JSTL_第1张图片

     <%
     	Cookie cookie = new Cookie("name","cookieTom");
     	response.addCookie(cookie);
      %>
     
5>pageContext: ${pageContext.request.contextPath} <br/>
6>cookie代表浏览器发送的Cookie: ${cookie.name.value}     <br/>
//------以下不常用-------     <br/>          
7>param			代表浏览器发送的参数 :${param.name}<br/>
8>paramValues	代表浏览器发送的参数 :${paramValues.name[0]} <br/>
9>header		代表浏览器请求头 :${header.Cookie}                        <br/>
10>headerValues 代表浏览器请求头 :${headerValues.Cookie[0]}                       <br/>
11>initParam	代表项目中的context-param参数 : ${initParam.name}<br/>


EL函数:

el可以调用java方法 ---- el函数库

jstl函数库中的函数

步骤:

    (1) 在jsp中使用taglib指令引入el函数库

    (2) 使用函数库

语法:${前缀:函数}

el常用函数示例:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'demo05.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
   
     fn:contanins:查看input中是否包含substring,包     含返回true,否则返回false;<br/>
     ${fn:contains("Java","J")} <br/> 
     <hr/>
     fn:escapeXml:把input中“<”、“>“、”&“、”'“、“"”进行转义<br/>
     ${fn:escapeXml("<hr>")}<br/>
     <hr/>
     fn:indexOf:返回input中substring出现的索引位置;<br/>
     ${fn:indexOf("Swift","i") }<br/>
     <hr/>
     fn:containsIgnoreCase:忽略大小写的情况下,判断"Java"中是否包含"A"<br/>
     ${fn:containsIgnoreCase("Java","A") }<br/>
     <hr/>
     fn:endsWith:判断test.bak是否以.bak结束<br/>
     ${fn:endsWith("test.bak",".bak") }<br/>	
	<hr/>
	  <%
    	String[] arr={"Java","PHP","Python","Swift","Go"};
    	request.setAttribute("array", arr);
     %>
     fn:join:将arr数组中的元素以“-”连接,并返回<br/>
      ${fn:join(array,"-") }<br/>
      <hr/>
      fn:length:最终是将数组的元素以“-”连接,并返回<br/>
      ${fn:length(array) }<br/>
  </body>
</html>

三.JSTL

jstl标准标签库 

主要使用core: 核心库和fmt:  格式化库

core:

    if

    choose

    when

   otherwise

    foreach

    url

    param

    redirect

     param

fmt:

    formatdate

    formatnumber

主要JSTL用法

foreach:

<body>
  	<!-- 
  		JSTL标签库:
  			步骤:
  				1.在页面导入标签库<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
  				2.在页面使用
  	 
  	 	core 核心库:
  	 		
  	 -->
  	 
  	 <%-- c:foreach 页面遍历标签
  	 
  	 		items属性: 填写需要遍历的集合&数组
  	 		var属性: 每次遍历,会将当前遍历的对象使用var属性值作为键放入page域
  	 		
  	  --%>
  	 
  	 
  	 <%
  	 	List list = new ArrayList();
  	 	list.add("tom");
  	 	list.add("jerry");
  	 	list.add("jack");
  	 	list.add("rose");
  	 	
  	 	request.setAttribute("list", list);
  	  %>
  	  
  	  <table border="1" >
  	  		<tr>
  	  			<th>姓名</th>
  	  			<th>索引</th>
  	  			<th>计数</th>
  	  			<th>当前是否是第一个元素</th>
  	  			<th>当前是否是最后一个元素</th>
  	  		</tr>
  	  	<c:forEach items="${list}" var="name" varStatus="st"  >
  	  		<tr class="${pageScope.st.index%2==0?"even":"odd"}" >
  	  			<td>${pageScope.name}</td>
  	  			<td>${pageScope.st.index}</td>
  	  			<td>${pageScope.st.count}</td>
  	  			<td>${pageScope.st.first}</td>
  	  			<td>${pageScope.st.last}</td>
  	  		</tr>
  	  	</c:forEach>
  	  </table>
  	
 <hr>
  
  	 <%-- c:foreach 页面数数 
  	 		begin : 开始数数的位置
  	 		end: 数数结束的位置
  	 		step: 步长
  	 		
  	 --%>
 	 	 
  	<a href="#">上一页</a> 
  	<c:forEach begin="1" end="10" step="1" var="num" >
  	 	${pageScope.num}
  	 </c:forEach>	
  	<a href="#">下一页</a> 
  	 
  	 
  </body>

if与choose用法

<body>
     <%
     	request.setAttribute("num01", 10);
     	request.setAttribute("num02", 5);
      %>
      <%-- <c:if> 判断标签 --%>
      <!--  <c:if test="${requestScope.num01>requestScope.num02}">
      		num01>num02
      </c:if>
      -->
       
      <br/>
       <c:choose>
	 		<c:when test="${num01>num02}">num1大!</c:when>
	 		<c:when test="${num01==num02}">一样大!</c:when>
	 		<c:otherwise>num2大!</c:otherwise>
	 </c:choose>
  </body>


你可能感兴趣的:(jsp,EL,jstl)