【左京淳的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内,以避免用户直接访问。


<<:  调查类型(Investigation Types)

>>:  硬碟上的资料是否有重量?

【资料结构】树的定义与追踪

树的定义 一种存资料的型态,由最初的节点延伸下多个分支,每个分支都个有个自的子分支,分支下可分割成彼...

[day30]优化架构-登入登出检核&最後一天心得

登入登出检核 之前已经针对登入登出进行控管,非登入无法进入会员页,按照此网站的需求,订单建置、订单查...

[Day24] NLP会用到的模型(七)-transformer encoder

一. encoder 架构如下: encoder的动作在於对input进行编码,在一开始input会...

查看fbx文件的version

用文本的方式打开文件,就可以看到版本了: FBXHeaderExtension: { FBXHead...

[Day 30] 模仿 Node 的非同步实验兼完赛心得

实作 所谓读了原始码却不实作与验证, 那不过就是对原始码的意淫而已, 所以在这个系列文的结尾总是还要...