JSP入门实战下

第一部分简单讲解:jsp语法的规范,以及三大编译指令,七个动作指令和九大内置对象,生命周期讲解等。这章主要讲解el表达式,核心标签库。


全部代码下载:链接

1.核心标签库(JSTL:c)讲解:

1.1简要介绍:

JSTL全名JspServer Pages Standdard Tag Library(Jsp标准标签库),它是sun公司发布的一个针对JSP开发的新组件,它允许使用标签开发Jsp页面.JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
JSTL所提供的标签库主要分为五大类:


09

1.2JSTL库安装:

  1. 从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)。下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
  2. 将下载的压缩包解压,将lib下的两个jar文件:standard.jar和jstl.jar文件拷贝到Tomcat下lib/目录下。
  3. 现在就可以通过在头部包含<taglib>标签使用JSTL了

1.3核心标签库的使用:

核心标签是最常用的JSTL标签。现在基本上我们也之使用功能核心标签库,此去只介绍核心标签,对于其他的标签用法类似。

  1. 引用核心标签库的语法如下:
<%--导入核心标签库 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" 
  1. 核心标签库的介绍:


    10
  2. 演示如下:详细见注释
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    import="java.util.*,com.rlovep.entity.Student"
    %> 
<%--导入核心标签库 --%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>核心标签jiangjie</title>
</head>
<body>
<%--使用标签库 --%>
<%--set标签:保存数据到域中,默认保存到pag域中
    var:属性名
    value:属性价值,可以是对象
    scope:范围
 --%>
<c:set var="name" value="rose" scope="page"></c:set>
<%--out标签: 类似输出表达式:<%= %>
    value:显示的内容;
    default:value为空时显示的内容
    escapexml:是否对<等实体符号转义;
--%>
<%--el表达式输出,调用属性 --%>
<c:out value="${name }" default="<h3>标题3</h3>" escapeXml="true"></c:out>
<%--默认值测试,以及输出特殊字符 --%>
<c:out value="${peace }" default="<h3>标题</h3>" escapeXml="true"></c:out>
<hr/>
<%--remove标签:删除数据,默认删除到pag域中
    var:属性名
    scope:范围
 --%>
<c:remove var="name" scope="page"/>
<c:out value="${name }" default="删除name之后" escapeXml="true"></c:out>
<hr/>
<%--catch标签:可以用来取得发生错误时的信息,同时可以进行适当处理.相当于try catch
    var:保存错误信息的exception
 --%>
 <c:catch var="e">
 <%
   int a=0,b=10;
    b=b/a;
 %>
 </c:catch>
 <%--输出错误信息 --%>
 <c:out value="${e }"/>
<%-- <%
   int a=0,b=10;
    b=b/a;
 %> --%>
 <hr/>
  <%--
    <c:url>标签将URL格式化为一个字符串,然后存储在一个变量中
    var:变量名。
    value:url
    context:本地的另一个工程库
  --%>
  <%--c:param 在重定向时当参数用 --%>
  <c:url var="url" value="el.jsp">
    <c:param name="pass" value="peace"/>
  </c:url>
  <a href="${url }">url重定向</a>
   <c:url var="baidu" value="http://wwww.baidu.com"/>
   <a href="${baidu }">百度</a>
<hr/>
<%--<c:import>标签:功能类似于<jsp:import>,但是功能更加强大。可以导入外部jsp文件,和保存到输入流中
    var:输出保存到string
    varReader:输出保存到输入字符流
    url:包含的页面
 --%>
 <c:import url="/common/header1.jsp" >
  <c:param name="name" value="sisi"/>
  </c:import>
  <hr/>
 <%--c:redirect 标签 可以是绝对地址 
    url:地址
    context:另外一个jsp容器
  --%>
