JSP简介、JSP四大域对象、EL表达式

一、JSP

1.1 简介

JSP:Java Server Page SUN 公司提供的动态⽹⻚编程技术,是 Java Web 服务器端的
动态资源。

它相比 html ⽽⾔,html 只能为⽤户提供静态数据,⽽ Jsp 技术允许在⻚⾯中嵌套 java 代
码,为⽤户提供动态数据。

相⽐ servlet ⽽⾔,servlet 很难对数据进⾏排版,⽽ jsp 除了可以⽤ java 代码产⽣动态数据的同时,也很容易对数据进⾏排版。

其实 Jsp 就是⼀个 Servlet,当我们第⼀次访问 Jsp 的时候,Jsp 引擎都会将这个 Jsp 翻
译 成⼀个Servlet,这个⽂件存放在tomcat(源码⽬录) 中的 work ⽬录中。

在这里插入图片描述

1.2 注释

在 JSP 中⽀持两种注释的语法操作:

  • 显示注释,这种注释是允许客户端看见的 ,显示注释语法:从 HTML ⻛格继承⽽来
  • 隐式注释,此种注释是客户端⽆法看见的,隐式注释语法:从 JAVA ⻛格继承;JSP
    自己的注释

JSP 的三种注释⽅式:

1// 注释,单⾏注释   /* 多⾏注释*/
2<!-- HTML⻛格的注释 -->
3<%-- JSP注释 --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSP的基础语法</title>
</head>
<body>

<pre>
<h2>JSP的注释</h2>
JSP有两类注释:
    显式注释(浏览器中可以看到的注释)
        1. 继承HTML风格的注释
            格式: &lt;!-- HTML注释 --&gt;
            <!-- 这是HTML的注释 -->
    隐式注释(浏览器中不可以看到的注释)
        1. JSP的注释
            格式:&lt;%-- JSP注释 --%&gt;
            <%-- 这是JSP的注释 --%>
        2. 继承Java风格的注释
            格式:// 单行注释      /* 多行注释 */
            <%
                // 单行注释
                int num = 1;
                /**
                 * 多行注释
                 */
                System.out.println(num);
            %>
</pre>
</body>
</html>

1.3 Scriptlet

在 JSP 中最重要的部分就是 Scriptlet(脚本小程序),所有嵌⼊在 HTML 代码中的 Java
程序。

在 JSP 中⼀共有三种 Scriptlet 代码:都必须使⽤ Scriptlet 标记出来

第⼀种:<% %>: java 脚本段,可以定义局部变量、编写语句
第⼆种:<%! %>:声明,可以定义全局(成员)变量、⽅法、类
第三种:<%= %>:表达式,数据⼀个变量或具体内容
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSP的基础语法</title>
</head>
<body>

<pre>
<h2>Scriptlet脚本小程序</h2>
    JSP中有3种脚本小程序:
        第一种: Java脚本段
            格式:&lt;%  %&gt;
            作用:可以定义局部变量,编写Java语法。生成的代码会在Servlet的service方法体中
            <%
                // 输出全局变量
                System.out.println(name);
                // 输出局部变量 (在局部变量声明前使用,会报错)
                // System.out.println(a);

                // 定义局部变量
                int a = 1;
                String str = "Hello JSP!";
                // 控制台 输出
                System.out.println(str);
                // 浏览器 输出
                out.write(str);
            %>
        第二种:声明
            格式:&lt;%!  %&gt;
            作用:声明全局变量、方法或类。生成的代码在Servlet类体中
            <%!
                // 声明全局变量
                String name = "admin";
            %>
        第三种:输出表达式
            格式:&lt;%=  %&gt;
            作用:是一个输出表达式,可以输出变量或字面量。生成的代码在Servlet类的service方法体中
            <%=a %> <br> <%=str %> <br> <%=name %>
</pre>

</body>
</html>

1.4 JSP的指令标签

