JavaWeb基础--jsp&el&jstl

目录

1jsp

1.1概述

1.2执行原理

1.3脚本和注释

1.4JSP指令

page指令

include指令

taglib指令

1.5内置对象

PageContext:

1.6动作标签

2.el

2.1概述

2.2使用 

2.3执行运算

3.jstl

3.1概述

3.2使用


1jsp

1.1概述

        java服务器端页面(Java Server Pages)

       既可以定义html标签,又可以定义java代码,jsp的本质上就是一个servlet。

1.2执行原理

1.3脚本和注释

Jsp通过脚本方式来定义java代码

  1. <% 代码 %> java脚本片段,生成在service方法中,每次请求的时候都会执行

  2. <%! 代码 %> 声明片段,在java代码中声明成员,放在jsp生成java文件中的成员位置

  3. <%=代码 %> 输出脚本片段,在jsp页面上进行输出,源码 out.print("代码"),放在生成的service方法中.

<body>
    <!-- java声明脚本 类体代码-->
    <%!
        int j=4;
        public void add(){

        }
    %>

    <!-- 脚本元素 java代码片段脚本 生命周期的service方法 -->
    <%
        int i = 3;
    %>

    <!-- java输出脚本 out.print()-->
    <%=i%>
    <%=j%>
</body>

注释

  1. html注释

    • <!-- 注释内容 -->

    • 只能注释html代码

  2. jsp注释 推荐

    • <%-- 注释内容 --%>

    • 注释html代码和java代码脚本

  3. java注释(jsp脚本内使用)

    • // /**/ /** */

    • 只能用来注释java代码

1.4JSP指令

  • 用:声明jsp的一些属性或者行为 , jsp转换成servlet需要有一定的依据

  • 格式:

    • <%@指令名称 属性1="值1" 属性2="值2"%>

    • 例如:<%@ page contentType="text/html;charset=UTF-8" language="java" %>

  • 三大指令

    1. page:声明页面的一些属性或者导入依赖的java文件

    2. include:将其他页面中的内容复制到当前页面上 (指令包含、静态包含)

    3. taglib:导入其他的标签库的

page指令

<%@ page contentType="text/html;charset=utf-8"%>
<%@ page language="java" session="false" %>
<%--
    处理响应编码
    contentType="text/html;charset=utf-8"

    jsp所支持的语言
        <%@ page language="java" %>
        contentType:相当于java中的response.setContentType("")
        language:声明 脚本的语言,目前只有java值
        isELIgnored:是否忽略EL(el是否不可用),默认值是false
        session:用来声明当前页面是否可用使用session这个对象 默认值是true
        errorPage:当此页面出现错误的时候,转发到哪个页面上
        isErrorPage:声明当前页面是一个错误页面,一旦此值为true的时候,就可用execption对象
--%>
<%

%>

include指令

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %><%--引入某些包--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--
        include : 包含 , 将两个页面结合在一起
            一般用于抽取页面的相同代码
    --%>
    <%@ include file="header.jsp"%>
    <div>体信息</div>
    <%
        List list = new ArrayList<>();
    %>
</body>
</html>

taglib指令

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%--
    taglib 引入标签库
        prefix="c" 别名 随便写
            <c:标签名称></c:标签名称>
        uri="http://java.sun.com/jsp/jstl/core"  引入的空间
--%>
<html>
<head>
    <title>Title</title>
</head>
<body>

</body>
</html>

1.5内置对象

内置对象:在jsp中已经声明好了,可以直接在页面上使用的对象。

jsp中一共有9大内置对象

  • request和response

  • session HttpSession

  • application servletContext域对象

  • out 输出对象

  • exception 当页面声明为错误页面的时候才可以使用

  • pageContext PageContext对象(单独讲)

  • page Object类型(Servlet类型) 代表当前servlet(或者java代码中的this)

  • config ServletConfig(servlet的配置对象)

