JSP、EL、JSTL

JSP:Java Server Pages–>Java服务器页面

指令:用于配置JSP页面,导入资源文件

格式:<@ 指令名称 属性名1=属性值1 属性名2=属性名2…%><%@ page contentType="text/html;charset=UTF-8" language="java" %>
分类:
page:配置指令
page-> contentType:contentType="text/html等同于response.setContentType("text/html;charset=utf-8");
1、设置响应体的mime类型以及字符集
2、设置当前jsp页面的编码(只能高级IDE才可生效,若使用低级工具,则需要设置pageEncoding属性设置页面字符编码)
language:指定为Java
buffer:buffer="8kb"指定页面缓冲区大小
import:import="java.util.List"导入Java的包
errorPage:errorPage="500.jsp"发生异常后页面跳转到500.jsp,可设置显示服务器正忙…
isErrorPage:isErrorPage="true"标注页面为错误页面,可使用内置对象exception,默认为false
include:页面包含的,导入页面的资源文件 <@include file="top.jsp"%>

taglib:导入资源<@taglib prefix="可自定义" uri="http://java.sun.com/jap/jst1/core"%>可导入WEB-INF下的lib文件夹中的东西

注释

1、html注释:<!----!>只能注释html代码片段
2、jsp注释:<%----%>可以注释所有,推荐使用

内置对象
变量名真实类型作用
pageContextPageContext当前页面共享数据 ,还可以获取其他8个对象
requestHttpServletRequest一次请求访问的多个资源(转发)
sessionHttpSession一次用户间共享数据
applicationServletContext所有用户间共享数据
responseHttpServletResponse响应对象
pageObject当前页面(Servlet)的对象 this
outJspWriter输出对象,数据输出到页面上
configServletConfigServlet的配置对象
exceptionThrowable异常对象

PageContext在获取其他8个对象的时候在comcat中将jsp.api.jar包引入到lib文件夹中

MVC开发模式

jsp演变历史

早期只有servlet,只能使用request输出标签数据,非常烦
后来有了jsp,简化servlet的开发,如果过度使用jsp,在jsp中写入大量java代码,有写html表,难以维护
再后来,Java的web开发,借鉴MVC开发模式,使得程序的实际更加合理性

M:Modle,模型,完成具体的业务操作,如:查询数据库,封装对象 JavaBean
V:View,视图,展示数据JSP
C:Controller,控制器,获取用户的输入,调用模型,将数据交给视图进行展示Servlet

在这里插入图片描述

MVC优缺点

优点:耦合性低,方便维护,可以利于分工协作,重用性高
缺点:使得项目架构变得复杂,对开发人员要求高

EL表达式 Expression Language表达式语言

替换和简化jsp页面中java代码的编写 ${表达式}
jsp默认支持el表达式
在page指令中可以忽略el表达式<%@isElIgnord="true">true表示页面中的所有el表达式都不能被使用了
使用\可控制局部el表达式被忽略

运算
运算符

算数运算符:+ - * /(div) %(mod)
比较运算符:> < >= <= == !=
逻辑运算符:&&(and)||(or)!(not)

<body>

${3>4}
<hr>
<h3>算数运算符</h3>
${3 + 4}<br>
${3 / 4}<br>
${3 div 4}<br>
${3 % 4}<br>
${3 mod 4}<br>
<h3>比较运算符</h3>
${3 == 4}<br>
<h3>逻辑运算符</h3>
${3>4 && 3<4}<br>
</body>

空运算符:empty–>用于判断字符串、集合、数组长度是否为0或对象是否为null
${empty str}
${ not empty str} 判断不为空或长度不为0

<%
    String str = null;
    request.setAttribute("str",str);
%>
${empty str}
获取值

el表达式只能从域对象中获取值

语法1:${域名称.键名}:从指定域中获取指定键的值
域名称获取值的地方
pageScopepageContext
requestScoperequest
sessionScopesession
applicationScopeapplication(ServletContext)

