JavaWeb学习__第6天__jsp/EL表达式/EL函数

1.jsp原理

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
    JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据

    JSP模版元素:直接写在jsp中的HTML内容就叫做模版元素,在翻译过来的Servlet中直接由out输出,最终直接打给了浏览器。

    JSP脚本表达式:<%=  java表达式 %>  ,在翻译过来的Servlet中,会将java表达式的值进行计算后将计算结果输出到浏览器
    如:当前时间:<%= new java.util.Date() %>

    JSP脚本片断: <% 任意多的java语句 %> ,在翻译过来的Servlet中,会被复制粘贴到对应的位置上执行.多个jsp脚本片段之间的java代码是可以互相访问的,某个jsp脚本片段可以不是一个完整的java代码,但是整个jsp翻译完成后,拼接在一起的语句应该是完整的。
    如:

<%for (int i=1; i<5; i++)	
{
%>
	<h1>www.it315.org</h1>
<%}
%> 
    JSP声明 :<%!  java代码 %> ,在翻译过来的Servlet中,jsp声明的内容将会被放置到与service方法同级的位置,成为一个类成员。可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法。
    JSP注释:<%-- 注释内容 --%> 被jsp注释注释的内容,在翻译过程中被丢弃,在翻译出来的Servlet中不存在
        //会被当作java源码翻译到Servlet中,但是是被注释的java内容,在。java被编译为。class的时候丢弃掉
        <!-- -->  被当作普通的html内容打给了浏览器,浏览器认识此标签对其中的内容不予显示

    JSP指令:JSP指令不直接产生任何输出,它的作用是只会JSP翻译引擎如何翻译当前JSP页面的其他内容

    <%@ 指令 属性名="值" %> 一个指令中可以有多个属性,也可以写多个指令

    如:<%@ page contentType="text/html;charset=utf-8"%>:jsp乱码相关的指令,用来指定jsp输出时,设置的Content-Type响应头用来指定浏览器打开的编码

        <%@ page import="java.util.Date"%>:导入需要使用到的包 
        <%@ page errorPage="relative_url"%> 如果页面出错,将要跳转到的页面,除了在jsp中使用此属性指定错误页面外也可以在web.xml中配置整个web应用的错误页面,如果两个都设置则jsp中的此属性起作用
        <%@ page pageEncoding="characterSet=utf-8"%> 服务器翻译jsp时使用的编码集.如果向防止jsp乱码,应该保证文件的保存编码和jsp翻译成servlet用的编码以及输出到浏览器后浏览器打开的编码一致.此属性一旦设置好,翻译引擎会间接帮我们设置content-type属性.

2.pageContext

    pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了对其它8大隐式对象的引用,它自身还是一个域对象,可以用来保存数据。并且,这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源、检索其它域对象中的属性等。
    pageContext内封装了其它8大内置对象,可以通过getXxx方法()获得其他8大内置对象
    它是一个域对象,作为入口对象操作四大作用域中的数据
    生命周期:当jsp页面访问开始时,创建此对象,当这次访问结束此对象销毁。
    作用范围:整个jsp页面
    作用:在当前jsp页面中共享数据

    特殊之处:可以用来操作四大作用域中任意域中的属性:
    public void setAttribute(java.lang.String name, java.lang.Object value,int scope)
    public java.lang.Object getAttribute(java.lang.String name,int scope)
    public void removeAttribute(java.lang.String name,int scope)
    第三个参数:PageContext.APPLICATION_SCOPE
                PageContext.SESSION_SCOPE
                PageContext.REQUEST_SCOPE
                PageContext.PAGE_SCOPE 

    findAttribute方法://(*重点,查找各个域中的属性)从最小的域开始向最大的域开始搜索,找到则返回值,找完四大作用于都找不到值则返回null

    其提供了快捷方法,实现请求转发和请求包含
    pageContext.forward("");
    pageContext.include("");

    四大作用域
    ServletContext(application)
    session(session)
    request(request)
    pageContext(page)
    如果一个数据只在当前jsp页面中使用,存入page域。
    如果一个数据,在Servlet中处理好后,请求转发到其他serlvet或jsp使用此数据,放入request域。
    如果一个数据,我当前要用,过一会我自己还要用。存入session。
    如果一个数据,我当前要用,过一会其他人也要用。存入application域。

3.jsp标签

    标签技术:对于jsp页面中的java代码,应该尽量的少,如果没有办法避免java代码,则我们使用标签来替代掉这些java代码。

    sun提供的,jsp中的原生的标签,不需要导入任何标签库就可以直接使用
        <jsp:include>标签 :实现页面包含
            <jsp:include page="relativeURL" flush="true|false" />
        <jsp:forward>标签 :实现请求转发
            <jsp:forward page="relativeURL" /> 
        <jsp:param>标签  :配合上面两个标签使用,只要的功能是,在请求转发或包含时,带一些请求参数过去
        当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给其它资源时,可以使用<jsp:param>标签向这个资源传递参数。
    语法1:
<jsp:include page="relativeURL">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
    语法2:
<jsp:forward page="relativeURL">
<jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
</jsp:include>
        <jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。

4.EL表达式

    用来替代jsp页面中的JSP脚本表达式:${el表达式 }

