05WEB初识JSP&EL&JSTL

1、概述

1.1 JSP引入

在Servlet中,能够直接获取后台服务器中的数据:获取数据方便

通过拼接字符串的形式,给浏览器响应html:操作麻烦,效率太低阅读性差。

如果能够有一个既能直接书写html代码,又能书写Servlet代码的页面。就能够在客户端和服务端直接进行数据交互了。

1.2JSP是什么

JSP全名为Java Server Pages,中文名叫java服务器页面,其本质是一个简化的Servlet 设计,它是由Sun 公司倡导、许多公司参与一起建立的一种动态网页 技术标准。其实就是一个既能书写Servlet代码又能书写HTML代码的文件。

jsp注释:不同的注释可见范围是不同

1)Html注释: —可见范围 jsp源码、翻译后的servlet、页面 显示html源码

2)java注释://单行注释 /多行注释/ –可见范围 jsp源码 翻译后的servlet

3)jsp注释:<%–注释内容–%> —– 可见范围 jsp源码可见

1.3 创建JSP文件

在web目录下,新建一个jsp文件

1.4 在JSP中书写代码

2、JSP的运行原理

我们通过浏览器访问到的jsp页面,最终访问的是tomcat服务器中的jsp页面。所以,我们可以到tomcat中查看一下上面案例中的jsp页面是怎么样的一种存在。IntilliJ IDEA借助tomcat发布web项目的机制是动态发布(为每一个web项目创建一个单独的发布文件)。我们可以通过tomcat其中日志中的CATALINA_BASE路径找到我们当前这个JSP页面在tomcat中的位置:

3、JSP中书写java代码的三种方式

在JSP页面的body标签中,可以直接书写html代码和JS代码。但是,如果在JSP页面中书写java代码。必须遵循固定的格式,才能够生效;JSP页面中书写java代码有三种方式:1.脚本片段;2.脚本声明;3.脚本表达式;

方式一:脚本片段

脚本片段指的是一段java代码。书写格式:<% java 代码 %>

方式二:脚本声明

脚本片段虽然可以嵌入java代码,但是如果,我们要给当前的jsp中定义一些成员方法或者成员变量,就行需要一个新的技术——脚本声明.

脚本声明的格式:<%! 书写Java代码 %>

方式三:脚本表达式

虽然脚本声明和脚本片段已经可以书写Java代码了,但是如果我们要使用java代码向页面输出一些内容,还是需要 使用原来的response对象,比较繁琐,因此,我们需要一个更加简便的方式,可以代替response向页面输出内容 \ ——这个就是脚本表达式。

脚本表达式的格式:<%= 内容 %> 等价于:out.print(内容)

【小结】

  1. 脚本表达式<%= str %> :在页面输出内容,在service方法中起作用;
  2. 脚本片段<% %> :在service方法中,原样输出的代码片段;
  3. 脚本声明:<%! String str = "34534ttert456" %> :定义成员变量;

write() 和println()区别

(1)、write():仅支持输出字符类型数据,字符、字符数组、字符串等(2)、print():可以将各种类型(包括Object)的数据通过默认编码转换成bytes字节形式,这些字节都通过write(int c)方法被输出

1
2
response.getWriter().println();
response.getWriter().write('c');

response.getWriter().println();和out.write(65);区别

(1)、out和response.getWriter的类不一样,一个是JspWriter,另一个是java.io.PrintWriter。(2)、执行原理不同:JspWriter相当于一个带缓存功能的printWriter,它不是直接将数据输出到页面,而是将数据刷新到response的缓冲区后再输出,response.getWriter直接输出数据(response.print()),所以(out.print)只能在其后输出。

(3)、out为jsp的内置对象,刷新jsp页面,自动初始化获得out对象,所以使用out对象是需要刷新页面的,而response.getWriter()响应信息通过out对象输出到网页上,当响应结束时它自动被关闭,与jsp页面无关,无需刷新页面。形象的比喻:当我们调用response.getWriter()这个对象同时获得了网页的画笔,这时你就可以通过这个画笔在网页上画任何你想要显示的东西。

4、JSP页面常用对象

我们发现,我们在JSP页面中书写的代码最终都会翻译到_jspService()方法中,我们发现这个方法中有两个入参:HttpServletRequest对象HttpServletResponse对象 。所以说,JSP的本质就是一个Servlet。我们可以直接在JSP页面上使用这两个对象。

第二章 EL表达式

1、EL概述

1.1 EL简介

1
2
3
4
EL全称: Expression Language 

作用:代替jsp中脚本表达式的功能,简化对java代码的操作,从【域对象】中取值。 EL表达式简化<%= %>方式取值
EL语法表达式的格式:${表达式内容}

2、EL取值

2.1 JSP的四大域对象

JSP的四大域对象指的是:page域,request域,session域,application域。我们通常使用EL表达式从这4个域对象用取值。以下是这4个域对象的详细信息:

