首页 > 编程语言 >javaweb5

javaweb5

时间:2022-12-09 18:55:45浏览次数:52  
标签:java book JSP 引入 javaweb5 servlet 页面

JSP

1.产生

1.1servlet的不足

  • Servlet是一个动态网页技术,客户端通过请求Servlet类可以相应给客户端一个动态网页, 但是Servlet在使用过程中有什么不足之处呢?
    1. 开发方式麻烦:继承HttpServlet父类、 重写doGet/doPost. Servlet配置
    2. 项目更新麻烦: Servlet类中的代码发生改变,需要重新编译、部署、启动Tomcat
    3. 网页呈现复杂:需要进行HTML标签拼接,同时要通过输出流逐行打印
    4. 协同开发困难:负责页面美化,但是页面是由Servlet类提供, 如果W不懂Java、则不能完成Servlet响应的页面的优化

1.2JSP介绍

  • JSP(Java Server Page)基础servlet技术,运行在服务器之上,支持java语言的动态网页技术
  • 简化了servlet的设计,采用在HTML标签中嵌套代码的形式进行动态网页的呈现,可以高效开发web应用的动态网页
  • 替换显示页面部分的servlet(使用.JSP网页文件替换PageServlet.java类)

1.3JSP入门案例

1.3.1案例准备

  1. 创建web项目

  2. 完成JDBC的准备

    • 导入jar包:MySQL驱动,druid.jar和dbutils包
  3. 创建数据库表

    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数据库操作

  1. 创建文件保存配置连接池参数

    # 数据库连接信息
    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
    
  2. 创建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;
        }
    }
    
    
  3. 创建实体类

    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有参无参
    }
    
    
  4. 创建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呈现动态网页

  1. 接收客户端的请求,查询图书信息,将图书信息转发到一个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);
        }
    }
    
    
  2. 创建JSP页面

    1. 右击web目录->新建->JSP/JSPX

      与HTML基本一致,只不过有了一行HTML无法识别的代码

      <%@ page contentType="text/HTML;charset=UTF-8" language="java" %>
      <HTML>
      <head>
          <title>JSP入门案例</title>
      </head>
      <body>
      </body>
      </HTML>
      
    2. 也可以编写java代码,但是要写在<%%>里面

      <%java代码%>
      
    3. 动态显示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

  1. JSP和servlet一样可以接收客户端请求,并响应一个动态网页
  2. JSP是对servlet的一种高级封装,一个JSP文件底层就是一个servlet类
  3. JSP文件需要依赖服务器运行,当客户端请求一个JSP文件时,JSP文件会在服务器中转换成servlet来执行
  4. 使用JSP的必要性
    • 我们将动态网页显示使用JSP完成,在HTML标签中嵌入java代码的形式开发动态网页更为便捷

2.2语法规范

2.2.1JSP文档规范

  1. JSP文件和HTML文档一样是一个视图文件,JSP文件创建在项目的web目录

  2. JSP文件以.JSP后缀名结尾

  3. JSP文档内容结构

    1. 在JSP文件的第一行需要通过<% page %>声明使用java语言

      <%@ page contentType="text/HTML;charset=UTF-8" language="java" %>
      
    2. JSP文件的主体内容是一个HTML文档,符合HTML的文档规范

2.2.2Java脚本

  • JSP页面可以嵌入java代码,java代码就是这个页面的脚本

    1. java代码:在JSP中的java代码必须写在<%%>

    2. 代码可以写在JSP文件的任何位置,可以包含多段代码

    3. 变量输出

      <%=输入的代码%>
      
    4. 声明成员变量和方法

      <%! int i = 5; %>
      <%! public void method(){
          
      }
      %>
      

2.2.3JSP注释

<%--  JSP文档注释,这种注释不会出现在JSP编译之后的java代码中 --%>
<!-- HTML文档注释,这种注释会出现在JSP编译之后的java代码中 --!>

2.3.4JSP编译指令

  1. <%@ 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
  2. <%@ include %>

    1. 在当前JSP中引用其他的资源(JSP/HTML)作为当前JSP的一部分,被引入的页面不会单独作为一个JSP编译,而是将引入的页面中的代码插入到当前JSP之后作为一个整体进行编译

    2. 被引入的页面只需要是一个HTML片段即可

      <p>直接编写HTML代码即可,不需要body,head等标签</p>
      
      • 静态引入:将被页面引入到当前JSP之后再进行整体的编译,被引入的页面不会单独编译
  3. <%@ taglib %>:引用第三方标签库,扩展JSP文件中的标签

2.3.5JSP动作指令

  • 在JSP文件中,除了支持标准的HTML标签库和编译指令之外,还支持JSP特有的动作指令(动作标签)
  • 动作指令:在JSP中以JSP:开头的,正在JSP页面运行期间执行的指令
  1. jsp:include

    1. 动态引入JSP文件:被引入的JSP文件先单独编译执行,将执行的结果引入到当前的JSP文件

    2. 因为被引入的JSP页面需要独立的编译执行,因此被引入的页面需要是一个完整的JSP文件

    3. 在动态引入的页面中不能访问主页面中定义的java变量

    4. 静态引入和动态引入的区别

      静态引入:使用<%@include file=""%>编译指令将HTML或者JSP页面引入到当前文件,静态引入是先引入再执行,因此被引入的页面可以是一个HTML片段, 也可在被引入的页面中访问主页面定义的Java变量;

      动态引入:使用<jsp:include page="" />动作指令将JSP页面引入到当前文件,动态引入是先独立编译执行被引入的页面,将执行结果引入到当前页面,被引入的页面需要独立执行因此必须是一个完成的JSP, 同时在被引入的JSP中不能访问主页面定,义的Java变量。

  2. jsp:useBean

    • 在JSP页面中构造java对象

      Book book = new Book();相当于
      <jsp:useBean id="book" class="Fast.Book"></jsp:useBean>
      
    • id:创建的对象的变量名

    • class:类的全限定名

  3. jsp:setProperty

    • 给创建的java对象属性赋值

      book.setBookId("001");相当于
      <jsp:setProperty name="book" property="bookId" value="001"></jsp:setProperty>
      
    • name:对象的变量名

    • property:对象的属性名

    • values:属性的值

  4. jsp:getProperty

    • 获取java对象属性的值
    book.getBookId("001");相当于
    <jsp:getProperty name="book" property="001"></jsp:getProperty>
    
    • name:对象的变量名
    • property:对象的属性名
  5. jsp:forward

    • 用于转发客户端请求

      <jsp:forward page="text2.jsp" ></jsp:forward>
      

      page="转发到的客户端路径"

  6. 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文件

    image-20221208204540887

2.4.2request

  • request对象作用于一次请求

    image-20221208204501146

2.4.3session

  • session对象作用于用户一次连接的多次请求

    image-20221208204114593

2.4.4application

  • application实际上就是servletContext,作用于一个web应用的所有用户

    image-20221208204350281

标签:java,book,JSP,引入,javaweb5,servlet,页面
From: https://www.cnblogs.com/Myvlog/p/16969754.html

相关文章

  • JavaWeb505错误,IDEA版问题解决
    问题描述:在学习JavaWeb的过程中,使用JSP文件转至servlet文件的过程中,发现无论如何都无法打开文件JSP文件代码<%@pagecontentType="text/html;charset=UTF-8"%><!DOCTY......
  • JavaWeb5 JDBC
       packagecom.itheima.jdbc;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLOutput;importjava.sql.Statement;publi......