Java之JSP基础 el表达式 JSTL表达式

JSP介绍

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet。

    jsp = html + java

    html:静态内容
    servlet:适合编写java逻辑代码
    jsp:适合编写输出动态内容,但不适合编写java逻辑。

    Jsp 原理(编译执行过程)
    试写一个获取当前系统时间的 jsp

JSP基础语法

    1.html 标签
2.
    小脚本 <% java代码 %>
    表达式 <%= 2+3 %>
    声明   <%! %> 表示在类中定义全局成员,和静态块。
    JSP注释
    JSP注释:<%-- 被注释的内容 --%> 特点:安全,省流量
    网页注释:    特点:不安全,费流量

JSP的三个指令

    page
    import 和java代码中的import是一样的
    <%@ page import="java.util.Date,java.util.List"%>
    或者:
    <%@ page import="java.util.Date"%>
    <%@ page import="java.util.List"%>
    JSP会自动导入以下的包:
    import java.lang.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.jsp.*;

    session 默认值是true
    errorPage: 如果页面中有错误,则跳转到指定的资源。
    isErrorPage: 是否创建throwable对象。默认是false;
    contextType: 等同于response.setContextType("text/html;charset=utf-8");

    Include
    静态包含:把其它资源包含到当前页面中。
    <%@ include file="/include/1.jsp" %>
    动态包含:
    include page="/include/1.jsp">include>

    两者的区别:翻译的时间段不同
    前者:在翻译时就把两个文件合并
    后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。

    原则:能用静的就不用动的。

    taglib
    作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。
    需要导入 jar 包
    jstl.jar standard.jar
    https://mvnrepository.com/
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

JSP的6个动作

    <jsp:include > 动态包含
    <jsp:forward> 请求转发
    <jsp:param> 设置请求参数

    <jsp:useBean> 创建一个对象
    <jsp:setProperty> 给指定的对象属性赋值
    <jsp:getProperty> 取出指定对象的属性值

JSP的9个内置对象

    request
    response
    session
    application
    exception
    page 当前servlet实例 this
    config
    out
    pageContext 指当前页面 域对象 然并卵
    void setAttribute(String name,Object o);
    Object getAttribute(String name);
    void removeAttribute(String name);

pageContext

    pageContext 该对象只在本页面有效 出了页面获取不到

    pageContext可以向各个域中添加值

    /* 向 pageContext域中 添加一对键值对 */
    pageContext.setAttribute("p", "pageContext", PageContext.PAGE_SCOPE);
    /* 向 request域中 添加一对键值对 */
    pageContext.setAttribute("p", "request", PageContext.REQUEST_SCOPE);
    /* 向 session域中 添加一对键值对 */
    pageContext.setAttribute("p", "session", PageContext.SESSION_SCOPE);
    /* 向 servletContext域中 添加一对键值对 */
    pageContext.setAttribute("p", "application", PageContext.APPLICATION_SCOPE);

    获取域中的值
    <%= pageContext.findAttribute("p") %>

    使用el表达式获取域中的值:
    ${p}
    ${} 就代表<%= pageContext.findAttribute() %>

JSP动作标签

    转发:
        <jsp:forward page="要转发的页面路径">
        <jsp:param value="参数值" name="参数名" />
        jsp:forward>

        因为不是存入域中的值 所以使用获取参数的方法就可以得到

        <%=request.getParameter("参数名") %>

el表达式

    el表达式 容错性强 并且域中没有该值
             就什么都不显示 不会显示null 也不会崩溃
    el表达式中的 pageContext就真的代表对象 可以使用方法

el表达式获取对象中的值

    域中保存对象 使用el表达式获取
    创建一个用户类 一个地址类 地址添加到 对象类中 作为对象

    <%
        User user = new User();
        user.setUsername("小明");
        user.setPassword("123");
        // 添加地址对象
        Address address = new Address();
        address.setCity("CHINA");
        user.setAddress(address);
        out.print(user);
        request.setAttribute("u", user);

    %>

    // 相当于调用的是 get方法 前提是 对象类中 有get方法
    // 相当于user.getUserName()
    ${u.username}

    user对象中的address也是个对象

    JavaBean导航 通过调用get方法 获的 直接使用 点
    ${u.address.city }