使⽤包含操作,可以将⼀些重复的代码包含进来继续使⽤,从正常的⻚⾯组成来看,有时
可能分为⼏个区域。⽽其中的⼀些区域可能是⼀直不需要改变的,改变的就其中的⼀个具
体内容区域。现在有两种⽅法可以实现上述功能。

  • 在每个 JSP ⻚⾯(HTML)都包含⼯具栏、头部信息、尾部信息、具体内容
  • 将⼯具栏、头部信息、尾部信息都分成各个独⽴的⽂件,使⽤的时候直接导⼊

很明显,第⼆种⽅法⽐第⼀种更好,第⼀种会存在很多重复的代码,并且修改很不⽅便,在 JSP 中如果要想实现包含的操作,有两种做法:静态包含动态包含

1.4.1 include 静态包含

<body>
<%--
   include包含
       1. 静态包含
           <%@include file="要包含的页面的路径" %>
           可以包含的html与jsp页面
           特点:
               相当于内容的替换,只会生成一个源码文件,不能出现同名变量。运行效率高一点点,但是耦合度高,不够灵活。
    
--%>
    <%--静态包含--%>
    <%@include file="02-include包含-01.jsp"%>
    <h2>主题内容</h2>
    <%
        //静态包含中,不能出现同名变量
        //int a = 10;
    %>
    <%@include file="02-include包含-02.jsp"%>
</body>

1.4.2 include 动态包含

<body>
<%--
   include包含
       2. 动态包含
           <jsp:include page="要包含的页面的路径"></jsp:include>
           可以包含html与jsp页面、servlet
           特点:
               相当于方法的调用,会生成多个源码文件(有几个页面生成几个),可以出现同名变量。运行效率高,耦合度低,比较灵活。
               可以传递参数。
                   <jsp:include page="要包含的页面的路径">
                       <jsp:param name="参数名" value="参数值"/>
                   </jsp:include>
      注:
           1. name不支持任何表达式,value支持表达式
           2. 如果没有传递参数,include双标签中不要添加任何内容,包括空格和回车。
           3. 在被包含的额页面获取参数,使用 request.getParameter(name);

--%>
   <%-- 动态包含--%>
    <jsp:include page="02-include包含-01.jsp"></jsp:include>
    <h2>主题内容</h2>
    <%
        int a = 10;
        String upwd = "123456";
    %>
    <jsp:include page="02-include包含-02.jsp">
        <jsp:param name="name" value="admin"/>
        <jsp:param name="upwd" value="<%=upwd%>"/>
    </jsp:include>
    <jsp:include page="02-include包含-02.jsp"></jsp:include>
</body>

接收参数:

<body>
    <h2>这是一个尾部导航!</h2>
    <%--接收传递过来的参数--%>
    <%
        String uname = request.getParameter("name");
    %>
    <%=uname %>--<%=request.getParameter("upwd")%>
</body>

1.5 JSP的四大域对象

<body>
<%--
    JSP四大域对象
        1. page作用域
            在当前页面有效,页面跳转后无效
        2. request作用域
            在一次请求中有效,服务端跳转有效,客户端跳转无效(两次请求)
        3. session作用域
            在一次会话中有效,无论服务端跳转还是客户端跳转都有效。但是session对象失效后无效。
        4. application作用域
            在整个应用程序中有效,关闭服务器失效。

        如何选择?
            在合理的范围内尽可能小。

    九大内置对象
        4个域对象
            1. request
            2. session
            3. application
            4. pageContext
        2个输出对象
            5. response
            6. out
        1个配置对象
            7. config
        1个其他对象
           8. page
        1个异常对象
           9. exception (只有页面的page指令设置了isErrorPage属性时,才能使用)
--%>

<%
    int i = 1/0;
%>
</body>

1.6 EL表达式的使用

1.6.1 EL表达式的语法

语法结构⾮常简单: ${expression}

EL 表达式⼀般操作的都是域对象中的数据,操作不了局部变量。

1.6.2 获取数据

