iT邦幫忙

1

【左京淳的JAVA WEB學習筆記】第九章 電商網站-基礎配置

本章開始研究實際案例
由於省略掉了一些細節,無法進行實際測試。
不過經由範例程式碼的演示,可以清楚了解實現各功能所需的流程。

DataBase(MySQL8)的使用

載點
https://dev.mysql.com/downloads/installer/

如果需要圖形化介面可以再下載MySQLWorkbench

建立資料庫
安裝完後會出現預設的MySQL 8.0 Command Line Client,進入後可以用命令列的方式建構資料庫。
確認DB伺服器是否運行中的指令:

mysqlshow -u <username> -p 

另外也可以用MySQLWorkbench,以圖形化的方式建模。
MySQL建表的語法如下例,可以自己熟悉一下介面(本案例中不會實際取用DB內的資料):

create table user (
userName VARCHAR(20) NOT NULL,
pwd VARCHAR(20),
userId DOUBLE(5,2),
userRole CHAR(1),
PRIMARY KEY (userName) );

create table record  (
buyId VARCHAR(28) NOT NULL,
userName VARCHAR(20),
buyTime date,
price DOUBLE(6,2),
PRIMARY KEY (buyId) ,
CONSTRAINT userName FOREIGN KEY (userName) REFERENCES mydb.user (userName));

create table order  (
autoId BIGINT NOT NULL,
isbn VARCHAR(20),
buyId VARCHAR(28),
amount INT,
PRIMARY KEY (autoId) ,
CONSTRAINT isbn FOREIGN KEY (isbn) REFERENCES mydb.book (isbn),
CONSTRAINT buyId FOREIGN KEY (buyId) REFERENCES mydb.record (buyId));

create table book  (
isbn VARCHAR(13) NOT NULL,
bookName VARCHAR(60),
PBHouse VARCHAR(50),
bookPrice DOUBLE(5,1),
PBTime date,
cover blob,
stock INT,
PRIMARY KEY (isbn) );

新建專案BookShop

jar包配置

  1. 下載jar包
    mysql-connector-java-8.0.23.jar 可以在MySQL資料夾找到此包:
    (C:\Program Files (x86)\MySQL\Connector J 8.0)
    jstl-api-1.2.jar
    jstl-impl-1.2.jar
    log4j 範例使用log4j-1.x.x.jar,到apache官網下載。

  2. 配置jar包
    首先在IDE工具內確認一下自己的workplace,例如:
    C:\Users\XXuser\Documents\workspace-spring-tool-suite-4-4.6.1.RELEASE
    把jar包放在專案資料夾->WEB-INF->lib裡面

  3. 建立路徑
    F5刷新一下專案頁面
    專案點右鍵-> Build Path -> Libraries頁籤 -> Add JARs

設置web.xml

伺服器在佈署專案時會依據web.xml來進行設定。
不過由於現在大多數的設定都可以用註解來代替了,
web.xml裡面只保留歡迎頁及設定metadata-complete="false"
(表示此處的配置信息不是完整的,請掃描class檔案的意思。)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
         http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" 
         id="WebApp_ID" version="4.0" metadata-complete="false">
         <display-name>BookShop</display-name>
         <welcome-file-list>
                <welcome-file>index.jsp</welcome-file>         
         </welcome-file-list>
</web-app>

配置log4j

在src下新建log4j.properties

log4j.rootLogger=INFO,BB,AA
log4j.appender.AA=org.apache.log4j.ConsoleAppender 
log4j.appender.AA.layout=org.apache.log4j.SimpleLayout 
log4j.appender.BB=org.apache.log4j.FileAppender
log4j.appender.BB.File=book.log
log4j.appender.BB.layout=org.apache.log4j.PatternLayout 
log4j.appender.BB.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %l %F %p %m %n

創建Log.class

創建Log物件是為了以後可以直接調用,不用每次都重新建立。

public class Log {
    public static Logger logger = Logger.getLogger(Log.class.getName());
}

日誌調用方法

使用error()捕捉出錯訊息

try{
    ...
}catch(Exception e){
    Log.logger.error(e.getMessage(),e);
}

使用info()丟出log訊息

Log.logger.info("Error msg");

配置DB訊息

在src下新增db.properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/資料庫名稱?useSSL=false
         &serverTimezone=UTC&allowPublicKeyRetrieval=true
username=root
password=123456

使用DriverManager.getConnection(url,userName,pwd)測試DB連結

使用JUNIT可以針對單一類進行測試,在class前面加上@Test,執行時選擇Run as->Junit Test

  @Test
  public void test() throws Exception {
    testDBConnection(
        "com.mysql.cj.jdbc.Driver",
        "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true",
        "root",
        "123456");
  }

  public void testDBConnection(String driverClassName, String jdbcURL, String username, String password) throws ClassNotFoundException, SQLException {
    Connection conn = DriverManager.getConnection(jdbcURL, username, password);
    DatabaseMetaData metaData = conn.getMetaData();
    System.out.println("連接的資料庫為:" + metaData.getDatabaseProductName() + "-" + metaData.getDatabaseProductVersion());
  }

使用Filter進行權限分級

  • 一般用戶皆可訪問:主頁與商品明細
  • 註冊會員可訪問:購物車、結算、登入登出
  • 系統管理員可訪問:網站後台

使用url來區分需要權限的頁面

  • /user/*
  • /back/*

新建UserFilter

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    if(request instanceof HttpServletRequest) {
      HttpServletRequest req = (HttpServletRequest)request;
      Object object = req.getSession().getAttribute("user");
      if(object != null) {
        chain.doFilter(request, response);
      }else {
        request.setAttribute("msg", "請先登錄");
        req.getRequestDispatcher("/WEB-INF/views/main/login.jsp").forward(request, response);
      }
    }
  }

新建AuthFilter

除了確認用戶存在DB之外,也確認是否有管理員權限。

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    Object object = req.getSession().getAttribute("user");
    if (object != null) {
      TUser user = (TUser) object;
      if (user.getRole() == IRole.ADMIN) {
        chain.doFilter(request, response);
      } else {
        request.setAttribute("msg", "管理員才能訪問");
        req.getRequestDispatcher("/WEB-INF/views/main/login.jsp").forward(request, response);
      }
    } else {
      request.setAttribute("msg", "請先登錄");
      req.getRequestDispatcher("/WEB-INF/views/main/login.jsp").forward(request, response);
    }
  }

JSP頁面配置

將JSP頁面都放置到WEB-INF內,以避免用戶直接訪問。


尚未有邦友留言

立即登入留言