1.获取数据

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@page import="com.itheima.domain.Person"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
  	<h3>获取javabean的属性</h3>
  	<%
  		Person p = new Person();
  		p.setName("无忌孩儿");
  		p.setAge(99);
  		pageContext.setAttribute("p",p);
  	 %>
  	 ${p.age}
  	 <a href="${pageContext.request.contextPath }/3.jsp">xxx</a>
  	<h3>获取Map中的数据</h3>
  	<%
  		Map map = new HashMap();
  		map.put("name","卢俊义");
  		map.put("age",99);
  		map.put("gender","男");
  		map.put("name.child","衣衣");
		pageContext.setAttribute("map",map);
		pageContext.setAttribute("age","name");
  	 %>
  	 ${map["age"] }
  	 ${map[age] }
  	 ${map.name }
  	 ${map["name.child"] }
  	<br>使用中括号的地方都可以使用点号进行替代,除了中括号中是数字或者包含特殊字符(-.)的情况除外<br>
  	<br>中括号中如果使用双引号则是用常量值作为键,如果不使用双引号则是变量,先到域中找变量的值,找到后作为键使用<br>
  	
  	<h3>获取集合中的数据</h3>
	<%
		List list = new ArrayList();
		list.add("武松");
		list.add("大郎");
		list.add("金莲");
		list.add("庆");
		pageContext.setAttribute("list",list);
	 %>
	 ${list[3] }

  	<h3>获取数组中的数据</h3>
  	<%
  		String [] names = {"林冲","宋江","鲁智深","孙二娘"};
  		pageContext.setAttribute("names",names);
  	 %>
  	 ${names[3] }
  	
  	<h3>获取域中的变量数据:底层其实是调用了pageContext的findAttribute方法来搜寻的数据,不一样的是如果找不到不会返回null,而是返回空</h3>
  	<%
  		String name = "吴用";
  		pageContext.setAttribute("name",name);
  	 %>
	${name }  	
  	
  	<h3>获取常量:数字、字符串、布尔常量</h3>
  	${999 } ${"abcd" } ${true }
  </body>
</html>
2.执行运算
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
  	<h1>empty 运算符</h1>
  	可以用来判断对象是否为null后字符串是否为空字符串,或集合数组是否为空,或域中是否没有任何属性
  	<%
  		String str = "";
  		pageContext.setAttribute("str",str);
  		String [] strs = {};
  		pageContext.setAttribute("strs",strs);
  	 %>
  	 ${empty str }
  	 ${empty strs }
  	 ${empty session }
  	
  	<h1>三元表达式</h1>
	${100>3? 'a' : 'b' }
	  
  	<h1>逻辑运算</h1>
  	&& and
  	|| or
  	! not
  	
  	${not (3>2 and 2>1) }
  
  	<h1>比较运算</h1>
  	> gt
  	>= ge
  	< lt
  	<= le
  	== eq
  	!= ne
  	
  	${3<2 }
  	${3==3 } 
	${3 gt 2 }  
  	<h1>算数运算</h1><hr>
  	<%
  		pageContext.setAttribute("num",100);
  	 %>
  	${10+1 }
  	${10*10 }
  	${num*num }
  	${1+"1"}
  </body>
</html>

3.获取常用开发对象

    11个内置对象:不需要定义直接在EL中可以直接使用)

    pageContext -- 可以间接获取9大隐式对象
    pageScope
    requestScope
    sessionScope
    applicationScope  带表四大作用域,本质上是作用域中所有域属性所组成的Map
    param 所有请求参数组成的Map<String,String>
    paramValues 所有请求参数组成的Map<String,String[]>
    header 所有请求头组成的Map<String,String>
    headerValues 所有请求头组成的Map<String,String[]>
    cookie 所有cookie信息组成的Map<String,Cookie>
    initParam 所有web应用初始化信息组成的Map<String,String>

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  <body>
  	<%
  		pageContext.setAttribute("name","li");
  		request.setAttribute("name","zhang");
  	 %>
  	 ${pageScope.name }
  	 ${requestScope.name }
  	 
  	 ${param.name }
  	 ${paramValues.like[2] }
  	 
  	 ${header["Accept-Language"] }
  	 
  	 ${cookie.JSESSIONID.value }
  	 
  	 ${initParam.encode }
  </body>
</html>
4.调用java方法
    调用的方法必须是静态的方法
    写一个类,其中包含需要调用的静态方法
    写一个tld文件,描述此静态方法
    在jsp页面中使用talib指令引入tld文件从而调用tld文件中描述的静态方法
    JSTL标签库 已经提供了很多现成的el函数,可以在程序中导入jstl相关的jar包(JAVAEE5以上内置了),使用taglib指令引入fn函数库后,可以直接使用JSTL定义的el函数,其中大部分都是对字符串进行操作的函数。

5.JSTL标签库

<c:out> 标签用于输出一段文本内容到pageContext对象当前保存的“out”对象中。

<%
	String str = "abc";
  	pageContext.setAttribute("str",str);
%>
<c:out value="${str}"></c:out>


<c:set>标签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的 属性。  
<c:remove>标签用于删除各种Web域中的属性
<c:catch>标签用于捕获嵌套在标签体中的内容抛出的异常,其语法格式如下:<c:catch [var="varName"]>nested actions</c:catch>
<c:if test="">标签可以构造简单的“if-then”结构的条件表达式 

<c:if test="${3>2}">
	你说对了
</c:if>

<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似 “if-else if-else” 的复杂条件判断结构。
<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。 

<c:forEach begin="10" end="100" var="number" step="2" varStatus="sta" >
  	<c:if test="${sta.count%3==0}">
		<font color="red">${number}</font>
	</c:if>
	<c:if test="${sta.count%3!=0}">
		<font color="black">${number}</font>
	</c:if>
</c:forEach>

<c:forTokens>用来浏览一字符串中所有的成员,其成员是由定义符号所分隔的
<c:param>标签   在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。<c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数。
<c:import> 标签,实现include操作
<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是将会话标识号以参数形式附加在URL地址后面 
<c:redirect>标签用于实现请求重定向








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值