Original address: http://www.work100.net/training/monolithic-frameworks-example.html更多教程:光束云-免费课程
serial Number | in-text chapters | video |
---|
please reference as above 章节导航
read
1. Overview
this section will make a phased summary of the "Java single application" course, and fully practice the knowledge learned through a comprehensive case.
The following courses include:
- Java microservices
- build IoT platform
- SaaS cloud service construction
for the continuity of follow-up courses, our 综合实例
will build a simple IoT管理后台
project iot-admin
to enable logon.
Follow the practice and take notes during the learning process!
2. Create a project
2.1. Build a project structure
create a project folder
pass IntelliJ IDEA
open the project structure in the preceding section and add a project folder. iot-admin
Create POM
add one pom.xml
file. The file content is as follows:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.work100.training.stage2</groupId>
<artifactId>iot-admin</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
</dependencies>
</project>
then pom.xml
managed Maven
.
Improve the Maven structure
the following table describes the directory structure:
directory or file | description |
---|
the following figure shows the project structure:
perfect src/main/webapp/WEB-INF/web.xml
file. The content is as follows:
<?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"
version="4.0">
</web-app>
improve the project architecture
combined with the three-tier architecture and MVC architecture src/main/java
the following table describes the class package structure of the project:
class package | description |
---|
the following figure shows the project structure:
configure Spring and Log4j
in src/main/resources
add spring-context.xml
and log4j.properties
file:
spring-context.xml
the code is as follows:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
log4j.properties
the code is as follows:
log4j.rootLogger=INFO, console, file
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=logs/log.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.MaxFileSize=1024KB
log4j.appender.A3.MaxBackupIndex=10
log4j.appender.file.layout.ConversionPattern=%d %p [%c] - %m%n
build a front-end framework
reference Bootstrap-Environment building-in the instance step build Bootstrap
directory structure:
directory | description |
---|
in src/main/webapp
create index.jsp
file. The code is as follows:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>IoT-Admin</title>
</head>
<body>
Hello IoT-Admin
</body>
</html>
the following figure shows the project structure:
configure Tomcat
see Architecture mode-as described in practice Tomcat
configure the runtime environment and run the following command:
3. Use AdminLTE templates
3.1. Download AdminLTE
AdminLTE
is based on Bootstrap
the latest version is based on Bootstrap 4
built, highly customizable and easy to use, suitable for various screen resolutions from small mobile devices to large desktops. The official website address is https://adminlte.io/. The AdminLTE is an open source software. You can go to Github to obtain the source code.
This instance will use AdminLTE-3.0.2
the version is shown. The Source Code package has been uploaded to QQ group. Please add it at the bottom of the portal homepage. QQ群
Obtain.
AdminLTE
Decompress the folder after downloading. The folder structure is as follows:
the files in the directory index.html
open it in a browser and run it as follows:
please use AdminLTE
view the display effect of each page in detail before the framework, and refer HTML
source code AdminLTE
use method.
3.2. Reconstruct the project
because AdminLTE-3.0.2
based on Bootstrap 4
built, so next we refactor our project.
First, delete the following directory from the project:
src/main/webapp/assets/plugins
src/main/webapp/assets/css
src/main/webapp/assets/images
src/main/webapp/assets/js
then AdminLTE-3.0.2
copy the folder to the project in the following position:
AdminLTE-3.0.2 directory |
project directory |
---|
the reconstructed directory structure is as follows:
4. Create a logon page
we refer AdminLTE-3.0.2/pages/examples/login.html
create a source code example iot-amdin
the logon page of the project.
Reconstruction index.jsp
the code is as follows:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>IoT-Admin</title>
<!-- Tell the browser to be responsive to screen width -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Font Awesome -->
<link rel="stylesheet" href="assets/plugins/fontawesome-free/css/all.min.css">
<!-- icheck bootstrap -->
<link rel="stylesheet" href="assets/plugins/icheck-bootstrap/icheck-bootstrap.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="assets/css/adminlte.min.css">
</head>
<body class="hold-transition login-page">
<div class="login-box">
<div class="login-logo">
IoT-Admin 登录
</div>
<!-- /.login-logo -->
<div class="card">
<div class="card-body login-card-body">
<p class="login-box-msg">请输入ID和密码登录</p>
<form action="/login" method="post">
<div class="input-group mb-3">
<input name="loginId" type="text" class="form-control" placeholder="登录ID">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-user"></span>
</div>
</div>
</div>
<div class="input-group mb-3">
<input name="loginPwd" type="password" class="form-control" placeholder="登录密码">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-lock"></span>
</div>
</div>
</div>
<div class="row">
<div class="col-8">
<div class="icheck-primary">
<input type="checkbox" id="remember">
<label for="remember">
记住我
</label>
</div>
</div>
<!-- /.col -->
<div class="col-4">
<button type="submit" class="btn btn-primary btn-block">登录</button>
</div>
<!-- /.col -->
</div>
</form>
</div>
<!-- /.login-card-body -->
</div>
</div>
<!-- /.login-box -->
<!-- jQuery -->
<script src="assets/plugins/jquery/jquery.min.js"></script>
<!-- Bootstrap 4 -->
<script src="assets/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE App -->
<script src="assets/js/adminlte.min.js"></script>
</body>
</html>
run Tomcat
, start the project, the effect is as follows:
5. Login
the implementation of backend code is similar to that described in the architecture mode-practice exercise section. We will modify the implementation code.
5.1. Create a User class
in package net.work100.training.stage2.iot.admin
create a package entity
, and then add a User
class
User.java
the file code is as follows:
package net.work100.training.stage2.iot.admin.entity;
import java.io.Serializable;
/**
* <p>Title: User</p>
* <p>Description: </p>
*
* @author liuxiaojun
* @date 2020-02-13 13:21
* ------------------- History -------------------
* <date> <author> <desc>
* 2020-02-13 liuxiaojun 初始创建
* -----------------------------------------------
*/
public class User implements Serializable {
private String userName;
private String loginId;
private String loginPwd;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public String getLoginPwd() {
return loginPwd;
}
public void setLoginPwd(String loginPwd) {
this.loginPwd = loginPwd;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", loginId='" + loginId + '\'' +
'}';
}
}
5.2 Create a UserDao interface and its implementation UserDaoImpl
in package net.work100.training.stage2.iot.admin.dao
create an API UserDao
UserDao.java
the file code is as follows:
package net.work100.training.stage2.iot.admin.dao;
import net.work100.training.stage2.iot.admin.entity.User;
/**
* <p>Title: UserDao</p>
* <p>Description: </p>
*
* @author liuxiaojun
* @date 2020-02-13 13:16
* ------------------- History -------------------
* <date> <author> <desc>
* 2020-02-13 liuxiaojun 初始创建
* -----------------------------------------------
*/
public interface UserDao {
/**
* 根据ID及密码获取用户信息
*
* @param loginId 登录ID
* @param loginPwd 登录密码
* @return
*/
User getUser(String loginId, String loginPwd);
}
in package net.work100.training.stage2.iot.admin.dao
add a class package impl
, and then in impl
create a class under the package UserDaoImpl
UserDaoImpl.java
the file code is as follows:
package net.work100.training.stage2.iot.admin.dao.impl;
import net.work100.training.stage2.iot.admin.dao.UserDao;
import net.work100.training.stage2.iot.admin.entity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* <p>Title: UserDaoImpl</p>
* <p>Description: </p>
*
* @author liuxiaojun
* @date 2020-02-13 13:23
* ------------------- History -------------------
* <date> <author> <desc>
* 2020-02-13 liuxiaojun 初始创建
* -----------------------------------------------
*/
public class UserDaoImpl implements UserDao {
private static final Logger logger = LoggerFactory.getLogger(UserDaoImpl.class);
public User getUser(String loginId, String loginPwd) {
logger.debug("调用方法 getUser(loginId:{}, loginPwd:{})", loginId, loginPwd);
// 根据 loginId 查询出用户信息
User user = getUserByLoginId(loginId);
if (user != null) {
// 验证 loginPwd 是否正确(区分大小写)
if (user.getLoginPwd().equals(loginPwd)) {
return user;
}
}
return null;
}
/**
* 获取模拟的用户数据
*
* @param loginId 登录ID
* @return
*/
private User getUserByLoginId(String loginId) {
// 模拟 DB 存在的用户数据
User dbUser = new User();
dbUser.setUserName("Xiaojun");
dbUser.setLoginId("admin");
dbUser.setLoginPwd("admin");
// 判断是否存在 loginId 的用户(忽略大小写)
if (dbUser.getLoginId().equalsIgnoreCase(loginId)) {
logger.info("匹配上用户:{}", dbUser);
return dbUser;
}
logger.warn("未匹配任何用户,将返回 null");
return null;
}
}
5.3. Create a UserService interface and its implementation UserServiceImpl
in package net.work100.training.stage2.iot.admin.service
create an API UserService
UserService.java
the file code is as follows:
package net.work100.training.stage2.iot.admin.service;
import net.work100.training.stage2.iot.admin.entity.User;
/**
* <p>Title: UserService</p>
* <p>Description: </p>
*
* @author liuxiaojun
* @date 2020-02-13 13:25
* ------------------- History -------------------
* <date> <author> <desc>
* 2020-02-13 liuxiaojun 初始创建
* -----------------------------------------------
*/
public interface UserService {
/**
* 登录验证
*
* @param loginId 登录ID
* @param loginPwd 登录密码
* @return
*/
User login(String loginId, String loginPwd);
}
in package net.work100.training.stage2.iot.admin.service
add a class package impl
, and then in impl
create a class under the package UserServiceImpl
UserServiceImpl.java
the file code is as follows:
package net.work100.training.stage2.iot.admin.service.impl;
import net.work100.training.stage2.iot.admin.dao.UserDao;
import net.work100.training.stage2.iot.admin.dao.impl.UserDaoImpl;
import net.work100.training.stage2.iot.admin.entity.User;
import net.work100.training.stage2.iot.admin.service.UserService;
/**
* <p>Title: UserServiceImpl</p>
* <p>Description: </p>
*
* @author liuxiaojun
* @date 2020-02-13 13:26
* ------------------- History -------------------
* <date> <author> <desc>
* 2020-02-13 liuxiaojun 初始创建
* -----------------------------------------------
*/
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
public User login(String loginId, String loginPwd) {
return userDao.getUser(loginId, loginPwd);
}
}
5.4. Create a LoginController
achieve Servlet
in package net.work100.training.stage2.iot.admin.web
add a class package controller
, and then in controller
create a class under the package LoginController
LoginController.java
the file code is as follows:
package net.work100.training.stage2.iot.admin.web.controller;
import net.work100.training.stage2.iot.admin.entity.User;
import net.work100.training.stage2.iot.admin.service.UserService;
import net.work100.training.stage2.iot.admin.service.impl.UserServiceImpl;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* <p>Title: LoginController</p>
* <p>Description: </p>
*
* @author liuxiaojun
* @date 2020-02-13 13:28
* ------------------- History -------------------
* <date> <author> <desc>
* 2020-02-13 liuxiaojun 初始创建
* -----------------------------------------------
*/
public class LoginController extends HttpServlet {
private UserService userService = new UserServiceImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user = userService.login("admin", "admin");
System.out.println("--------------doGet test(begin)-----------------");
System.out.println(user);
System.out.println("--------------doGet test(end)-----------------");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String loginId = req.getParameter("loginId");
String loginPwd = req.getParameter("loginPwd");
User user = userService.login(loginId, loginPwd);
// 登录成功
if (user != null) {
// 重定向到首页
resp.sendRedirect("/main.jsp");
}
// 登录失败
else {
// 跳转回登录页
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}
}
}
configure Servlet mapping
modify src/main/webapp/WEB-INF/web.xml
file. The content is as follows:
<?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"
version="4.0">
<servlet>
<servlet-name>loginController</servlet-name>
<servlet-class>net.work100.training.stage2.iot.admin.web.controller.LoginController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginController</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
the main.jsp page is displayed after the logon is created.
To simulate the effect of login verification, we src/main/webapp/
create a file main.jsp
, after successful logon, you will be redirected to this page. The code is as follows:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
这里是首页
</body>
</html>
5.5. Run
start Tomcat
for login verification, enter the following correct login data in the form:
name | value |
---|
the page is redirected main.jsp
, as shown below:
return to the logon page when incorrect logon data is entered.
5.6. Use Spring IoC
create SpringContext
create a class package net.work100.training.stage2.iot.admin.commons.context
, and then create SpringContext
class
SpringContext.java
the file code is as follows:
package net.work100.training.stage2.iot.admin.commons.context;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* <p>Title: SpringContext</p>
* <p>Description: </p>
*
* @author liuxiaojun
* @date 2020-02-13 14:31
* ------------------- History -------------------
* <date> <author> <desc>
* 2020-02-13 liuxiaojun 初始创建
* -----------------------------------------------
*/
public final class SpringContext {
public Object getBean(String beanId) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
return context.getBean(beanId);
}
}
configuration spring-context.xml
modify src/main/resources/spring-context.xml
file. The content is as follows:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- DAO -->
<bean id="userDao" class="net.work100.training.stage2.iot.admin.dao.impl.UserDaoImpl" />
<!-- Service -->
<bean id="userService" class="net.work100.training.stage2.iot.admin.service.impl.UserServiceImpl" />
</beans>
modify UserServiceImpl
modify UserServiceImpl.java
the code is as follows:
package net.work100.training.stage2.iot.admin.service.impl;
import net.work100.training.stage2.iot.admin.commons.context.SpringContext;
import net.work100.training.stage2.iot.admin.dao.UserDao;
import net.work100.training.stage2.iot.admin.entity.User;
import net.work100.training.stage2.iot.admin.service.UserService;
/**
* <p>Title: UserServiceImpl</p>
* <p>Description: </p>
*
* @author liuxiaojun
* @date 2020-02-13 13:26
* ------------------- History -------------------
* <date> <author> <desc>
* 2020-02-13 liuxiaojun 初始创建
* -----------------------------------------------
*/
public class UserServiceImpl implements UserService {
private SpringContext context = new SpringContext();
public User login(String loginId, String loginPwd) {
UserDao userDao = (UserDao) context.getBean("userDao");
return userDao.getUser(loginId, loginPwd);
}
}
modify LoginController
modify LoginController.java
the code is as follows:
package net.work100.training.stage2.iot.admin.web.controller;
import net.work100.training.stage2.iot.admin.commons.context.SpringContext;
import net.work100.training.stage2.iot.admin.entity.User;
import net.work100.training.stage2.iot.admin.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* <p>Title: LoginController</p>
* <p>Description: </p>
*
* @author liuxiaojun
* @date 2020-02-13 13:28
* ------------------- History -------------------
* <date> <author> <desc>
* 2020-02-13 liuxiaojun 初始创建
* -----------------------------------------------
*/
public class LoginController extends HttpServlet {
private SpringContext context = new SpringContext();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
UserService userService = (UserService) context.getBean("userService");
User user = userService.login("admin", "admin");
System.out.println("--------------doGet test(begin)-----------------");
System.out.println(user);
System.out.println("--------------doGet test(end)-----------------");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
UserService userService = (UserService) context.getBean("userService");
String loginId = req.getParameter("loginId");
String loginPwd = req.getParameter("loginPwd");
User user = userService.login(loginId, loginPwd);
// 登录成功
if (user != null) {
// 重定向到首页
resp.sendRedirect("/main.jsp");
}
// 登录失败
else {
// 跳转回登录页
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}
}
}
re-run
restart Tomcat
verify the running effect.
6. Improve user experience
if you enter an incorrect ID or password, the verification fails, and the page is redirected to the logon page.
From the perspective of user experience, you need to give the user a 提示信息
, inform it that the login verification failed. Let's implement this function.
6.1. Transformation LoginController
an error message is returned after logon verification fails. req.setAttribute("message", "登录ID或登录密码错误");
, the complete code is as follows:
package net.work100.training.stage2.iot.admin.web.controller;
import net.work100.training.stage2.iot.admin.commons.context.SpringContext;
import net.work100.training.stage2.iot.admin.entity.User;
import net.work100.training.stage2.iot.admin.service.UserService;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* <p>Title: LoginController</p>
* <p>Description: </p>
* <p>Url: http://www.work100.net/training/monolithic-frameworks-example.html</p>
*
* @author liuxiaojun
* @date 2020-02-13 13:28
* ------------------- History -------------------
* <date> <author> <desc>
* 2020-02-13 liuxiaojun 初始创建
* -----------------------------------------------
*/
public class LoginController extends HttpServlet {
private SpringContext context = new SpringContext();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
UserService userService = (UserService) context.getBean("userService");
User user = userService.login("admin", "admin");
System.out.println("--------------doGet test(begin)-----------------");
System.out.println(user);
System.out.println("--------------doGet test(end)-----------------");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
UserService userService = (UserService) context.getBean("userService");
String loginId = req.getParameter("loginId");
String loginPwd = req.getParameter("loginPwd");
User user = userService.login(loginId, loginPwd);
// 登录成功
if (user != null) {
// 重定向到首页
resp.sendRedirect("/main.jsp");
}
// 登录失败
else {
// 跳转回登录页
req.setAttribute("message", "登录ID或登录密码错误");
req.getRequestDispatcher("/index.jsp").forward(req, resp);
}
}
}
6.2. Transform index.jsp
introduce JSTL dependencies
here we will use JSTL expressions, so we need to first pom.xml
import dependencies into the file:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
add taglib instructions
in index.jsp
add the following code to the file header:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
add error message
in index.jsp
file form
add the following code above the form:
<c:if test="${message != null}">
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
${message}
</div>
</c:if>
the complete index.jsp file code is as follows:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>IoT-Admin</title>
<!-- Tell the browser to be responsive to screen width -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Font Awesome -->
<link rel="stylesheet" href="assets/plugins/fontawesome-free/css/all.min.css">
<!-- icheck bootstrap -->
<link rel="stylesheet" href="assets/plugins/icheck-bootstrap/icheck-bootstrap.min.css">
<!-- Theme style -->
<link rel="stylesheet" href="assets/css/adminlte.min.css">
</head>
<body class="hold-transition login-page">
<div class="login-box">
<div class="login-logo">
IoT-Admin 登录
</div>
<!-- /.login-logo -->
<div class="card">
<div class="card-body login-card-body">
<p class="login-box-msg">请输入ID和密码登录</p>
<c:if test="${message != null}">
<div class="alert alert-danger alert-dismissible">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
${message}
</div>
</c:if>
<form action="/login" method="post">
<div class="input-group mb-3">
<input name="loginId" type="text" class="form-control" placeholder="登录ID">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-user"></span>
</div>
</div>
</div>
<div class="input-group mb-3">
<input name="loginPwd" type="password" class="form-control" placeholder="登录密码">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-lock"></span>
</div>
</div>
</div>
<div class="row">
<div class="col-8">
<div class="icheck-primary">
<input type="checkbox" id="remember">
<label for="remember">
记住我
</label>
</div>
</div>
<!-- /.col -->
<div class="col-4">
<button type="submit" class="btn btn-primary btn-block">登录</button>
</div>
<!-- /.col -->
</div>
</form>
</div>
<!-- /.login-card-body -->
</div>
</div>
<!-- /.login-box -->
<!-- jQuery -->
<script src="assets/plugins/jquery/jquery.min.js"></script>
<!-- Bootstrap 4 -->
<script src="assets/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- AdminLTE App -->
<script src="assets/js/adminlte.min.js"></script>
</body>
</html>
6.3 Verification effect
run Tomcat
, enter the wrong login data, the page effect is as follows:
7. Instance source code
the source code of the instance is hosted to the following address:
- https://github.com/work100-net/training-stage2/tree/master/iot-admin
- https://gitee.com/work100-net/training-stage2/tree/master/iot-admin
previous: Log4j
next: Spring Web
if you are interested in the course content, you can scan the code to follow our
公众号
orQQ群
, pay attention to our curriculum updates in a timely manner
Start Building Today with a Free Trial to 50+ Products
Learn and experience the power of Alibaba Cloud.
Sign Up Now