1. 程式人生 > >不會框架不要緊,我帶你自定義框架

不會框架不要緊,我帶你自定義框架

不會框架不要緊,我帶你自定義框架

前言:這標題說的有點大了,當一回標題黨,之前在學JSP的時候提到了JSTL和EL表示式,由於一直鍾情於Servlet,遲遲沒有更新別的,這回算是跳出來了。這回放個大招,用Spring+SpringMVC+Spring Jdbc Template,實現一個增刪改查加分頁,但重點不在這,我的重心在於JSTL和EL表示式,標題雖然有點大,但話糙理不糙,我真的是要自定義框架,當然,這個框架可大可小,大的我不敢說,用JSTL自定義標籤封裝個分頁還是可以的,也算補上JSTL和EL表示式的學習吧。對於那些一直跟著我跟新部落格腳步的朋友,我提醒你們不要著急,你要是好奇就可以先試著跟著我的案例試試手,不要看到SSM框架就說還沒學,不會啥的,哈哈,開玩笑,都沒學怎麼可能會呢,我說了,這篇的重點在於JSTL和EL表示式,重要的話說了不下三遍了,至於附加的SSM,我會持續跟新,會手把手帶你理解的,別急,別急,就當先認識一下SSM吧。

 

 

環境準備

我用的開發工具是IDEA,如果有不會用IDEA的朋友可以看之前寫過的部落格《IDEA新手使用教程》,我建的這是一個Maven專案,如果有朋友不知道Maven,可以先看一下我之前寫的介紹Maven的部落格《Maven》,不知道如何配置Maven環境的可以看《Maven的安裝與配置》https://www.cnblogs.com/zyx110/p/10801666.html不知道如何在IDEA中建Maven專案的朋友可以看《IDEA為新手專業打造》,此案例還會用到Tomcat,同樣,不會在IDEA中配置Tomcat的朋友可以看《IDEA為新手專業打造》,好,完成這些,就可以開始敲程式碼了。

 

 

 

用JSTL封裝框架

寫之前先簡單介紹一下JSTL和EL表示式:

JSTL簡介及環境搭建

什麼是JSTL

JSTL是Java中的一個定製標記庫集

為什麼要使用JSTL

實現了JSP頁面中的程式碼複用,基於標籤庫原理,重複率較高的程式碼塊支援複用,提高效率

書寫JSP頁面時可讀性更強,長得很像XML,方便前端檢視和參與開發

舉例:


 
不同角色使用者登入時顯示不同提示資訊

 

需要匯入的JSTL模組

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>

 

  

 

EL表示式配合使用JSTL

第一個JSTL小程式

在JSP頁面中匯入JSTL標籤庫

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

  

 

使用out標籤輸出

<c:out value="Hello JSTL"></c:out>

  

JSTL標籤的四大分類:核心標籤、格式化標籤、SQL標籤、XML標籤EL表示式

  • EL表示式全名為Expression Language,經常與JSTL配合使用,使得JSP頁面更直觀,寫法更簡單。

普通表示式的寫法: <%=session.getValue("name") %>

EL表示式寫法:  <c:out value="${sessionScope.name}" />

  • EL表示式的格式

用美元符號“$”定界,內容包括在花括號“{ }”中;

  • "."與"[ ]"運算子

²  通常情況是通用的${user.sex}或${user["sex"]}

²  "[ ]"還可以用來進行集合元素中的定位${booklist[0].price}

²  當包含特殊字元時,必須使用"[ ]",例如:${user["first-name"]}

²  通過變數動態取值:${user[param]},例如:param可以是name/sex/others

EL變數

 

 

EL自動型別轉換

 

 

EL隱式物件

 

 

EL運算子

 

 

 

JSP自定義標籤

什麼是自定義標籤

在實際開發過程中不能出現大量的html+java程式碼相混合的jsp頁面,但是有時候jsp標籤和第三方標籤滿足不了正常的開發工作,這就需要開發人員將業務邏輯封裝到符合jsp規範的類或介面中,來自己定義標籤從而滿足不同的開發需求。這樣做的缺點是會加重開發的工作量,但在開發過程中簡化了前後端的溝通,便於後期的維護,這點工作量也是微不足道的。我們可以自己定義一套標籤機制,讓完全不懂寫程式碼的人開發一套網站出來。

