2020-05-08:JSP&MVC&EL&JSTL

191 阅读6分钟

今日内容

1. JSP:
    1.指令
    2.注释
    3.内置对象
2. MVC开发模式
3. EL表达式
4. JSTL标签
5. 三层架构

一、JSP

1.指令
    * 作用:用于配置JSP页面,导入资源文件
    * 格式:
        <%@ 指令名称 属性名1=属性值1 属性名2=属性值2...%>
    * 分类:
        1. page:用于配置JSP页面的
            * contentType:等同于response.setContentType()
                1.设置响应体的mime类型以及字符集
                2.设置当前jsp页面的编码(针对于高级开发工具才起作用,如果使用低级工具,
                  则需要设置pageEncoding属性设置当前页面的字符集)。
            * import:导包
            * errorPage:当前页面发生异常后,会自动跳转到指定的错误页面
            * isErrorPage:标识当前页面是否是错误页面。
                * isErrorPage="true":是错误页面,此时可以使用内置对象exception
                    <%
                        String message = exception.getMessage();
                        out.println(message);
                    %>
                * isErrorPage="false":默认值,不是错误页面。不能使用内置对象exception
        2. include:页面包含的。导入页面的资源文件
            * <%@include file="top.jsp" %>
        3. taglib:导入资源
            一般用于导入标签库,比如导入JSTL标签库。
            <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
                * prefix:前缀自定义的。

2.注释:
    1.html注释:
        <!-- -->:只能注释html代码片段
        使用html注释的代码,它的html源码会被发送到我们的response响应里面。只不过它告
        诉浏览器这些数据不解析不显示而已。
        其实浏览器可以看到这些信息。
    2.jsp注释
        <%-- --%>:可以注释所有
        被JSP注释的源码都不会发送到response响应里面。
        浏览器根本看不到这些信息。
    * 推荐使用jsp注释。
3.内置对象
    * 在jsp页面中不需要创建,直接使用的对象
    * 一共9个:
        1.pageContext
        2.request
        3.session
        4.application
        5.response
        6.page
        7.out
        8.config
        9.exception
            指令isErrorPage="true",才可以使用该内置对象。
            
    1.本地项目在:
        E:\Idea_Project\day0508_EL&JSTL\out\artifacts\day0508_EL_JSTL_war_exploded
    2.但是IDEA真正将项目部署在:
        C:\Users\13099\.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_31_day0508_EL&JSTL\work\Catalina\localhost\day0508
    3.当我们请求.jsp页面时,服务器会将.jsp文件转成.java和.class文件。然后放到work文件夹中。
        打开一个.java文件,可以发现在_jspService()方法里面定义者上面9个内置对象
        真实类型                变量名          作用
        PageContext             pageContext     当前jsp页面共享数据,还可以获取其他8
                                                个内置对象
                                                
        HttpServletRequest      request         一次请求访问的多个资源(转发)
        HttpSession             session         一次会话的多个请求间
        ServletContext          application     域最大:所有用户间共享数据。随服务器
                                                创建创建,随服务器销毁销毁。
                                                
        HttpServletResponse     response        响应对象
        Object                  page            代表当前(Servlet)页面的对象
        JspWriter               out             输出对象,可以把数据输出到页面上
        ServletConfig           config          Servlet的配置对象
        Throwable               exception       异常对象

二、MVC开发模式

1.jsp演变历史
    1.早期只有servlet,只能使用response输出标签数据,非常麻烦。
    2.后来有了jsp,简化了Servlet的开发。
      但是如果过度的使用jsp,在jsp中即写大量的java代码,又写html标签,造成难于维护,
      难于分工协作。
    3.再后来,java的web开发借鉴了mvc开发模式,使得程序的设计更加的合理性。
    
2.MVC:不是设计模式,是一种软件开发的思想。软件设计开发典范
    1.M:Model,模型-----JavaBean
        * 完成具体的业务操作,如查询数据库,封装对象。
    2.V:View,视图------SP
        * 展示数据
    3.C:Controller,控制器------Servlet
        * 获取用户输入(请求参数)
        * 调用模型
        * 将数据交给视图展示
    * 优缺点:
        1.优点:
            1.耦合性低,方便维护,可以利于分工协作。
            2.重用性高
        2.缺点:
            1.使得项目架构变得复杂,对开发人员要求高。

通过MVC的学习,我们知道在JSP页面作为表现层,只做展示功能。但是如果有些时候又需要写一些逻辑代码时,我们可以用下面两种技术来使用。

