栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

第7章 EL和JSTL

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第7章 EL和JSTL

1、EL表达式

expression Language 表达式语言,常用于取值
我们之前在JSP中写java代码必须写在<%%>里面。并且取值代码比较繁琐。
而EL表达式可以使我们的取值代码更加简洁

语法非常简单:${}

MyServlet用于存储用户名和密码

import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet(name = "MyServlet",urlPatterns="/MyServlet")
public class MyServlet extends HttpServlet {
    public void doGet(HttpServletRequest request,
        HttpServletResponse  response) throws ServletException, IOException {
        request.setAttribute("username", "itcast");
        request.setAttribute("password", "123");
        RequestDispatcher dispatcher = request
                .getRequestDispatcher("/myjsp.jsp");
        dispatcher.forward(request, response);
    }
    public void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

web目录下编写一个名称为myjsp的JSP文件,比较Java代码和EL的区别:

<%@ page language="java" contentType="text/html; charset=utf-8" %>



用户名:<%=request.getAttribute("username")%>
密 码:<%=request.getAttribute("password")%>

使用EL:
用户名:${username}
密 码:${password}

使用EL表达式则可以减少很多取值的代码,接 ${username} 。这些值是从哪取的呢,实际上就是从四大作用域中获取的。servlet中的四个作用域分别为 page,request,session,application

2、EL隐式对象

隐式对象名称

描       述

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值,cookie的类型是Map

initParam

表示一个保存了所有Web应用初始化参数的Map对象

在上表列举的隐式对象中,pageContext可以获取其他10个隐式对象,pageScope、requestScope、sessionScope、applicationScope是用于获取指定域的隐式对象;param和paramValues是用于获取请求参数的隐式对象,header和headerValues是用于获取HTTP请求消息头的隐式对象;cookie是用于获取cookie信息的隐式对象;initParam是用于获取Web应用初始化信息的隐式对象。

2.1 pageContext

web目录下创建一个名为pageContext.jsp的文件演示pageContext隐式对象的具体用法:

<%@ page language="java" contentType="text/html; charset=utf-8"%>



请求URI为:${pageContext.request.requestURI} 
Content-Type响应头:${pageContext.response.contentType}
服务器信息为:${pageContext.servletContext.serverInfo}
Servlet注册名为:${pageContext.servletConfig.servletName}

需要注意的是,不要将EL中的隐式对象与JSP中的隐式对象混淆,只有pageContext对象是它们所共有的,其他隐式对象则毫不相关。

2.2 Web域相关对象

EL中提供了4 个用于访问作用域范围的隐式对象,即pageScope、requestScope、 sessionScope和applicationScope。默认作用域从小到大:page->request->session->application。

应用这4个隐式对象指定所要查找的标识符的作用域后,系统将不再按照默认的顺序(page、Request、session及application)查找相应的标识符。它们与JSP中的page、request、session及application内置对象类似,只不过这4个隐式对象只能用于获取指定范围内的属性值,而不能获取其他相关信息。

${pageScope.userName} 
${requestScope.userName} 
${sessionScope.userName} 
${applicationScope.userName} 

/ *pageScope、requestScope、 sessionScope和applicationScope4个隐式对象都可以通过setAttribute()方法存储属性,通过getAttribute()方法获取属性。 */

示例:web目录下,新建一个名为scopes.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>




Insert title here


<% pageContext.setAttribute("userName", "itcast"); %>
<% request.setAttribute("bookName", "Java Web"); %>
<% session.setAttribute("userName", "itheima"); %>
<% application.setAttribute("bookName", "Java 基础"); %>
表达式${pageScope.userName}的值为:${pageScope.userName} 
表达式${requestScope.bookName}的值为:${requestScope.bookName}
表达式${sessionScope.userName}的值为:${sessionScope.userName}
表达式${applicationScope.bookName}的值为:${applicationScope.bookName}
表达式${userName}的值为:${userName}
2.3  访问环境信息的隐式对象

web目录下,新建一个名为param.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>



num1:
num2:
num3:

  
num1:${param.num1}
num2:${paramValues.num[0]}
num3:${paramValues.num[1]}

注意:提交路径要正确。

2.4 cookie对象

web目录下新建一个名为cookie.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>



cookie对象的信息:
${cookie.userName }
cookie对象的名称和值:
${cookie.userName.name }=${cookie.userName.value } <% response.addcookie(new cookie("userName", "itcast")); %>
2.5 initParam对象

若没有则选择Java EE Tools -> Generate Deployment Descriptor Stub。Eclipse会自动添加web.xml至WEB-INF。

//web.xml 设置如下:

author
张三


//web包下创建initParam.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>



Author的值为:${initParam.author}

3、JSTL

SP标准标签库(JavaSeverPages Standard Tag Libary)
同样的也是为了简化我们的jsp代码,一般与EL表达式结合使用
EL表达式多用于取值操作,而JSTL则可以方便我们对集合进行遍历,对数据进行判断等操作。

首先,下载Standard Taglib:https://tomcat.apache.org/taglibs/standard/

 目前最新版本是1.2.5,将下面四个jar包下载后倒入到项目中即可。