開發第一個自定義標籤

案例場景:

在頁面中顯示當前時間,格式:“當前時間為:2017年8月1日 10:30:50”

  • 如果使用傳統的jsp指令碼開發,程式碼如下:
<%

SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

String date = sdf.format(new Date());

%>

當前時間為:<%=date %>

  


 顯示結果:

 

 

  • 下面使用自定義標籤庫來實現這個案例

第一步:編寫自定義標籤的業務邏輯處理類

 

 

DateTag
package utils;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTag extends TagSupport {
    private String format="yyyy-MM-dd HH:mm:ss";
    private String color="blue";
    private String fontSize="12px";

    public void setFormat(String format) {
        this.format = format;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void setFontSize(String fontSize) {
        this.fontSize = fontSize;
    }

    public int doStartTag() throws JspException {
        //自定義業務
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        String date = simpleDateFormat.format(new Date());

        String htmlshow = "<p class='' style='font-size:"+fontSize+";color:"+color+"'>"+date+"</p>";

        try {
            pageContext.getOut().print(htmlshow);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return super.doStartTag();
    }
}

  

第二步:在WEB-INF目錄下編寫*.tld檔案註冊標籤

 

 

 

格式模板

datetag.tld

 

<?xml version="1.0" encoding="utf-8"?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">

    <tlib-version>1.0</tlib-version>
    <short-name>myshortname</short-name>
    <uri>http://mycompany.com</uri>

    <tag>
        <name>date</name>
        <tag-class>utils.DateTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>format</name>
            <required>false</required>
        </attribute>
        <attribute>
            <name>color</name>
            <required>false</required>
        </attribute>
        <attribute>
            <name>fontSize</name>
            <required>false</required>
        </attribute>

    </tag>

</taglib>

  

 

JSP顯示

 

 

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="z" uri="http://mycompany.com" %>
<%@ taglib prefix="c" uri="http://mycompany.com" %>
<html>
<head>
    <title>顯示時間</title>
</head>
<body>
<h1>index.jsp</h1>
<c:date/>
</body>
</html>

 

 

  

 

 

 

Spring+SpringMVC+Spring Jdbc Template

資料庫結構

 

 

專案結構

 

 

 

Pom.xml

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
  <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
  </dependency>
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.38</version>
  </dependency>
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
    <version>1.2</version>
  </dependency>
  <!--Spring核心基礎依賴-->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-expression</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.0.2.RELEASE</version>
  </dependency>
  <!--日誌相關-->
  <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.2</version>
  </dependency>
</dependencies>

 

  

 

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app>

  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!--處理中文亂碼-->
  <filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <!--設定訪問靜態資源-->
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.css</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.png</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.gif</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.mp3</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.mp4</url-pattern>
  </servlet-mapping>

</web-app>

  

 

 

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
        ">
 

    <!--配置註解要掃描的包-->
    <context:component-scan base-package="controller"></context:component-scan>
    <context:component-scan base-package="dao"></context:component-scan>
    <context:component-scan base-package="Service"></context:component-scan>
    <context:component-scan base-package="pojo"></context:component-scan>
    <context:component-scan base-package="utils"></context:component-scan>
    <context:component-scan base-package="test"></context:component-scan>
    <mvc:annotation-driven></mvc:annotation-driven>

    <!--配置spring-jdbcTemplate-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/bbb?useUnicode=true&characterEncoding=UTF-8"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--配置事務-->
    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!--註冊事務註解驅動-->
    <tx:annotation-driven transaction-manager="txManager"></tx:annotation-driven>

    <!--配置訪問靜態資源-->
    <mvc:resources mapping="/js/**" location="/js/"></mvc:resources>
    <mvc:resources mapping="/css/**" location="/css/"></mvc:resources>
    <mvc:resources mapping="/img/**" location="/img/"></mvc:resources>

    <!--配置檢視解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--配置字首-->
        <property name="prefix" value="/"></property>
        <!--配置字尾-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--建立檔案上傳元件物件-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
</beans>

 

  

 

Book

package pojo;

public class Book {
    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", bookname='" + bookname + '\'' +
                ", price=" + price +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getBookname() {
        return bookname;
    }

    public void setBookname(String bookname) {
        this.bookname = bookname;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    private int id;
    private String bookname;
    private int price;


}

 

  

PageBean

package pojo;

import java.util.List;

public class PageBean<T> {

    private int pageCode;//當前頁碼
    private int totalPage;//總頁數
    private int count;//總記錄數
    private int pageSize;//每頁記錄數
    private List<T> pageList;//每頁的資料


    public PageBean(int pageCode, int pageSize, int count, List<T> pageList) {
        this.pageCode = pageCode;
        this.count = count;
        this.pageSize = pageSize;
        this.pageList = pageList;
    }

    public PageBean() {
    }

    public int getPageCode() {
        return pageCode;
    }

    public void setPageCode(int pageCode) {
        this.pageCode = pageCode;
    }

    public int getTotalPage() {
        int tp = count/pageSize;
        return count%pageSize==0 ? tp : tp+1;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public List<T> getPageList() {
        return pageList;
    }

    public void setPageList(List<T> pageList) {
        this.pageList = pageList;
    }
}

 

  

 

BookDao

package dao;

import pojo.Book;

import java.util.List;

public interface BookDao {
    public List<Book> findByPage(int pageCode,int pageSize);
    public int count();
}

 

  

BookDaoImpl

package dao;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import pojo.Book;

import java.util.List;
@Repository
public class BookDaoImpl implements BookDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public List<Book> findByPage(int pageCode, int pageSize) {
        String sql = "select * from book limit ?,?";
        Object[] param = {(pageCode-1)*pageSize,pageSize};
        return jdbcTemplate.query(sql,new BeanPropertyRowMapper<Book>(Book.class),param);
    }

    @Override
    public int count() {
        String sql = "select count(*) from book";
        return jdbcTemplate.queryForObject(sql,Integer.class);
    }
}

  

 

BookService

package Service;

import pojo.Book;
import pojo.PageBean;

public interface BookService {
    public PageBean<Book> findByPage(int pageCode,int pageSize);
}

 

  

BookServiceImpl

package Service;

import dao.BookDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pojo.Book;
import pojo.PageBean;
@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookDao bookDao;

    @Override
    public PageBean<Book> findByPage(int pageCode, int pageSize) {
        return new PageBean<Book>(pageCode,pageSize,bookDao.count(),bookDao.findByPage(pageCode,pageSize));
    }
}

 

  

 

BookController

package controller;

import Service.BookService;
import com.sun.org.apache.xml.internal.resolver.readers.XCatalogReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.Book;
import pojo.PageBean;
import utils.RequestPage;

@Controller
@RequestMapping("/book")
public class BookController {
    @Autowired
    private BookService bookService;

    @RequestMapping("/query")
    public String findByPage(Integer page, Model model){
        page = RequestPage.getPage(page);//判斷是否為空
        PageBean<Book> pageBean = bookService.findByPage(page,RequestPage.PAGE_SIZE);
        model.addAttribute("pageBean",pageBean);

        return "book";
    }


}

  

 

DateTag

package utils;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateTag extends TagSupport {
    private String format="yyyy-MM-dd HH:mm:ss";
    private String color="blue";
    private String fontSize="12px";

    public void setFormat(String format) {
        this.format = format;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public void setFontSize(String fontSize) {
        this.fontSize = fontSize;
    }

    public int doStartTag() throws JspException {
        //自定義業務
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        String date = simpleDateFormat.format(new Date());

        String htmlshow = "<p class='' style='font-size:"+fontSize+";color:"+color+"'>"+date+"</p>";

        try {
            pageContext.getOut().print(htmlshow);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return super.doStartTag();
    }
}

 

  

PageTag

package utils;

import pojo.PageBean;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
import java.io.IOException;

public class PageTag extends TagSupport {


    private PageBean pageBean;
    private String url;

    public void setUrl(String url) {
        this.url = url;
    }

    public void setPageBean(PageBean pageBean) {
        this.pageBean = pageBean;
    }

    @Override
    public int doStartTag() throws JspException {

        try {
            StringBuffer sb = new StringBuffer();
            //首頁
            sb.append("<a href=\"" + url + "?page=1\">首頁</a> ");
            //上一頁
            if (pageBean.getPageCode() <= 1) {
                sb.append("<span style=\"color: #555;\">上一頁</span> ");
            } else {
                sb.append("<a href=\"" + url + "?page=" + (pageBean.getPageCode() - 1) + "\">上一頁</a> ");
            }

            //顯示頁碼
            int begin, end;
            if (pageBean.getTotalPage() <= 10) {
                begin = 1;
                end = pageBean.getTotalPage();
            } else {
                begin = pageBean.getPageCode() - 5;
                end = pageBean.getPageCode() + 4;
                if (begin < 1) {
                    begin = 1;
                    end = 10;
                } else if (end > pageBean.getTotalPage()) {
                    begin = pageBean.getTotalPage() - 9;
                    end = pageBean.getTotalPage();
                }
            }

            for (int i = begin; i <= end; i++) {
                if (i == pageBean.getPageCode()) {
                    sb.append("<span style=\"color:red;\">" + i + "</span> ");
                } else {
                    sb.append("<a href=\"" + url + "?page=" + i + "\">[" + i + "]</a> ");
                }
            }

            //下一頁
            if (pageBean.getPageCode() >= pageBean.getTotalPage()) {
                sb.append("<span style=\"color: #555;\">下一頁</span>");
            } else {
                sb.append("<a href=\"" + url + "?page=" + (pageBean.getPageCode() + 1) + "\">下一頁</a> ");
            }
            //尾頁
            sb.append("<a href=\"" + url + "?page=" + pageBean.getTotalPage() + "\">尾頁</a> \n" +
                    "    頁碼" + pageBean.getPageCode() + "/" + pageBean.getTotalPage());

            pageContext.getOut().print(sb.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }

        return super.doStartTag();
    }
}

 

 

RequestPage
package utils;

public class RequestPage {
    public static final int PAGE_SIZE =5;

    public static Integer getPage(Integer page){
        if (page==null||page<1){
            page=1;
        }

        return page;
    }

}

  

datetag.tld

<?xml version="1.0" encoding="utf-8"?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">

    <tlib-version>1.0</tlib-version>
    <short-name>myshortname</short-name>
    <uri>http://mycompany.com</uri>

    <tag>
        <name>date</name>
        <tag-class>utils.DateTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>format</name>
            <required>false</required>
        </attribute>
        <attribute>
            <name>color</name>
            <required>false</required>
        </attribute>
        <attribute>
            <name>fontSize</name>
            <required>false</required>
        </attribute>

    </tag>
    <tag>
        <name>page</name>
        <tag-class>utils.PageTag</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>pageBean</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>url</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>

</taglib>

 

  

 

book.jsp

 

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="z" uri="http://mycompany.com" %>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/book.css">
<html>
<head>
    <title>圖書</title>
</head>
<body>
<h1 align="center">圖書列表</h1>
<hr>
<table>
    <tr>
        <th>ID</th>
        <th>書名</th>
        <th>價格</th>

    </tr>
    <c:forEach var="book" items="${pageBean.pageList}">
        <tr>
            <td>${book.id}</td>
            <td>${book.bookname}</td>
            <td>${book.price}</td>
        </tr>
    </c:forEach>
</table>
<div id="page">
    <z:page url="${pageContext.request.contextPath}/book/query" pageBean="${pageBean}"></z:page>
</div>
</body>
</html>

 

  

 

執行顯示

 

 

 

 

 

 

分享結束

後面我會持續分享SSM框架知識,欲知後文如何,請看下回分解

*****************************************************************************************************

我的部落格園地址:https://www.cnblogs.com/zyx110/

轉載請說明出處

我不能保證我所說的都是對的,但我能保證每一篇都是用心去寫的,我始終認同“分享的越多,你的價值增值越大”,歡迎大家關注我的技術分享“Java匹馬行天下”和學習心得分享“匹馬行天下”,在分享中進步,越努力越幸運,人生贏在轉折處,改變從現在開始!

支援我的朋友們記得點波推薦哦,您的肯定就是我前進的動力。

 

&n