三、EL表达式

    * jsp默认支持EL表达式的
    1.概念:Expression Language 表达式语言
    2.作用:替换和简化jsp页面中java代码的编写。
    3.语法:${表达式}
    4.注意:
        * jsp默认支持jsp表达式,会将其解析。
        * 如果要忽略EL表达式
            1.设置jsp中page指令:isELIgnored="true",但是会忽略当前页面的所有EL表达式
            2.\${表达式}:忽略一个EL表达式。
    5.使用:
        1.运算:
            * 运算符:
                1.算数运算符: + - * / %; 其中/可以用div,%可以用mod表示
                2.比较运算符:> < >= <= == !=
                3.逻辑运算符:&& || !   也可以用 and or not表示
                4.空运算符:empty
                    * 功能:用于判断字符串,集合,数组对象是否为null并且长度是否为0
                    * ${empty list}
        2.获取值
            1.el表达式只能从域对象中获取值
                1.pageContext
                2.request
                3.session
                4.application
            2.语法:
                1.${域名城.健名}:从指定域中获取指定键的值。
                    * 域名城:
                        1.pageScope
                        2.requestScope
                        3.sessionScope
                        4.applicationScope
                    * 举例:在request域中存储了name=zhangsan
                    * 获取:${requestScope.name}
                        有的话原样展示,如果没有不会显示null,而是空字符串。
                2.${键名}:表示一次从最小的域中查找是否有该键,直到找到为止。
                  pageContext-->request-->session->application(ServletContext)
                  如果每个域的键名称都不同,那么就可以直接${键名}这样写。
            
        3.获取其他类型的值:对象,List集合,Map集合
            1.获取对象中的成员变量对象:${域名城.健名.属性名}
                * 本质上回去调用对象的getter方法
                * 详见:ek3.jsp  package cn.itcast.domain.User
            2. List集合:${域名城.健名[索引]}
                * ${list[2]}
                * 如果索引越界不会报错,显示空字符串
            3. Map集合:${域名称.键名.key}
                ${map.gender}
                ${map.sname}
                ${map["gender"]}
                ${map["sname"]}
        
        4.空运算符:empty
            * 功能:用于判断字符串,集合,数组对象是否为null并且长度是否为0
                * ${empty str}:先从各个域中找str键,然后判断str键是否为空或0.
                * ${not empty str}:判断是否不为null或长度大于0
        
        5.隐式对象:
            * el表达式中有11个隐式对象
                1.pageScope
                2.requestScope
                3.sessionScope
                4.applicationScope
            * pageContext:也是一个隐式对象
                * 获取其他8个内置对象:实际上也是通过pageContext对象中的getXxx()方法
                    ${pageContext.request}
                    ${pageContext.session}
                    ${pageContext.out}
                    ${pageContext.servletContext}
                    ${pageContext.servletConfig}
                    ${pageContext.page}
                    ${pageContext.response}
                    ${pageContext.exception}
        
            * 在jsp页面动态获取虚拟目录
                ${pageContext.request.contextPath}

四、JSTL

1.概念:JavaServer Pages Tag Library    JSTL标准标签库
    * 是由Apache组织提供的开源免费的jsp标签
2.作用:用于简化和替换jsp页面上的java代码

3.使用步骤:
    1.导入JSTL相关的jar包
    2.引入标签库:taglib指令 <%@ taglib %>
    3.使用标签
4.常用的JSTL标签
    1.if        :相当于Java代码的if语句
        *.属性:test必须属性:接收boolean表达式
            * 如果表达式为true,则显示if标签体内容,如果为false不显示内容
            * 一般情况下,test属性值会结合el表达式一起使用
        *.注意:c:if标签没有else情况,想要else请况,可以在定义一个c:if。
    2.choose    :相当于Java代码的switch语句
        1.域中存储数字
        2.使用choose标签去除数字            :相当于switch声明
        3.使用when标签做数字的判断          :相当于case
        4.otherwise标签做其他情况的声明    :相当于default
        5.完成数字编号对应星期几的案例:
        ```
            <%
            request.setAttribute("number", 8);
            %>
            <c:choose>
                <c:when test="${number == 1}">星期一</c:when>
                <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>
        ```
    3.foreach   :相当于Java代码的for语句
        1.完成重复的操作
            for(int i=0; i<10; i++){
                ....
            }
            * 属性:
                begin:      开始值
                end:        结束值
                var:        临时变量
                step:       步长(i++  i+=2)
                varStatus:  循环状态对象
                    index:容器中元素的索引,从0开始。在普通for循环里使用展示的是:临时变量i的值,和i一样了
                    count:循环次数,从1开始
        2.遍历容器
            List<User> list;
            for(User user : list){
                ...
            }
            属性:
                items:容器对象------------list
                var: 容器中元素的临时变量---user
        * 详见jstl3.jsp
5.练习:
    * 需求:在request域中有一个存有User对象的List集合,需要使用jstl和el将list集合数据
      展示到jsp页面的表格table中。
     ```
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%--引入jstl标签库--%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>Test</title>
    </head>
    <body>
        <%
            ArrayList list = new ArrayList();
            list.add(new User("张三", 24, new Date()));
            list.add(new User("李四", 27, new Date()));
            list.add(new User("王五", 29, new Date()));
    
            request.setAttribute("myList", list);
        %>
        <table border="1" width="500" align="center">
            <tr>
                <th>编号</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>生日</th>
            </tr>
            <%--数据行--%>
            <c:forEach items="${myList}" var="user" varStatus="s">
                <%--偶数行--%>
                <c:if test="${s.count % 2 == 0}">
                    <tr bgcolor="red">
                        <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="green">
                        <td>${s.count}</td>
                        <td>${user.name}</td>
                        <td>${user.age}</td>
                        <td>${user.birStr}</td>
                    </tr>
                </c:if>
            </c:forEach>
        </table>
    </body>
    </html>
     ```
    * 详见jstl_test.jsp

五、三层架构:软件设计架构

1.界面层(表示层):用户看的到的界面,用户可以通过界面上的组件和服务器进行交互
2.业务逻辑层:处理业务逻辑的。
3.数据访问层:操作数据存储文件的。

六、案例:用户信息列表展示

1.需求:用户信息的增删改查操作。
2.设计:
    1.技术选型:Servlet+JSP+MySql+JDBCTemplate+Druid+BeanUtils+tomcat
    2.数据库设计:
        create database day0509; ---创建数据库
        use day0509;            ---使用数据库
        create table user{       ---创建表
            id int primary key auto_increment,
            name varchar(20) not null,
            gender varchar(5),
            age int,
            address varchar(32),
            qq varchar(20),
            email varchar(50)
        };
    3.开发:
        1.环境搭建
            1.创建数据库环境
            2.创建项目,导入需要的jar包
        2.编码
    4.测试
    5.部署运维