JSP
1.产生
1.1servlet的不足
- Servlet是一个动态网页技术,客户端通过请求Servlet类可以相应给客户端一个动态网页, 但是Servlet在使用过程中有什么不足之处呢?
- 开发方式麻烦:继承HttpServlet父类、 重写doGet/doPost. Servlet配置
- 项目更新麻烦: Servlet类中的代码发生改变,需要重新编译、部署、启动Tomcat
- 网页呈现复杂:需要进行HTML标签拼接,同时要通过输出流逐行打印
- 协同开发困难:负责页面美化,但是页面是由Servlet类提供, 如果W不懂Java、则不能完成Servlet响应的页面的优化
1.2JSP介绍
- JSP(Java Server Page)基础servlet技术,运行在服务器之上,支持java语言的动态网页技术
- 简化了servlet的设计,采用在HTML标签中嵌套代码的形式进行动态网页的呈现,可以高效开发web应用的动态网页
- 替换显示页面部分的servlet(使用.JSP网页文件替换PageServlet.java类)
1.3JSP入门案例
1.3.1案例准备
-
创建web项目
-
完成JDBC的准备
- 导入jar包:MySQL驱动,druid.jar和dbutils包
-
创建数据库表
create table books( book_id char(6) primary key, book_name varchar(50) not null, book_author varchar(20) not null, book_price DECIMAL(10,2), book_img_path varchar(100) not null, book_desc varchar(200), book_type int not null );
1.3.2数据库操作
-
创建文件保存配置连接池参数
# 数据库连接信息 driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/db_JSP?characterEncoding=utf8 username=root password=123456 # 连接池属性 # 连接池的初始化连接数<创建数据库连接池时默认初始化的连接的个数> initialSize=10 # 连接池的最大连接数 maxActive=50 # 最小空闲连接数(当数据库连接使用率很低时,连接池中的连接会被释放一部分) minIdle=5 # 超时等待时间(单位:ms) maxWait=30000
-
创建DruidUtils类编写连接代码
package Fast; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; public class DruidUtils { private static DruidDataSource druidDataSource; static{ try { InputStream is = DruidUtils.class.getResourceAsStream("druid.properties"); Properties properties = new Properties(); properties.load(is); druidDataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } } /** * 获取数据库连接池数据源对象 * @return */ public static DataSource getDataSource(){ return druidDataSource; } /** * 从数据库连接池中获取数据库连接对象 * @return */ public static Connection getConnection(){ Connection connection = null; try { connection = druidDataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return connection; } }
-
创建实体类
package Fast; //创建图书实体类 public class Book { private String bookId; private String bookName; private String bookAuthor; private String bookPrice; private String bookImgPath; private String bookDesc; private int bookType; //getset有参无参 }
-
创建DAO类,完成数据库查询
package Fast; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import java.sql.SQLException; import java.util.List; //数据库查询操作 public class BookDAO { public List<Book> listBooks(){ List<Book> bookList = null; try { String sql = "select book_id bookId,book_name bookName,book_author bookAuthor,book_price bookPrice,book_img_path bookImgPath,book_desc bookDesc,book_type bookType from books"; QueryRunner queryRunner = new QueryRunner(DruidUtils.getDataSource()); bookList = queryRunner.query(sql,new BeanListHandler<Book>(Book.class)); }catch (SQLException e){ e.printStackTrace(); } return bookList; } }
1.3.3JSP呈现动态网页
-
接收客户端的请求,查询图书信息,将图书信息转发到一个JSP文件进行显示
@WebServlet("/BookListServlet") public class BookListServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //调用BookDAO查询图书信息 BookDAO bookDAO = new BookDAO(); List<Book> bookList = bookDAO.listBooks(); //将数据转发到book-list.JSP进行动态显示 req.setAttribute("bookList",bookList); req.getRequestDispatcher("book-list.JSP").forward(req,resp); } }
-
创建JSP页面
-
右击web目录->新建->JSP/JSPX
与HTML基本一致,只不过有了一行HTML无法识别的代码
<%@ page contentType="text/HTML;charset=UTF-8" language="java" %> <HTML> <head> <title>JSP入门案例</title> </head> <body> </body> </HTML>
-
也可以编写java代码,但是要写在<%%>里面
<%java代码%>
-
动态显示JSP页面
<%@ page import="java.util.List" %> <%@ page import="Fast.Book" %> <%@ page contentType="text/HTML;charset=UTF-8" language="java" %> <HTML> <head> <title>JSP入门案例</title> </head> <body> <table width="80%" align="center" border="1" cellpadding="0"> <tr> <th>图书ID</th> <th>图书名称</th> <th>图书作者</th> <th>图书价格</th> <th>图书封面</th> <th>图书描述</th> <th>图书类型</th> </tr> <%--循环获取信息--%> <%--因为java代码不能把HTML代码括起来,所以要写成如下方式--%> <% List<Book> bookList =(List<Book>)request.getAttribute("bookList"); for(int i=0;i < bookList.size();i++){ Book book = bookList.get(i); %> <tr> <%--如果需要将JSP中java代码的变量显示在HTML标签中,则需要使用<%=变量%>--%> <td><%=book.getBookId()%></td> <td><%=book.getBookName()%></td> <td><%=book.getBookAuthor()%></td> <td><%=book.getBookPrice()%></td> <td><%=book.getBookImgPath()%></td> <td><%=book.getBookDesc()%></td> <td><%=book.getBookType()%></td> </tr> <% } %> </table> </body> </HTML>
-
2.开发详解
2.1JSP与servlet
- JSP和servlet一样可以接收客户端请求,并响应一个动态网页
- JSP是对servlet的一种高级封装,一个JSP文件底层就是一个servlet类
- JSP文件需要依赖服务器运行,当客户端请求一个JSP文件时,JSP文件会在服务器中转换成servlet来执行
- 使用JSP的必要性
- 我们将动态网页显示使用JSP完成,在HTML标签中嵌入java代码的形式开发动态网页更为便捷
2.2语法规范
2.2.1JSP文档规范
-
JSP文件和HTML文档一样是一个视图文件,JSP文件创建在项目的web目录
-
JSP文件以.JSP后缀名结尾
-
JSP文档内容结构
-
在JSP文件的第一行需要通过<% page %>声明使用java语言
<%@ page contentType="text/HTML;charset=UTF-8" language="java" %>
-
JSP文件的主体内容是一个HTML文档,符合HTML的文档规范
-
2.2.2Java脚本
-
JSP页面可以嵌入java代码,java代码就是这个页面的脚本
-
java代码:在JSP中的java代码必须写在<%%>中
-
代码可以写在JSP文件的任何位置,可以包含多段代码
-
变量输出
<%=输入的代码%>
-
声明成员变量和方法
<%! int i = 5; %> <%! public void method(){ } %>
-
2.2.3JSP注释
<%-- JSP文档注释,这种注释不会出现在JSP编译之后的java代码中 --%>
<!-- HTML文档注释,这种注释会出现在JSP编译之后的java代码中 --!>
2.3.4JSP编译指令
-
<%@ page &>:声明当前JSP页面在web容器中的配置引用
标签属性 说明 示例 contenType 声明当前JSP文档的MIME类型和字符集编码 contentType="text/html;charset=UTF-8" language 定义JSP中所用的脚本语言类型(默认java) language="java" import 声明当前JSP中的java代码依赖的类 import="java.util.List" pageEncoding 声明当前JSP文档的解码格式 pageEncoding="UTF-8" errorPage 如果当前JSP出现异常则跳转到errorPage指向的页面 errorPage="error.jsp" isEoorPage 定义当前页面是否可以作为错误页面 isEoorPage="true -
<%@ include %>
-
在当前JSP中引用其他的资源(JSP/HTML)作为当前JSP的一部分,被引入的页面不会单独作为一个JSP编译,而是将引入的页面中的代码插入到当前JSP之后作为一个整体进行编译
-
被引入的页面只需要是一个HTML片段即可
<p>直接编写HTML代码即可,不需要body,head等标签</p>
- 静态引入:将被页面引入到当前JSP之后再进行整体的编译,被引入的页面不会单独编译
-
-
<%@ taglib %>:引用第三方标签库,扩展JSP文件中的标签
2.3.5JSP动作指令
- 在JSP文件中,除了支持标准的HTML标签库和编译指令之外,还支持JSP特有的动作指令(动作标签)
- 动作指令:在JSP中以JSP:开头的,正在JSP页面运行期间执行的指令
-
jsp:include
-
动态引入JSP文件:被引入的JSP文件先单独编译执行,将执行的结果引入到当前的JSP文件
-
因为被引入的JSP页面需要独立的编译执行,因此被引入的页面需要是一个完整的JSP文件
-
在动态引入的页面中不能访问主页面中定义的java变量
-
静态引入和动态引入的区别
静态引入:使用<%@include file=""%>编译指令将HTML或者JSP页面引入到当前文件,静态引入是先引入再执行,因此被引入的页面可以是一个HTML片段, 也可在被引入的页面中访问主页面定义的Java变量;
动态引入:使用<jsp:include page="" />动作指令将JSP页面引入到当前文件,动态引入是先独立编译执行被引入的页面,将执行结果引入到当前页面,被引入的页面需要独立执行因此必须是一个完成的JSP, 同时在被引入的JSP中不能访问主页面定,义的Java变量。
-
-
jsp:useBean
-
在JSP页面中构造java对象
Book book = new Book();相当于 <jsp:useBean id="book" class="Fast.Book"></jsp:useBean>
-
id:创建的对象的变量名
-
class:类的全限定名
-
-
jsp:setProperty
-
给创建的java对象属性赋值
book.setBookId("001");相当于 <jsp:setProperty name="book" property="bookId" value="001"></jsp:setProperty>
-
name:对象的变量名
-
property:对象的属性名
-
values:属性的值
-
-
jsp:getProperty
- 获取java对象属性的值
book.getBookId("001");相当于 <jsp:getProperty name="book" property="001"></jsp:getProperty>
- name:对象的变量名
- property:对象的属性名
-
jsp:forward
-
用于转发客户端请求
<jsp:forward page="text2.jsp" ></jsp:forward>
page="转发到的客户端路径"
-
-
jsp:param
-
在JSP页面转发过程中进行参数传递
<jsp:forward page="text2.jsp" > <jsp:param name="name" value="张三"></jsp:param> </jsp:forward>
-
2.3内置对象
-
一个JSP文件在让我去上是转换成Java文件(Servlet类)编译执行的,我们在JSP文件中嵌入的Java代码都会转换到中国Java文件的方法中(_jspService),因此这个方法的参数,方法中定义的变量以及当前类继承的父类中定义的变量,我们的代码都可以使用
-
在JSP中编写Java代码可以不用创建,直接使用的对象我们称之为JSP内置对象
对象名 类型 描述 request javax.servlet.HttpServletRequest 表示客户端请求对象,用户获取HTTP请求信息 response javax.servlet.HttpServletResponse 表示服务器对客户端的响应对象.用于将JSP处理的数据响应给客户端 session javax.servlet.HttpServletSession 表示当前客户端与服务器的会话对象 application javax.servlet.ServletApplication 表示web应用在服务器上的全局对象 config javax.servlet.ServletConfig 表示当前Servlet类的配置信息 pageContext javax.servlet.jsp.PageContext 当前JSP的上下文,可以获取当前JSP的任何信息 out javax.servlet.jsp.JspWriter 指向当前JSP文档的输出流 exception java.lang.Throwable 只有在设置了isErrorPage="true"的JSP可使用 page java.lang.Object 当前JSP转换的servlet类的实例,相当于this
2.4域对象
- 可以用来存储数据的对象称为域对象
2.4.1pageContext
-
pageContext对象只作用于当前JSP文件
2.4.2request
-
request对象作用于一次请求
2.4.3session
-
session对象作用于用户一次连接的多次请求
2.4.4application
-
application实际上就是servletContext,作用于一个web应用的所有用户