前言

感谢


JSP

JSP介绍

我们在之前学习了Servlet,Cookie和Session,但其实我们一直仅仅有后端而没有前端。

只开发接口并不能算一个完整的项目,我们的JavaWeb自然也需要前端的技术。

但其实说实在话,JSP已经过时了,现在的公司基本没有使用JSP的公司了,但是我们还是需要讲,因为我们需要知道互联网编程语言的发展史,只有知道了老的技术,才能知道新的技术到底优越在哪里。

当然了,因为JSP这种东西已经过时了,所以就简单理解一下就好,不必深入进行。

那么,什么是JSP呢

JSP:Java Server Pages,Java服务端页面,和Servlet一样,也用于动态的Web技术

但是JSP和Servlet是不一样的,他可以写页面,再写JSP的时候我们会觉得和写HTML是差不多的,但是多了一些语法而已

但是JSP和HTML还不一样

  • HTML只可以给用户展示静态的数据,不同的用户看到的效果是一样的
  • JSP页面中可以嵌入Java代码,使用Java代码来为用户提供动态的数据

JSP的本质

其实是Java类,如果我们查看IDEA的Tomcat,在work/Catalina/localhost/ROOT/org/apache/jsp目录下会看到页面其实已经转换为了Java程序

浏览器向服务器发送请求,其实就是在访问Servlet

JSP本身就是一个Servlet,它也有初始化,提供服务,销毁的过程

1、客户端向服务器发送请求,访问localhost:8080/index.jsp

2、服务器解析请求信息,寻找是否有index.jsp这个资源

3、找到了资源,将index.jsp转换为.java文件

4、编译.java为.class字节码文件

5、字节码文件提供访问


快速起步

1、依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>javax.servlet</groupId>
  4. <artifactId>javax.servlet-api</artifactId>
  5. <version>3.1.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>javax.servlet.jsp</groupId>
  9. <artifactId>javax.servlet.jsp-api</artifactId>
  10. <version>2.3.1</version>
  11. </dependency>
  12. </dependencies>

2、补全目录结构

JSP&EL&JSTL&MVC和三层结构 - 图1

3、删掉原来的JSP页面重新创建一个名为index.jsp的页面

4、编写代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>HELLO JSP</title>

</head>
<body>

    <%
        int num = 10;

        for (int i = 0; i < num; i++) {
            out.print(i);
        }

    %>

</body>
</html>

5、服务器部署运行

JSP&EL&JSTL&MVC和三层结构 - 图2


基本语法

JSP脚本

JSP定义Java代码的方式实际上就是使用JSP脚本的方式去定义

1、<% 代码 %>:定义的Java代码,比如说我们在快速起步的时候编写的内容

2、<%! 代码 %>:在JSP转换后会到达Java类的成员位置

3、<%= 代码 %>:在JSP中的定义会输出到页面上

4、<%@ 代码 %>:用于配置JSP页面,导入资源文件

1、格式:<%@ 指令名称 属性名=属性值 属性名=属性值 属性名=属性值 ... %> 2、分类

  • page:定义页面
    • contentType:等于response.setContentType()
      1、设置响应体的mime类型和字符集
      2、设置当前JSP页面的编码(如果使用低级IDE,需要设置pageEncoding属性来设置当前也买的字符集)
    • import:导包
    • errorPage:当前页面发生异常之后,会自动跳转到指定的错误页面
    • isErrorPage:表示当前页面是否为错误页面
    • buffer:设置输出流可以使用的流量
<%@ page 
    contentType="text/html;charset=UTF-8" 
    language="java" 
    pageEncoding="utf-8"    
    buffer="8kb"
    import="com"
    errorPage="index.jsp"
    isErrorPage="true"
%>
<html>
    <head>
        <title>HELLO JSP</title>
    </head>
    <body>
    </body>
</html>
  • include:导入其他的JSP页面
    • file:引入其他页面资源
<%@ include file="./top.jsp"%>
<html>
    <head>
        <title>HELLO JSP</title>
    </head>
    <body>
    </body>
</html>
  • taglib:导入资源和标签库
    • prefix:前缀,自定义的前缀
    • uri:地址
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"%>
<html>
    <head>
        <title>HELLO JSP</title>
    </head>
    <body>
    </body>
</html>

注释

1、<!-- -->:只能注释html的代码

2、<%-- --%>:注释所有

<%--JSP的指令,引资源
又比如
<%@include file="./hello.jsp"%>
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>HELLO JSP</title>

</head>
<body>


