一.JSP简介
- JSP(全称Java Server Pages)java服务器页面。 是一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。
- JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求,是简化版的Servlet。
二.JSP入门
1.第一个JSP文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
<h1>hello JSP</h1>
</body>
</html>
2.JSP的运行方式
(1)将模块发布到服务器上
- 添加exploded
- 将exploded发布到服务器上
(2)运行该项目中的jsp文件
3.JSP文件执行流程
(1)JSP文件被第一次访问时的流程
(2)JSP文件未被修改情况下第N次被访问时的流程
4.翻译的java文件及编译的字节码文件
(1)存储位置
(2)查看翻译后的Java文件
(3)查看父类源码
(4)结论
- JSP实际上就是一个Servlet
三.JSP与与Servlet的区别
JSP | Servlet | |
---|---|---|
功能 | 主要功能是给用户看的页面 | 控制器 |
内置对象 | JSP被Tomcat翻译成java文件时直接赋予了九大内置对象 | 没有 |
限制 | 简化版的Servlet,功能有限 | 功能更加全面 |
类 | 不算一个纯粹的Java类 | Servlet是一个纯粹的Java类 |
四.JSP三大指令
1.三大指令
指令 | 说明 |
---|---|
page | 页面描述 |
include | 包含 |
taglib | 引入其他工具 |
2.page指令
(1)导包
- language:当前页面的脚本语言
- contentType:页面响应体的编码格式
- import:导包
(2)页面出错跳转
- errorPage:如果当前页面出错,就运行指定的页面
3.include指令
- include指令:包含
(1)编写测试页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
<%@ include file="head.jsp"%>
<h1>这是页面主体</h1>
<%@ include file="foot.jsp"%>
</body>
</html>
(2)运行测试
4.taglib指令
- taglib指令:引入其他工具
五.示例学生信息展示
1.创建学生表
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(20) NOT NULL,
sgender CHAR(1),
sage INT,
semail VARCHAR(20)
);
2.创建实体类
package com.demo02.entity;
public class Student {
private int sid;
private String sname;
private String sgender;
private int sage;
private String semail;
public Student() {
}
public Student(int sid, String sname, String sgender, int sage, String semail) {
this.sid = sid;
this.sname = sname;
this.sgender = sgender;
this.sage = sage;
this.semail = semail;
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getSgender() {
return sgender;
}
public void setSgender(String sgender) {
this.sgender = sgender;
}
public int getSage() {
return sage;
}
public void setSage(int sage) {
this.sage = sage;
}
public String getSemail() {
return semail;
}
public void setSemail(String semail) {
this.semail = semail;
}
@Override
public String toString() {
return "Student{" +
"sid=" + sid +
", sname='" + sname + '\'' +
", sgender='" + sgender + '\'' +
", sage=" + sage +
", semail='" + semail + '\'' +
'}';
}
}
3.创建StudentDao.java
package com.demo02.dao;
import com.demo02.entity.Student;
import java.util.List;
public interface StudentDao {
List<Student> getAllStudent();
}
package com.demo02.dao.impl;
import com.demo02.dao.StudentDao;
import com.demo02.entity.Student;
import com.demo02.util.C3P0Util;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.SQLException;
import java.util.List;
public class StudentDaoImpl implements StudentDao {
QueryRunner queryRunner = new QueryRunner(C3P0Util.getDataSource());
@Override
public List<Student> getAllStudent() {
List<Student> list = null;
String sql = "select * from student";
try {
list = queryRunner.query(sql, new BeanListHandler<>(Student.class));
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
}
4.创建StudentService.java
package com.demo02.service;
import com.demo02.entity.Student;
import java.util.List;
public interface StudentService {
List<Student> getAllStudent();
}
package com.demo02.service.impl;
import com.demo02.dao.StudentDao;
import com.demo02.dao.impl.StudentDaoImpl;
import com.demo02.entity.Student;
import com.demo02.service.StudentService;
import java.util.List;
public class StudentServiceImpl implements StudentService {
StudentDao studentDao = new StudentDaoImpl();
@Override
public List<Student> getAllStudent() {
return studentDao.getAllStudent();
}
}
5.创建StudentServlet.java
package com.demo02.servlet;
import com.demo02.entity.Student;
import com.demo02.service.StudentService;
import com.demo02.service.impl.StudentServiceImpl;
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.io.PrintWriter;
import java.util.List;
@WebServlet("/studentServlet")
public class StudentServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
StudentService studentService = new StudentServiceImpl();
List<Student> list = studentService.getAllStudent();
/*PrintWriter out = resp.getWriter();
for (Student stu:list) {
out.print("<table>");
out.print(stu);
}
out.close();*/
//带着学生信息跳转到student.jsp
req.setAttribute("stuList",list);
req.getRequestDispatcher("student.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
}
6.index.html中请求路径的书写
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
恭喜您,登录成功<br>
<a href="studentServlet">展示所有学生信息</a>
</body>
</html>
7.创建student.jsp
<%@ page import="java.util.List" %>
<%@ page import="com.etime.entity.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="0" width="500">
<tr>
<td>学号</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
<td>邮箱</td>
</tr>
<%-- 脚本程序 --%>
<%-- 纯java解析代码写到<%%>中,java获取的数据显示到页面上时需要写到<%=%>中 --%>
<%
List<Student> list = (List<Student>)request.getAttribute("stuList");
for (Student student:list) {
%>
<tr>
<td><%=student.getSid()%></td>
<td><%=student.getSname()%></td>
<td><%=student.getSgender()%></td>
<td><%=student.getSage()%></td>
<td><%=student.getSemail()%></td>
</tr>
<%
}
%>
</table>
</body>
</html>
六.动作标签
-
与JSP指令元素不同的是,JSP动作元素在请求处理阶段起作用
-
JSP动作元素是用XML语法写成的
-
利用JSP动作可以动态地插入文件、重用JavaBean组件、把用户重定向到另外的页面、为Java插件生成HTML代码
-
动作元素只有一种语法,它符合XML标准
-
<jsp:action_name attribute="value" />
-
1.动作标签分类
语法 | 描述 |
---|---|
jsp:include | 在页面被请求的时候引入一个文件。 |
jsp:useBean | 寻找或者实例化一个JavaBean。 |
jsp:setProperty | 设置JavaBean的属性。 |
jsp:getProperty | 输出某个JavaBean的属性。 |
jsp:forward | 把请求转到一个新的页面。 |
jsp:plugin | 根据浏览器类型为Java插件生成OBJECT或EMBED标记。 |
jsp:element | 定义动态XML元素 |
jsp:attribute | 设置动态定义的XML元素属性。 |
jsp:body | 设置动态定义的XML元素内容。 |
jsp:text | 在JSP页面和文档中使用写入文本的模板 |
2.动作标签常见属性
- 所有的动作标签都有两个属性:id属性和scope属性
属性 | 描述 |
---|---|
id | id属性是动作标签的唯一标识,可以在JSP页面中引用。动作标签创建的id值可以通过PageContext来调用 |
scope | 该属性用于识别动作标签的生命周期。 id属性和scope属性有直接关系,scope属性定义了相关联id对象的寿命。 scope属性有四个可能的值: page, request, session,application。 |
3.include指令(静态包含)与include标签(动态包含)的区别
1、语法不一样
2、翻译方式不一样,指令只翻译一个文件,标签翻译所有文件
3、指令的效率相对较高,标签较低
4、指令不能携带数据,标签可以
七.JSP九大内置对象
一.九大内置对象
- Tomcat将JSP文件翻译成Java文件时给的
内置对象 | 描述 |
---|---|
request | 请求对象 |
response | 响应对象 |
config | 初始化数据对象 |
application | 服务器对象 |
out | 输出对象 |
page | 当前页面对象,类似于Java中的this |
ageContext | 页面内容对象 |
session | 会话对象 |
exception | 异常对象 |
2.内置对象的创建
八.JSP四大作用域
1.作用域
作用域 | 作用域 | 作用域 | 作用域 | |
---|---|---|---|---|
Servlet | request:针对请求,一次请求内有效 | session:针对浏览器,浏览器不关闭就有效 | ServletContext:针对项目,在当前项目中有效 | |
JSP | request:针对请求,一次请求内有效 | session:针对浏览器,浏览器不关闭就有效 | application:针对模块/项目,在当前模块/项目中有效 | pageContext:针对页面,在当前页面内有效。(是JSP独有的) |
2.作用域对象方法
- 用域对象其实就是容器
- 内部存储数据
- 存储的数据在他的作用域范围内都能使用
(1)作用域都有的方法
方法 |
---|
setAttribute(String,Object) |
getAttribute(String) |
removeAttribute(String) |
- 示例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
request.setAttribute("color","red");
%>
<%=request.getAttribute("color")%>
<%
request.removeAttribute("color");
%>
<%=request.getAttribute("color")%>
</body>
</html>
2.在test.jsp中存入四个作用域的数据,在当前页面又取出来
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
pageContext.setAttribute("pageContext","green");
request.setAttribute("request","red");
session.setAttribute("session","yellow");
application.setAttribute("application","blue");
%>
<%=pageContext.getAttribute("pageContext")%><br>
<%=request.getAttribute("request")%><br>
<%=session.getAttribute("session")%><br>
<%=application.getAttribute("application")%>
</body>
</html>
- 当前页面中,四个作用域都有效
3.在test.jsp中存入四个作用域的数据,通过请求转发到second.jsp,再在second.jsp中取出这些数据
(1)test.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
pageContext.setAttribute("pageContext","green");
request.setAttribute("request","red");
session.setAttribute("session","yellow");
application.setAttribute("application","blue");
request.getRequestDispatcher("second.jsp").forward(request,response);
%>
</body>
</html>
(2)second.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%=pageContext.getAttribute("pageContext")%><br>
<%=request.getAttribute("request")%><br>
<%=session.getAttribute("session")%><br>
<%=application.getAttribute("application")%>
</body>
</html>
- pageContext作用域范围只在当前页面
4.在test.jsp中存入四个作用域的数据,通过重定向到second.jsp,再在second.jsp中取出这些数据
(1)修改test.jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
pageContext.setAttribute("pageContext","green");
request.setAttribute("request","red");
session.setAttribute("session","yellow");
application.setAttribute("application","blue");
response.sendRedirect("second.jsp");
%>
</body>
</html>
- 使用重定向,request就失效
5.关闭浏览器,再打开浏览器,直接访问second.jsp
- 浏览器关闭,session就失效
6.重启服务器,直接访问second.jsp
- 服务器关闭,application失效
九.EL表达式
1.EL表达式概述
- EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
2.EL内部进行运算
运算 | 运算符 |
---|---|
算数 | + - * / |
关系 | > >= < <= == != |
逻辑 | && || ! |
条件 | ?: |
空 | empty |
3.示例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
${1+1}
</body>
</html>
4.EL在项目中的运用
1、获取变量的值(变量必须放到作用域中)
2、获取对象的属性值
3、获取集合的数据
(1)示例
<%@ page import="com.etime.entity.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
<%
String color = "red";
pageContext.setAttribute("c",color);
%>
${c}<br>
<%
User user = new User(1,"mary");
pageContext.setAttribute("u",user);
%>
${u.id}
${u.name}<br>
<%
User user1 = new User(1,"mary");
User user2 = new User(2,"tom");
User user3 = new User(3,"jack");
List<User> list = new ArrayList<>();
list.add(user1);
list.add(user2);
list.add(user3);
pageContext.setAttribute("uList",list);
%>
${uList.get(1).id}
${uList.get(1).name}
</body>
</html>
5.EL表达式获取作用域的数据
<%@ page import="com.etime.entity.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
<%
pageContext.setAttribute("pc","green");
request.setAttribute("req","red");
session.setAttribute("sess","yellow");
application.setAttribute("app","blue");
%>
${pc}<br>
${req}<br>
${sess}<br>
${app}
</body>
</html>
6.四大作用域中存入了相同key的数据
- 按照pageContext–>request–>session–>application的顺序寻找,找到了就结束
7.使用EL表达式,获取指定作用域的数据
(1)分类
作用域 | 获取 |
---|---|
pageContext | pageScope |
request | requestScope |
session | sessionSc |
application | applicationScope |
(2)示例
<%@ page import="com.etime.entity.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
<%
pageContext.setAttribute("color","green");
request.setAttribute("color","red");
session.setAttribute("color","yellow");
application.setAttribute("color","blue");
%>
${pageScope.color}<br>
${requestScope.color}<br>
${sessionScope.color}<br>
${applicationScope.color}
</body>
</html>
十.JSTL标签库
1.JSTL标签库概述
- JSTL(Java server pages standarded tag library,即JSP标准标签库)是由JCP(Java community Proces)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
2.使用JSTL标签库
(1)导入jar包
(2)创建JSP页面,并在其中使用taglib指令来导入需要的标签库
(3)标签的使用
标签 |
---|
<c:set> |
<c:if> |
<c:choose> <c:when> <c:otherwise>(<c:when> <c:otherwise>必须写在<c:choose>内部) |
<c:forEach> |
(4)示例
<%@ page import="com.etime.entity.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>第一个JSP页面</title>
</head>
<body>
<c:set var="name" value="mary"></c:set>
${name}<br>
<c:if test="${2>1}">
这是真的
</c:if><br>
<c:choose>
<c:when test="${2>1}">
2真的大于1
</c:when>
<c:when test="${2==1}">
2真的等于1
</c:when>
<c:otherwise>
2真的小于1
</c:otherwise>
</c:choose><br>
<%
User user1 = new User(1,"mary");
User user2 = new User(2,"tom");
User user3 = new User(3,"jack");
List<User> list = new ArrayList<>();
list.add(user1);
list.add(user2);
list.add(user3);
pageContext.setAttribute("uList",list);
%>
<c:forEach var="user" items="${uList}">
${user.id}
${user.name}<br>
</c:forEach>
</body>
</html>
十一.学生信息展示功能改造
1.student.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="0" width="500">
<tr>
<td>学号</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
<td>邮箱</td>
</tr>
<%--纯java解析代码写到<%%>中,java获取的数据显示到页面上时需要写到<%=%>中--%>
<%--<%
List<Student> list = (List<Student>)request.getAttribute("stuList");
for (Student student:list) {
%>
<tr>
<td><%=student.getSid()%></td>
<td><%=student.getSname()%></td>
<td><%=student.getSgender()%></td>
<td><%=student.getSage()%></td>
<td><%=student.getSemail()%></td>
</tr>
<%
}
%>--%>
<c:forEach var="stu" items="${stuList}">
<tr>
<td>${stu.sid}</td>
<td>${stu.sname}</td>
<td>${stu.sgender}</td>
<td>${stu.sage}</td>
<td>${stu.semail}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
ava获取的数据显示到页面上时需要写到<%=%>中–%>
<%–<%
List list = (List)request.getAttribute(“stuList”);
for (Student student:list) {
%>
<%=student.getSid()%>
<%=student.getSname()%>
<%=student.getSgender()%>
<%=student.getSage()%>
<%=student.getSemail()%>
<%
}
%>–%>
<c:forEach var=“stu” items="
s
t
u
L
i
s
t
"
>
<
t
r
>
<
t
d
>
{stuList}"> <tr> <td>
stuList"><tr><td>{stu.sid}
s
t
u
.
s
n
a
m
e
<
/
t
d
>
<
t
d
>
{stu.sname}</td> <td>
stu.sname</td><td>{stu.sgender}
s
t
u
.
s
a
g
e
<
/
t
d
>
<
t
d
>
{stu.sage}</td> <td>
stu.sage</td><td>{stu.semail}
</c:forEach>