el表达式获取集合中的值

    如果想要获取的是一个集合
    例如:
        <%
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        request.setAttribute("l", list);
        HashMap<String,String> map = new HashMap<>();
        map.put("a", "aa");
        map.put("b", "bb");
        map.put("c", "cc");
        map.put("d", "dd");
        map.put("e", "ee");
        request.setAttribute("m", map);
    %>

    // 如果是集合 例如list集合 那么就必须要使用[]
    ${l[1] }

    // 如果是map 那么两种都可以
    // 这里单引号和双引号都可以
    ${m.d }
    ${m['d'] }

el表达式判断空值

    <%
        String str1 = null;
        request.setAttribute("str1", str1);

        String str2 = "";
        request.setAttribute("str2", str2);

        ArrayList<String> list1 = new ArrayList<>();
        list1.add("aaa");
        request.setAttribute("list1", list1);

        ArrayList<String> list2 = new ArrayList<>();
        request.setAttribute("list2", list2);

        ArrayList<String> list3 = null;
        request.setAttribute("list3", list3);

    %>

    // 判断是否是空的 只要没有值 返回的就是true
    ${empty str1}
    ${empty str2}
    // 判断集合中指向空 和 不添加值 返回的也是true
    
    ${empty list1}
    ${empty list2}
    ${empty list3}

    只要判断的表达式没有内容 那么 返回的就都是true

el表达式支持三目运算符

    ArrayList<String> list3 = null;
    request.setAttribute("list3", list3);

    ${empty list3 ? "我是前面的" : "我是后面的" }

隐式对象可以直接在el表达式中使用

    <%
    /* 向 pageContext域中 添加一对键值对 */
    pageContext.setAttribute("p", "pageContext", PageContext.PAGE_SCOPE);
    /* 向 request域中 添加一对键值对 */
    pageContext.setAttribute("p", "request", PageContext.REQUEST_SCOPE);
    /* 向 session域中 添加一对键值对 */
    pageContext.setAttribute("p", "session", PageContext.SESSION_SCOPE);
    /* 向 servletContext域中 添加一对键值对 */
    pageContext.setAttribute("p", "application", PageContext.APPLICATION_SCOPE);
    %>
    ${pageScope.p}
    ${requestScope.p}
    ${sessionScope.p}
    ${applicationScope.p}

JSTL表达式

    JSTL表达式需要导包 tablib
    还需要在JSP页面添加导包语句
    <%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>

    JSTL表达式 实际上就是处理JSP页面上的逻辑处理
    通用标签 set out remove 声明的便利默认是放在page域中
    <c:set var="num" value="10" scope="session">c:set>
    
    <c:out value="${num }">c:out>
    // 和上面的 是一样的
    ${num }
    
    <c:remove var="num" scope="session" />
    ${num }


    逻辑表达式 if choose
    <c:set var="n" value="10">c:set>
    <c:if test="${n < 5 }">
        aaa
    c:if>
    <c:if test="${n > 5 }">
        bbb
    c:if>

    <c:choose>
        <c:when test="${n == 5 }">5c:when>
        <c:when test="${n == 10 }">10c:when>
        <c:otherwise>
            xx
        c:otherwise>
    c:choose>

    循环

    //step 循环增量
    <c:forEach var="i" begin="0" end="10" step="1">
        ${i }
    c:forEach>

    <%
        ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        list.add("e");
        list.add("f");
        request.setAttribute("list", list);
    %>

    // items 表示你要便器的容器 var表示容器中的对象
    <c:forEach var="i" items="${list }" step="2">
        ${i }
    c:forEach>

    <table border="1">
        <tr>
            <th>th>
            <th>索引th>
            <th>计数th>
        tr>


    <c:forEach items="${list }" var="l" varStatus="vs">
        <tr>
            <td>${l }td>
            <td>${vs.index }td>
            <td>${vs.count }td>
        tr>
    c:forEach>
    table>

设计模式

    1.Model1模式
        JSP + JavaBean <jsp:useBean/> 模式

    2.Model2模式 (模拟MVC模式) MCV: M:Model(数据模型) V:View(视图页面) C:Controller(控制器)
        JSP(页面和展示数据) + servlet(逻辑处理) + JavaBean(实体类) 模式

Model2模式大概图

Java之JSP基础 el表达式 JSTL表达式_第1张图片

你可能感兴趣的:(Java)