<%--在此定义的JSP代码会转换到Java类的成员变量的位置--%>
<%!
    static {
        System.out.println("输出到成员变量的位置");
    }

    public int sum(int x, int y) {
        return x + y;
    }
%>


<%-- JSP脚本 --%>
<%
    int num = 10;

    for (int i = 0; i < num; i++) {
        out.println(i + " + " + i + 1 + " = " + sum(i, i + 1));
    }

    out.println("--------------------------------");
%>


<%-- JSP表达式,程序未来将会输出到客户端页面 --%>
<%=
new java.util.Date()
%>


</body>
</html>

JSP&EL&JSTL&MVC和三层结构 - 图3

查看编译成的Java文件

1、通过控制台打印我们可以查看到编译的目录

JSP&EL&JSTL&MVC和三层结构 - 图4

2、找到对应目录下的文件

JSP&EL&JSTL&MVC和三层结构 - 图5

3、打开.java文件查看

JSP&EL&JSTL&MVC和三层结构 - 图6


JSP九大内置对象和四大作用域

九大内置对象

JSP有九大内置对象,这九个内置对象我们不用定义,可以直接获取

  • 输入输出对象:out,request,response
  • 通信控制对象:pageContext,session,application
  • servlet对象:page,config
  • 错误处理对象:exception | 变量 | 实例 | 作用 | | —- | —- | —- | | out | JSPWriter | 输出对象,数据将会输出到页面上 | | request | HttpServletRequest | 一次请求访问的多个资源(转发方式)
    保存的数据只在一次请求中有效 | | response | Response | 响应对象 | | pageContext | PageContext | 当前页面共享数据,并且获取其他的八个内置对象
    保存的数据只在一个页面中有效 | | session | HttpSession | 一次会话的多次请求
    保存的数据只在一次会话中有效 | | application | ServletContext | 所有用户间共享数据
    保存的数据只在服务器打开到关闭这期间,在服务器范围内有效 | | page | Object | 当前页面(Servlet)的对象this | | config | ServletConfig | Servlet的配置对象 | | exception | Throwable | 异常对象 |

四大作用域

  • page:只在一个页面保留数据
  • request:在一个请求中保留数据
  • session:在一次会话中保留数据,单个用户使用
  • Application:在整个服务器中保留数据,全部用户共享

EL

EL介绍

EL:Expression Language,表达式语言

作用是替换和简化JSP页面中的Java代码的编写

语法

${表达式}

注意

JSP默认支持EL表达式,但是如果要忽略

1、设置JSP中的page指令,添加:isELIgnored=""true,忽略当前JSP页面中的所有EL表达式

2、\${表达式}:忽略当前表达式

快速起步

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>HELLO EL</title>

</head>
<body>

    ${1+2}

</body>
</html>

JSP&EL&JSTL&MVC和三层结构 - 图7

基本语法

运算符

1、算数:+ - * / %

2、比较:> < >= <= == !=

3、逻辑:&& || !

4、空:empty

功能: 1、判断字符串,集合,数组对象是否为null或者长度是否为0 2、${empty list}:判断字符串,集合,数组对象是否为null或长度是否为0 3、${not empty str}:判断字符串,集合,数组对象是否不为null并且长度>0

获取值

EL表达式只能从指定域中获取指定键的值

1、pageScope,页面域,代表的是pageContext

2、requestScope,请求域,代表的是request

3、sessionScope,session域,代表的是session

4、applicationScope,全局域,代表的是application(ServletContext)

假如从域中找不到对应的值,那么会使用空字符串来展示,不会打乱布局

<%
    request.setAttribute("name","张三");
%>
${requestScope.name}

获取对象,List集合,Map集合

1、获取对象:${域.键名.属性名},本质上会调用对象的getter方法,所以注意getter是否是获取的你想要的值

2、获取List:${域.键名[索引]}

2、获取Map:${域.键名[“key”]},或者为${域.键名.key}

隐式对象

EL中有11个隐式对象,类似于JSP中的内置对象,只学一个:pageContext,作用是获取JSP的其他八个内置对象

比如:${pageContext.request.contextPath}:动态获取虚拟目录

  • pageContext:对应于JSP页面的pageContext对象
  • pageScope:代表page域中用于保存属性的Map对象
  • requestScope:代表request域中用于保存属性的Map对象
  • sessionScope:代表session域中用于保存属性的Map对象
  • applicationScope:代表application域中用于保存属性的Map对象
  • param:表示一个保存了所有请求参数的Map对象
  • paramValues:表示一个保存了所有请求参数的Map对象,它对于某个请求,返回的是一个String[]
  • header:表示一个保存了所有http请求头字段的Map对象
  • headervalues:表示了一个保存了所有http请求头字段的Map对象,返回String类型数组
  • cookie:表示一个保存了所有cookie的Map对象
  • initParam:表示一个保存了所有web应用初始化参数的map对象