<body>
<%--
   EL表达式
       语法;${限域变量名}
           注:限域变量名,表示作用域的key
       EL表达式一般操作的是作用域中的数据,不能操作变量。
       作用域的范围:
           page范围:pageContext
           request范围:request
           session范围:session
           application范围:application

       操作作用域数据的方法:
           设置作用域      setAttribute(name,value);
           获取作用域      getAttribute(name);
           移除作用域      removeAttribute(name);

       获取指定范围的域对象:
           page范围:${pageScope.限域变量名}
           request范围:${requestScope.限域变量名}
           session范围:${sessionScope.限域变量名}
           application范围:${applicationScope.限域变量名}

       EL表达式取值范围从小到大,取到即止。如果四个范围都没找到,则返回空字符串""--%>

    <%
        pageContext.setAttribute("uname","zhangsan");// page作用域
        request.setAttribute("uname","lisi");// request作用域
        session.setAttribute("uname","wangwu");// session作用域
        application.setAttribute("uname","zhaoliu");// application

        //变量
        String name = "test";
    %>
    获取作用域中的值:${uname}--${uname2}<br>
    获取变量的值:${name}<br>
    获取指定范围的作用域:${pageScope.uname}--${requestScope.unmae}-- ${sessionScope.uname} -- ${applicationScope.uname}
</body>

1.6.3 获取List、map、对象中的数据

<body>
<%--

            获取作用域中的集合
                获取List中指定下标的数据
                    ${list[下标] }
                获取集合的长度
                    ${list.size()}
                注:
                   list代表的是存在域对象中的变量名(限域变量名)

            获取作用域中的Map
                获取Map中指定值
                   ${map["key"] } 或 ${map.key }
                注:
                    map代表的是存在域对象中的变量名(限域变量名)

            获取作用域中的JavaBean对象
                获取javabean的属性字段 (字段名提供get方法)
                    $(对象.字段名)
    --%>

    <%
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        //设置到作用域中
        request.setAttribute("myList",list);
    %>
    <h3>获取List</h3>
    获取List的长度:${myList.size()}<br>
    获取List的指定值:${myList[0]}

    <br>
    <hr>
    <%
        Map map = new HashMap();
        map.put("aaa", "111");
        map.put("bbb", 2222);
        map.put("ccc-a", 333);
        request.setAttribute("map", map);
    %>
    <h3>获取Map</h3>
    获取Map的指定值:${map["aaa"]}--${map.bbb}

    <br>
    <hr>
    <%
        User user = new User();
        user.setUserId(1);
        user.setUserName("zhangsan");
        user.setUserPwd("123456");

        Account account = new Account();
        account.setAccountId(1);
        account.setAccountName("招商银行");

        user.setAccount(account);

        request.setAttribute("user",user);
    %>
    <h3>获取JavaBean</h3>
    获取对象:${user} <br>
    获取对象中的属性字段:${user.uname} -- ${user.getUpwd()}<br>
    获取对象中的对象的字段:${user.account.accountName}
</body>

1.7 empty

<body>
    <%--
       empty
           判断域对象是否为空。为空,返回true;不为空返回false;
               ${empty 限域变量名 }
           判断对象是否不为空。
               ${!empty 限域变量名 }
    --%>
    <%
        String str1 = null;
        String str2 = "";
        String str3 = "Hello";


        List list1 = null;
        List list2 = new ArrayList<>();
        List list3 = new ArrayList<>();
        list3.add(1);

        User user1 = null;
        User user2 = new User();
        User user3 = new User();
        user3.setUserId(1);

        request.setAttribute("str1",str1);
        request.setAttribute("str2",str2);
        request.setAttribute("str3",str3);

        request.setAttribute("user1",user1);
        request.setAttribute("user2",user2);
        request.setAttribute("user3",user3);

        request.setAttribute("list1",list1);
        request.setAttribute("list2",list2);
        request.setAttribute("list3",list3);

    %>
    判断字符串:${empty str1} -- ${empty str2} -- ${empty str3} <br>
    判断List:${empty list1} -- ${empty list2} -- ${empty list3} <br>
    判断JavaBean:${empty user1} -- ${empty user2} -- ${empty user3} <br>

</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值