JavaWeb开发之JSP&EL&JSTL
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb开发之JSP&EL&JSTL相关的知识,希望对你有一定的参考价值。
JSP就是Java Server Pages ,即Java服务器端页面。JSP 本质上就是 html + Java代码 + JSP自身东西。Servlet技术生成动态网页的时候很麻烦,需要通过response获得输出流,调用print方法进行打印的。这种编程方式很麻烦,而且美工也不容易处理。SUN公司为了简化动态网页开发,推出JSP。JSP在执行时,会被服务器翻译为Servlet编译执行。EL:Expression Language表达式语言,为了使得JSP写起来更简单。JSTL:JSP的标准标签库。EL和JSTL一起使用取代JSP页面中嵌入Java代码写法。
目录
1、JSP脚本元素和注释
<%! %> :JSP声明 翻译成 Servlet成员部分的内容。声明变量,方法,内部类。
<%= %> :表达式翻译out.print(),在service方法内部。
<% %> :小脚本,嵌入Java代码 翻译成service方法内部的代码块。声明变量,内部类。
<%-- JSP的注释 --%>
2、JSP的指令元素
JSP指令元素用于指定JSP的执行步骤和表现行为。
语法:<%@ 指令名称 属性名称=属性的值 属性名称=属性的值 %>
JSP的指令元素主要分为三类,分别为page指令,include指令,taglib指令。
- page指令:指示JSP的页面设置属性和行为
- include指令:指示JSP包含哪些其他页面
- taglib指令:指示JSP页面包含哪些标签库
page指令包含如下属性:
- language属性: 声明使用脚本的语言。只能是java。
- extends属性: 标明JSP编译成Servlet的时候继承的类。默认值:HttpJspBase。
- session属性: 标明JSP中是否可以直接使用session对象。默认值是true。
- buffer属性: 标明JSP对客户端输出缓冲区大小。默认值8kb。
- autoFlush属性: 如果缓冲区大小溢出,是否自动刷出。默认true。
- import属性: 用于导入Java包或类。
- contentType属性:标明JSP被浏览器解析和打开的时候采用的默认的字符集。
- pageEncoding属性:JSP文件及JSP翻译后的Servlet保存到硬盘上采用字符集。
- isErrorPage属性: 处理JSP页面异常。
- errorPage属性: 处理JSP页面异常。
- isELIgnored属性: 通知JSP是否忽略EL表达式。
included指令的作用是在JSP页面静态包含一个文件,由该JSP解析包含文件的内容。它的主要属性就是file:
- file属性: 指示JSP页面包含页面路径
taglib指令用于在JSP中引入标签库,它主要包含两个指令:
- uri属性: 引入的标签库的路径
- prefix属性: 引入标签库的别名
3、JSP的内置对象
JSP当中有9大内置对象:
- request :从客户端向服务器发送的请求对象
- response :从服务器端向客户端作出响应对象
- session :服务器为客户端创建会话对象
- application :代表应用。获得的ServletContext对象。
- out :向输出流写入内容的对象。
- page :当前的JSP翻译成Servlet后的对象的引用。
- pageContext :本JSP的页面的上下文对象。
- config :本JSP的ServletConfig对象。
- exception :表示JSP页面运行时产生的异常对象。
3、pageContext对象
pageContext对象直接翻译为“页面上下文”对象,代表的是当前页面运行的一些属性。
它是javax.servlet.jsp.PageContext类的实例对象。
首先它提供了page页面的数据存取和查找以及移除等方法,如下:
通过pageContext对象可以直接获取其余8个JSP内置对象:
4、JSP的四个作用范围
- PageScope :页面范围。页面范围指的是在当前的页面内有效,出了这个页面,用pageContext保存的数据就无效了。
- RequestScope :请求范围。从客户端向服务器发送一次请求,服务器对这次请求作出了响应之后,用request保存的数据就无效了。
- SessionScope :会话范围。每个浏览器向服务器发送请求(多次请求)。将该会话结束。
- ApplicationScope :应用范围。在整个应用中任意的地方都可以获取。
5、JSP的动作标签
JSP的动作标签用于在JSP页面中提供业务逻辑功能,避免在JSP页面中直接编写Java代码,造成jsp页面难以维护。
常用的动作标签又如下三个:
- <jsp:forward/> :请求转发。
- <jsp:include/>:包含(动态包含)。
- <jsp:param/>:传递参数。
6、EL表达式的主要功能
EL表达式的功能有如下几个:语法:$ EL表达式
- EL获取数据
- EL执行运算
- EL获取web开发常用的对象
- EL调用Java方法
下面演示EL获取数据,可以指定对象获取,也可以简写,简写默认从最小范围的开始搜索,如果最终搜索不到,就返回空字符串。EL表达式语句在执行的时候,会调用pageContext.findAttribute()方法。分别从page、request、session、application范围查找相应对象,找到就会返回相应对象。
<%--
Created by IntelliJ IDEA.
User: nuist__NJUPT
Date: 2022-08-18
Time: 19:09
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式获取对象</title>
</head>
<body>
<% pageContext.setAttribute("name","张三");
request.setAttribute("name","张四");
session.setAttribute("name","张五");
application.setAttribute("name","张六");
%>
<%= pageContext.getAttribute("name")%> - $pageScope.name<br/>
<%= request.getAttribute("name")%> - $requestScope.name<br/>
<%= session.getAttribute("name")%> - $sessionScope.name<br/>
<%= application.getAttribute("name")%> - $applicationScope.name<br/>
<!--简写-->
$name
</body>
</html>
下面演示EL表达式获取数组和集合中的数据,如下:
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %><%--
Created by IntelliJ IDEA.
User: nuist__NJUPT
Date: 2022-08-19
Time: 16:21
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL获取数据和集合数据</title>
</head>
<body>
<h2>EL获取数组和集合数据</h2>
<%
String [] arr = "xx","yy","zz" ;
pageContext.setAttribute("arr",arr);
List<String> list = new ArrayList<String>() ;
list.add("java") ;
list.add("python") ;
list.add("c++") ;
pageContext.setAttribute("list",list);
Map<String,String> map = new HashMap<String,String>() ;
map.put("key1","jsp") ;
map.put("key2","EL") ;
pageContext.setAttribute("map",map);
%>
$arr[0]
$arr[1]
$arr[2]
$list[0]
$list[1]
$list[2]
$map.key1
$map.key2
</body>
</html>
下面演示一下EL表达式执行基本运算,如下:
<%--
Created by IntelliJ IDEA.
User: nuist__NJUPT
Date: 2022-08-19
Time: 16:21
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title></title>
</head>
<body>
<h2>EL执行基本运算</h2>
<%
pageContext.setAttribute("s1","10");
pageContext.setAttribute("s2","20");
%>
$s1+s2
$empty s1
$s1>s2
</body>
</html>
另外EL表达式可以用来获取web开发常用对象,具体包括如下对象:
EL表达式定义了11个web开发常用对象。使用这些对象可以很方便获取web开发冲的一些常见对象,并可以读取这些对象中的数据。
- pageContext :相当于JSP内置对象中pageContext
- pageScope :获取指定域下的名称的数据
- requestScope :获取指定域下的名称的数据
- sessionScope :获取指定域下的名称的数据
- applicationScope :获取指定域下的名称的数据
- param :在页面中接收请求参数(接收一个名称对应一个值参数)。
- paramValues :在页面中接收请求参数(接收一个名称对应多个值参数)。
- header :在页面上获取请求头(获取一个key对应一个value 头)
- headerValues :在页面上获取请求头(获取一个key对应多个value 头)
- cookie :访问cookie的名称和值($cookie.key.name $cookie.key.value)
- initParam :获取全局初始化参数的值
7、JSTL的常用标签
JSTL:JSP的标准标签库。主要和EL来取代传统页面上直接嵌入Java代码写法。提升程序可读性、维护性和方便性。标签库如下,其中,常用的是核心标签库和EL函数库。
- c标签(core标签库)
- fmt标签(国际化标签库)
- xml标签
- sql标签
- jstl函数库(EL函数)
我们在使用的时候需要导入标签库的jar包,然后在页面引入,然后演示core标签库下的if标签的使用,具体入如下:其中if标签有三个属性:
- test属性 :条件
- var属性 :将test中的条件的值赋给一个变量,在var中定义变量
- scope属性:作用范围
<%--
Created by IntelliJ IDEA.
User: nuist__NJUPT
Date: 2022-08-19
Time: 16:21
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<html>
<head>
<title></title>
</head>
<body>
<h2>JSTL的使用</h2>
<c:set var="names" value="wang1" scope="page"></c:set>
$names
<!--if标签的使用-->
<c:set var="n" value="1" scope="page"></c:set>
<c:if test="$n>=10">
<font color="red">n大于等于10</font>
</c:if>
<c:if test="$n<10">
<font color="blue">n小于10</font>
</c:if>
</body>
</html>
下面演示了JSTL核心库的foreach标签的使用,具体如下:
<%@page import="java.util.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>JSTL的foreach标签的使用</h1>
<h3>遍历数组</h3>
<%
String[] arrs = "aa","bb","cc";
pageContext.setAttribute("arrs", arrs);
%>
<c:forEach var="s" items="$ arrs ">
$ s
</c:forEach>
<h3>遍历List集合</h3>
<%
List<String> list = new ArrayList<String>();
list.add("11");
list.add("22");
list.add("33");
pageContext.setAttribute("list", list);
%>
<c:forEach var="s" items="$ list ">
$ s
</c:forEach>
<h3>遍历Map集合</h3>
<%
Map<String,Integer> map =new HashMap<String,Integer>();
map.put("aaa",111);
map.put("bbb",222);
map.put("ccc",333);
pageContext.setAttribute("map", map);
%>
<c:forEach var="entry" items="$ map ">
$ entry.key -$ entry.value
</c:forEach>
<h3>遍历从1到10</h3>
<c:forEach var="i" begin="1" end="10" step="1" >
$ i
</c:forEach>
<h3>遍历100到200 每次加2 到第三个数的时候 将该数字变为蓝色</h3>
<c:forEach var="i" begin="100" end="200" step="2" varStatus="status">
<c:if test="$ status.count % 3 == 0 ">
<font color="blue">$ i </font>
</c:if>
<c:if test="$ status.count % 3 != 0 ">
$ i
</c:if>
</c:forEach>
</body>
</html>
8、综合案例
下面通过一个案例来回顾一下,案例的需求是将从数据库中读取到的学生信息显示到浏览器页面带上 ,具体如下:
1)环境准备
创建web项目,导入相关jar包,创建目录结构,并引入工具类。
然后需要进行数据准备,创建数据库和表,并插入记录,具体如下:
create database if not exists web04_student;
use web04_student;
create table if not exists student(
sid int primary key auto_increment,
sname varchar(20),
sex varchar(10),
age int
);
insert into student values (null,'张三','男',20);
insert into student values (null,'李四','女',23);
insert into student values (null,'王五','女',18);
insert into student values (null,'赵六','男',25);
insert into student values (null,'孙七','男',21);
2)编写代码
第一,编写获得连接池的工具类,如下:
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class JDBCUtils
// 创建一个连接池:但是这个连接池只需要创建一次即可。
private static final ComboPooledDataSource dataSource = new ComboPooledDataSource();
/**
* 获得连接的方法
* @throws SQLException
*/
public static Connection getConnection() throws SQLException
return dataSource.getConnection();
/**
* 获得连接池:
*/
public static DataSource getDataSource()
return dataSource;
编写学生实体类,具体如下:
public class Student
private Integer sid;
private String sname;
private String sex;
private Integer sage;
public Integer getSid()
return sid;
public void setSid(Integer sid)
this.sid = sid;
public String getSname()
return sname;
public void setSname(String sname)
this.sname = sname;
public String getSex()
return sex;
public void setSex(String sex)
this.sex = sex;
public Integer getSage()
return sage;
public void setSage(Integer sage)
this.sage = sage;
编写模型层,用于查询所有学生信息,并封装成list集合。
import java.sql.SQLException;
import java.util.List;
import jsp.domain.Student;
import jsp.utils.JDBCUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
public class StudentModel
// 查询所有学生信息的方法:
public List<Student> findAll() throws SQLException
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
List<Student> list = queryRunner.query("select * from student", new BeanListHandler<Student>(Student.class));
return list;
编写控制层sevlet,用于控制模型层处理数据,并跳转到jsp页面。
import jsp.domain.Student;
import jsp.model.StudentModel;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 查询学生信息的Servlet
*/
public class StudentServlet extends HttpServlet
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
try
// 1.调用Java类处理数据
StudentModel studentModel = new StudentModel();
List<Student> list = studentModel.findAll();
// 2.显示到JSP页面
request.setAttribute("list", list);
request.getRequestDispatcher("/jsp/list.jsp").forward(request, response);
catch(Exception e)
e.printStackTrace();
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
doGet(request, response);
最后编写视图层的list.jsp代码,用于获取和显示学生信息,如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>学生信息显示页面</h1>
<table border="1" width="600">
<tr>
<td>学生编号</td>
<td>学生姓名</td>
<td>学生性别</td>
<td>学生年龄</td>
</tr>
<c:forEach var="student" items="$ list ">
<tr>
<td>$ student.sid </td>
<td>$ student.sname </td>
<td>$ student.sex </td>
<td>$ student.sage </td>
</tr>
</c:forEach>
</table>
</body>
</html>
本次使用c3p0开源开源连接池,故需要配置c3p0-config.xml中配置数据库参数,具体如下:
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///web04_student</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="initialPoolSize">5</property>
<property name="minPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
</c3p0-config>
最后需要在web.xml中配置本次所用到的servlet对象,如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>StudentServlet</servlet-name>
<servlet-class>jsp.controller.StudentServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>StudentServlet</servlet-name>
<url-pattern>/StudentServlet</url-pattern>
</servlet-mapping>
</web-app>
效果如下:
以上是关于JavaWeb开发之JSP&EL&JSTL的主要内容,如果未能解决你的问题,请参考以下文章
04-JavaWeb开发JSP&EL&JSTL&MVC&Bootstrap前端框架