 在jsp页面添加如下指令后,即可使用jstl标签了

//使用核心标签库的taglib指令格式如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
//核心标签库主要用于完成JSP页面的常用功能,包括JSTL的表达式标签、URL标签、流程控制标签。

//使用格式标签库的taglib指令格式如下:
<%@ taglib prefix "fmt" url="http://java.sun.com/jsp/jstl/fmt"%>
//国际化/格式化标签库,它包含实现Web应用程序的国际化标签和格式化标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、使日期按照本地格式显示等。

//使用SQL标签库的taglib指令格式如下:
<%@ taglib prefix="sql" url="http://java.sun.com/jsp/jstl/sql" %>
//SQL标签库,它包含了用于访问数据库和操作数据库的标签。例如,获取数据库连接、从数据库表中检索数据等。由于在软件分层开发模型中,JSP页面仅作为显示层,一般不会在JSP页面中直接操作数据库,所以,JSTL中提供的这套标签库不经常使用。

//使用XML标签库的taglib指令格式如下:
<%@ taglib prefx="xml" url="http://java.sun.com/jsp/jstl/xml" %> 
//XML文档的标签库,它包含对XML文档中的数据进行操作的标签。例如,解析XML文件、输出XML文档中的内容,以及迭代处理XML文档中的元素。XML广泛应用于Web开发,使用XML标签库处理XML文档更加简单方便。

//使用函数标签库的taglib指令格式如下:
<%@ taglib prefix= "fn" url="http://java.sun.com/jsp/jstl/functions"%>
//函数标签库,它提供了一套自定义EL函数,包含了JSP网页制作者经常要用到的字符串操作。例如,提取字符串中的子字符串、获取字符串的长度等。


 其中prefix表示前缀,前缀的值我们可以自己定义,但是不要使用关键字,会有冲突。为了保证可读性,一般都跟标签类型相对应例如 c 对应core.

编写一个简单的JSP文件test.jsp,使用taglib指令引入Core标签库,在该文件中使用标签

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>





3.1 报错处理

报错:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://java.sun.com/jsp/jstl/core]

报错原因:找不到jstl标签库。

解决方法:WEB-INFlib目录下,拷贝刚才的那4个包,刷新下。

3.2 常用标签

语法格式:前缀名:标签

平时最常使用的就是核心标签了,我们来看看核心标签中都有哪些常用标签

set标签:将值保存在指定的作用域中

<%-- var="变量名"  value="值" scope="保存在哪个作用域(page、request、session、application)"--%>

${userName}<%--配合EL表达式取值--%>

out标签:将结果输出

<%--取值--%>

remove标签:删除某个值

<%--删除userName的值--%>

if标签:判断

之前的jsp中我们如果要对数据进行判断后显示符合条件的数据,要这么写。

<%--JSP程序脚本--%>

<%
    
    String name = "yzq";
    int age = 23;
    if (age > 20) {
%>

奔三的人了
<%

} else {
%>

奔二的人了
<%
    }
%>

用JSTL的if标签就很简单了



    奔三的人了


    奔二的人了

choose:选择,跟java中的switch语句类似




    <%--符合该条件时执行--%>
    
        奔三的人了
    

    <%--符合该条件时执行--%>
    
        还是小鲜肉

    

    <%--之前条件都不满足时,执行这个--%>
    

        可以考虑养生了

    

forEach标签:用于迭代集合

创建一个servlet,用于创建一个集合数据,放到request中,User中就两个属性,name和age。

User类

package firstweb;

public class User {
	private String username;
	private int age;
	public User() {
		// TODO Auto-generated constructor stub
	}
	
	public User(String username,int age) {
		// TODO Auto-generated constructor stub
		this.username = username;
		this.age = age;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

}

package firstweb;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/myforEach")
public class myforEach extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    
    public myforEach() {
        super();
        // TODO Auto-generated constructor stub
    }

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//response.getWriter().append("Served at: ").append(request.getContextPath());
		 List users = new ArrayList<>();

	        for (int i = 0; i < 10; i++) {
	            users.add(new User("yzq", i));
	        }
	        request.setAttribute("users", users);
	        request.getRequestDispatcher("/chapter07/jstl.jsp").forward(request, response);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

jstl.jsp

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

<%--迭代标签 用于迭代集合--%>


    ${user.username}:${user.age}
    

foreach标签还有一些其他的属性

begin  :从哪个下标开始迭代,默认值为0
end:迭代到第几个,默认值为集合的长度
step:迭代的步长
varStatus:迭代项的状态变量名,可以获取迭代项的相关状态

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%--迭代标签 用于迭代集合--%>



    
${user.username}:${user.age}
count:${userStatus.count}
step:${userStatus.step}
begin: ${userStatus.begin}
end:${userStatus.end}
index:${userStatus.index}
IsFirst:${userStatus.first}
IsEnd:${userStatus.last}

例7-17if.jsp

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


    Title


周一了:工作的第一天,加油! 周二了:工作的第二天,加油! 周三了:工作的第三天,加油! 周四了:工作的第四天,加油! 周五了:工作的第五天,加油! 周六了:休息的第一天! 周日了:休息的第二天!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/777620.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号