JavaWeb开发 JSP技术详解(二)

简介: JavaWeb开发 JSP技术详解(二)

八、EL表达式

什么是EL表达式

EL(Expression Language)是一种表达式语言。是为了使JSP写起来更加简单,减少java代码,可以使得获取存储在Java对象中的数据变得非常简单。在JSP2.0版本后开始支持EL表达式。

语法结构

${表达式}

${对象.属性名}

EL表达式中的操作符

操作符 描述
( ) 优先级
+
- 减或负
*
/ 或div
% 或 mod 取模
== 或 eq 测试是否相等
!= 或 ne 测试是否不等
< 或 lt 测试是否小于
> 或gt 测试是否大于
<= or le 测试是否小于等于
>= 或 ge 测试是否大于等于
&& 或 and 测试逻辑与
|| 或 or 测试逻辑或
! 或not 测试取反
empty 测试是否空值

EL表达式的隐含对象

隐含对象 描述
pageScope page 作用域
requestScope request 作用域
sessionScope session 作用域
applicationScope application 作用域
param Request 对象的参数,字符串
paramValues Request对象的参数,字符串集合
header HTTP 信息头,字符串
headerValues HTTP 信息头,字符串集合
initParam 上下文初始化参数
cookie Cookie值
pageContext 当前页面的pageContext

使用EL表达式取出作用域中的值

${pageScope.name}

${requestScope.name}

${sessionScope.name}

${applicationScope.name}

获取作用域属性中的数据时,也可以只写属性名,EL表达式会按照pageScope、requestScope、sessionScope、applicationScope的顺序查找该属性的值。

${name}

十、JSTL标签库与EL表达式的使用

10.1 JSTL标签库的使用步骤

添加jstl.jar

在JSP页面中添加taglib指令标签。

10.2 JSTL核心标签的使用

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

10.3 c标签中的if标签的使用

标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--test中只能存放true(显示标签中的内容)或者false(不显示标签中的内容),可以书写EL表达式--%>
<c:if test="${1 == 1}">
    hello JSTL
</c:if>
</body>
</html>

10.4 c标签中的choose标签的使用

< c:choose >, < c:when >, < c:otherwise >

< c:choose >标签与Java switch语句的功能一样,用于在众多选项中做出选择。

switch语句中有case,而< c:choose >标签中对应有< c:when >,switch语句中有default,而< c:choose >标签中有< c:otherwise >。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--如果多个条件都满足的话,只返回第一个;条件都不满足的话返回otherwise中的结果--%>
<c:choose>
    <c:when test="${1 == 1}">
        Hello when1
    </c:when>
    <c:when test="${1 == 1}">
        Hello when2
    </c:when>
    <c:otherwise>
        hello otherwise
    </c:otherwise>
</c:choose>
</body>
</html>

10.5 c标签中的foreach标签的使用

迭代器,用于迭代集合。

属性 描述
items 被迭代的集合
begin 迭代器的起始因子
end 迭代器的结束因子
step 迭代因子的增长数
var 代表当前迭代元素的变量名称
varStatus 代表循环状态的变量名称

varStatus 属性

current: 当前这次迭代的(集合中的)项

index: 当前这次迭代从 0 开始的迭代索引

count: 当前这次迭代从 1 开始的迭代计数

first: 用来表明当前这轮迭代是否为第一次迭代的标志

last: 用来表明当前这轮迭代是否为最后一次迭代的标志

begin: 属性值

end: 属性值

step: 属性值

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--表示0~9循环10次,step表示每次循环结束后迭代因子加2,varStatus为迭代器取的名称,可以获取迭代器的属性--%>
<c:forEach begin="0" end="9" step="2" varStatus="suibian">
    forEach  ${suibian.count},${suibian.first},${suibian.last},${suibian.index} <br>
</c:forEach>
</body>
</html>

10.5.1 使用foreach标签迭代List

需求:

创建Users对象,含有userid,username属性。

创建一个Servlet,在Servlet中创建多个Users对象并放到List集合中,在showUsers.jsp的页面中显示所有的Users对象的信息。