==el如果没有获取到值,会显示空字符串,不会打乱页面排序,可用于验证码案例中使用div定义的用户名错误而显示null… ==

<head>
    <title>el获取域中的数据</title>
</head>
<body>
<%
    //在域中存储数据
    request.setAttribute("name","张三");
    session.setAttribute("age",34);
%>
<h3>el获取值</h3>
${requestScope.name}
${sessionScope.age}
</body>
语法2:${键名}:依次表示从最小的域中查找是否有该对应的值,直达找到为止
EL获取对象的值${域名称.键名.属性名}

${域名称.键名.属性名} 本质上会去调用对象的getter方法
对象User JavaBean

package cn.zg.domain;

import java.text.SimpleDateFormat;
import java.util.Date;

public class User {
    private String name;
    private int age;
    private Date birthday;

    //逻辑视图,没有对应的成员变量,只是为了提供页面上的一些好看的效果
    public String getBirStr(){
        if (birthday !=null){
            //格式化日期对象
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            //返回字符串即可
            return sdf.format(birthday);
        }else {
            return "";
        }

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}

el.jsp

<%@ page import="cn.zg.domain.User" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>获取对象的数据</title>
</head>
<body>
<%
    User user = new User();
    user.setName("张三");
    user.setAge(23);
    user.setBirthday(new Date());

    request.setAttribute("u",user);

%>
<h3>el获取对象中的值</h3>
${requestScope.u}<%--获取到的是u的hashCode值--%>

<%--
    通过对象的属性来获取值
    setter或getter方法,去掉set或get,在将剩余的部分,首字母变小写
    getUsername()->Username->username
--%>
${requestScope.u.name}<br><%--所以说u.name找的其实是getName这个方法--%>
${requestScope.u.age}<br>
${requestScope.u.birthday}<br><%--这里获取的日期是美国时间,所以需要进行转换--%>

${requestScope.u.birStr}
</body>
</html>

EL获取List集合的值${域名称.键名[索引]}
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="cn.zg.domain.User" %>
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    User user = new User();
    user.setName("张三");
    user.setAge(23);
    user.setBirthday(new Date());

    request.setAttribute("u",user);
    List list = new ArrayList();
    list.add("aaa");
    list.add("bbb");
    list.add(user);

    request.setAttribute("list",list);
%>

<h3>el获取List集合中的值</h3>
${list}<%--[aaa,bbb]--%>
${list[0]}<%--aaa--%>
${list[1]}<%--bbb--%>
${list[10]}<%--如果因为下标越界,不会报错就只是什么也不显示--%>
${list[2].name}<%----%>

</body>
</html>

EL获取Map集合的值${域名称.键名.key名称} && ${域名称.键名.[“key名称”]}
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.Date" %>
<%@ page import="cn.zg.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    User user = new User();
    user.setName("张三");
    user.setAge(23);
    user.setBirthday(new Date());
    Map map =new HashMap<>();
    map.put("sname","李四");
    map.put("gender","男");
    map.put("user",user);

    request.setAttribute("map",map);
%>

<h3>el获取Map集合中的值</h3>
${map.gender}<%--男--%>
${map["gender"]}<%--男--%>
${map.user.name}<%--张三--%>
</body>
</html>

隐式对象11个

pageContext:获取jsp其他8个隐式对象
在jsp页面动态的获取虚拟目录
${pageContext.request.contextPath}->获取虚拟目录

JSTL :JavaServer Pages Tag Library JSP标准标签库

由Apache组织提供的开源免费的jsp标签
作用:用于简化和替换jsp页面上的Java代码

步骤

1、导入jstl相关jar包
2、引入标签库:taglib指令:<%@ taglib%>
3、使用标签

常用JSTL标签

1、if:相当于Java代码的if语句

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>if</title>
</head>
<body>
<%--c:if标签
    属性:test必须属性,接收boolean表达式
        如果表达式为true,则显示if标签体内容,如果为false,则不显示标签体内容