* jsp一共有9个内置对象
    变量名                  真实类型                         作用
    pageContext        PageContext                  当前页面中共享数据
    request                HttpServletRequest        一次请求中共享数据
    session                HttpSession                    一次会话中共享数据
    application           ServletContext                整个web应用共享数据
    response              HttpServletResponse     响应对象
    page                     Object                            当前页面(servlet)对象
    out                        JspWriter                       输出对象
    config                   ServletConfig                 servlet配置对象
    exception             Throwable                      异常对象        

PageContext:

  • 作用:

    • 域对象:只能在当前页面上使用 xxxAttribute()

    • 操作其他的域对象 xxxAttribute(..,int 那个域)

    • 获取其他的内置对象,例如 getRequest();

    • findAttribute():依次从最小域对象到最大域对象中去查找指定的属性,若找到马上返回且终止查找;若没有找到返回null

      • application>session>reqeust>page


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--
        pageContext : 页面的上下文根对象, 用于联系上下文使用
        1.用于获得其他八个内置对象(用于传递参数使用->自定义底层使用)
            pageContext.getXxxx()
        2.简化域操作
            Servlet三个域:  request , session  , servletContext
            jsp有四个域: page(page域 仅在当前页面使用,临时变量) request  session application
            原生操作:
                setAttribute("key" ,value)
                getAttribute("key")
                removeAttribute("key")
            统一了api:
                pageContext.setAttribute(key , value ,指明域 Scope)
                pageContext.getAttribute(key,指明域 Scope)
                pageContext.removeAttribute(key,指明域 Scope)
        3.依次从域中获得数据
            findAttribute(key) 从域中获得数据 从小到大域中获得一个出来即可
            page request session application
            在开发中 key 不要重名
        4.动态操作项目路径
    --%>
    <%
        pageContext.setAttribute("jiujiu" , "request_学习" ,PageContext.REQUEST_SCOPE);
        pageContext.setAttribute("jiujiu" , "session_学习" ,PageContext.SESSION_SCOPE);
        pageContext.setAttribute("jiujiu" , "application_学习" ,PageContext.APPLICATION_SCOPE);
    %>
    <%=pageContext.getAttribute("jiujiu"   ,PageContext.REQUEST_SCOPE)%><br/>
    <%=pageContext.getAttribute("jiujiu"   ,PageContext.SESSION_SCOPE)%><br/>
    <%=pageContext.getAttribute("jiujiu"   ,PageContext.APPLICATION_SCOPE)%><br/>
    <%=pageContext.findAttribute("jiujiu")%><br/>

    <%--request.getContextPath()--%>
    <%=((HttpServletRequest)pageContext.getRequest()).getContextPath() %>
</body>
</html>

1.6动作标签

在jsp上使用的话就能体现出现一些效果

  • jsp:forward 封装了 request.getRequestDispatcher("").forward(req,resp);

  • jsp:include 封装了 request.getRequestDispatcher("").include(req,resp);

    • 最终效果和静态包含效果一样

    • 静态包含:先将页面内容组合到一起,再编译成一个文件(执行效率快)

    • 动态包含:要包含的页面先编译,再将编译的结果包含进来

<body>
    <%--
    <jsp:forward page="a_jiaoben.jsp"/>
    --%>
    <jsp:include page="include/header.jsp"/>
    我是身体信息
    <jsp:include page="include/footer.jsp"/>
</body>

2.el

jsp可以嵌套java代码 使用脚本元素 , 复杂 麻烦(淘汰了)

我们会采用el+jstl的方式替换 脚本元素

el:作用 ,主要是获得域中数据

jstl: 作用, 获得数据后遍历 判断

2.1概述

表达式语言(Expression Language)

jsp内置的表达式语言.可以直接使用.

作用:

  • 获取域中的数据

  • 在jsp上执行运算

  • ...

语法:

${表达式}

2.2使用 

获取值(域中)

  • el表达式只能从域对象中获取数据

  • 语法

    • ${pageScope.键名} //从page域中获取指定键名对应的值

    • ${requestScope.键名} //从request域中获取指定键名对应的值

    • ${sessionScope.键名} //从session域中获取指定键名对应的值

    • ${applicationScope.键名} //从application域中获取指定键名对应的值

    简化写法:

    ${键名}:从最小域到最大域依次查找,若找到,立即返回且终止查找;若没有找到,返回""

