JSP(全称:Java Server Pages):Java 服务端页面(中)

简介: JSP(全称:Java Server Pages):Java 服务端页面

5,EL 表达式


5.1 概述

EL(全称Expression Language )表达式语言,用于简化 JSP 页面内的 Java 代码。


EL 表达式的主要作用是 获取数据。其实就是从域对象中获取数据,然后将数据展示在页面上。


而 EL 表达式的语法也比较简单,==e x p r e s s i o n = = 。例如: {expression}== 。例如:expression==。例如:{brands} 就是获取域中存储的 key 为 brands 的数据。


5.2 代码演示

定义servlet,在 servlet 中封装一些数据并存储到 request 域对象中并转发到 el-demo.jsp 页面。


@WebServlet("/demo1")
publicclassServletDemo1extendsHttpServlet {
@OverrideprotectedvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse) throwsServletException, IOException {
//1. 准备数据List<Brand>brands=newArrayList<Brand>();
brands.add(newBrand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
brands.add(newBrand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
brands.add(newBrand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
//2. 存储到request域中request.setAttribute("brands",brands);
//3. 转发到 el-demo.jsprequest.getRequestDispatcher("/el-demo.jsp").forward(request,response);
    }
@OverrideprotectedvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse) throwsServletException, IOException {
this.doGet(request, response);
    }
}



注意: 此处需要用转发,因为转发才可以使用 request 对象作为域对象进行数据共享


在 el-demo.jsp 中通过 EL表达式 获取数据


<%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head><title>Title</title></head><body>${brands}
</body></html>


在浏览器的地址栏输入 http://localhost:8080/jsp-demo/demo1 ,页面效果如下:


5.3 域对象

JavaWeb中有四大域对象,分别是:


page:当前页面有效

request:当前请求有效

session:当前会话有效

application:当前应用有效

el 表达式获取数据,会依次从这4个域中寻找,直到找到为止。而这四个域对象的作用范围如下图所示


例如: ${brands},el 表达式获取数据,会先从page域对象中获取数据,如果没有再到 requet 域对象中获取数据,如果再没有再到 session 域对象中获取,如果还没有才会到 application 中获取数据。


6,JSTL标签


6.1 概述

JSP标准标签库(Jsp Standarded Tag Library) ,使用标签取代JSP页面上的Java代码。如下代码就是JSTL标签


<c:iftest="${flag == 1}"></c:if><c:iftest="${flag == 2}"></c:if>


上面代码看起来是不是比 JSP 中嵌套 Java 代码看起来舒服好了。而且前端工程师对标签是特别敏感的,他们看到这段代码是能看懂的。


JSTL 提供了很多标签,如下图


我们只对两个最常用的标签进行讲解, 标签和  标签。


JSTL 使用也是比较简单的,分为如下步骤:


导入坐标


<dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.2</version></dependency>


在JSP页面上引入JSTL标签库


<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>


使用标签


6.2 if 标签

:相当于 if 判断


属性:test,用于定义条件表达式

<c:iftest="${flag == 1}"></c:if><c:iftest="${flag == 2}"></c:if>


代码演示:


定义一个 servlet ,在该 servlet 中向 request 域对象中添加 键是 status ,值为 1 的数据


@WebServlet("/demo2")
publicclassServletDemo2extendsHttpServlet {
@OverrideprotectedvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse) throwsServletException, IOException {
//1. 存储数据到request域中request.setAttribute("status",1);
//2. 转发到 jstl-if.jsp数据request.getRequestDispatcher("/jstl-if.jsp").forward(request,response);
    }
@OverrideprotectedvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse) throwsServletException, IOException {
this.doGet(request, response);
    }
}


定义 jstl-if.jsp 页面,在该页面使用  标签


<%@pagecontentType="text/html;charset=UTF-8"language="java"%><%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><html><head><title>Title</title></head><body><%--c:if:来完成逻辑判断,替换javaifelse--%><c:iftest="${status ==1}">启用</c:if><c:iftest="${status ==0}">禁用</c:if></body></html>



注意: 在该页面已经要引入 JSTL核心标签库


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


6.3 forEach 标签

:相当于 for 循环。java中有增强for循环和普通for循环,JSTL 中的  也有两种用法


6.3.1 用法一

类似于 Java 中的增强for循环。涉及到的  中的属性如下


items:被遍历的容器


var:遍历产生的临时变量


varStatus:遍历状态对象


如下代码,是从域对象中获取名为 brands 数据,该数据是一个集合;遍历遍历,并给该集合中的每一个元素起名为 brand,是 Brand对象。在循环里面使用 EL表达式获取每一个Brand对象的属性值


<c:forEachitems="${brands}"var="brand"><tralign="center"><td>${brand.id}</td><td>${brand.brandName}</td><td>${brand.companyName}</td><td>${brand.description}</td></tr></c:forEach>


代码演示:


servlet 还是使用之前的名为 ServletDemo1 。


定义名为 jstl-foreach.jsp 页面,内容如下:


<%@pagecontentType="text/html;charset=UTF-8"language="java"%><%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%><!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title></head><body><inputtype="button"value="新增"><br><hr><tableborder="1"cellspacing="0"width="800"><tr><th>序号</th><th>品牌名称</th><th>企业名称</th><th>排序</th><th>品牌介绍</th><th>状态</th><th>操作</th></tr><c:forEachitems="${brands}"var="brand"varStatus="status"><tralign="center"><%--<td>${brand.id}</td>--%><td>${status.count}</td><td>${brand.brandName}</td><td>${brand.companyName}</td><td>${brand.ordered}</td><td>${brand.description}</td><c:iftest="${brand.status == 1}"><td>启用</td></c:if><c:iftest="${brand.status != 1}"><td>禁用</td></c:if><td><ahref="#">修改</a><ahref="#">删除</a></td></tr></c:forEach></table></body></html>


