SpringMVC實(shí)現(xiàn)登錄與注冊功能的詳細(xì)步驟
一.準(zhǔn)備工作
1.通過Maven安裝所需依賴:
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>SpringMVCPractice1</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>SpringMVCPractice1 Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- Spring MVC 依賴 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.25</version> <!-- 可以根據(jù)需要調(diào)整版本 --> </dependency> <!-- Druid 依賴 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> <!-- 可以根據(jù)需要調(diào)整版本 --> </dependency> <!-- MySQL 連接器依賴 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.29</version> <!-- 可以根據(jù)需要調(diào)整版本 --> </dependency> <!-- Spring Context 依賴(通常與 Spring MVC 一起使用) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.25</version> <!-- 可以根據(jù)需要調(diào)整版本 --> </dependency> <!-- Spring Core 依賴(通常與 Spring MVC 一起使用) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.3.25</version> <!-- 可以根據(jù)需要調(diào)整版本 --> </dependency> <!-- Spring Transaction --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.3.23</version> </dependency> <!-- Jackson JSON Processor --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency> <!-- Servlet API --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <!-- JSP (If using JSP for views) --> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.3.3</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--jsp坐標(biāo)--> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.25</version> <!-- 請根據(jù)你的項目需要調(diào)整版本 --> </dependency> </dependencies> <build> <finalName>SpringMVCPractice1</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>7</source> <target>7</target> </configuration> </plugin> </plugins> </build> </project>
2.在配置文件中添加:
<context:component-scan base-package="buka" /> <mvc:annotation-driven />
這是為了開啟包掃描以使用注解
3.創(chuàng)建User類:
package buka; public class User { private int id; private String userName; private String passWord; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } }
4.配置中文過濾器以及DispatcherServlet
在為web.xml中添加:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!-- Filters --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Servlets --> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
二.登陸頁面的實(shí)現(xiàn)
1.先簡單寫出前端頁面,在webapp下創(chuàng)建login.jsp:
<%-- Created by IntelliJ IDEA. User: Lenovo Date: 2024/7/23 Time: 10:14 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <style> body { width: 100%; height: 100vh; background-color: brown; display: flex; align-items: center; justify-content: center; margin: 0; } div { width: 400px; padding: 20px; background-color: pink; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); border-radius: 10px; } form { display: flex; flex-direction: column; align-items: center; } form input[type="text"], form input[type="password"] { margin-bottom: 15px; padding: 10px; width: 80%; border: 1px solid #ccc; border-radius: 5px; font-size: 16px; } form input[type="submit"], form button { padding: 10px 20px; margin-top: 10px; width: 85%; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; transition: background-color 0.3s ease; } form input[type="submit"] { background-color: #4CAF50; color: white; } form input[type="submit"]:hover { background-color: #45a049; } form button { background-color: #2196F3; color: white; } form button:hover { background-color: #1976D2; } h1 { text-align: center; margin-bottom: 20px; } </style> <body> <div> <h1>登錄</h1> <form action="/login" method="post"> 用戶名: <input type="text" name="username"><br/> 密碼: <input type="text" name="password"><br/> <input type="submit" value="submit" id="submit"> <button id="register">register</button> </form> </div> </body> </html>
運(yùn)行效果為:
2.考慮后面要發(fā)送ajax請求:
這里需要引入jquery,由于我本地有jquery的靜態(tài)文件,所以這里我直接將它放進(jìn)webapp下引入使用,大家如果沒有可以使用CDN,即<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>也可正常運(yùn)行
注意由于springMVC默認(rèn)會將webapp下的文件識別為頁面格式,如果這是不做任何處理直接使用的jquery的話會出現(xiàn)404,所以要配置資源處理器,聲明該文件為靜態(tài)資源:
在對應(yīng)包下創(chuàng)建WebConfig類(這里可以在配置文件配置,但是習(xí)慣上我用注解的方式):
package buka; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableWebMvc @ComponentScan(basePackages = "buka") public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/js/**").addResourceLocations("/js/"); } }
如此我們就可以正常使用jquery了
3.創(chuàng)建后端文件:
這里Controller是整體的控制層,Service是邏輯處理層,Dao是數(shù)據(jù)交互層
首先從Dao層開始書寫,考慮登錄功能要從數(shù)據(jù)庫中查詢對應(yīng)用戶信息是否存在,所以在這之前應(yīng)有數(shù)據(jù)庫:
(1)在Dao層添加代碼:
這段代碼比較簡單,就是查詢并根據(jù)每一行數(shù)據(jù)創(chuàng)建User,最后返回一個User列表
package buka.Dao; import buka.User; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @Repository public class UserDao { @Autowired private DruidDataSource dataSource; public List<User> getAllUsers() { List<User> list = new ArrayList<User>(); String sql="select * from t_user"; try { Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); while(rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setUserName(rs.getString("userName")); user.setPassWord(rs.getString("passWord")); list.add(user); } } catch (SQLException e) { throw new RuntimeException(e); } return list; } }
(2)寫Service層邏輯:
將傳入的數(shù)據(jù)與Dao層返回的用戶列表一一進(jìn)行比對,如果比對成功就返回true,否則證明數(shù)據(jù)庫中沒有這個用戶
package buka.Service; import buka.Dao.UserDao; import buka.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @org.springframework.stereotype.Service public class UserService { @Autowired private UserDao userDao; public boolean validateUser(String username,String password) { List<User> users = userDao.getAllUsers(); System.out.println(username+" "+password); for (User user : users) { System.out.println(user.getUserName()+"-----"+user.getPassWord()); if(user.getUserName().equals(username) && user.getPassWord().equals(password)){ return true; } } return false; } }
(3)寫Controller層:
添加地址映射,接受前端參數(shù),如果登陸成功,將用戶名存儲到session域(后面會有用),進(jìn)行重定向,否則重新回到該頁面
package buka.Controller; import buka.Dao.UserDao; import buka.Service.UserService; import buka.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; @org.springframework.stereotype.Controller public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/login") public void login(HttpServletRequest request, HttpServletResponse response, @RequestParam("username") String username, @RequestParam("password") String password) throws IOException { boolean flag = userService.validateUser(username, password); if (flag) { // 登錄成功后將用戶信息存儲到Session中 request.getSession().setAttribute("user", username); response.sendRedirect("success.jsp"); } else { response.sendRedirect("login.jsp"); } } }
(4)進(jìn)行測試:
如此證明功能沒有問題,事實(shí)上現(xiàn)在已經(jīng)實(shí)現(xiàn)了登錄功能,但是為了體現(xiàn)異步編程,我們使用ajax發(fā)送請求,修改login.jsp:
<%-- Created by IntelliJ IDEA. User: Lenovo Date: 2024/7/23 Time: 10:14 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <style> body { width: 100%; height: 100vh; background-color: brown; display: flex; align-items: center; justify-content: center; margin: 0; } div { width: 400px; padding: 20px; background-color: pink; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); border-radius: 10px; } form { display: flex; flex-direction: column; align-items: center; } form input[type="text"], form input[type="password"] { margin-bottom: 15px; padding: 10px; width: 80%; border: 1px solid #ccc; border-radius: 5px; font-size: 16px; } form input[type="submit"], form button { padding: 10px 20px; margin-top: 10px; width: 85%; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; transition: background-color 0.3s ease; } form input[type="submit"] { background-color: #4CAF50; color: white; } form input[type="submit"]:hover { background-color: #45a049; } form button { background-color: #2196F3; color: white; } form button:hover { background-color: #1976D2; } h1 { text-align: center; margin-bottom: 20px; } </style> <body> <div> <h1>登錄</h1> <form action="/login" method="post"> 用戶名: <input type="text" name="username"><br/> 密碼: <input type="text" name="password"><br/> <input type="submit" value="submit" id="submit"> <button id="register">register</button> </form> </div> </body> <script src="js/jquery.min.js"></script> <script> $("#submit").click(()=>{ const username = $("input[name='username']").val(); const password = $("input[name='password']").val(); if (!username || !password) { alert("用戶名和密碼不能為空"); return; } $.ajax({ url:"/login", method:"POST", success:(res)=>{ if (res.status === "success") { alert("登陸成功!") } else { alert("登錄失敗,請重試!"); } } }) }); </script> </html>
效果上應(yīng)該是不變的。
三.注冊功能的實(shí)現(xiàn)
1.前端頁面:
實(shí)際上我們把登陸的頁面簡單修改一下就可以:
在webapp下創(chuàng)建register.jsp:
<%-- Created by IntelliJ IDEA. User: Lenovo Date: 2024/7/23 Time: 10:14 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <style> body { width: 100%; height: 100vh; background-color: lightskyblue; display: flex; align-items: center; justify-content: center; margin: 0; } div { width: 400px; padding: 20px; background-color: brown; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); border-radius: 10px; } form { display: flex; flex-direction: column; align-items: center; } form input[type="text"], form input[type="password"] { margin-bottom: 15px; padding: 10px; width: 80%; border: 1px solid #ccc; border-radius: 5px; font-size: 16px; } form input[type="submit"] { padding: 10px 20px; background-color: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; transition: background-color 0.3s ease; } form input[type="submit"]:hover { background-color: #45a049; } h1 { text-align: center; margin-bottom: 20px; } </style> <body> <div> <h1>注冊</h1> <form action="/register" method="post"> 用戶名: <input type="text" name="username"><br/> 密碼: <input type="text" name="password"><br/> <input type="submit" value="submit" id="submit"> </form> </div> </body> <script src="js/jquery.min.js"></script> <script> $("#submit").click(()=>{ const username = $("input[name='username']").val(); const password = $("input[name='password']").val(); if (!username || !password) { alert("用戶名和密碼不能為空"); return; } }) </script> </html>
2.對登陸頁面的注冊按鈕添加點(diǎn)擊事件:
當(dāng)點(diǎn)擊注冊按鈕時跳轉(zhuǎn)到register.jsp頁面
注意,由于注冊按鈕寫在了form里面,當(dāng)點(diǎn)擊按鈕時,默認(rèn)會發(fā)起提交,這里要阻止表單的默認(rèn)行為,在login.jsp中添加:
$("#register").click((event) => { event.preventDefault(); // 阻止表單的默認(rèn)提交行為 window.location.href = "register.jsp"; });
3.創(chuàng)建后端文件:
(1)在Dao層添加代碼:
由于注冊用戶相當(dāng)于向數(shù)據(jù)庫中添加用戶,所以重要的部分就是Dao層的數(shù)據(jù)操縱
package buka.Dao; import buka.User; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @Repository public class UserDao { @Autowired private DruidDataSource dataSource; public List<User> getAllUsers() { List<User> list = new ArrayList<User>(); String sql="select * from t_user"; try { Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ResultSet rs = ps.executeQuery(); while(rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setUserName(rs.getString("userName")); user.setPassWord(rs.getString("passWord")); list.add(user); } } catch (SQLException e) { throw new RuntimeException(e); } return list; } public boolean addUser(User user) { if (user.getUserName() == null || user.getUserName().isEmpty() || user.getPassWord() == null || user.getPassWord().isEmpty()) { return false; } String sql = "insert into t_user(userName, passWord) values(?, ?)"; try { Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1, user.getUserName()); ps.setString(2, user.getPassWord()); int rowsAffected = ps.executeUpdate(); // 使用 executeUpdate 方法 return rowsAffected > 0; // 判斷是否有行受到影響 } catch (SQLException e) { throw new RuntimeException(e); } } }
(2)寫Service邏輯:
直接返回Dao層結(jié)果就行
package buka.Service; import buka.Dao.UserDao; import buka.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; @org.springframework.stereotype.Service public class UserService { @Autowired private UserDao userDao; public boolean validateUser(String username,String password) { List<User> users = userDao.getAllUsers(); System.out.println(username+" "+password); for (User user : users) { System.out.println(user.getUserName()+"-----"+user.getPassWord()); if(user.getUserName().equals(username) && user.getPassWord().equals(password)){ return true; } } return false; } public boolean addUser(User user) { return userDao.addUser(user); } }
(3)寫Controller層:
添加地址映射,判斷是否添加成功以進(jìn)行頁面跳轉(zhuǎn)
package buka.Controller; import buka.Dao.UserDao; import buka.Service.UserService; import buka.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; @org.springframework.stereotype.Controller public class UserController { @Autowired private UserService userService; @RequestMapping(value = "/login") public void login(HttpServletRequest request, HttpServletResponse response, @RequestParam("username") String username, @RequestParam("password") String password) throws IOException { boolean flag = userService.validateUser(username, password); if (flag) { // 登錄成功后將用戶信息存儲到Session中 request.getSession().setAttribute("user", username); response.sendRedirect("success.jsp"); } else { response.sendRedirect("login.jsp"); } } @RequestMapping("/register") public void register(HttpServletRequest request, HttpServletResponse response, @RequestParam("username") String username, @RequestParam("password") String password) throws IOException { User user = new User(); user.setUserName(username); user.setPassWord(password); boolean flag = userService.addUser(user); if (flag) { response.sendRedirect("login.jsp"); }else{ response.sendRedirect("register.jsp"); } } }
(4)進(jìn)行測試:
點(diǎn)擊提交后跳轉(zhuǎn)回登陸頁面
如此注冊功能書寫完畢。
四.路由問題考慮
- 問題一:我們每次開啟項目,都會去index.jsp頁面,按理來說我應(yīng)該直接來到登陸頁面
- 問題二:我登陸后訪問success.jsp等其他頁面這沒有問題,但是當(dāng)我未登陸的時候,無論我想訪問那個頁面都應(yīng)該自動跳轉(zhuǎn)回登陸頁面,也就是說未登錄時我只能訪問login.jsp和register.jsp
解決方案:在之前書寫Controller層時,當(dāng)用戶登陸成功時,我們將用戶名信息存儲到了session域中,我們可以通過檢測session域是否有值來進(jìn)行頁面控制,可是如何控制?這里我們用過濾器實(shí)現(xiàn),本來我是想用攔截器寫的,但是初始邏輯不好判斷,這里采用過濾器給出解決辦法:
1.創(chuàng)建AuthenticationFilter類:
package buka; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class AuthenticationFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // 獲取請求路徑 String requestURI = httpRequest.getRequestURI(); System.out.println("Filter Request URI: " + requestURI); // 檢查用戶是否已登錄 Object user = httpRequest.getSession().getAttribute("user"); if (user != null || requestURI.endsWith("login") || requestURI.endsWith("login.jsp") || requestURI.endsWith("register.jsp") || requestURI.endsWith("register")) { chain.doFilter(request, response); } else { httpResponse.sendRedirect("login.jsp"); } } @Override public void destroy() { } }
2.在web.xml中添加過濾器:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!-- Filters --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter> <filter-name>authenticationFilter</filter-name> <filter-class>buka.AuthenticationFilter</filter-class> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>authenticationFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Servlets --> <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>DispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
如此就大功告成了,上述兩個問題都得到解決,項目的初始登錄與注冊就書寫完畢
總結(jié)
到此這篇關(guān)于SpringMVC實(shí)現(xiàn)登錄與注冊功能的文章就介紹到這了,更多相關(guān)SpringMVC登錄與注冊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SparkSQL中的JSON內(nèi)置函數(shù)全解析
你是否曾經(jīng)為處理JSON數(shù)據(jù)而頭疼?SparkSQL為我們提供了強(qiáng)大的內(nèi)置JSON函數(shù),讓JSON處理變得輕而易舉,本文將帶你深入了解這些函數(shù),感興趣的朋友一起看看吧2024-08-08SpringBoot接入釘釘自定義機(jī)器人預(yù)警通知
本文主要介紹了SpringBoot接入釘釘自定義機(jī)器人預(yù)警通知,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07MyBatis中resultType和parameterType和resultMap使用總結(jié)
這篇文章主要介紹了MyBatis中resultType和parameterType和resultMap使用總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11詳解如何使用MongoDB+Springboot實(shí)現(xiàn)分布式ID的方法
這篇文章主要介紹了詳解如何使用MongoDB+Springboot實(shí)現(xiàn)分布式ID的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09