@WebServlet(name = "ElDemoServlet" , urlPatterns = "/elDemo")
public class ElDemoServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //往域中存入数据
        //1.存字符串
        String str = "迪丽热巴";
        //request.setAttribute("str" , "request_"+str);
        request.getSession().setAttribute("str" ,"session_"+ str);
        getServletContext().setAttribute("str" ,"application_"+str);



        //存复杂数据类型
        //1.存字符串
        request.setAttribute("myStr" ,"张三");

        //2.存数组
        String[] arrs = {"a" , "b" , "c"};
        request.setAttribute("arrs" ,arrs);

        //3.存对象(javaBean)
        User user = new User("jack", "rose", 18);
        request.setAttribute("user" , user);

        //4.list集合
        List<String> strList = new ArrayList<>();
        strList.add("a");
        strList.add("b");
        strList.add("c");
        request.setAttribute("strList" , strList);


        List<User> userList = new ArrayList<>();
        userList.add( new User("jack1", "rose1", 18));
        userList.add( new User("jack2", "rose2", 18));
        userList.add( new User("jack3", "rose3", 18));
        userList.add( new User("jack4", "rose4", 18));
        request.setAttribute("userList" , userList);

        //5.map集合
        Map<String,String> strMap = new HashMap<>();
        strMap.put("key1","value1");
        strMap.put("key2","value2");
        strMap.put("key3","value3");
        request.setAttribute("strMap" , strMap);


        Map<String,User> userMap = new HashMap<>();
        userMap.put("key1",new User("jack1", "rose1", 18) );
        userMap.put("key2",new User("jack2", "rose2", 18));
        userMap.put("key3",new User("jack3", "rose3", 18));
        request.setAttribute("userMap" , userMap);

        request.getRequestDispatcher("f_el.jsp").forward(request,response);
    }
}

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>原生方式获得</h1>
    <%=request.getAttribute("str")%><br/>
    <%=session.getAttribute("str")%><br/>
    <%=application.getAttribute("str")%><br/>
    <%=pageContext.getAttribute("str" ,PageContext.REQUEST_SCOPE)%><br/>
    <%=pageContext.getAttribute("str",PageContext.SESSION_SCOPE)%><br/>
    <%=pageContext.getAttribute("str",PageContext.APPLICATION_SCOPE)%><br/>
    <h1>el表达式获得</h1>
    <%--
        el:主要作用获得域中数据
            域对象字符串: pageScope requestScope sessionScope applicationScope
            ${域对象字符串Scope.key}  或者 ${key} 底层是findAttribute
            注意的是 域中不要放入同名key 只由小到大获得数据
    --%>
    ${requestScope.str}<br/>
    ${sessionScope.str}<br/>
    ${applicationScope.str}<br/>
    ${str}

    <h1>字符串</h1>
    ${myStr}
    <h1>数组</h1>
    <%--
        地址:[L....数组
        ${数组的key[索引]}
    --%>
    ${arrs[0]}
    <h1>对象</h1>
    <%--
        对象.key
        key: 是调用的get方法 应该是get方法去掉get首字母小写过程
    --%>
    ${user.username2}
    <h1>list-str</h1>
    <%--
        集合 : [, , , , ]
        ${key[索引]}
    --%>
    ${strList[1]}
    <h1>list-user</h1>
    ${userList[2].nickname}

    <h1>map-str-str</h1>
    <%--
        map:  {key=value,key=value}
        ${map.key} 或者 ${map['key']}
    --%>
    ${strMap.key2} @@${strMap['key2']}
    <h1>map-str-user</h1>
    ${userMap.key3.username2}
</body>

</html>

2.3执行运算

el表达式支持运算符

* 算数运算符
        语法: + - * /(div) %(mod)
* 比较运算符
        语法:> < >= <= ==(eq) !=(ne)
* 逻辑运算符
        语法:&&(and) ||(or) !(not)
* 三元运算符
        语法:${条件表达式?为真:为假}
* 空运算符
         语法:${not empty 对象}
         功能:
             用于非空判断,
             判断一个字符串是否为null或者""
             判断一个集合或者数组的长度是否为0
             判断一个对象是否为null

<%@ page import="java.util.ArrayList" %>
<%@ page import="com.study.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>算术运算符</h1>
    ${1}<br/>
    ${1+1}<br/><%--el支持运算符--%>
    ${1+"1"}<br/><%--el表达式 会将字符串转换成数字 并进行计算--%>
    ${1+'1'}<br/><%--el表达式中没有字符的概念 都是字符串--%>
    <%--${1+'a'}<br/>报错NumberFormatException,数字转换异常 , a转换不了数字 报错--%>
    ${1+a}<br/><%--${a} 尝试先从域中获得数据 如果没有数据 展示为空串 1+ 空串 为1--%>
    <%
        request.setAttribute("a" , "100");
    %>
    ${1+a}<br/>
    <%--没有字符串的概念 都会转换数组尝试计算  ${str}获得域中数据 获得出来转换成数字进行计算--%>
    ${5/2}<%-- el表达式会保留小数位 (不精准) --%>

    <h1>比较运算符</h1>
    ${3>2} ${3<2}

    <h1>逻辑运算符</h1>
    ${ true and true}
    ${ true && false}
    ${ true or false}
    ${not true}

    <h1>三元(三目)运算符</h1>
    <%-- 条件表达式 ? 条件成立 : 条件不成立 --%>
    ${3>2 ? "大于" : "小于"}

    <h1> empty </h1>
    <%--
        empty表示为空
        1.判断字符串是否为空串
        2.判断集合的大小是否为0
        3.判断对象是否为null
    --%>
    <%
        request.setAttribute("str" , "");
        request.setAttribute("array" , new ArrayList<>());
        request.setAttribute("user" , new User("张三" , "李四" , 18));
    %>
    ${ empty str}
    ${ empty array}
    ${ empty user}

    if(){}
</body>

</html>

3.jstl

3.1概述

Jsp 标准标签库(Jsp Standard Tag Library),是由Apache组织提供的开源的jsp标签库

jstl其实本质就是标签, 含一定逻辑的标签

作用:主要使用他们在页面做判断和循环操作

JSTL标准标签库有5个子库,但随着发展,目前常使用的是它的核心库 core

标签库标签库的URI前缀
CoreOracle Java Technologies | Oraclec
国际化Oracle Java Technologies | Oraclefmt
SQLhttp://java.sun.com/jsp/jstl/sqlsql
XMLhttp://java.sun.com/jsp/jstl/xmlx
FunctionsOracle Java Technologies | Oraclefn

jstl是一套标准(接口) , 必须要引入实现 引入jar 2个jar包

3.2使用

  1. 导入jar包 jstl1.2.jar

  2. 在使用的页面中通过<%@taglib prefix="标签前缀" uri="标签库的uri"%>导入标签库

core中常用标签:

c:if

<c:if test="${返回值为boolen的el表达式}">若test为true的时候就会展示此内容</c:if>

<%@ page import="com.study.domain.User" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%--
    taglib 引入标签库
        prefix="c" 别名 随便写
            <c:标签名称></c:标签名称>
        uri="http://java.sun.com/jsp/jstl/core"  引入的空间
--%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--
        if(条件表达式){
            条件成立的情况
        }

        jstl中没有else
        <c:if test="条件表达式(支持el)" var="声明一个变量,此处的变量表示域中的key" scope="将条件表达式的值 存入到某个域中">
            条件成立的情况
        </c:if>
        <c:if test="${3>2}" var="flag" scope="request">
        将${3>2}的值 赋值给flag 并将flag 放入request域中  替换else使用
        var  scope 可选属性
    --%>
    <%--<c:if test="${3<2}" var="flag" scope="request">
        成立
    </c:if>
    <c:if test="${not flag}">
        不成立
    </c:if>--%>
    <%--<c:if test="${3<2}">
        不成立
    </c:if>--%>


    <%--以后登录的代码--%>
    <%
        //模拟登录成功的代码
        //session.setAttribute("user" , new User("jack" ,"rose" , 18));
    %>

    <c:if test="${empty user}">
        对不起,请您登录
    </c:if>
    <c:if test="${not empty user}">
        欢迎回家,${user.username2}
    </c:if>


</body>
</html>

c:foreach

普通循环

<c:forEach begin="开始的数字" end="结束的数字" step="步长(若为1可省略)" var="当前遍历到的数据起个名字">
        ${变量名字}
</c:forEach>

<c:forEach begin="1" end="10" step="1" var="n">
    ${n}
</c:forEach>

<c:forEach begin="1" end="10" step="2" var="n">
    ${n}
</c:forEach>

增强循环

<c:forEach items="${从域中获取要遍历的集合}" var="当前遍历到的数据起个名字" varStatus="循环遍历的状态">
        ${循环变量的名字}
</c:forEach>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--
        java
        for(类型 变量 : 集合){
            循环体
        }
        jstl
        <c:forEach items="遍历的集合 支持el" var="临时变量的名称">
            循环的每一步会将var的临时变量放入临时域 page域中
            循环体
        </c:forEach>
    --%>
    <h1>增强遍历</h1>
    <h2>数组</h2>
    <%--[L... 空格不能随便乱加 items="${arrs}" 数组的toString 进行遍历--%>
    <c:forEach items="${arrs} " var="tempStr">
        ${tempStr}<br/>
    </c:forEach>

    <h2>集合</h2>
    <%--[ , , , , ]  el 表达式中 空格写多少无所谓 --%>
    <c:forEach items="${strList}" var="tempStr">
        ${tempStr}
    </c:forEach>


    <h2>集合-对象</h2>
    <%--for循环遍历的时候 不要加空格--%>
    <c:forEach items="${userList}" var="user">
        ${user} @@ ${user.username2} @@ ${user.nickname}<br/>
    </c:forEach>

    <h2>map</h2>
    <%--{key=value , key=value ....}--%>
    <%--底层使用的是 entryset--%>
    <c:forEach items="${strMap}" var="entry">
        ${entry.key} @@ ${entry.value}<br/>
    </c:forEach>

    <h2>map-对象</h2>
    <c:forEach items="${userMap}" var="entry">
        ${entry.key} @@ ${entry.value} @@ ${entry.value.username2}<br/>
    </c:forEach>
    <%--注意 不要加空格 不要漏${}--%>


    <%--
        for(int i = 1 ; i <=9 ; i ++ ){
            循环体
        }
      <c:forEach begin="1" end="9" step="1" var="i" >
         begin="1"  开始
         end="9"    结束 含头含尾
         step="1" 步进  每次+1
         var="临时变量"
    --%>
    <h1>普通遍历</h1>
    <c:forEach begin="1" end="9" step="1" var="i" >
        <c:forEach begin="1" end="${i}" step="1" var="j">
            ${i} * ${j} = ${i*j}
        </c:forEach>
        <br/>
    </c:forEach>



    <h1>扩展-varStatus</h1>
    <%--
        varStatus : 变量状态 也是放入了临时域
            用于记录每一次循环中的状态值
            count:计数 , 用于记录当前循环的次数
            index:索引 , 用于记录当前循环的索引值
            用于表格中第一列 序号
    --%>
    <c:forEach items="${arrs}" var="tempStr" varStatus="status">
        ${tempStr}@@ <br/>
    </c:forEach>
</body>
</html>

        以上就是jsp、el、jstl的部分知识点啦,后续会继续补充。各位大佬如发现有知识点错误或者有不同的建议与意见,欢迎评论、私信指正,本人才疏学浅还需向各位大佬学习,还请不吝赐教!在此感谢各位的观看!谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值