jdbc+servlet+jsp來寫個mysql分頁案例

一、項目使用到的內容

jsp servlet bootstrap3 jdk6 tomcat6 jstl標籤庫 EL表達式語言 mysql 5.5 eclipse(Neon)

二、項目的目錄結構

在這裏插入圖片描述
第三方的架包文件
在這裏插入圖片描述

三、主要的代碼

  • 1、數據文件subwayinfo.sql
USE `test`;
DROP TABLE IF EXISTS `subwayinfo`;
CREATE TABLE `subwayinfo` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '編號',
  `subwayname` varchar(50) NOT NULL COMMENT '線路名稱',
  `start_station` varchar(50) NOT NULL COMMENT '始發站',
  `end_station` varchar(50) NOT NULL COMMENT '終點站',
  `station_num` int(10) NOT NULL COMMENT '途徑站點數',
  `start_time` varchar(50) DEFAULT '--' COMMENT '發車時間',
  `price` int(11) DEFAULT '2' COMMENT '票價',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (1,'1號線','蘋果園','四惠東',23,'5:10',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (2,'2號線','西直門','西直門',18,'5:09',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (3,'4號線','安河橋北','公益西橋',24,'5:00',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (4,'5號線','天通苑北','安家莊',23,'4:50',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (5,'8號線','北土城','回龍觀東大街',10,'5:33',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (6,'測試線路1','黃金口','漢口火車站',22,'5:00',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (7,'1號線','蘋果園','四惠東',23,'5:10',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (8,'2號線','西直門','西直門',18,'5:09',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (9,'4號線','安河橋北','公益西橋',24,'5:00',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (10,'5號線','天通苑北','安家莊',23,'4:50',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (11,'8號線','北土城','回龍觀東大街',10,'5:33',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (12,'測試線路1','黃金口','漢口火車站',22,'5:00',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (13,'1號線','蘋果園','四惠東',23,'5:10',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (14,'2號線','西直門','西直門',18,'5:09',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (15,'4號線','安河橋北','公益西橋',24,'5:00',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (16,'5號線','天通苑北','安家莊',23,'4:50',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (17,'8號線','北土城','回龍觀東大街',10,'5:33',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (18,'測試線路1','黃金口','漢口火車站',22,'5:00',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (19,'1號線','蘋果園','四惠東',23,'5:10',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (20,'2號線','西直門','西直門',18,'5:09',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (21,'4號線','安河橋北','公益西橋',24,'5:00',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (22,'5號線','天通苑北','安家莊',23,'4:50',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (23,'8號線','北土城','回龍觀東大街',10,'5:33',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (24,'測試線路1','黃金口','漢口火車站',22,'5:00',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (25,'1號線','蘋果園','四惠東',23,'5:10',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (26,'2號線','西直門','西直門',18,'5:09',2);
insert  into `subwayinfo`(`id`,`subwayname`,`start_station`,`end_station`,`station_num`,`start_time`,`price`) values (27,'4號線','安河橋北','公益西橋',24,'5:00',2);
  • 2、bean包下的文件

第一個文件SubwayInfo.java

package top.linksinke.bean;

/**
 * subwayinfo表對應的實體類<br/>
 * create by LINKSINKE on 2020/3/11
 */
public class SubwayInfo implements java.io.Serializable {
	private static final long serialVersionUID = -8471088390616186369L;
	
	private Long id;// 線路編號
	private String subwayname;// 線路名稱
	private String start_station; // 始發站
	private String end_station;// 終點站
	private Integer station_num;// 途徑站點數
	private String start_time; // 發車時間
	private Double price;// 票價
	
	public SubwayInfo() { super();  }

	@Override
	public String toString() {
		return "SubwayInfo [id=" + id + ", subwayname=" + subwayname + ", start_station=" + start_station
				+ ", end_station=" + end_station + ", station_num=" + station_num + ", start_time=" + start_time
				+ ", price=" + price + "]";
	}

	public Long getId() { 	return id; }
	public void setId(Long id) { this.id = id; }
	public String getSubwayname() { 	return subwayname; }
	public void setSubwayname(String subwayname) { this.subwayname = subwayname; 	}
	public String getStart_station() { return start_station; 	}
	public void setStart_station(String start_station) { 	this.start_station = start_station; 	}
	public String getEnd_station() { 	return end_station; 	}
	public void setEnd_station(String end_station) { this.end_station = end_station; 	}
	public Integer getStation_num() { 	return station_num; }
	public void setStation_num(Integer station_num) { this.station_num = station_num; }
	public String getStart_time() { return start_time; 	}
	public void setStart_time(String start_time) { 	this.start_time = start_time; 	}
	public Double getPrice() { 	return price; }
	public void setPrice(Double price) { this.price = price; 	}
}

第二個文件PageInfo.java

package top.linksinke.bean;

/**
 * 分頁信息實體類<br/>
 * create by LINKSINKE on 2020/3/11
 */
public class PageInfo {
	private Integer currentPage; // 當前是多少頁
	private Integer startNo;// 起始條數
	private Integer endNo;// 結束條數
	private Integer backPageNo; // 上一頁
	private Integer nextPageNo; // 下一頁
	private Integer totalData; // 總的數據量
	private Integer totalPage; // 總的分頁數量
	private Integer pageSize; // 每頁顯示多少條數據量

	public PageInfo() { super(); }
	/**
	 * 取得分頁信息
	 * 
	 * @param currentNo
	 *            當前的頁碼
	 * @param totalData
	 *            總共的數據量
	 * @param pageSize
	 *            每頁顯示的數據量
	 */
	public PageInfo(Integer currentPage, Integer totalData, Integer pageSize) {
		super();
		this.currentPage = currentPage;
		this.totalData = totalData;
		this.pageSize = pageSize;
		/**
		 * 總的分頁數量<br>
		 * 總的數據量除以每頁顯示的數量,如果結果不爲0,就增加一頁
		 */
		this.totalPage = totalData % pageSize == 0 ? totalData / pageSize : totalData / pageSize + 1;

		/**
		 * 每頁最開始的一條數據<br>
		 * 例如:顯示第一頁,每頁五條數據,那麼語法是:limit 0,5<br>
		 * 顯示第二頁,每頁五條數據,那麼語法是: limit 5,5<br>
		 * 顯示第三頁,每頁五條數據,那麼語法是: limit 10,5<br>
		 * <p>
		 * 每一頁顯示的數量是一樣的,即不會發生改變的<br>
		 * 而當前的頁會發生改變,比如到第二頁、第三頁,其開始頁的結果也會有所不同
		 * 可以看出每次翻一頁就等於上一頁的累計頁面顯示的數量
		 * </p>
		 */
		this.startNo = (currentPage - 1) * pageSize;

		/**
		 * 每頁最後面的一條數據<br>
		 * 例如:顯示第一頁,每頁五條數據,那麼語法是:limit 0,5<br>
		 * 顯示第二頁,每頁五條數據,那麼語法是: limit 6,5<br>
		 * 顯示第三頁,每頁五條數據,那麼語法是: limit 10,5<br>
		 * 所以可以得到最後一條數據總是等於每頁顯示的大小
		 */
		this.endNo = pageSize;
		/**
		 * 上一頁<br>
		 * 假設當前頁是小於-1或者是直接爲1的,那麼就讓他等於1,要不然sql語法會發生錯誤
		 */
		this.backPageNo = currentPage <= 1 ? 1 : currentPage - 1;

		/**
		 * 下一頁<br>
		 * 假設當前頁沒有超出了總的頁面數據量,那麼就讓他繼續當前頁+1頁,超出則等於總的頁面數據量(注意判斷的順序)
		 */
		this.nextPageNo = currentPage < totalPage ?  currentPage + 1 : currentPage ;
	}

	@Override
	public String toString() {
		return "PageInfo [currentPage=" + currentPage + ", startNo=" + startNo + ", endNo=" + endNo + ", backPageNo="
				+ backPageNo + ", nextPageNo=" + nextPageNo + ", totalData=" + totalData + ", totalPage=" + totalPage
				+ ", pageSize=" + pageSize + "]";
	}

	public Integer getCurrentPage() { return currentPage; }
	public void setCurrentPage(Integer currentPage) { this.currentPage = currentPage; }
	public Integer getStartNo() { return startNo; }
	public void setStartNo(Integer startNo) { this.startNo = startNo; }
	public Integer getEndNo() { return endNo; }
	public void setEndNo(Integer endNo) { this.endNo = endNo; }
	public Integer getBackPageNo() { return backPageNo; }
	public void setBackPageNo(Integer backPageNo) { this.backPageNo = backPageNo; }
	public Integer getNextPageNo() { return nextPageNo; }
	public void setNextPageNo(Integer nextPageNo) { this.nextPageNo = nextPageNo; }
	public Integer getTotalData() { return totalData; }
	public void setTotalData(Integer totalData) { this.totalData = totalData; }
	public Integer getTotalPage() { return totalPage; }
	public void setTotalPage(Integer totalPage) { this.totalPage = totalPage; }
	public Integer getPageSize() { return pageSize; }
	public void setPageSize(Integer pageSize) { this.pageSize = pageSize; }
}
  • 3、dao包下的文件

SubwayInfoDao.java好像java面試題裏有關於手敲一個jdbc連接並寫個分頁這樣的題目,這個類應該算是核心的類吧。。。。。需要的可以直接借鑑該類

package top.linksinke.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import top.linksinke.bean.PageInfo;
import top.linksinke.bean.SubwayInfo;

public class SubwayInfoDao {
	// mysql連接地址,數據庫用戶和密碼
	private final String URL = "jdbc:mysql://localhost:3306/test";
	private final String USER = "root";
	private final String PASSWORD = "root";

	private Connection conn;// 連接
	private PreparedStatement ps; // sql執行者
	private ResultSet rs; // 返回的數據結果集

	/**
	 * @describe 關閉正在佔用的資源
	 * @throws SQLException SQL語句語法存在錯誤
	 */
	public void close() throws SQLException {
		// 如果結果集在使用中
		if (rs != null) {
			rs.close();// 關閉結果集
		}
		// 如果執行者還在執行過程中
		if (ps != null) {
			ps.close();// 關閉執行者
		}
		// 如果連接狀態是打開的情況
		if (conn != null) {
			conn.close();// 關閉連接
		}
	}

	/**
	 * 分頁查詢
	 * @param pageInfo
	 * @return SubwayInfo集合
	 */
	public List<SubwayInfo> searchByPage(PageInfo pageInfo) {
		Connection conn; // 連接源
		List<SubwayInfo> lis = new ArrayList<SubwayInfo>();
		try {
			// 1、加載mysql的驅動
			Class.forName("com.mysql.jdbc.Driver");

			// 2、獲得連接源
			conn = DriverManager.getConnection(URL, USER, PASSWORD);

			// 3、獲取sql執行者對象
			PreparedStatement ps = conn.prepareStatement("select * from subwayinfo limit ?,?");

			// 4、向sql中帶參數的,沒參數就不用準備下面的操作
			Object[] params = { pageInfo.getStartNo(), pageInfo.getEndNo() };
			for (int i = 0; i < params.length; i++) {
				ps.setObject(i + 1, params[i]);
			}

			// 5、執行者開始查詢數據庫數據並返回到結果集進行存儲
			ResultSet rs = ps.executeQuery(); // 結果集對象

			// 6、讀取數據
			while (rs.next()) { // rs如果存在下一條數據就開始循環
				// 將取出來的數據存放到集合中
				SubwayInfo subway = new SubwayInfo();
				subway.setId(rs.getLong("id"));
				subway.setSubwayname(rs.getString("subwayname"));
				subway.setStart_station(rs.getString("start_station"));
				subway.setEnd_station(rs.getString("end_station"));
				subway.setStation_num(rs.getInt("station_num"));
				subway.setStart_time(rs.getString("start_time"));
				subway.setPrice(rs.getDouble("price"));
				lis.add(subway);
			}

			// 7、返回最後的查詢結果
			return lis;

		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 取得數據庫的總數據量
	 * @return 總的數據量
	 */
	public Integer totalData() {
		Connection conn = null; // 連接源
		Integer count = null;
		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
			PreparedStatement ps = conn.prepareStatement("select count(1) from subwayinfo");
			ResultSet rs = ps.executeQuery();
			if (rs.next()) {
				count = rs.getInt(1);
			}
			return count;
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		return null;
	}

	// 方法測試
	public static void main(String[] args) {
		SubwayInfoDao dao = new SubwayInfoDao();
		System.out.println("總數據量" + dao.totalData());
		PageInfo pageInfo = new PageInfo(1, dao.totalData(), 5);
		List<SubwayInfo> info = dao.searchByPage(pageInfo);
		for (SubwayInfo subwayInfo : info) {
			System.out.println(subwayInfo);
		}
		System.out.println(pageInfo.toString());
	}
}

  • 4、servlet包下的文件

SubwayInfoServlet.java

package top.linksinke.servlet;

import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import top.linksinke.bean.PageInfo;
import top.linksinke.bean.SubwayInfo;
import top.linksinke.dao.SubwayInfoDao;

public class SubwayInfoServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		HttpSession session = req.getSession();
		String page = req.getParameter("pageNo");
		// 要是找不到pageNo參數或者沒有賦值就默認給值爲1
		if (page == null || "".equals(page)) {
			page = "1";
		}
		// 取得pageInfo信息
		Integer currentPage = Integer.valueOf(page);
		 SubwayInfoDao subwayInfoDao = new SubwayInfoDao();
		Integer totalData = subwayInfoDao.totalData();
		Integer pageSize = 5;
		PageInfo pageInfo = new PageInfo(currentPage, totalData, pageSize);

		// 取得subwayInfo信息
		List<SubwayInfo> subwayinfo = subwayInfoDao.searchByPage(pageInfo);
		
		// pageInfo和subwayInfo信息都存儲到session作用域中
		session.setAttribute("subwayinfo", subwayinfo);
		session.setAttribute("pageinfo", pageInfo);
		req.getRequestDispatcher("/index.jsp").forward(req, resp);// 轉發
	}
}
  • 5、WebContent目錄下的jsp文件

第一個chain.jsp,這個jsp的作用是,項目的發佈訪問後默認自行打開的頁面,發送一個請求到servlet來加載數據結果並返回一個新的頁面;

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<% response.sendRedirect(request.getContextPath() + "/display?pageNo=1"); %>

第二個index.jsp,這個頁面是chain.jsp請求成功後跳轉的頁面。

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head lang="zh-Hans-cmn">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>mysql分頁數據顯示</title>
<link rel="stylesheet" type="text/css" href="assets/bootstrap-3.3.7.css">
<link rel="stylesheet" type="text/css" href="assets/bootstrap-theme-3.3.7.css">
</head>
<body>
	<div class="container">
		<div class="row">
			<div class="col-md-12 col-lg-12">
				<div class="page-header">
					<h1>mysql分頁數據顯示</h1>
				</div>
				<table>
					<tr>
						<th>線路編號</th>
						<th>線路名稱</th>
						<th>始發站</th>
						<th>終點站</th>
						<th>途徑站點數</th>
						<th>發車時間</th>
						<th>票價</th>
					</tr>
					<c:forEach var="info" items="${sessionScope.subwayinfo }">
						<tr>
							<td>${info.id }</td>
							<td>${info.subwayname}</td>
							<td>${info.start_station}</td>
							<td>${info.end_station}</td>
							<td>${info.station_num}</td>
							<td>${info.start_time}</td>
							<td>${info.price}</td>
						</tr>
					</c:forEach>
				</table>
			</div>
		</div>
		<hr>
		<nav aria-label="Page navigation">
		<p>
			共計<span style="color:red;">${sessionScope.pageinfo.totalData }</span>條數據,當前是第<span style="color:red;">${sessionScope.pageinfo.currentPage }</span></p>
		<ul class="pagination">
			<li><a href="<%=basePath%>display?pageNo=1" aria-label="首頁">首頁 </a></li>
			<li><a href="<%=basePath%>display?pageNo=${sessionScope.pageinfo.backPageNo }" aria-label="上一頁">上一頁</a></li>
			<li><a href="<%=basePath %>display?pageNo=${sessionScope.pageinfo.nextPageNo }" aria-label="下一頁">下一頁</a></li>
			<li><a href="<%=basePath %>display?pageNo=${sessionScope.pageinfo.totalPage }" aria-label="尾頁"> 尾頁</a></li>
		</ul>
		</nav>
	</div>
</body>
<script type="text/javascript" src="assets/jquery-1.12.4.js"></script>
<script type="text/javascript" src="assets/bootstrap-3.3.7.js"></script>
</html>
  • 6、最後一個是web.xml,配置的就是servlet請求的內容
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>paging_mysql</display-name>

  <servlet>
  	<servlet-name>subwayinfo</servlet-name>
  	<servlet-class>top.linksinke.servlet.SubwayInfoServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>subwayinfo</servlet-name>
  	<url-pattern>/display</url-pattern>
  </servlet-mapping>
  
  <!-- 你說爲什麼默認就可以打開到chain.jsp呢,因爲源頭在這 -->
  <welcome-file-list>
    <welcome-file>chain.jsp</welcome-file>
  </welcome-file-list>
</web-app>

四、項目最終跑起來的效果

  • 先請求一下路徑,看有沒有問題
    比如:localhost:8080,看看tomcat是不是能正常訪問;
    比如:localhost:8080/paging_mysql/display,看看不給pageNo參數能否正常打開index.jsp
    比如:localhost:8080/paging_mysql,看攜帶pageNo參數默認是不是打開index.jsp
    在這裏插入圖片描述

  • 現在來看功能有沒有問題吧
    在這裏插入圖片描述
    功能基本沒問題,翻上一頁,下一頁,首頁,尾頁都可以

總結

好長時間沒有純手工寫jdbc訪問了,都是框架提供好一些方法自己直接配置就能用了

代碼下載

需要下載這篇文章的項目的話,請訪問該地址進行下載
https://download.csdn.net/download/qq_29001539/12241984

下載後可能遇到的問題

  • 項目要怎麼才能放入進來到我的ide裏呢?
    你可以從頭到尾的敲上一篇
    或者使用import菜單來導入項目
    1、找到import…,其他導入方式
    在這裏插入圖片描述
    2、其他的選項不用,用這個選項,該選項可以複製項目到你工具的工作空間裏,而不是引用該項目,好處是桌面上項目丟失了,該項目不會丟失
    在這裏插入圖片描述
    3、導入項目
    在這裏插入圖片描述

  • 數據庫訪問問題:
    mysql的版本過高,請更換mysql的驅動包
    mysql的連接發生錯誤,應該是mysql的root用戶密碼錯誤,或者你不是用的root用戶等

  • 項目出現紅叉叉:
    更換你工具裏的環境(以eclipse項目爲例)
    1、選擇該項目,快捷鍵alt+enter,打開項目配置窗口
    在這裏插入圖片描述
    2、修改項目的環境
    在這裏插入圖片描述

  • 如果是在不行,一個一個的寫到你的空項目裏沒有出現創建錯誤或者環境錯誤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章