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脚本元素和注释
2、JSP的指令元素
3、JSP的内置对象
3、pageContext对象
4、JSP的四个作用范围
5、JSP的动作标签
6、EL表达式的主要功能
7、JSTL的常用标签
8、综合案例
<%! %> :JSP声明 翻译成 Servlet成员部分的内容。声明变量,方法,内部类。
<%= %> :表达式翻译out.print(),在service方法内部。
<% %> :小脚本,嵌入Java代码 翻译成service方法内部的代码块。声明变量,内部类。
<%-- JSP的注释 --%>
JSP指令元素用于指定JSP的执行步骤和表现行为。
语法:<%@ 指令名称 属性名称=属性的值 属性名称=属性的值 %>
JSP的指令元素主要分为三类,分别为page指令,include指令,taglib指令。
page指令包含如下属性:
included指令的作用是在JSP页面静态包含一个文件,由该JSP解析包含文件的内容。它的主要属性就是file:
taglib指令用于在JSP中引入标签库,它主要包含两个指令:
JSP当中有9大内置对象:
pageContext对象直接翻译为“页面上下文”对象,代表的是当前页面运行的一些属性。
它是javax.servlet.jsp.PageContext类的实例对象。
首先它提供了page页面的数据存取和查找以及移除等方法,如下:
通过pageContext对象可以直接获取其余8个JSP内置对象:
JSP的动作标签用于在JSP页面中提供业务逻辑功能,避免在JSP页面中直接编写Java代码,造成jsp页面难以维护。
常用的动作标签又如下三个:
EL表达式的功能有如下几个:语法:${ EL表达式 }
下面演示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" %>
EL表达式获取对象
<% pageContext.setAttribute("name","张三");
request.setAttribute("name","张四");
session.setAttribute("name","张五");
application.setAttribute("name","张六");
%>
<%= pageContext.getAttribute("name")%> - ${pageScope.name}
<%= request.getAttribute("name")%> - ${requestScope.name}
<%= session.getAttribute("name")%> - ${sessionScope.name}
<%= application.getAttribute("name")%> - ${applicationScope.name}
${name}
下面演示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" %>
EL获取数据和集合数据
EL获取数组和集合数据
<%
String [] arr = {"xx","yy","zz"} ;
pageContext.setAttribute("arr",arr);
List list = new ArrayList() ;
list.add("java") ;
list.add("python") ;
list.add("c++") ;
pageContext.setAttribute("list",list);
Map map = new HashMap() ;
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}
下面演示一下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" %>
EL执行基本运算
<%
pageContext.setAttribute("s1","10");
pageContext.setAttribute("s2","20");
%>
${s1+s2}
${empty s1}
${s1>s2}
另外EL表达式可以用来获取web开发常用对象,具体包括如下对象:
EL表达式定义了11个web开发常用对象。使用这些对象可以很方便获取web开发冲的一些常见对象,并可以读取这些对象中的数据。
JSTL:JSP的标准标签库。主要和EL来取代传统页面上直接嵌入Java代码写法。提升程序可读性、维护性和方便性。标签库如下,其中,常用的是核心标签库和EL函数库。
我们在使用的时候需要导入标签库的jar包,然后在页面引入,然后演示core标签库下的if标签的使用,具体入如下:其中if标签有三个属性:
<%--
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" %>
JSTL的使用
${names}
n大于等于10
n小于10
下面演示了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"%>
Insert title here
JSTL的foreach标签的使用
遍历数组
<%
String[] arrs = {"aa","bb","cc"};
pageContext.setAttribute("arrs", arrs);
%>
${ s }
遍历List集合
<%
List list = new ArrayList();
list.add("11");
list.add("22");
list.add("33");
pageContext.setAttribute("list", list);
%>
${ s }
遍历Map集合
<%
Map map =new HashMap();
map.put("aaa",111);
map.put("bbb",222);
map.put("ccc",333);
pageContext.setAttribute("map", map);
%>
${ entry.key }-${ entry.value }
遍历从1到10
${ i }
遍历100到200 每次加2 到第三个数的时候 将该数字变为蓝色
${ i }
${ i }
下面通过一个案例来回顾一下,案例的需求是将从数据库中读取到的学生信息显示到浏览器页面带上 ,具体如下:
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 findAll() throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
List list = queryRunner.query("select * from student", new BeanListHandler(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 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"%>
Insert title here
学生信息显示页面
学生编号
学生姓名
学生性别
学生年龄
${ student.sid }
${ student.sname }
${ student.sex }
${ student.sage }
本次使用c3p0开源开源连接池,故需要配置c3p0-config.xml中配置数据库参数,具体如下:
com.mysql.jdbc.Driver
jdbc:mysql:///web04_student
root
123456
5
5
20
最后需要在web.xml中配置本次所用到的servlet对象,如下:
StudentServlet
jsp.controller.StudentServlet
StudentServlet
/StudentServlet