域对象 对象名称 说明
page域 pageScope page域指的是当前JSP页面,其中存储的数据只在当前页面有效
request域 requestScope request域:一次请求或请求链中request域
session域 sessionScope session域:一次会话过程中,session域
application域 applicationScope application域:服务启动后整个项目对应的ServletContext域

2.2 EL表达式从四大域中取值

EL表达式从指定的域中取值的方式如下:

域对象 取值方式
page域 ${pageScope.xxx}
request域 ${requestScope.xxx}
session域 ${sessionScope.xxx}
application域 ${applicationScope.xxx}

2.3 EL表达式搜索数据

EL表达式取值的时候也可以不指定域,如果取值的时候不指定域对象。就会按照从page域—>request域—>session域—>servletContext域从小到大逐级根据name属性值查找。

2.4 EL表达式从cookie中取值

servlet生成cookie CreateCookieServlet.java

3、EL运算符

EL表达式获取到值之后可以直接通过运算符进行运算。EL表达式的运算符主要有以下几类:算术运算,关系运算,逻辑运算,三元运算,empty运算符。

3.1 算术运算

顾名思义,算术运算是进行算术运算的符号,主要包括:加,减,乘,除。具体使用如下表:

运算符 说明 使用示例 结果
+ ${n1+n2} 30
- ${n1-n2} -10
* ${n1*n2} 200
/或div ${n1/n2}
%或mod 取余

3.2 关系运算

关系运算符是判断两个数据的大小关系的,关系运算符有:==,!=,<,<=,>,>=。具体使用方法如下:

运算符 说明 使用示例 结果
== 或 eq 等于 equal ${n1 == n2} false
!= 或ne 不等于 not equal ${n1 != n2} true
> 或 gt 大于 greater than ${n1 > n2} false
>= 或ge 大于等于 greater than or equal ${n1 >= n2} false
< 或 lt 小于 less than ${n1 < n2} true
<= 或le 小于等于 less than or equal ${n1 <= n2} true

3.3 逻辑运算

逻辑运算符包括:&& ,||,!使用方法如下:

