J S P

JSP

一、JSP入门

1.JSP概述

1.1 什么是JSP

​ Java server page(java服务器页面). JSP本质就是Servlet

​ 它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。

​ JSP=html(js,css)+java(servlet)+jsp(内置对象、指令、动作标签等等)特有的内容

1.2.JSP产生的原因

需求: 我们要向页面动态输出一个表格. 发现特别的繁琐

servlet在展示页面的时候,相当的繁琐。sun公司为了解决这个问题,参照asp开发了一套动态网页技术jsp。

1.3 JSP执行原理

JSP会翻译(通过默认的JspServlet,JSP引擎)成Servlet(.java),Servlet编译成class文件

​ JSP执行流程

​ 第一次访问的xxx.jsp时候,服务器收到请求,JspServlet会去查找对应的jsp文件

​ 找到之后,服务器会将这个jsp文件转换成java文件(Servlet)

​ 服务器编译java文件,生成class文件

​ 服务器运行class文件,生成动态的内容

​ 服务器收到内容之后,返回给浏览器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8KeSOK8b-1629039988773)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day26-cookie&session&jsp/笔记/img/tu_5.png)]

1.4.小结
  1. JSP: java 服务器 页面, sun公司定义的动态资源, 本质就是Servlet
  2. JSP产生的原因: Servlet在动态展示很麻烦, jsp展示方便一点

2.JSP基本语法

2.1 JSP脚本

我们可以通过JSP脚本在JSP页面上编写Java代码. 一共有三种方式:

类型翻译成Servlet对应的部分注意
<%…%>:Java程序片段翻译成Service()方法里面的内容, 局部的
<%=…%>:输出表达式翻译成Service()方法里面的内容,相当于调用out.print()输出表达式不能以;结尾
<%!..%>:声明成员变量(肯定不用)翻译成Servlet类里面的内容
  • eg
 <%
		for(int i = 0; i < 10;i++){
			out.print("i="+i);
			%>
			<hr/>
			<%
		}
	%> 

2.2JSP注释
注释类型
HTML注释
JAVA注释 //; /* */
JSP注释; <%–注释内容–%>

注释快捷键:Ctrl+Shift+/

2.3.小结
  1. 脚本
    • <%%> 翻译成了service()方法里面的局部内容
    • <%=%> 输出, 翻译成了service()方法里面的out.print()
    • <%!%> 翻译成了servlet类里面的全局内容
  2. 注释
    • 注释快捷键:Ctrl+Shift+/

登录案例的优化

一、优化登录失败的效果

LoginServlet的代码

package com.work.servlet;

import com.work.bean.User;
import com.work.utils.DruidUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.sql.SQLException;