<%--  <c:redirect url="el.jsp">
   <c:param name="pass" value="wang"></c:param>
 </c:redirect> --%>
 <%
   Integer score=new Integer(60);
   pageContext.setAttribute("score", score);
 %>
   <%--if标签 :单条件判断
     test:判断是否为true执行
   --%>
    <c:if test="${!empty score}">
        条件成立
    </c:if>
    <hr/>
    <%--choose标签+when标签+otherwirse标签: 多条件判断 --%>
    <c:set var="score" value="56"></c:set>
        <c:choose>
        <c:when test="${score>=90 && score<=100}">
            优秀
        </c:when>
        <c:when test="${score>=80 && score<90}">
            良好
        </c:when>
        <c:when test="${score>=70 && score<80}">
            一般
        </c:when>
        <c:when test="${score>=60 && score<70}">
            及格
        </c:when>
        <c:otherwise>
            不及格
        </c:otherwise>
    </c:choose>
    <%-- forEach标签:循环 --%>
    <%
        //List
        List<Student>  list = new ArrayList<Student>();
        list.add(new Student("rose",18));
        list.add(new Student("jack",28));
        list.add(new Student("lucy",38));
        //放入域中
        pageContext.setAttribute("list",list);
                //Map
        Map<String,Student> map = new HashMap<String,Student>();
        map.put("100",new Student("mark",20));
        map.put("101",new Student("maxwell",30));
        map.put("102",new Student("narci",40));
        //放入域中
        pageContext.setAttribute("map",map);
     %>
     <hr/>
     <%--
      begin="" : 从哪个元素开始遍历,从0开始.默认从0开始
      end="":     到哪个元素结束。默认到最后一个元素
      step="" : 步长    (每次加几)  ,默认1
      items="": 需要遍历的数据(集合) 
      var="": 每个元素的名称 
      varStatus="": 当前正在遍历元素的状态对象。(count属性:当前位置,从1开始,last属性:最后一个)
           --%>
    <c:forEach items="${list}" var="student" varStatus="varSta">
        序号:
{student.name } - 年龄:${student.age}<br/>

    </c:forEach>
        <hr/>
        <c:forEach items="${map}" var="entry">  
{entry.value.name } - 年龄:${entry.value.age }<br/>

    </c:forEach>
    <hr/>
    <%-- forToken标签: 循环特殊字符串 --%>
    <%
        String str = "java-php-net-平面";
        pageContext.setAttribute("str",str);
     %>
    <c:forTokens items="${str}" delims="-" var="s" varStatus="status">
        ${s }<br/>
        <c:if test="${status.last }">
        <c:out value="输出:${status.count}"/>个元素
        </c:if>
    </c:forTokens>
</body>
</html>

2.EL表达式语言:

E L(Expression Language) 目的:为了使JSP写起来更加简单。 EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能。
EL既可以用来创建算术表达式也可以用来创建逻辑表达式。在JSP EL表达式内可以使用整型数,浮点数,字符串,常量true、false,还有null。
EL使得访问存储在JavaBean中的数据变得非常简单,EL可以访问内置对象,以及放置在对象中的属性;
EL表达式作用: 向浏览器输出域对象中的变量值或表达式计算的结果?。。?/p>

2.1EL语法:${exper}

  1. 输出基本数据类型变量:
    不注明域的范围时,从四个域中获?。核承蛭猵ageScoep / requestScope / sessionScope / applicationScope
    ${name}<%--从指定域中获取name变量的值--%>
    指定域获取:
    ${pageScope.name} <%--等价于getAttribute()方法;--%>
  2. 输出对象的属性值
    ${student.name} 等价于 (点相对于调用getXX()方法)
  3. 使用EL获取集合对象

{list[0].age } <%-- list[0]等价于 (中括号相对于调用get(参数)方法) ((List)pageContext.findAttribute("list")).get(0)--%>

  1. el还可以执行算法表达式
    EL表达式支持大部分Java所提供的算术和逻辑操作符:


    11

    演示如下:

比较运算
     ${10>5 }<br/>
     ${10<5 }<br/>
     ${10!=10 }
     <hr/>
逻辑运算
     ${true && false }<br/>
     ${true || false }<br/>
     ${!false }<br/>
判空
        null 或 空字符串:  empty
     <%
        //String name = "eric";
        //String name = null;
        String name = "";
        pageContext.setAttribute("name",name);
      %>
      判断null: ${name==null }<br/>
      判断空字符: ${name=="" }<br/>
     判空:  ${name==null || name=="" }
另一种判空写法: ${empty name }

2.2EL高级用法自定义函数:

el表达语言的自定义函数 本质是为了调用提供一种方法允许el中调用某类的静态方法:

  1. 自定义函数使用语法:
    ${rlovep:reverse(student.name)}<%--调用reverse方法使传入的student.name反转--%>
  2. 开发步骤:
    1.在src建立开发处理类,这个类包含若干个静态方法。当然这个步骤可以省掉使用jdk库的类也是可以的
    2.使用标签库定义函数:定义函数的方式与定义标签的方式相似。增加function标签就行;
    3.使用:增加taglib指令
  3. 演示如下
    建立开发处理类: MyFuns.java
public static String reverse(String str)
    {
        return new StringBuffer(str).reverse().toString();
    }
    public static int count(String str)
    {
        return str.length();
    }

