假設要撰寫很多的網頁,但每個網頁的前後都一樣,只有中間內容不一樣。此時在每個網頁都要寫 <html></html>,而上面的 logo、選單都要重覆寫一次,是很煩人的事。
Html 常會使用到第三方寫好的 javascript,請請在 Web Pages 下按右鍵/New Folder,Folder Name 輸入 static。
static 目錄內容
請下載 static.zip,下載後解壓縮到專案下的 web/static 目錄下。
header.jsp
在 WEB-INF 新增 views 目錄,然後新增 header.jsp 檔案,完整代碼如下。
底下有幾個地方要注意 :
1. 網頁的 icon 無論是使用 .ico 或 .png,在近期的 Chrom 怪怪的,但使用 Edge 則完全正常。
2. Java 區塊使用 <% ….. %> 包含住。
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<title>MahalJSP</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="/static/css/bootstrap.min.css"/>
<link rel="Shortcut Icon" type="image/x-icon" href="/static/images/logo.ico" />
<script src="/static/SpryAssets/SpryMenuBar.js" type="text/javascript"></script>
<script src="/static/SpryAssets/SpryValidationTextField.js" type="text/javascript"></script>
<link href="/static/SpryAssets/SpryMenuBarHorizontal.css" rel="stylesheet" type="text/css" />
<link href="/static/SpryAssets/SpryValidationTextField.css" rel="stylesheet" type="text/css" />
</head>
<style>
body {
height : 100%;
margin:0px;
display:flex;
flex-direction :column;
}
#base_banner{
height: 80px;
width:100%;
background-image: url('/static/images/banner.png');
background-repeat:no-repeat;
}
#base_menu{
position : relative;
width:100%;
height:40px;
background-color:#0077ff;
}
#base_content{
flex-grow:1;
display: flex;
flex-direction:column;
width:100%;
overflow:hidden;
background-color:#c0c0ff;
align-items:center;
}
#base_copyright{
background-color: #00aaff;
width: 100%;
height: 25px;
text-align: right;
}
ul.MenuBarHorizontal a {
color: #000;
background-color: transparent;
}
ul.MenuBarHorizontal a:hover{
background-color: #005555;
}
ul.MenuBarHorizontal ul a {
background-color: #dddddd;
}
ul.MenuBarHorizontal li.MenuBarItemIE {
background: transparent;
}
</style>
<body>
<%
String userAccount = (String)session.getAttribute("userAccount");
%>
<a href="index">
<div id="base_banner">
</div>
</a>
<div id="base_menu">
<ul id="MenuBar1" class="MenuBarHorizontal">
<li>
<a>一般資訊</a>
<ul>
<li>
<a href="/finance/twstock">台灣股市</a>
</li>
<li>
<a href="/finance/twgold">黃金儲摺</a>
</li>
<li>
<a href="/finance/ai">AI 預測</a>
</li>
<li>
<a href="/solar">24節氣</a>
</li>
<li>
<a href="/tools">程式下載</a>
</li>
</ul>
</li>
<li>
<a>相片記錄</a>
<ul>
<li>
<a href="/gallery">相片瀏覽</a>
</li>
<li>
<a href="/upload/photo_form">上傳圖片</a>
</li>
<li>
<a href="/gallery/thumb">製作縮圖</a>
</li>
</ul>
</li>
<li>
<a href="/travel/">旅遊軌跡</a>
</li>
<li>
<a href="/streaming">網路直播</a>
</li>
<li>
<a href="/smonitor">監控系統</a>
</li>
<li>
<a href="/stream_history">錄影回放</a>
</li>
<li>
<a href="/pymovies">影片戲劇</a>
</li>
<li>
<%
if (userAccount==null){
out.println("<a href='login'>登入</a>");
}
else{
out.println("<a href='logout'>登出</a>");
}
%>
</li>
</ul>
</div>
<div id="base_content">
footer.jsp
在 WEB-INF\views 新增 footer.jsp,完整代碼如下。
</div>
<div id="base_copyright">
Powered by Thomas(mahaljsp@gmail.com)
</div>
</body>
</html>
<script>
var MenuBar1 = new Spry.Widget.MenuBar(
"MenuBar1", {imgDown:"/static/SpryAssets/SpryMenuBarDownHover.gif",
imgRight:"/static/SpryAssets/SpryMenuBarRightHover.gif"}
);
</script>
index Servlet
新增 Servlet 檔案,Class Name 輸入 index,完整代碼如下。
package net.ddns.mahaljsp;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet(name = "index", urlPatterns = {"/index"})
public class index extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
request.setAttribute("message", "歡迎光臨這是首頁");
request.getRequestDispatcher("/WEB-INF/views/index.jsp").forward(request, response);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
@Override
public String getServletInfo() {
return "Short description";
}
}
上面有一個重點,就是 urlPatterns 設定為「/index」,表示網址為 http://localhost:8085/thomas/index。而在 processRequest 方法中先設定要傳入的 message,然後使用如下方法套用 index.jsp 模板。
request.getRequestDispatcher("/WEB-INF/views/index.jsp")
index.jsp
在 WEB-INF/views 裏增 index.jsp 檔案,然後使用 <%@ include file=”xxx.jsp” %> 或者是 <jsp:include page=”xxx.jpg”> 套用 header.jsp 及 footer.jsp,完整代碼如下。
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ include file="/WEB-INF/views/header.jsp" %>
<h1>${message}</h1>
<%@ include file="/WEB-INF/views/footer.jsp" %>
<%@ include ….> 在編譯期就會完成,效能比較高,而 <jsp:include …> 則在執行時期才會完成,效能較差,但靈活性較佳。
NetBeans 測試
在 NetBeans 執行後,網址如下
http://localhost:8085/thomas/index
Tomcat 測試
停掉 NetBeans Tomcat,把專案 build/web/ 下的所有檔案及目錄複製到 Tomcat docBase。請注意包含 static 也一併要複製,否則 NetBeans 執行時會找不到圖按,此應該是 NetBeans 的 bug。然後啟動系統級 Tomcat,輸入如下網址
http://localhost:8085/index
如果有架設 Nginx,亦可使用如下網址測試
http://192.168.1.2/index