JSTL

JSTL介绍

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

由Apache开源免费的JSP标签。

快速开始

1、导入依赖

<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
</dependency>

2、引入标签库

<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>

3、使用标签

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
    <head>
        <title>HELLO JSTL</title>
    </head>

    <body>
        <c:if test="true">
            可见
        </c:if>

        <c:if test="false">
            不可见
        </c:if>
    </body>
</html>

JSP&EL&JSTL&MVC和三层结构 - 图8

4、假如报错

1、进入网址http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 2、下载 jakarta-taglibs-standard-1.1.2.zip ,将解压后的/lib目录下的standard.jar 和 jstl.jar拷贝到/WEB-INF/lib下并加入到项目中

基本语法

以下内容来自:https://blog.csdn.net/weixin_42808295/article/details/81460609

  • 表达式标签:out标签、set标签、remove标签、catch标签。
  • 流程标签:if标签、choose标签、when标签、otherwise标签。
  • 循环标签:forEach标签、forTokens标签。
  • URL标签:import标签、url标签、redirect标签。

out标签:输出一个值。

<c:out value="${num }"></c:out>1

set标签:定义一个变量,var变量名,value变量值。

<c:set var="age" value="90"></c:set>1

remove标签:移除一个属性。

<c:remove var="num"/>1

catch标签:抛出一个异常,catchException为抛出的异常名。

<c:catch var="catchException">
    <%
        int x = 5 / 0;
    %>
</c:catch>12345

if标签:if判断,写在test中。

<c:if test="${num>10 }">
    标签体的内容得到了输出
</c:if>123

choose标签,when标签,otherwise标签:choose表示选择,when表示判断,otherwise表示除了上述情形以外的其他状况。满足条件显式出来,不满足不显示。

<c:choose>
    <c:when test="${age>95 }">
        国家每月每人700
    </c:when>
    <c:when test="${age>80 }">
        国家每月每人150
    </c:when>
    <c:when test="${age>60 }">
        养老金自备
    </c:when>
    <c:otherwise>
        努力赚钱
    </c:otherwise>
</c:choose>1234567891011121314

forEach标签:循环遍历,items 需要循环展现的数据,var代表当前遍历项的变量名。 begin 开始条件 end 结束条件(用于截取) 。step 步长(隔几个输出一下)。delims=”|,”使用,|分割。varStatus设定变量名,该变量用于存放集合中元素的信息。

<c:forEach var=”user” items=”${userList }” varStatus=”StatusName” begin=”begin” end=”end” step=”step”>
    <tr>
        <td>${user.id }</td>
        <td>${user.name }</td>
        <td>${user.email }</td>
        <td>修改</td>
    </tr>
</c:forEach>12345678

forTokens标签:

<c:forTokens items="Zara,nuha,roshy" delims="," var="name">
   <c:out value="${name}"/><p>
</c:forTokens>123

import标签:动态加载外部容器的内容。

<c:import var="data" url="http://www.baidu.com"/>1

url标签:用于写一个链接,param表示需要传入的参数。

<a href="
<c:url value="/delete">
    <c:param value="${user.id }" name="userId"></c:param>
    <c:param value="${user.name }" name="userName"></c:param>
</c:url>
">123456

redirect标签:重定向到某一个页面。

<c:redirect url="jstl2.jsp"></c:redirect>

MVC和三层架构

MVC和三层架构介绍

三层架构

通常意义上,将业务的应用范围划分为三块

1、表现层:用户看得见的界面

2、逻辑层:处理业务逻辑

3、数据访问层:操作数据存储文件

JSP&EL&JSTL&MVC和三层结构 - 图9

这张图来自黑马,我觉得十分好 我们先不要管这几个框架,只需要先看一下左边,中间,右边这几个分层的结构

MVC

全名为Model View Controller,是模型-视图-控制器的缩写,是一种软件的设计典范。

  • Model:模型,主要处理业务逻辑和数据库的交互
  • View:视图层
  • Controller:控制层,主要用于请求转发和页面的请求

对比两者我们可以看到,其实MVC和三层结构是不同的,三层是基于业务逻辑来分开的,而MVC是基于页面来分的