4/22day39_el&jstl&三层架构

2020-04-24  本文已影响0人  蹦蹦跶跶的起床啊

回顾

1. jsp介绍
    特殊页面,可以编写html标签,也可以编写java代码
    本质上就是一个servlet

2. jsp脚本和注释
        <% 脚本片段 %>
        <%! 声明片段 %>
        <%=输出片段 %> 相当于 out.print()方法
        <%-- 注释一切 --%>
3. jsp指令
    page:配置jsp页面
        contentType 指定响应体的mime类型和编码方式
        import      导入jar包
    include:静态包含技术
    taglib:导入jstl标准标签库

4. jsp内置对象
        pageContext:是一个域对象
        request
        response
        out

5. jsp动作标签
    <jsp:include>:动态包含
    <jsp:forward>:请求转发
        <jsp:param>:携带参数

6. mvc设计思想【感知】
    实现业务逻辑和视图的分离
        m:模型,javaBean(1.处理业务逻辑 2.封装实体)
        v:视图 jsp(展示内容 el+jstl)
        c:控制器 servlet(1.接收请求 2.调用模型 3.转发视图)

EL&JSTL&三层架构

今日目标

1. el表达式

2. jstl标签库

3. 三层架构(mvc升级版...)

4. 用户信息列表展示 大作业

一 EL

1.1 概述

表达式语言(Expression Language)

作用:主要用来代替jsp中脚本的功能,简化对java代码的操作。

语法:${表达式}

1.2 使用

1.2.1 获取(域中的)值

EL表达式==只能==从域对象(4个域)中获取数据

语法

* 标准(了解)
    1. ${pageScope.键名} 
            从page域中获取指定键名对应的值

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

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

    4. ${applicationScope.键名} 
            从servletContext域中获取指定键名对应的值
        
* 简化(掌握)
    ${键名}
        特点:默认从最小域开始找,找到后直接显示,不在继续寻找
        小结:要求四个域键名唯一
    
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo1</title>
</head>
<body>
<h3>el表达式基本语法</h3>
<%
    /*模拟servlet向域中存值....*/
    // pageContext.setAttribute("username", "饭岛爱老师");
    request.setAttribute("username", "小泽老师");
    request.setAttribute("age", 33);
    session.setAttribute("sex", "女");
    application.setAttribute("address", "小日本");
%>
<h5>标准语法</h5>
${pageScope.username} <br> <%--不会出现空指针异常问题--%>
${requestScope.age} <br>
${sessionScope.sex}<br>
${applicationScope.address}<br>
<h5>简化语法</h5>
${username} <br>
${age} <br>
${sex}<br>
${address}<br>
</body>
</html>

练习【作业】

1. 获取字符串
        ${键名}
        
2. 获取对象(User)
        ${键名.属性名}

3. 获取List(Array)集合
        ${键名[索引]}

4. 获取Map集合
        ${键名.key}
        ${键名["key"]}
        
5. 补充
    el不会出现null和索引角标越界问题
<%@ page import="cn.itcast.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo2</title>
</head>
<body>
<h3>获取user对象</h3>
<%
    User user = new User("大雄", 13, "男");
    request.setAttribute("user", user);
%>
${user} <br> <%--执行该对象的toString方法--%>
${user.username} | ${user.age} | ${user.sex} <br>


<h3>获取list集合</h3>
<%
    List<Object> list = new ArrayList<>();
    list.add("胖虎");
    list.add("小夫");
    list.add("静香");
    list.add(user);
    request.setAttribute("list", list);
%>
${list}<br><%--执行该对象的toString方法--%>
${list[0]} | ${list[1]} | ${list[2]} | ${list[3].username} | ${list[10]} <br> <%--el表达式不会出现 集合(数组)角标越界异常--%>


<h3>获取map集合</h3>
<%
    Map<String, Object> map = new HashMap<>();
    map.put("key1", "盲僧");
    map.put("key2", "瞎子");
    map.put("key3", "李青");
    map.put("key.4", user);
    request.setAttribute("map", map);
%>
${map}<br><%--执行该对象的toString方法--%>
${map.key1} | ${map.key2} | ${map.key3} | ${map["key.4"].username}<br>
</body>
</html>

1.2.2 执行运算

* 算数运算符
        语法: + - * /(div) %(mod)
        
* 比较运算符
        语法:> < >= <= ==(eq) !=(ne)
        
* 逻辑运算符
        语法:&&(and) ||(or) !(not)
        
* 三元运算符
        语法:${条件表达式?为真:为假}

------------------------------

* 空运算符
        语法:${not empty 对象}
        功能:
            可以判断字符串和对象是否为空
            可以判断一个集合的长度是否为0
<%@ page import="cn.itcast.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo3</title>
</head>
<body>
<%
    int a = 4;
    int b = 3;
    request.setAttribute("a", a);
    request.setAttribute("b", b);
%>
<h5>算数运算符</h5>
${a / b} | ${a div b} <br>
${a % b} | ${a mod b}<br>