package cn.it.pojo;
public class User {
    private int userId;
    private String username;
    public User() {
    }
    public User(int userId, String username) {
        this.userId = userId;
        this.username = username;
    }
    public int getUserId() {
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
}
package cn.it.Servlet;
import cn.it.pojo.User;
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.ArrayList;
import java.util.List;
@WebServlet("/find.do")
public class FindUsersServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建测试数据
        User user1 = new User(1,"张三");
        User user2 = new User(2,"李四");
        User user3 = new User(3,"王五");
        User user4 = new User(4,"赵六");
        List<User> userList = new ArrayList<>();
        userList.add(user1);
        userList.add(user2);
        userList.add(user3);
        userList.add(user4);
        req.setAttribute("userList",userList);
        req.getRequestDispatcher("showUsers.jsp").forward(req,resp);
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<table border="1" align="center">
    <tr>
        <th>userId</th>
        <th>userName</th>
    </tr>
    <c:forEach var="user" items="${requestScope.userList}">
    <tr>
        <td>${user.userId}</td>
        <td>${user.username}</td>
    </tr>
    </c:forEach>
</table>
</body>
</html>

10.5.2 使用foreach标签迭代Map

需求:

创建Users对象,含有userid,username属性。

创建一个Servlet,在Servlet中创建多个Users对象并放到Map集合中,在showUsers2.jsp的页面中显示所有的Users对象的信息。

package cn.it.Servlet;
import cn.it.pojo.User;
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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@WebServlet("/find.do")
public class FindUsersServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建测试数据
        User user1 = new User(1,"张三");
        User user2 = new User(2,"李四");
        User user3 = new User(3,"王五");
        User user4 = new User(4,"赵六");
        Map<String,User> userMap = new HashMap<String,User>();
        userMap.put("user1",user1);
        userMap.put("user2",user2);
        userMap.put("user3",user3);
        userMap.put("user4",user4);
        req.setAttribute("userMap",userMap);
        req.getRequestDispatcher("showUsers2.jsp").forward(req,resp);
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<table border="1" align="center">
    <tr>
        <th>map的key</th>
        <th>userId</th>
        <th>userName</th>
    </tr>
    <c:forEach var="userMap" items="${requestScope.userMap}">
    <tr>
        <td>${userMap.key}</td>
        <td>${userMap.value.userId}</td>
        <td>${userMap.value.username}</td>
    </tr>
    </c:forEach>
</table>
</body>
</html>

10.6 fmt标签的使用

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

对日期的格式化处理

<fmt:formatDate value="${data}" pattern="yyyy-MM-dd"/>

对数字格的式化处理

<fmt:formatNumber value="${balance}" type="currency"/>
package cn.it.Servlet;
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.Date;
@WebServlet("/format.do")
public class FormatServlet  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //时间
        req.setAttribute("date",new Date());
        //数字
        req.setAttribute("balance",36546.445);
        req.getRequestDispatcher("/date.jsp").forward(req, resp);
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   ${requestScope.date}
  <br />
  <fmt:formatDate value="${requestScope.date}" pattern="yyyy-MM-dd"/>
<br />
<%--   四舍五入保留两位小数,货币符号取决于浏览器的语言--%>
  <fmt:formatNumber value="${requestScope.balance}" type="currency"/>
</body>
</html>

十一、MVC模式

11.1 什么是MVC模式

MVC模式:Model、View、Controller即模型、视图、控制器。是软件的一种架构模式(Architecture pattern)。MVC要实现的目标是将软件的用户界面和业务逻辑分离,可提高代码可扩展性、可复用性、可维护性、以及灵活性。

View(视图):用户的操作界面。如:html、jsp。

Model(模型):具体的业务模型与数据模型。如:service、dao、pojo。

Controller(控制):处理从视图层发送的请求,并选取模型层的业务模型完成响应的业务实现,并产生响应。如:Servlet。

11.2 MVC模式与应用程序分层的区别

MVC模式是一种软件的架构方式,而应用程序分层这是一种代码的组织方式。MVC模式与应用程序分层的目标都是一致的:为了解耦和、提高代码复用性。

相关文章
|
1月前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
61 0
|
1天前
|
前端开发 Oracle 关系型数据库
关于使用SSM+JSP开发时setter、getter隐式调用问题的小结
本文主要分享了在使用SSM+JSP进行网站开发时,因忽视setter、getter的隐式调用问题而导致的常见bug及其解决方法。详细介绍了setter和getter的隐式调用时机,并给出了具体示例,帮助开发者避免类似问题。
23 11
|
2月前
|
存储 前端开发 Java
JavaWeb基础6——Request,Response,JSP&MVC
Request继承体系、获取请求头行体的方法、IDEA使用模板创建Servlet、请求参数中文乱码解决、请求转发、Respones重定向、Response响应字节字符数据、JSP、EL 表达式、JSTL标签、MVC模式和三层架构
JavaWeb基础6——Request,Response,JSP&MVC
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
32 3
|
3月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
27 0
|
5月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
【6月更文挑战第23天】Java Web开发中,Servlet和JSP是构建动态Web应用的基础。Servlet处理逻辑,JSP专注展示。示例展示了Servlet如何通过`request.setAttribute`传递数据给JSP渲染。JSP自定义标签提升页面功能,如创建`WelcomeTag`显示欢迎消息。Servlet过滤器,如`CacheControlFilter`,用于预处理数据或调整响应头。这些集成和扩展技术增强了应用效率、安全性和可维护性,是Java服务器端开发的关键。
63 7
|
5月前
|
前端开发 安全 Java
Java服务器端开发实战:利用Servlet和JSP构建动态网站
【6月更文挑战第23天】**Servlet和JSP在Java Web开发中扮演关键角色。Servlet处理业务逻辑,管理会话,JSP则结合HTML生成动态页面。两者协同工作,形成动态网站的核心。通过Servlet的doGet()方法响应请求,JSP利用嵌入式Java代码创建动态内容。实战中,Servlet处理数据后转发给JSP展示,共同构建高效、稳定的网站。虽然新技术涌现,Servlet与JSP仍为Java Web开发的基石,提供灵活且成熟的解决方案。**
71 8
|
5月前
|
搜索推荐 Java 数据库连接
探索Java Web开发:Servlet与JSP的协同工作原理
【6月更文挑战第23天】Java Web开发中,Servlet和JSP协同打造动态网站。Servlet是服务器端的Java程序,处理HTTP请求并执行复杂逻辑;JSP则结合HTML和Java,生成动态内容。Servlet通过`doGet()`等方法响应请求,JSP在首次请求时编译成Servlet。两者常搭配使用,Servlet处理业务,JSP专注展示,通过`RequestDispatcher`转发实现数据渲染。这种组合是Java Web应用的基础,即使新技术涌现,其价值仍然重要,为开发者提供了强大的工具集。
61 7
|
5月前
|
存储 设计模式 搜索推荐
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
31 1
|
5月前
|
XML 前端开发 Java
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(上)
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(上)
30 0

相关实验场景

更多