jsp和el表达式详解

jsp&el

JSP(JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。

访问servlet的问题: 页面出现白板 , 我们希望让页面更好看 , 需要修改响应体, 代码及其复杂
jsp用来替换html存在 , jsp当作html一模一样使用 也可以编写html代码 , jsp用来作为servlet的响应体部分
html有特点:只支持html代码 不支持java代码 , jsp 可以支持html 并且支持java
重点:Jsp其实就是一个servlet。
jsp有java的特性存在
在这里插入图片描述

jsp和servlet区别

在这里插入图片描述
在jsp中
在这里插入图片描述
该方法等效域servlet的service方法,只要执行jsp必然执行该方法。
在这里插入图片描述

jsp脚本(了解)

jsp本质是一个java代码-> jsp应该能够编写代码的
jsp中编写java代码的脚本元素
脚本 ( 相当于 方法体的代码 public void service(){ 方法体 } 循环 局部变量 )
<% %>
输出脚本( 相当于 out.print(参数部分) 参数部分可以写的内容 )
<%= %>
声明脚本 ( 相当于 类体的 public class 类名 { 类体 } 全局变量 方法声明 )
<%! %>
在这里插入图片描述

jsp指令

jsp最后要转换成java代码
指令(规则)的作用-> jsp转换java代码的依据
指令的语法: <%@ 指令 %>
在这里插入图片描述page(不重要)
最后还是转换成servlet代码 处理问题
在这里插入图片描述
include
一个jsp可以包含另一个jsp
在这里插入图片描述
taglib(重要)
tag标签 lib 库 引入标准的标签库 在jsp的页面中引入一些特殊的语法 让程序会更简单

jsp内置对象(重要)

内置对象: 在jsp中我们不需要经过任何声明 就可以直接使用的对象 (jsp已经创建好了 我们直接使用即可)
有九大内置对象:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
pageContext:页面的根对象
可快速获得其他八个对象
在这里插入图片描述
在jsp中有四个域对象 : page域 , request , session , application(应用)
共享范围:
page域: 表示 当前页面共享数据 , 只能在当前类 当前页面中共享数据
request:一次请求共享数据
session :一次会话共享数据
application : 一个项目共享数据
servlet有三个域对象 : request , session , servletContext

pageContext

<%--scope 的含义是 域--%>
    <%--jsp是一个servlet --%>
    <%--存入域中数据--%>
   <%-- <%
        //内置对象直接放入域数据
        request.setAttribute("ds" , "request_老王" );
        session.setAttribute("ds" , "session_老王" );
        application.setAttribute("ds" , "application_老王" );
    %>--%>
   <%-- <%=request.getAttribute("ds")  %> <br/>
    <%=session.getAttribute("ds")  %> <br/>
    <%=application.getAttribute("ds")  %> <br/>--%>

    <%--
        pageContext :
        作用1:获得其他八个内置对象
        作用2:简化(统一)域对象的操作
             pageContext.setAttribute( String key  , Object value ,);
             pageContext.getAttribute(String key ,)
        作用3:
            提供一个 findAttribute(String key )  不需要指明域  , 依次从四个域中查找数据
                取数据从范围开始小的取
                page < request < session < application(ServletContext)
                以后的建议 四个域中不要存入同名的key  因为我们使用findAttribute 有可能拿到的不是我们想要的数据
    --%>
    <%
        pageContext.setAttribute("ds" ,"page_老王_pageContext", PageContext.PAGE_SCOPE);
        pageContext.setAttribute("ds" ,"request_老王_pageContext", PageContext.REQUEST_SCOPE);
        pageContext.setAttribute("ds" ,"session_老王_pageContext", PageContext.SESSION_SCOPE);
        pageContext.setAttribute("ds" ,"application_老王_pageContext", PageContext.APPLICATION_SCOPE);
    %>
    <%=pageContext.getAttribute("ds" , PageContext.PAGE_SCOPE) %> <br/>
    <%=pageContext.getAttribute("ds", PageContext.REQUEST_SCOPE)  %> <br/>
    <%=pageContext.getAttribute("ds", PageContext.SESSION_SCOPE)  %> <br/>
    <%=pageContext.getAttribute("ds", PageContext.APPLICATION_SCOPE)  %> <br/>

    <%=pageContext.findAttribute("ds")%>

jsp动作标签
jsp提供一个很特殊的标签 , 该标签的作用 引入其他的页面
一个jsp可以包含另外一个jsp
在这里插入图片描述
静态引入:两个jsp编译阶段就在一起了 最后输出给浏览器
在这里插入图片描述
动态引入:两个jsp只不过是将最后的结果合并输出给浏览器,本质上还是两个类。
在这里插入图片描述

el表达式(重要)

在这里插入图片描述
el表达式作用:简化获得域中数据的操作

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    el.jsp页面
    <h1>原始获得数据的方式</h1>
    <%=pageContext.getAttribute("ds" , PageContext.REQUEST_SCOPE) %><br/>
    <%=pageContext.getAttribute("ds" , PageContext.SESSION_SCOPE) %><br/>
    <%=pageContext.getAttribute("ds" , PageContext.APPLICATION_SCOPE) %><br/>

    <h1>el表达式获得数据</h1>
    <%--
        expression language : 表达式语言
        表达式语言:固定语法  作用:快速获得域中的数据
        语法格式:  ${ 固定的字符串 }
        固定的字符串 : el表达式中提供了 3个固定的字符串
            pageScope requestScope(常见) sessionScope(常见) applicationScope(常见)
        效果: ${requestScope.key}   ${sessionScope.key}  ${sessionScope.key}
        Scope :域
        能把所有的代码放到一个{}里面吗 ?不能
        ${requestScope.key}  ==  <%=request.getAttribute("ds")

       ${key}的说明:(重要)
            底层采用的是 findAttribute("") 依次从四个域中获得数据的
            page->request->session-> application
        使用原因: 建议不要往不同域中放同名的key

        el表达式对比pageContext.getAttribute("ds" , PageContext.REQUEST_SCOPE)
        好处: el表达式如果获得不到数据 顶多显示空字符串
    --%>
    ${requestScope.ds}<br/>
    ${sessionScope.ds}<br/>
    ${applicationScope.ds}<br/>

    ${ds}<br/>
</body>
</html>

el表达式运算符

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.llz.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--
        模拟servlet存储数据  el表达式操作域数据
    --%>
    <%
        request.setAttribute("str" , "xxx"); //放在servlet
    %>
    <%--
        jsp获得数据
    --%>
    <h1>算术运算 + - * / </h1>
    ${1}      <br/> <%--输出1  没有修改--%>
    ${1+1}    <br/> <%--结果是2  el表达式中的数字进行会计算 --%>
    ${1+"1"}  <br/> <%--结果是2  el表达式字符串 先将字符串转换成数字 进行计算--%>
    ${1+'1'}  <br/> <%--结果是2  在el表达式中没有字符串和字符的概念 将字符串 转换成数字进行计算 --%>
    <%-- ${ key } 依次从四个域中获得数据   --%>
    ${1+a}    <br/> <%--结果是1 , ${a} 先从域中获得数据 , 域中没有数据结果为空 1+= 1 --%>
    <%
        request.setAttribute("a" , "100"); //放在servlet
    %>
    ${1+a}    <br/> <%--结果:101 --%>

    <%--  java.lang.NumberFormatException: For input string: "a"  --%>
    <%--${1+"a"}  <br/>--%><%--结果: 报错 , 尝试将"a" 转换成数字 此处报错 --%>

    <%-- jsp中除法是有余数的 --%>
    ${10/5}<br/>
    ${10/4}<br/>

    <h1>逻辑运算</h1>
    <%-- 一模一样 --%>
    ${ true && true } <br/>
    ${ true || false}<br/>
    ${ !true }<br/>
    <%--el表达式提供特殊符号--%>
    ${ true and true }
    ${ true or false }
    ${ not true }

    <h1>比较运算</h1>
    <%-- 一样 --%>
    ${10 > 3 }  ${10< 3}  ${10 == 3}<br/>
    <%--grant than  less than  equals--%>
    ${10 gt 3 }  ${10 lt  3}  ${10 eq 3}<br/>

    <h1>三元运算</h1>
    <%--一模一样--%>
    ${10 > 3 ? "大于" :"小于" }
    <h1>empty运算符</h1>
    <%--
        empty :1.判断字符串是否为空串
        2.判断集合大小是否为0
        3.判断对象是否为null
    --%>
    <%
        request.setAttribute("dzd"  ,"");
        List list = new ArrayList();
        request.setAttribute("user" , new User());
        request.setAttribute("username" , "jack");
    %>
    ${empty dzd }
    ${empty list}
    ${empty user}
    <%--伪代码 执行不了的--%>
    <%--if(${empty username }){
        你好,请登录
    }else{
        欢迎您登录, ${username}欢迎回家
    }--%>
</body>
</html>

el获得域中复杂数据

<%@ page import="com.llz.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--el获得数据(域中数据)--%>
    <h1>字符串</h1>
    <%--模拟代码 赋值到域中--%>
    <%
        request.setAttribute("str" , "aaa");
    %>
    <%--获得域中数据--%>
    ${str}
    <h1>数组</h1>
    <%
        String [] myArray = {"a" , "b" , "c"};
        request.setAttribute("myArray" , myArray);
    %>
    
    <%--
        直接输出数组 执行toString方法
        数组获得数据 ${key[索引值]}
        数组的格式:  [L..... 数组
    --%>
    ${myArray}  @@  ${myArray[0]}  @@  ${myArray[1]}

    <h1>对象-javaBean</h1>
    <%
        User user = new User("jack" , "rose" , "1234");
        //user.getUsername();
        request.setAttribute("user" , user);
    %>
    <%--
        ${key.get方法}  去掉get首字母小写的过程   不是${key.属性名称}
    --%>
    ${user}  @@ ${user.username2} @@ ${user.nickname}

    <h1>List集合-放字符串</h1>
    <%
        List<String> list = new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        request.setAttribute("list" , list);
    %>
    <%--
        获得list的数据
        格式: [1 ,2 ,3 ]
        获得数据跟数组一模一样  ${key[索引值]}
    --%>
    ${list} @@ ${list[0]} @@ ${list[1]}

    <h1>List集合-javaBean</h1>
    <%
        //矩形编译 alt + 鼠标左键
        List<User> javaBeanList = new ArrayList<User>();
        javaBeanList.add(new User("jack1" ,"rose1" , "1234"));
        javaBeanList.add(new User("jack2" ,"rose2" , "1111"));
        javaBeanList.add(new User("jack3" ,"rose3" , "2222"));
        request.setAttribute("javaBeanList" , javaBeanList);
    %>
    <%--第二个javaBean中nickname和password--%>
    ${javaBeanList[1].nickname}  @@  ${javaBeanList[1].password}


    <h1>Map集合-string-string</h1>
    <%
        //矩形编译 alt + 鼠标左键
        Map<String , String > map = new HashMap<String ,String>();
        map.put("a" , "b");
        map.put("key1" , "value1");
        map.put("xxx" , "张三");
        request.setAttribute("map" , map);
    %>

    <%--
        数组: [L.....
        集合:  [1 ,2,3 ]
        map的输出格式: { key = value , key=value , key=value }
        获得数据的方式和javaBean一样
        ${域中的key.map的key即可}
    --%>
    ${map.key1} <br/>
    ${map.a} <br/>
    ${map.xxx} <br/>
    <h1>Map集合-string-javaBean</h1>
    <%
        //矩形编译 alt + 鼠标左键
        Map<String , User > javaBeanMap = new HashMap<String ,User>();
        javaBeanMap.put("bean1" , new User("jack1" ,"rose1" , "1234"));
        javaBeanMap.put("bean2" , new User("jack2" ,"rose2" , "1111"));
        javaBeanMap.put("bean3" , new User("jack3" ,"rose3" , "2222"));
        request.setAttribute("javaBeanMap" , javaBeanMap);
    %>
    <%--第二个javaBean中nickname和password--%>
    ${javaBeanMap.bean2.nickname} @@  ${javaBeanMap.bean2.password}
</body>
</html>

jsp中获得动态项目发布路径

<%--服务器名称不建议写死--%>
    <%-- request.getContextPath() 获得项目的发布路径 --%>
    <a href="<%=request.getContextPath()%>/DemoServlet">访问servlet</a><br/>
    <a href="${pageContext.request.contextPath}/demo2.jsp">原理</a><br/>

在这里插入图片描述

jsp和js(JavaScript)区别

1、JSP全称是java server page JS全称是javaScript
2、最主要的区别是运行位置不同。
JSP运行在后台服务器上,混合在HTML中的java程序段用于控制HTML的动态生成,并且通常负责调用后台数据库中的数据,形成能够根据使用情况的变化的,具有丰富数据交互效果的页面。
JavaScript 通常是运行在前台,即运行于用户浏览器的,通常不需要服务器的后台支持(AJAX交互例外),混合在HTML中的JavaScript脚本程序直接被浏览器解释执行,以提高页面的美观性和UI操作响应速度为基本目标。
3、JSP在HTML中用<%%>里面实现。JS在html中用实现

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值