        一般情况下,test属性值会结合el表达式一起使用
        注意:c:if标签没有else情况,想要else情况,则可以重新定义一个c:if标签
--%>
<c:if test="true">
    hhhh
</c:if>
<%
    //判断request域中的一个list集合是否为空,如果不为null则显示遍历集合
    List list = new ArrayList();
    list.add("aaa");
    request.setAttribute("list",list);
%>
<c:if test="${not empty list}">
    遍历集合
</c:if>
</body>
</html>

2、choose:相当于Java代码的switch语句

<%--
  Created by IntelliJ IDEA.
  User: 64359
  Date: 2021/10/20
  Time: 19:10
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--完成数字编号对应星期几的案例
    1、在域中存储一数字
    2、使用choose标签取出数字       相当于switch声明
    3、使用when标签zuo数字判断      相当于case
    4、otherwise标签做其他情况的声明 相当于default
--%>
<%
    request.setAttribute("number",3);
%>

<c:choose>
    <c:when test="${number == 1}">星期一</c:when>//如果number是1,则显示星期一
    <c:when test="${number == 2}">星期二</c:when>
    <c:when test="${number == 3}">星期三</c:when>
    <c:when test="${number == 4}">星期四</c:when>
    <c:when test="${number == 5}">星期五</c:when>
    <c:when test="${number == 6}">星期六</c:when>
    <c:when test="${number == 7}">星期天</c:when>
    
    <c:otherwise>数字输入有误</c:otherwise>

</c:choose>
</body>
</html>

3、foreach:相当于Java代码的for语句

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %><%--
  Created by IntelliJ IDEA.
  User: 64359
  Date: 2021/10/20
  Time: 19:18
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--foreach:相当于Java代码的for语句
    1、完成重复的操作
    for(int 1 = 0;i < 10;i ++){

    }
    属性:begin:开始值0
         end:结束值10,这里表示包含开始值也包含结束值
         var:临时变量i
         step:步长,也就是临时变量var每次增长多少
         varStatus:循环状态对象
                index:容器中元素的索引,从0开始
                count:循环次数
    2、遍历容器
    List<User> list;
    for(User user : list){

    }
    属性:items:容器对象list
         var:容器中元素的临时变量user
         varStatus:循环状态对象
                index:容器中元素的索引,从0开始
                count:循环次数
--%>
<c:forEach begin="1" end="10" var="i" step="1" varStatus="s">
    ${i} ${s.index} ${s.count}<br>
</c:forEach>

<%
    List list = new ArrayList();
    list.add("aaa");
    list.add("bbb");
    list.add("ccc");
    request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="str" varStatus="s">
    ${s.index}${s.count}${str}
</c:forEach>
</body>
</html>

在这里插入图片描述

案例

在request域中由一个存有User对象的List集合,需要使用JSTL+EL将list集合数据展示到jsp页面的表格table中

<%@ page import="cn.zg.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Date" %><%--
  Created by IntelliJ IDEA.
  User: 64359
  Date: 2021/10/20
  Time: 19:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    List list = new ArrayList();
    list.add(new User("bob",23,new Date()));
    list.add(new User("Alice",22,new Date()));
    list.add(new User("Mallory",33,new Date()));
    request.setAttribute("list",list);
%>

<table border="1" width="500" align="center">
    <tr>
        <th>编号</th>
        <th>编号</th>
        <th>编号</th>
        <th>编号</th>
    </tr>
    <c:forEach items="${list}" var="user" varStatus="s">
        
        <c:if test="${s.count % 2 ==0}">
            <tr bgcolor="#f0f8ff">
                <td>${s.count}</td>
                <td>${user.name}</td>
                <td>${user.age}</td>
                <td>${user.birStr}</td>
            </tr>
        </c:if>
        <c:if test="${s.count % 2 != 0}">
            <tr bgcolor="#faebd7">
                <td>${s.count}</td>
                <td>${user.name}</td>
                <td>${user.age}</td>
                <td>${user.birStr}</td>
            </tr>
        </c:if>

    </c:forEach>
</table>

</body>
</html>

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zgDaren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值