本章开始研究实际案例
由於省略掉了一些细节,无法进行实际测试。
不过经由范例程序码的演示,可以清楚了解实现各功能所需的流程。
载点
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) );
下载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官网下载。
配置jar包
首先在IDE工具内确认一下自己的workplace,例如:
C:\Users\XXuser\Documents\workspace-spring-tool-suite-4-4.6.1.RELEASE
把jar包放在专案资料夹->WEB-INF->lib里面
建立路径
F5刷新一下专案页面
专案点右键-> Build Path -> Libraries页签 -> Add JARs
服务器在布署专案时会依据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>
在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物件是为了以後可以直接调用,不用每次都重新建立。
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");
在src下新增db.properties
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/资料库名称?useSSL=false
&serverTimezone=UTC&allowPublicKeyRetrieval=true
username=root
password=123456
使用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());
}
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);
}
}
}
除了确认用户存在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页面都放置到WEB-INF内,以避免用户直接访问。
树的定义 一种存资料的型态,由最初的节点延伸下多个分支,每个分支都个有个自的子分支,分支下可分割成彼...
登入登出检核 之前已经针对登入登出进行控管,非登入无法进入会员页,按照此网站的需求,订单建置、订单查...
一. encoder 架构如下: encoder的动作在於对input进行编码,在一开始input会...
用文本的方式打开文件,就可以看到版本了: FBXHeaderExtension: { FBXHead...
实作 所谓读了原始码却不实作与验证, 那不过就是对原始码的意淫而已, 所以在这个系列文的结尾总是还要...