在webcontent目录下建立:mytaglib.tld标签库文件,增加function标签

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    version="2.1">
    <description>A tag library exercising SimpleTag handlers.</description>
    <!-- 标签库的版本 -->
    <tlib-version>1.0</tlib-version>
    <!-- 标签库前缀 -->
    <short-name>rlovep</short-name>
     <!-- tld文件的唯一标记 -->
   <uri>http://rlovep.com</uri>
 <!-- 定义第一个方法 -->
   <function>
   <!-- 定义方法名 -->
    <name>reverse</name>
    <!-- 定义方法的处理类 -->
    <function-class>com.rlovep.elmethod.MyFuns</function-class>
    <!-- 定义函数的实现方法:包括返回值和函数名以及参数 -->
    <function-signature>java.lang.String reverse(java.lang.String)</function-signature>
   </function>
    <!-- 定义第二个方法 -->
   <function>
   <!-- 定义方法名 -->
    <name>count</name>
    <!-- 定义方法的处理类 -->
    <function-class>com.rlovep.elmethod.MyFuns</function-class>
    <!-- 定义函数的实现方法:包括返回值和函数名以及参数 -->
    <function-signature>int count(java.lang.String)</function-signature>
   </function>
   </taglib>

增加taglib指令
<%@taglib prefix="rlovep" uri="http://rlovep.com" %>

2.3整体演示如下:

<%@page import="java.util.HashMap,java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@page import="com.rlovep.entity.Student"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <!-- 定义标签 -->
<%@taglib prefix="rlovep" uri="http://rlovep.com" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>el表达式学习:</title>
</head>
<body>
<%--el的内置对象 --%>
 <%
    pageContext.setAttribute("name", "peace");
    pageContext.setAttribute("age", "22", pageContext.APPLICATION_SCOPE);
 %>
 <%--直接从域中搜索获得属性 --%>
 El表达式:${name }
 <hr/>
 <%--等价于 --%>
 表达式:<%=pageContext.findAttribute("name") %>
 <hr/>
 <%--从指定域中获取属性 --%>
 EL表达式:${applicationScope.age}
 <hr/>
 <%--等价于 --%>
 <%=pageContext.getAttribute("age", pageContext.APPLICATION_SCOPE) %>
 <hr/>
 <%--获取请求参数 --%>
 请求参数${param.pass}
 <hr/>
<%--请求头获取 --%>
请求头${header.Host}
<%--还可以获得初始参数:initparam 以及cookie --%>
<hr/>
<%--el输出对象的属性 ,必须将对象放入域中--%>
<%
    Student student=new Student("peace",22);
    String a="123";
    //放入域中
   pageContext.setAttribute("student", student);
    //放入list中
    List<Student> list=new ArrayList<Student>();
    list.add(new Student("sisi",22));
    list.add(new Student("nick",20));
    list.add(new Student("lucy",38));
    pageContext.setAttribute("list", list);
    //放入map中
    Map<String,Student> map=new HashMap<String,Student>();
    map.put("100",new Student("mark",20));
    map.put("101",new Student("maxwell",30));
    map.put("102",new Student("narci",40));
    //放入域中
    pageContext.setAttribute("map",map);
%>
<%--使用el获取对象值 --%>
{student.age }

 <%--
       ${student.name} 等价于     (点相对于调用getXX()方法)
          <%=((Student)pageContext.findAttribute("student")).getName()%>
       --%>
       <hr/>
       <%--使用EL获取List对象 --%>
{list[0].age }<br/>

{list[1].age }<br/>
{list[2].age }

       <%--
       list[0]等价于       (中括号相对于调用get(参数)方法)
            ((List)pageContext.findAttribute("list")).get(0)
        --%>
        <hr/>
        <%--使用EL获取Map对象 --%>       
{map['100'].age }<br/>
{map['101'].age }<br/>
{map['102'].age }<br/>

<%--el还可以执行算法表达式 --%>
<%--el表达语言的自定义函数 
本质是为了调用提供一种方法允许el中调用某类的静态方法:
1.在src建立开发处理类,这个类包含若干个静态方法。当然这个步骤可以省掉使用jdk库的类也是可以的
2.使用标签库定义函数:定义函数的方式与定义标签的方式相似。增加function标签就行;
3.增加taglib指令
--%>
此去表达式调用函数:<br/>
peace倒转:${rlovep:reverse(student.name)}<%--调用reverse方法使传入的student.name反转--%>
<br/>
peace字符个数:${rlovep:count(student.name)}
</body>
</html>

来自一条伊豚wpeace(blog.wpeace.cn)

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,605评论 18 399
  • 一. Java基础部分.................................................
    wy_sure阅读 3,808评论 0 11
  • JSP 基本结构JSP 页面组成:模板文本(HTML,XML,纯文本),JSP 元素;JSP 元素:脚本元素,指令...
    jslancer阅读 839评论 0 11
  • 1什么是JSTLJSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL...
    TY_阅读 373评论 0 1
  • 2012?年?2?月?29?日,??18:36:00 七年之后的我已然29岁。也许是经过了岁月的洗礼与社会的考...
    小叶_榄仁阅读 321评论 0 0