/**
 * @author Leevi
 * 日期2020-08-24  16:24
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //0. 解决乱码
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //1. 获取客户端提交的用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 获取客户端输入的验证码
        String checkCode = request.getParameter("checkCode");

        // 获取服务器生成的验证码
        //从session中获取服务器端生成的验证码
        HttpSession session = request.getSession();
        String code = (String) session.getAttribute("code");
        //校验验证码
        if (code.equalsIgnoreCase(checkCode)) {
            //验证码正确,当验证码正确了,才进行用户名和密码的校验
            //2. 使用DBUtils执行SQL语句校验用户名和密码
            QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
            String sql = "select * from user where username=? and password=?";
            try {
                User user = queryRunner.query(sql, new BeanHandler<>(User.class), username, password);

                if (user != null) {
                    //登录成功
                    response.getWriter().write("登录成功");
                }else {
                    //登录失败:用户名或密码错误
                    String errorMsg = "用户名或密码错误";
                    //将errorMsg字符串存储到哪个域对象??? request
                    request.setAttribute("errorMsg",errorMsg);

                    //优化登录:跳转回到登录页面,并且进行错误信息的提示
                    //跳转方式有两种:1. 重定向 2. 请求转发

                    request.getRequestDispatcher("login.jsp").forward(request, response);
                }
            } catch (SQLException e) {
                e.printStackTrace();
                //登录失败: 登录失败
                //登录失败:验证码错误
                String errorMsg = "登录失败";
                //将errorMsg存储到request域对象
                request.setAttribute("errorMsg",errorMsg);
                //跳转到login.jsp
                request.getRequestDispatcher("login.jsp").forward(request, response);
            }
        }else {
            //登录失败:验证码错误
            String errorMsg = "验证码错误";
            //将errorMsg存储到request域对象
            request.setAttribute("errorMsg",errorMsg);
            //跳转到login.jsp
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }
    }
}

login.jsp的代码

<%--
  Created by IntelliJ IDEA.
  User: Fanyi Xiao
  Date: 2020/8/26
  Time: 15:15
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<center>
    <%
        //从request域对象中取出errorMsg
        String errorMsg = (String) request.getAttribute("errorMsg");
        if (errorMsg == null) {
            errorMsg = "";
        }
    %>
    <h1>用户登录</h1>
    <span style="color: red"><%=errorMsg%></span>
    <form action="login" method="post">
        姓名:<input type="text" name="username"/><br/>
        密码:<input type="password" name="password"/><br/>
        验证码:<input type="text" name="checkCode"><br>
        <img src="checkCode" id="code"><a href="javascript:;" οnclick="changeCheckCode()">换一换</a><br>
        <input type="submit" value="登录"/>
    </form>

    <script>
        //实现点击换一换,切换验证码图片
        function changeCheckCode() {
            //具体怎么去切换验证码呢? 也就是重新设置img标签的src
            //如果直接设置src为"checkCode"的话,那么浏览器就会从缓存中获取验证码图片,所以我们要让浏览器避开缓存
            //浏览器如果发现每次请求的路径不一样,就不会找缓存
            document.getElementById("code").setAttribute("src","checkCode?date="+new Date())
        }
    </script>
</center>
</body>
</html>

二、优化登录成功的效果

LoginServlet的代码

/**
 * @author Leevi
 * 日期2020-07-12  16:44
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            //1. 解决乱码
            request.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");

            //2. 获取请求参数username和password
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            //获取浏览器传入的验证码(用户输入的验证码)
            String checkCode = request.getParameter("checkCode");

            //获取服务器生成的验证码,从session里面根据key "code"取出
            HttpSession session = request.getSession();
            String code = (String) session.getAttribute("code");
            //3. 校验验证码
            if (code.equalsIgnoreCase(checkCode)) {
                //验证码校验通过
                //进行用户名和密码的校验
                //3. 连接数据库校验用户名和密码,也就是执行查询的SQL语句
                QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
                String sql = "select * from user where username=? and password=?";
                //执行查询,查询一条数据,封装到User中
                User user = queryRunner.query(sql, new BeanHandler<>(User.class), username, password);
                //判断是否登录成功
                if (user != null) {
                    //登录成功
                    //将user存储到session中
                    session.setAttribute("user",user);
                    //跳转到成功页面success.jsp
                    response.sendRedirect("/userDemo/success.jsp");
                }else {
                    //往request域对象中存放"用户名或密码错误"
                    request.setAttribute("msg","用户名或密码错误");
                    //请求转发跳转到login.jsp页面
                    request.getRequestDispatcher("/login.jsp").forward(request, response);
                }
            }else {
                //往request域对象中存放"验证码错误"
                request.setAttribute("msg","验证码错误");
                //请求转发跳转到login.jsp页面
                request.getRequestDispatcher("/login.jsp").forward(request, response);
            }
        } catch (Exception e) {
            e.printStackTrace();
            //往request域对象中存放"服务器异常请稍后再试"
            request.setAttribute("msg","服务器异常请稍后再试");
            //请求转发跳转到login.jsp页面
            request.getRequestDispatcher("/login.jsp").forward(request, response);
        }
    }
}

success.jsp的代码

<%@ page import="com.work.pojo.User" %><%--
  Created by IntelliJ IDEA.
  User: Fanyi Xiao
  Date: 2020/7/14
  Time: 16:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>成功页面</title>
</head>
<body>
    <%
        //从session域对象中取出user
        User user = (User) session.getAttribute("user");
        //取出nickname
        String nickname = null;
        if (user != null) {
            nickname = user.getNickname();
        }
    %>
    <h1>欢迎回来,<%=nickname%></h1>
</body>
</html>

案例-记住用户名案例

1.需求

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O8elvADT-1629039988776)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day26-cookie&session&jsp/笔记/img/remember.jpg)]

2.分析
  1. 在LoginServlet里面, 如果用户登录成功:

    ​ //判断用户是否勾选了记住用户名

    ​ //勾选了, 把用户名存到Cookie

    ​ //未勾选则清除已经保存的用户名

  2. 在login.jsp页面 从cookie取出展示

3.实现
  • LoginServlet
package com.work.servlet;

import com.work.pojo.User;
import com.work.utils.DruidUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

/**
 * @author Leevi
 * 日期2020-10-14  14:56
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //1. 获取请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //获取是否记住用户名
        String remember = request.getParameter("remember");
        //判断是否记住用户名
        Cookie cookie = new Cookie("username",username);
        cookie.setPath(request.getContextPath());
        if (remember != null) {
            //表示勾上了,那么就记住用户名: 将用户名存储到cookie中,发送给客户端
            cookie.setMaxAge(7*24*60*60);
        }else {
            //表示没有勾上,就要清除之前保存在cookie中的username
            cookie.setMaxAge(0);
        }
        response.addCookie(cookie);

        //获取验证码: 用户输入的验证码
        String checkCode = request.getParameter("checkCode");
        //从session中获取服务器生成的验证码
        HttpSession session = request.getSession();
        String code = (String) session.getAttribute("code");

        //校验验证码: 使用用户输入的验证码和服务器生成的验证码进行校验
        if (code.equalsIgnoreCase(checkCode)) {
            //验证码正确: 才会去校验用户名和密码
            //2. 连接数据库校验用户名和密码
            String sql = "select * from user where username=? and password=?";
            QueryRunner queryRunner = new QueryRunner(DruidUtil.getDataSource());
            try {
                User user = queryRunner.query(sql, new BeanHandler<>(User.class), username, password);
                if (user != null) {
                    //登录成功
                    //将当前用户的信息存起来:session
                    session.setAttribute("user",user);
                    //登录成功之后,要跳转到success.jsp页面,并且显示"欢迎XXX登录"
                    request.getRequestDispatcher("success.jsp").forward(request, response);
                }else {
                    //登录失败
                    String errorMsg = "用户名或密码错误";
                    //将errorMsg存储到域对象中
                    request.setAttribute("errorMsg",errorMsg);
                    //跳转回到登录页面
                    request.getRequestDispatcher("login.jsp").forward(request, response);
                }
            } catch (Exception e) {
                e.printStackTrace();
                String errorMsg = "用户名或密码错误";
                request.setAttribute("errorMsg",errorMsg);
                request.getRequestDispatcher("login.jsp").forward(request, response);
                //response.getWriter().write("用户名或密码错误");
            }
        }else {
            //验证码错误
            String errorMsg = "验证码错误";
            request.setAttribute("errorMsg",errorMsg);
            request.getRequestDispatcher("login.jsp").forward(request, response);
            //response.getWriter().write("验证码错误");
        }
    }
}

  • login.jsp
<%--
  Created by IntelliJ IDEA.
  User: Fanyi Xiao
  Date: 2020/10/15
  Time: 14:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
    <%
        //从request域对象中取出errorMsg的值,并且显示在页面上
        String errorMsg = (String) request.getAttribute("errorMsg");
        if (errorMsg == null) {
            errorMsg = "";
        }

        String username = "";
        //获取名为username的cookie的值
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("username")) {
                    username = cookie.getValue();
                }
            }
        }
    %>
    <div style="color: red"><%=errorMsg%></div>
    <form action="login" method="post">

        <%--将变量username的值显示到用户名输入框--%>
        用户名<input type="text" name="username" value="<%=username%>"><br>
        密码<input type="password" name="password"><br>
        验证码<input type="text" name="checkCode"><br>
        <img id="checkCode" src="checkCode"/>
        <a href="javascript:;" οnclick="changeCheckCode()">换一换</a>
        <br>
        <input type="checkbox" name="remember">记住用户名<br>
        <input type="submit" value="提交">
    </form>
    <script>
        //声明一个方法,切换验证码图片
        function changeCheckCode() {
            //怎么切换验证码图片呢?  再一次请求验证码图片路径,也就是重新设置img标签的src
            //因为我们的访问路径没有改变,所以服务器认为我们发送的是同一次请求,所以服务器会返回一个状态码304,所以我们会从缓存中获取数据
            //如果每次访问的url路径有变化,就绝不会从缓存中获取数据
            document.getElementById("checkCode").setAttribute("src","checkCode?a="+new Date())
        }
    </script>
</body>
</html>

4.小结
  1. 用户勾选了记住用户名,我们把用户名存到Cookie里面
  2. 在login.jsp里面 从cookie取出用户名展示

二、EL表达式

1.EL表达式概述

1.1.什么是El表达式

​ Expression Language: 表达式语言, jsp2.0之后内置在jsp里面

​ 目的:为了使JSP写起来更加简单, 取值(取的域对象里面存的值)更加简单。(代替脚本 <% %>)

1.2. EL语法

${el表达式}

1.3. EL表达式的用途

​ 1.获取数据. 获取的是域(request,session,ServletContext)对象中存储的数据

​ 2.EL执行运算

  1. 使用EL表达式获取cookie中的数据

2.El获取数据

2.1获取简单数据类型数据

​ 语法:${requestScope|sessionScope|applicationScope.属性名};

​ 快捷写法:${属性名}, 属性名就是存在域对象里面的key

<%--
  Created by IntelliJ IDEA.
  User: Fanyi Xiao
  Date: 2020/7/15
  Time: 8:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>使用EL表达式获取域对象中的简单类型的数据</title>
</head>
<body>
    <%
        //往域对象存值
        application.setAttribute("msg","applicationValue");
        //session.setAttribute("msg","sessionValue");
        //request.setAttribute("msg","requestValue");

        //在我们开发过程中,是否会往多个域对象中存放同一个key??? 这是不会的
        //所以我们用el表达式获取域对象里面的数据,还可以简化成${key} 获取范围最小的域对象中的这个key对应的值
    %>
    获取的application域对象中的msg=${applicationScope.msg}<br>
    获取session域对象中的msg=${sessionScope.msg}<br>
    获取request域对象中的msg=${requestScope.msg}<br>
    获取存放在域对象中的msg=${msg}
</body>
</html>
2.2获取数组

​ 语法: ${key[下标]} key就是域对象里面存的key

2.3获取list

语法:${list属性名[index]}或者${list属性名.get(index)};list属性名就是存入域对象里面的key

2.4获取Map

语法:${map属性名.键}或者${map属性名.get("键")},map属性名就是存入域对象里面的key

2.5 获取bean

语法:${key.javabean属性}

​ 依赖getxxx()方法; eg: getPassword()—去掉get–>Password()----首字母小写—>password

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.Map" %>
<%@ page import="com.work.pojo.User" %><%--
  Created by IntelliJ IDEA.
  User: Fanyi Xiao
  Date: 2020/7/15
  Time: 9:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>使用EL表达式获取存储在域对象中的复杂类型的数据</title>
</head>
<body>
    <%
        //往域对象中存放数组类型的数据
        String[] arr = {"张三","李四","王五","赵六","田七","狗娃"};
        request.setAttribute("arr", arr);

        //往域对象中存放一个集合
        List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        list.add("田七");
        request.setAttribute("list", list);

        //往域对象中存放一个map
        Map<String,String> map = new HashMap<String,String>();
        map.put("name", "张三");
        map.put("password", "123456");
        map.put("nickname", "张三丰");
        request.setAttribute("map", map);

        //往域对象中存放一个pojo对象
        User user = new User(1, "jay", "台湾省");
        request.setAttribute("user",user);
    %>
    获取存放在request域对象中的数组中的第三个元素:${arr[2]}<br>
    <%--
        在el表达式中,只要是根据下标获取元素,都可以写[index]
    --%>
    获取存放在request域对象中的集合中的第四个元素:${list[3]}<br>

    <%--
        在el表达式中,只要是根据对应的属性的get方法去获取数据,都可以写成".属性名"  或者 ["属性名"]
    --%>
    获取存储在request域对象中的map中的nickname:${map.nickname}<br>

    获取存放在request域对象中的user的address属性的值:${user.address}
</body>
</html>

3.EL执行运算

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a4FFeNyQ-1629039988778)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day27-JSP三层架构/笔记/img/tu_3.jpg)]

3.1算数运算

​ +,-,*,/

  • +不能拼接字符串,如果+两端是字符串,那么会将字符串转换成数字之后再进行加法运算,如果+两端的字符串无法转换成数字,则会报错
3.2 逻辑运算

​ < >= <= != ==

3.3 关系运算

​ && || !

3.4 非空判断【重点】

​ empty,1. 判断一个对象是否为null, 2. 判断集合长度是否为0, 3. 判断一个字符串是否为空字符串

​ not empty

​ 语法: ${empyt 属性名};属性名 就是域对象里面的key值

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="com.work.pojo.User" %><%--
  Created by IntelliJ IDEA.
  User: Fanyi Xiao
  Date: 2020/7/15
  Time: 9:35
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>empty 运算符的介绍</title>
</head>
<body>
    <%
        //el表达式中的empty可以判断一个字符串是否为空字符串,一个对象是否为null,一个集合的长度是否为0
        List<String> list = new ArrayList<String>();
        list.add("张三丰");
        request.setAttribute("list", list);

        request.setAttribute("msg","requestValue");

        User user = new User();
        request.setAttribute("u",user);
    %>
    判断域对象中的list集合的长度是否为0: ${empty list}<br>
    判断域对象中的msg字符串是否为空字符串: ${empty msg}<br>
    判断域对象中的user是否为null : ${empty u}<br>
</body>
</html>

4.使用EL表达式获取存放在cookie中的数据(扩展)

​ 语法:${cookie.cookie的name.value}

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>使用el表达式获取存储在cookie中的数据</title>
</head>
<body>
    <%--
        jsp里面是内置session对象,有了session对象,那么浏览器就会携带一个名为"JSESSIONID"的cookie
        我们的目标就是获取"JSESSIONID"的值
    --%>
    <%
        Cookie[] cookies = request.getCookies();
        String cookieValue = null;
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("JSESSIONID")) {
                    cookieValue = cookie.getValue();
                }
            }
        }
    %>
    使用原始方式获取的JSESSIONID的值为: <%=cookieValue%><br>

    <%--
        ${cookie}表示获取这次请求中的所有cookie对象
        ${cookie.JSESSIONID}表示获取名为"JSESSIONID"的cookie对象
        ${cookie.JSESSIONID.value}表示获取名为"JSESSIONID"的cookie对象的value
    --%>
    使用EL表达式获取JSESSIONID的值为: ${cookie.JSESSIONID.value}
</body>
</html>

三、JSTL标签库

1.JSTL标签库概述

1.1 什么是JSTL标签库

​ JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。这个JSTL标签库没有集成到JSP的, 要使用的话, 需要导jar包.

1.2 JSTL标签库的作用

​ 为了简化在jsp页面上操作数据; eg: 遍历数据 判断数据等

1.3 JSTL标签库的类别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dxoks7At-1629039988782)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day27-JSP三层架构/笔记/img/tu_2.jpg)]

2.JSTL核心标签库

2.1核心标签库使用步骤

1. 导入jar包 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UuXug9jn-1629039988784)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day27-JSP三层架构/笔记/img/tu_12.png)]

  1. 在JSP页面上导入核心标签库<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
2.2if标签

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OBYOuuJY-1629039988785)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day27-JSP三层架构/笔记/img/06.png)]

  • 语法
<c:if test="el表达式${..}">
</c:if>
  • 实例
<%--
  Created by IntelliJ IDEA.
  User: Fanyi Xiao
  Date: 2020/8/27
  Time: 10:10
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
    <title>使用jstl中的if标签进行判断</title>
</head>
<body>
    <%
        //往域对象中存储一个age
        request.setAttribute("age",17);

        //目标:判断age的值,如果大于等于18,则在浏览器页面上输出"已成年",否则输出"未成年"
        //jstl的使用步骤:1. 导入jar包  2. 在jsp页面通过taglib指令引入核心标签库  3. 使用标签
    %>
    <%--
        if标签有一个属性叫做test,它表示判断表达式,需要结合el一起使用
        如果要表示相反的判断,则再添加一个if标签,然后写相反的条件就行

        if标签还有一个属性叫做var,表示将判断结果存储进域对象时候的key(了解)

        if标签的第三个属性叫做scope,表示将判断结果存储进哪个域对象(了解)
    --%>
    <c:if test="${age >= 18}" var="flag" scope="request">
        已成年
    </c:if>

    <c:if test="${age < 18}">
        未成年
    </c:if>
    <br>
    ${flag}
</body>
</html>
  • 小结

    • 语法
    <c:if test="${} "></c:if>
    
    • 特点
      • 如果test里面的是true, if标签体里面的就会执行
      • 如果test里面的是false, if标签体里面的就不会执行
      • 没有else的
2.3choose标签
  • 实例
<%--
  Created by IntelliJ IDEA.
  User: Fanyi Xiao
  Date: 2020/7/15
  Time: 9:59
  To change this template use File | Settings | File Templates.
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>jstl中的choose标签的使用介绍</title>
</head>
<body>
    <%
        request.setAttribute("course","PHP");
    %>
    <c:choose>
        <%--
            一个when标签表示一个条件
        --%>
        <c:when test="${course == 'Java'}">
            学习Java
        </c:when>

        <c:when test="${course == 'Android'}">
            学习Android
        </c:when>

        <c:when test="${course == 'C++'}">
            学习C++
        </c:when>

        <c:otherwise>
            学习,学个屁!!!
        </c:otherwise>
    </c:choose>
</body>
</html>
2.4 foreach标签

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tTdnCXvB-1629039988786)(E:/Java/03-就业阶段_JAVAWEB阶段/03-就业阶段_JAVAWEB课件/day27-JSP三层架构/笔记/img/07.png)]

  • 简单的使用:

 <%--
        jstl中的forEach标签是用来代替for循环语句

        目标1: 在浏览器上显示0-9的数字
            begin属性: 从哪个下标开始遍历, 如果不写默认是从0开始
            end属性: 到哪个下标结束遍历,如果不写默认是遍历到集合/数组的最后一个元素
            step属性: 表示遍历时候的步长,默认步长是1
            var属性: 表示将遍历的结果存放进域对象时候的key
    --%>
<c:forEach begin="0" end="9" step="1" var="i">
	${i}
</c:forEach><br>

  • 复杂的使用遍历集合:

    <%
        //往域对象存储一个集合
        List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        list.add("田七");
        request.setAttribute("list", list);
    %>
    
    <c:forEach begin="0" end="9" step="1" var="i">
        ${i}
    </c:forEach><br>
    
    	<%--
        通过items属性指定遍历域对象里面的list
        通过var属性指定遍历出来的每个数据存储到域对象时候的key
        --%>
    <c:forEach items="${list}" var="username">
        ${username}
    </c:forEach>
    
  • c:forEach中的varStatus属性。

    指向一个字符串,该字符串引用一个对象。  map.put("vs",一个对象);
    
     	  这个对象记录着当前遍历的元素的一些信息:
    
       		   index:返回索引。从0开始
    
        		   count:返回计数。从1开始
    
       		    last:是否是最后一个元素
    
        		   first:是否是第一个元素	
    
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %><%--
  Created by IntelliJ IDEA.
  User: Fanyi Xiao
  Date: 2020/7/15
  Time: 10:15
  To change this template use File | Settings | File Templates.
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>forEach 标签的varStatus属性的介绍</title>
</head>
<body>
    <%
        //往域对象存储一个集合
        List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        list.add("田七");
        request.setAttribute("list", list);
    %>

    <%--
        forEach标签的varStatus属性:指定将遍历出来的每一个元素的状态存储进域对象时候的key
            遍历出来的每一个元素都有一些状态(属性),比如:
                下标 index:
                计数 count:
                当前元素的值 current:
                是否是第一个元素:
                是否是最后一个元素
    --%>
    <table border="1" cellspacing="0" width="700" align="center">
        <tr>
            <th>下标</th>
            <th>计数</th>
            <th>姓名</th>
            <th>是否是第一个元素</th>
            <th>是否是最后一个元素</th>
        </tr>
        <c:forEach items="${list}" varStatus="vst">
            <tr>
                <td>${vst.index}</td>
                <td>${vst.count}</td>
                <td>${vst.current}</td>
                <td>${vst.first}</td>
                <td>${vst.last}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言都有相应的实现方式,可以应用于各种不同的场景。C语言的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言用于封装代码的单元,可以实现代码的复用和模块化。C语言定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言用于存储同类型数据的结构,可以通过索引访问和修改数组的元素。字符串是C语言用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值