运算符 说明 使用示例 结果
&& 或 and 逻辑与 ${true && false} false
\ \ 或 or 逻辑或 `${true
! 或 not ${!false} true

3.4 三元运算

EL表达式也支持三元运算符:如,判断n1是否是正数,

表达式1?表达式2:表达式3

–%>

三元运算符:

${n1>=n2?”正确”:”错误!”}

3.5 empty运算

empyt运算符对以下数据运算返回true:

  1. 字符串:””;
  2. 空集合(size=0):List list = new ArrayList();
  3. 空对象(null):Student stu = null;

EL表达式小结:

  • EL:Expression Language;
  • EL语法:${ }
  • 作用:简化脚本表达式的取值,简化<%= request.getAttribute(“name”) %> ===> ${name}
  • jsp的四大域对象
    • page域:pageContext pageContext.setAttrubute() pageContext.getAttribute() JSP特有 作用范围:当前的JSP页面
    • requst域:request request.setAttribute() request.getAttribute() 作用范围:一次请求和响应之间
    • session域: session session.setAttribute() session.getAttribute() 作用范围:会话期间(多次请求和响应)
    • servletContext域:application application.setAttribute() application.getAttribute() 作用范围:整个项目;
  • jsp从四大域中取值(指定域对象):
    • ${pageScope.name}
    • ${requestScope.name}
    • ${sessionScope.name}
    • ${applicationScope.name}
  • JSP搜索域对象中的值:page — request — session — servletContext
    • ${name}
  • 运算
    • 算术运算
    • 关系运算
    • 逻辑运算:&& || !
    • 三元运算
    • empty运算:empty notempty
      • 空字符串:””
      • 空对象:null
      • 空集合:list.size = 0;

第三章 JSTL标签库

1、JSTL概述

1.1 、JSTL引入

1.2、JSTL是什么

1
2
3
4
5
6
7
8
9
10
11
12
从JSP 1.1规范开始JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重
用性,因此自定义标签在WEB应用中被广泛使用。

许多WEB应用厂商都开发出了自己的一套标签库提供给用户使用,这导致出现了许多功能相同的标签,令网页制作者无所适从,不知道选择哪一家的好。

为了解决这个问题,
Apache Jakarta小组归纳汇总了那些网页设计人员经常遇到的问题,
开发了一套用于解决这些常用问题的自定义标签库,
这套标签库被SUN公司定义为标准标签库(The JavaServer Pages Standard Tag Library),简称JSTL。

使用JSTL可以解决用户选用不同WEB厂商的自定义标签时的困惑,JSP规范同时也允许WEB容器厂商按JSTL标签库的
标准提供自己的实现,以获取最佳性能

1.3、JSTL核心标签库

标签名称 作用
<c:out> 通常用于输出一段文本内容到客户端浏览器
<c:set> 用于设置各种Web域中的属性
<c:remove> 用于删除各种Web域中的属性
<c:catch> 用于捕获嵌套在标签体中的内容抛出的异常
<c:if> 用户java代码if(){}语句功能
<c:choose> 用于指定多个条件选择的组合边界,它必须与c:when和c:otherwise标签一起使用
<c:forEach> 用户代替java代码for循环语句
<c:forTokens> 用户迭代操作String字符
<c:param> 给请求路径添加参数
<c:url> 重写url,在请求路径添加sessionid
<c:import> 用于在JSP页面中导入一个URL地址指向的资源内容
<c:redirect> 用于将当前的访问请求转发或重定向到其他资源

2、JSTL标签应用

2.1 安装JSTL

我们知道JSTL标签是将一段java代码功能封装成一个标签来使用。所以,我们使用JSTL标签之前必须导入被封装的java代码—jar包。JSTL标签库主要依赖以下两个jar包:

1530284514276

我们在IDEA的web项目的WEB-INF目录下创建一个lib文件夹,然后将jar包复制到这个文件夹里。选中这些jar包,右键—add as library即可将jar包导入到项目中。

2.2 将标签库资源引入JSP页面

在JSP页面中通过以下标签,通过taglib标签引入JSTL资源:

【注意】

  1. prefix:是jstl标签在使用的时候的前缀;
  2. uri:是标签库的资源路径;

2.3 在JSP页面中使用JSTL标签

在JSP页面中书写”<c: “,如果出现如下图的提示则说明标签库引入成功,我们可以根据提示信息使用自己需要的标签。

1533186873185

3、常用JSTL标签

3.1、c:if标签

3.1.1 作用

标签的作用相当于java中的if判断语句。

3.1.3 属性

test:if的判断条件

3.1.2 使用示例

【案例】完善登录案例,成功页面

【需求】在success.jsp页面上进行如下判断

  1. 使用 标签判断session中的用户信息是否为空;
  2. 如果不为空:获取session中的用户信息,并将其展示在页面上;
  3. 如果为空:提示用户登录;

3.2 c:foreach标签

3.2.1 c:foreach标签的作用

标签的作用相当于java中的for循环。主要是对数据和集合进行遍历。

3.2.2 c:foreach标签的属性

1530291021501

1
2
3
4
5
6
var:在不循环对象的时候,保存的是控制循环的变量;在循环对象的时候,保存的是被循环对象中的元素
items:指定要循环的对象
varStatus:保存了当前循环过程中的信息(循环的开始、结束、步长、次数等)
begin:设置循环的开始
end:设置循环的结束
step:设置步长——间隔几次循环,执行一次循环体中的内容
3.2.3 c:foreach标签的使用

【案例】c:foreach遍历案例

【需求】

  1. 遍历普通数组;
  2. 遍历实体类对象list集合;
  3. 遍历map集合;

    3.3choose标签

3.3.1 choose标签作用

<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。

三个标 签组合发挥java代码if(){}else if(){} else{}语句的作用。

3.3.2 choose标签子标签

介绍 <c:when>,相当于else if(){}。

<c:when>标签含有test属性,作用与if相同 <c:otherwise>,相当于else{}。

3.3.3 choose标签注意事项

三个标签必须组合使用,一组标签中不能出现两个<c:otherwise>

3.3.4 choose标签演示

第四章 JSP的发展

1、model1时代—一个JSP页面搞定前端和后台

JSP技术主要用来简化动态网页的开发过程,由于它在形式上和html文档比较相似,因此与Servlet相比,用JSP来编写动态网页更加直观。

2、model2时代—弱化在JSP页面书写java代码

但是,当网页非常复杂时,JSP文件中的大量的html标记和java程序片段混杂在一起,会大大削弱JSP代码的可读性和可维护性,而且会增加调试JSP文件的难度。于是,出现了EL表达式帮助我们在JSP页面上简化从容器中取值的操作。【EL表达式】—简化取值

如果是在JSP页面上处理一些业务逻辑,JSTL标签库给我们提供了一个解决思路。将java代码封装成标签。直接在JSP页面书写标签,如 即可完成相应逻辑。【JSTL标签库】—将java代码封装成标签

3、服务器渲染和前端渲染

开发网站,网站页面渲染你知道吗?

关键字服务器渲染(后端渲染)

1
2
3
4
服务器渲染(后端渲染)
浏览器发送请求到服务器端,服务器端处理请求并处理好数据,然后生成html文件,并返回给浏览器。

传统的jsp、php都是属于服务器渲染。

关键字: 前端渲染

1
2
3
客户端渲染(前端渲染)

服务器端处理请求后将数据返回给浏览器,浏览器通过拼接html字符串或者使用js模板引擎,或者React这类框架进行页面渲染,又称作 : 局部渲染
1
2
3
4
5
6
7
前端渲染的优势:

1. 局部更新页面,无需每次都进行完整页面请求
2. 懒加载。页面初始时只加载可视区域内的数据,随着滚动等操作再加载其他数据
3. 节约服务器成本
4. 关注分离设计。服务器只用于访问数据库提供接口,前端关注展现。
5. 富交互,使用 JS 实现各种酷炫效果

前后端分离(前端渲染)未来视图层的趋势。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2016 - 2018 Francis的个人博客 All Rights Reserved.

UV : | PV :