JSP基本使用
什么是JSP
JSP是Java Server Page的简称,是一种动态网页开发技术。它通过<% %>,<%= %>标签在网页中嵌入java代码。JSP是基于java Servlet Api,因此有许多强大的企业级Api,也因为是这一点,它相比其他同类型的技术,更易于移植到非MS平台。
JSP的处理流程
第一步 用户发送请求到服务器。
第二步 服务器识别出这是一个对JSP页面的请求,将请求交给JSP引擎处理。
第三步 JSP引擎从硬盘中读取JSP文件,将其转化为Servlet类。
第四步 JSP引擎将Servlet类编译成可执行文件,并将请求交给Servlet引擎处理。
第五步 web服务器调用Servlet引擎执行Servlet类,Servlet引擎将执行结果嵌入到响应中。
第六步 web服务器将响应结果返回给浏览器,形成我们所看到的网页。
JSP的生命周期
JSP的生命周期和Servlet的生命周期类似,只是JSP比Servlet多一个编译成Servlet的阶段。
- 编译阶段
将JSP页面编译成Servler类 - 初始化阶段
加载Servlet类,实例化Servlet类,并调用初始化方法 - 服务阶段
调用Servlet类的服务方法 - 销毁阶段
调用销毁方法,并销毁Servlet的实例。
JSP的九大内置对象
- request
request对象是HttpServletRequest接口的实例,用户每次请求一个jsp页面,JSP引擎都会创建一个新的request对象。 - response
response对象是HttpServletResponse接口的实例,JSP引擎创建request对象时就会创建对应的response对象。 - session
session对象是HttpSession类的实例,它可以用于跟踪用户的行为。 - application
application对象包装了ServletContext类的对象,它在jsp页面初始化时创建,随着jsp的销毁而销毁。你可以在application中添加属性,以此达到在多个jsp页面之间共享对象的目的。 - out
out对象是JspWriter类的实例,用于在response对象中写入数据。它会根据页面是否缓存调用不同的实例操作。JspWriter类会抛出IOException,PrintWriter类则不会。 - exception
exception对象中包含了JSP页面抛出的异常信息。 - config
config对象是ServletConfig类的实例,你可以通过这个对象获得JSP或Servlet引擎的初始化参数 - pagecontext
pageContext对象是PageContext 类的实例,用来代表整个JSP页面。你可以用它获得页面信息。 - page
这个对象就是页面实例的引用。它可以被看做是整个JSP页面的代表。page 对象就是this对象的同义词。
JSP基本语法
JSP声明代码
<%! int i = 0; %> .
JSP脚本代码
<% out.print("hello world"); %>
JSP表达式
<%=(5*9) %>
JSP注释
<%--JSP注释,注释内容不会被发送至浏览器甚至不会被编译--%>
<!-- HTML注释,通过浏览器查看网页源代码时可以看见注释内容-->
JSP指令
定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ page %>
<%@ page contentType="text/xml;charset=UTF-8" language="java" isELIgnored="false" %>
//此处设置页面属性编码为UTF-8,内容为html网页,脚本语言为java,开启el表达式,默认是关闭的
引入标签库的定义,可以是自定义标签
<%@ taglib %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
//此处引入jstl标签库,设置前缀为c
包含其他文件
<%@ include %>
使用JSTL标签库
第一步 引入依赖
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jstl-impl</artifactId>
<version>1.2</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
</exclusion>
</exclusions>
</dependency>
//由于tomcat7是兼容j2ee 3.0规范的,所以我们将jstl 依赖的东西给去除掉,防止和tomcat自身的servlet jar包冲突.
第二步 在JSP中引入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
//前缀可以自定义
第三步 使用JSTL标签
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.study.bean.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<body>
<%
List<User> list=new ArrayList();
list.add(new User("admin","123456"));
list.add(new User("system","789654"));
list.add(new User("super","46546465"));
session.setAttribute("list",list);
%>
<table border="1px solid black">
<thead>
<tr>
<th>username</th>
<th>password</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="user">
<tr>
<td>${user.name}</td>
<td>${user.password}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>
JSTL标签库还提供了sql标签支持SQL操作,下面是查询的例子
在JSP引入sql标签
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
查询user表
<%@ page import="java.sql.ResultSet" %>
<%@ page import="org.apache.taglibs.standard.tag.common.sql.ResultImpl"%>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.study.bean.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<html>
<body>
<sql:setDataSource driver="com.mysql.cj.jdbc.Driver" user="root" password="root" url="jdbc:mysql://localhost:3306/mybatistest?characterEncoding=utf8&useSSL=true&serverTimezone=UTC" scope="application" var="test"></sql:setDataSource>
<sql:query var="res" sql="select * from user" dataSource="${test}" scope="session"></sql:query>
<table border="1px solid black">
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>sign</th>
</tr>
</thead>
<tbody>
<c:forEach items="${res.rows}" var="user">
<tr>
<td>${user.id}</td>
<td>${user.name}</td>
<td>${user.sign}</td>
</tr>
</c:forEach>
</tbody>
</table>
</body>
</html>