<h5>比较运算符</h5>
${a == b} | ${a eq b}<br>
${a !=b } | ${a ne b} <br>

<h5>三元运算符</h5>
${a == b ? "a相等b" : "a不等b"} <br>

<h5>非空判断</h5>
<%
    User user = new User();
    request.setAttribute("user", user);

    List list = new ArrayList();
    list.add("aa" );
    request.setAttribute("list", list);
%>
user对象:${not empty user} <br> <%--  if(user !=null ){} --%>
list集合:${not empty list} <br> <%-- if(list !=null && list.size>0 ){}--%>

<h5>空值判断</h5>
user对象:${empty user} <br> <%--  if(user ==null ){} --%>
list集合:${empty list} <br> <%-- if(list ==null || list.size==0 ){}--%>
</body>
</html>

1.2.3 隐式对象

* el表达式中有11个隐式对象
    掌握
        pageContext
            就是jsp九大内置对象之一,这哥们可以获得其他八个内置对象
        cookie
            可以获取浏览器指定cookie名称的值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>demo4</title>
</head>
<body>
<h3>el隐式对象..</h3>
${pageContext.request.contextPath}  动态获取:项目名称(虚拟路径) <br>

${cookie.JSESSIONID.value} 获取指定cookie名称的值... <br>
</body>
</html>

1.2.4 补充

* jsp默认支持el表达式
        servlet2.3规范中,默认不支持el表达式

* 如果要忽略el表达式
    1)忽略当前jsp页面中所有的el表达式
        设置jsp中page指令中:isELIgnored="true" 属性
    2)忽略单个el表达式
        \${表达式}
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>demo4</title>
</head>
<body>
<h3>el隐式对象..</h3>
${pageContext.request.contextPath}  动态获取:项目名称(虚拟路径) <br>

\${cookie.JSESSIONID.value} 获取指定cookie名称的值... <br>
</body>
</html>

1.3 JavaBean

这哥们其实就是一个普通的java类

使用规范

  1. 所有字段(成员变量)为private
  2. 提供无参构造方法
  3. 提供getter、setter和is方法
  4. 实现serializable接口

例如:下面User类,有四个字段(成员变量),有无参构造方法,有一个属性(username)

public class User implements Serializable {

    private String username;

    private Integer age;

    private String sex;

    private boolean success; // 是否操作成功


    public User() {
    }



    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

}

二 JSTL

2.1 概述

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

作用:替换和简化jsp页面中java代码的编写

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

标签库 标签库的URI 前缀
Core http://java.sun.com/jsp/jstl/core c
国际化(几乎不用) http://java.sun.com/jsp/jstl/fmt fmt
SQL(过时) http://java.sun.com/jsp/jstl/sql sql
XML(过时) http://java.sun.com/jsp/jstl/xml x
Functions(几乎不用) http://java.sun.com/jsp/jstl/functions fn

2.2 Core标签使用

2.2.1 使用步骤

① 当前web项目引入jar包

② 当前jsp页面tablib指令引入

2.2.2 常用标签

① c:if标签

* 这哥们就相当于,java中 if(){}
    语法
        <c:if test="boolean值"></c:if>
            true:显示标签体内容
            false:隐藏标签体内容
        通常与el表达式一起使用
        注意:此标签没有else功能,如果想实现else效果,请让条件取反
<%@ page import="cn.itcast.domain.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo1</title>
</head>
<body>
<%
    User user = new User();
    user.setUsername("jack");
    request.setAttribute("user", user);
%>

<c:if test="${empty user}">
    你好,请登录...
</c:if>

<c:if test="${not empty user}">
    你好,${user.username}
</c:if>
</body>
</html>

② c:forEach标签

* 相当于java中的for循环
    1)普通for
        for(int i=1; i<=5; i++){
            i
        }
        <c:forEach begin="1" end="5" step="1" var="i">
            ${i}
        </c:forEach>
            begin="1" 起始值(包含)
            end="5"   结束值(包含)
            step="1"  步长为1
            var="i"   当前输出临时变量
    2)增强for
        for(User user : list){
            user
        }
        <c:forEach items="${list}" var="user" varStatus="vs">
            ${user}
        </c:forEach>
            items="list" 集合
            var="user"   当前输出的临时变量
            varStatus="vs" 变量状态
                index 当前索引 从0开始
                count 计数器   从1开始
<%@ page import="java.util.List" %>
<%@ page import="cn.itcast.domain.User" %>
<%@ 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>demo2</title>
</head>
<body>
<h3>普通for循环</h3>
<c:forEach begin="1" end="5" step="1" var="i"> <%--for循环将临时变量存储到了 pageContext域空间--%>
    ${i} <br>
</c:forEach>

<h3>增强for循环</h3>
<%
    List<User> list = new ArrayList<>();
    list.add(new User("dilireb", 27, "女"));
    list.add(new User("古力娜扎", 23, "女"));
    list.add(new User("马尔扎哈", 127, "中"));
    request.setAttribute("list", list);
%>