6.3.2 用法二

类似于 Java 中的普通for循环。涉及到的  中的属性如下


begin:开始数


end:结束数


step:步长


实例代码:


从0循环到10,变量名是 i ,每次自增1


<c:forEachbegin="0"end="10"step="1"var="i">${i}
</c:forEach>


7,MVC模式和三层架构

MVC 模式和三层架构是一些理论的知识,将来我们使用了它们进行代码开发会让我们代码维护性和扩展性更好。


7.1 MVC模式

MVC 是一种分层开发的模式,其中:


M:Model,业务模型,处理业务


V:View,视图,界面展示


C:Controller,控制器,处理请求,调用模型和视图


控制器(serlvlet)用来接收浏览器发送过来的请求,控制器调用模型(JavaBean)来获取数据,比如从数据库查询数据;控制器获取到数据后再交由视图(JSP)进行数据展示。


MVC 好处:


职责单一,互不影响。每个角色做它自己的事,各司其职。


有利于分工协作。


有利于组件重用


7.2 三层架构

三层架构是将我们的项目分成了三个层面,分别是 表现层、业务逻辑层、数据访问层。


数据访问层:对数据库的CRUD基本操作

业务逻辑层:对业务逻辑进行封装,组合数据访问层层中基本功能,形成复杂的业务逻辑功能。例如 注册业务功能 ,我们会先调用 数据访问层 的 selectByName() 方法判断该用户名是否存在,如果不存在再调用 数据访问层 的 insert() 方法进行数据的添加操作

表现层:接收请求,封装数据,调用业务逻辑层,响应数据

而整个流程是,浏览器发送请求,表现层的Servlet接收请求并调用业务逻辑层的方法进行业务逻辑处理,而业务逻辑层方法调用数据访问层方法进行数据的操作,依次返回到serlvet,然后servlet将数据交由 JSP 进行展示。


三层架构的每一层都有特有的包名称:


表现层: com.itheima.controller 或者 com.itheima.web

业务逻辑层:com.itheima.service

数据访问层:com.itheima.dao 或者 com.itheima.mapper

后期我们还会学习一些框架,不同的框架是对不同层进行封装的


7.3 MVC 和 三层架构

通过 MVC 和 三层架构 的学习,有些人肯定混淆了。那他们有什么区别和联系?


如上图上半部分是 MVC 模式,上图下半部分是三层架构。 MVC 模式 中的 C(控制器)和 V(视图)就是 三层架构 中的表现层,而 MVC 模式 中的 M(模型)就是 三层架构 中的 业务逻辑层 和 数据访问层。


可以将 MVC 模式 理解成是一个大的概念,而 三层架构 是对 MVC 模式 实现架构的思想。 那么我们以后按照要求将不同层的代码写在不同的包下,每一层里功能职责做到单一,将来如果将表现层的技术换掉,而业务逻辑层和数据访问层的代码不需要发生变化。

相关文章
|
1天前
|
SQL Java API
|
3月前
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
本文分享了作者在公司APP海外发布过程中,选择Google FCM进行消息推送的集成经验。文章详细解析了Java集成FCM推送的多种实现方式,包括HTTP请求和SDK集成,并指出了通知栏消息和透传消息的区别与应用场景。同时,作者还探讨了Firebase项目的创建、配置和服务端集成的注意事项,帮助读者解决文档混乱和选择困难的问题。
163 1
|
2月前
|
SQL XML 缓存
java中jsp详解!!!
JSP(Java Server Pages)是一种动态网页技术标准,允许在HTML页面中嵌入Java代码,实现网页逻辑与设计分离。JSP本质上是Servlet的简化,支持跨平台运行。JSP通过内置对象(如request、response、session等)和指令(如page、include、taglib)提供强大的功能,同时利用EL表达式和JSTL标签库简化页面开发。JSP的核心优势在于快速开发和维护Web应用。
69 0
|
3月前
|
JSON Java 开发工具
Java服务端集成Google FCM推送的注意事项和实际经验
公司的app要上海外,涉及到推送功能,经过综合考虑,选择Google FCM进行消息推送。 查看一些集成博客和官方文档,看的似懂非懂,迷迷惑惑。本篇文章除了将我实际集成的经验分享出来,也会对看到的博客及其中产生的疑惑、注意事项一一评论。 从官方文档和众多博客中,你会发现Java集成FCM推送有多种实现方式,会让生产生文档很乱,不知作何选择的困惑。
132 0
|
5月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
56 3
|
5月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
51 1
|
5月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
132 0
|
3月前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
101 0
|
5月前
|
SQL Java 数据库
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
该博客文章介绍了在JSP应用中使用Servlet查询SQL Server数据库的表信息,并通过JavaBean封装图书信息,将查询结果展示在Web页面上的方法。
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
|
5月前
|
供应链 前端开发 Java
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)
这篇文章通过一个服装库存管理系统的实例,展示了在Spring Boot项目中使用Ajax、JSON、layui、MVC架构和iframe等技术,涵盖了注册登录、权限管理、用户管理、库存管理等功能,并提供了系统运行环境和技术要求的详细说明。
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)