<c:forEach items="${list}" var="user" varStatus="vs">
   索引:${vs.index} |  计数器: ${vs.count} | ${user.username} <br>
</c:forEach>
</body>
</html>

③ c:choose标签 【了解】

* 相当于java中switch语句
    <c:choose>  等价于 switch
    <c:when>    等价于 case+break
    <c:otherwise> 等价于 default
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>demo3</title>
</head>
<body>
<h3>choose标签</h3>
<%
    Integer money = 7000;
    request.setAttribute("money", money);
%>
<c:choose>
    <c:when test="${money == 7000}">
        单身汪....
    </c:when>
    <c:when test="${money == 15000}">
        撩小姐姐....
    </c:when>
    <c:when test="${money > 30000}">
        妻妾成群....
    </c:when>
    <c:otherwise>
        来传智奋斗吧骚年....
    </c:otherwise>
</c:choose>
</body>
</html>

三 三层架构(MVC升级版)

改造了MVC以后的架构,就称为三层架构

3.1 概述

通常意义上的三层架构就是将整个业务应用划分为:表示(现)层、业务逻辑层、数据访问层。

区分层次的目的 为了高内聚低耦合的思想

表示(现)层:又称为web层,与浏览器进行数据交互(控制器和视图)

业务逻辑层:又称为service层,处理业务数据(if判断,for循环)

数据访问(持久)层:又称为dao层,与数据库进行交互的(每一条(行)记录与javaBean实体对应)

包目录结构

* com.itheima 基本包(公司域名倒写)

* com.itheima.dao 持久层

* com.itheima.service 业务层

* ccom.itheima.web 表示层

* com.itheima.domain 实体(JavaBean)

* com.itheima.util 工具

3.2 案例:用户信息列表展示

需求

使用MVC模式升级版(三层架构)开发代码,完成用户显示列表功能。

3.2.1 需求分析

3.2.2 环境搭建

① 创建web项目

② 导入第三方依赖jar包(jstl)

③ 创建三层包目录结构

④ 最终项目结构(必须跟讲师包名一致...否则过后果自负...)

3.2.3 代码实现

① index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>${NAME}</title>
</head>
<body>
<h3><a href="${pageContext.request.contextPath}/FindAllServlet">用户列表查询</a></h3>
</body>
</html>

② User实体类

public class User {
    
    private String id;
    private String name;
    private String sex;
    private Integer age;
    private String address;
    private String qq;
    private String email;

    public User() {
    }

    public User(String id, String name, String sex, Integer age, String address, String qq, String email) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
        this.address = address;
        this.qq = qq;
        this.email = email;
    }
    
    // 省略getter/setter方法...
}

③ FindAllServlet

package cn.itcast.dzb.web;

import cn.itcast.dzb.domain.User;
import cn.itcast.dzb.service.UserService;

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 java.io.IOException;
import java.util.List;

@WebServlet("/FindAllServlet")
public class FindAllServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.调用service查询
        UserService userService = new UserService();
        List<User> list = userService.findAll();
        // 2.将list存储request域
        request.setAttribute("list", list);
        // 3.转发list.jsp
        request.getRequestDispatcher("/list.jsp").forward(request, response);
    }

}

④ UserService

package cn.itcast.dzb.service;

import cn.itcast.dzb.dao.UserDao;
import cn.itcast.dzb.domain.User;

import java.util.List;

public class UserService {

    public List<User> findAll() {
        // 调用dao,查询
        UserDao userDao = new UserDao();
        List<User> list = userDao.findAll();
        return list;
    }
}

⑤ UserDao

package cn.itcast.dzb.dao;

import cn.itcast.dzb.domain.User;

import java.util.ArrayList;
import java.util.List;

public class UserDao {

    private static List<User> list = new ArrayList<>();

    static {
        list.add(new User("1", "如花", "女", 18, "香港", "123456", "123456@qq.com"));
        list.add(new User("2", "甄姬", "女", 17, "扬州", "123436", "123436@qq.com"));
        list.add(new User("3", "马大脚", "女", 28, "北京", "223456", "223456@qq.com"));
        list.add(new User("4", "波多老师", "女", 35, "日本", "423456", "423456@qq.com"));
    }

    public List<User> findAll() {
        return list;
    }
}

⑥ list.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>list.jsp</title>
</head>
<body>
<%--<c:forEach items="${list}" var="user">
    ${user} <br>
</c:forEach>--%>

<table border="1" cellpadding="0" cellspacing="0" width="500px" align="center">
    <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>性别</th>
        <th>年龄</th>
        <th>地址</th>
        <th>QQ</th>
        <th>邮箱</th>
    </tr>
    <c:forEach items="${list}" var="user">
        <tr align="center">
            <td>${user.id}</td>
            <td>${user.name}</td>
            <td>${user.sex}</td>
            <td>${user.age}</td>
            <td>${user.address}</td>
            <td>${user.qq}</td>
            <td>${user.email}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

上一篇 下一篇

猜你喜欢

热点阅读