一、說明:
目前工作中的開發框架主要是 spring ,使用的是 springMVC+ spring + spring JdbcTemplate ,最近學習了一下Mybatis、Maven這些內容,所以嘗試使用 springMVC + Spring + Mybatis + Maven來搭建一個簡單的demo ,功能很簡單,主要是對於一個表的CRUD。
項目源碼下載地址:github下載地址
項目結構圖:
二、環境搭建流程
① 、新建一個Maven工程,並改項目為WEB項目,創建出相應的項目結構。
步驟:New---》Project----》Maven Project
之后選擇Next:
選中 Create a simple project 選項,然后Next
然后點擊Finish ,工程創建完成,結構如下:
然后,右鍵選中項目,打開Properties選項
將圖中的Dynamic Web Module 選項去掉,點擊OK保存
然后再次選中項目打開上述的菜單,並且選中Dynamic Web Module 選項,對話框出現下圖的提示:
此時,點擊下面的:Further configuration avaaliable選項 ,出現如下對話框
將web目錄改為src/main/webapp ,之后ok保存,發現在項目的src/main.webapp下面多出了WEB-INF與META-INF文件,同時還生成了web.xml 文件,如下圖:
②、配置相關的配置文件
1)、配置Maven的pom.xml文件,引入整合所需要的jar包:
<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> com.elgin </groupId> <artifactId> ssm_first </artifactId> <version> 0.0.1-SNAPSHOT </version> <packaging> war </packaging> <properties> <!-- spring 版本號 --> <spring.version> 4.1.4.RELEASE </spring.version> <!-- junit 版本號 --> <junit.version> 4.10 </junit.version> <!-- mybatis 版本號 --> <mybatis.version> 3.3.0 </mybatis.version> </properties> <dependencies> <!-- 添加spring依賴 --> <dependency> <groupId> org.springframework </groupId> <artifactId> spring-webmvc </artifactId> <version> ${spring.version} </version> </dependency> <dependency> <groupId> org.springframework </groupId> <artifactId> spring-context </artifactId> <version> ${spring.version} </version> </dependency> <dependency> <groupId> org.springframework </groupId> <artifactId> spring-context-support </artifactId> <version> ${spring.version} </version> </dependency> <dependency> <groupId> org.springframework </groupId> <artifactId> spring-aop </artifactId> <version> ${spring.version} </version> </dependency> <dependency> <groupId> org.springframework </groupId> <artifactId> spring-aspects </artifactId> <version> ${spring.version} </version> </dependency> <dependency> <groupId> org.springframework </groupId> <artifactId> spring-tx </artifactId> <version> ${spring.version} </version> </dependency> <dependency> <groupId> org.springframework </groupId> <artifactId> spring-jdbc </artifactId> <version> ${spring.version} </version> </dependency> <!-- 添加mybatis依賴 --> <dependency> <groupId> org.mybatis </groupId> <artifactId> mybatis </artifactId> <version> ${mybatis.version} </version> </dependency> <dependency> <groupId> org.mybatis </groupId> <artifactId> mybatis-spring </artifactId> <version> 1.2.3 </version> </dependency> <!-- mysql 驅動 --> <dependency> <groupId> Mysql </groupId> <artifactId> mysql-connector-java </artifactId> <version> 5.1.30 </version> </dependency> <!-- 需要的log4j2日志包依賴 --> <dependency> <groupId> org.apache.logging.log4j </groupId> <artifactId> log4j-core </artifactId> <version> 2.5 </version> </dependency> <dependency> <groupId> org.apache.logging.log4j </groupId> <artifactId> log4j-web </artifactId> <version> 2.5 </version> </dependency> <dependency> <groupId> org.apache.logging.log4j </groupId> <artifactId> log4j-1.2-api </artifactId> <version> 2.5 </version> </dependency> <!-- 單元測試依賴的jar --> <dependency> <groupId> org.springframework </groupId> <artifactId> spring-test </artifactId> <version> ${spring.version} </version> <scope> test </scope> </dependency> <dependency> <groupId> org.junit4 </groupId> <artifactId> org.junit4 </artifactId> <version> 4.3.1 </version> </dependency> <!-- JSTL 標簽庫 --> <dependency> <groupId> jstl </groupId> <artifactId> jstl </artifactId> <version> 1.2 </version> </dependency> <dependency> <groupId> org.apache.commons </groupId> <artifactId> com.springsource.org.apache.commons.fileupload </artifactId> <version> 1.2.0 </version> </dependency> </dependencies> </project> |
注:我使用的是oschina的Maven倉庫,庫不匹配的時候可能部分jar包加不進來。
2)、配置 web.xml 文件:
<?xml version
=
"1.0"
encoding
=
"utf-8"
?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id = "WebApp_ID" version = "2.5" > <!-- 聲明項目的初始化參數 ,這里聲明了spring配置文件的位置 --> <context-param> <param-name> contextConfigLocation </param-name> <param-value> classpath:applicationContext*.xml </param-value> </context-param> <!-- 加入spring支持 --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <!-- 加入springMVC支持 --> <!-- springmvc 配置文件默認加載路徑為:WEB-INF/[servlet-name]-servlet.xml [servlet-name]為下面配置中的servlet-name元素的值,此處為springmvc --> <servlet> <servlet-name> springmvc </servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name> contextConfigLocation </param-name> <param-value> classpath:springmvc*.xml </param-value> </init-param> <!-- 1 代表容器初始化時加載servlet --> <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name> springmvc </servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 項目編碼過濾器 --> <filter> <filter-name> encodingFileter </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> encodingFileter </filter-name> <url-pattern>/ * </url-pattern> </filter-mapping> <!-- log4j2 支持 --> <context-param> <param-name> log4jConfiguration </param-name> <param-value>/ WEB-INF / classes / log4j2.xml </param-value> </context-param> <listener> <listener-class> org.apache.logging.log4j.web.Log4jServletContextListener </listener-class> </listener> <filter> <filter-name> log4jFilter </filter-name> <filter-class> org.apache.logging.log4j.web.Log4jServletFilter </filter-class> </filter> <filter-mapping> <filter-name> log4jFilter </filter-name> <url-pattern>/ * </url-pattern> </filter-mapping> </web-app> |
3 )、配置spring的配置文件applicationContext.xml
在源碼包src/main/resources下新建xml配置文件:applicationContext.xml,內容如下:
<?xml version
=
"1.0"
encoding
=
"utf-8"
?>
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:context = "http://www.springframework.org/schema/context" xmlns:tx = "http://www.springframework.org/schema/tx" xmlns:aop = "http://www.springframework.org/schema/aop" xsi:schemaLocation = "http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd "> <!-- 導入properties屬性文件 --> <context:property-placeholder location = "classpath:properties/datasource.properties" /> <!-- 配置數據源 --> <bean id = "dataSource" class = "org.springframework.jdbc.datasource.DriverManagerDataSource" > <property name = "username" value = "${jdbc.username}" ></property> <property name = "password" value = "${jdbc.password}" ></property> <property name = "url" value = "${jdbc.url}" ></property> <property name = "driverClassName" value = "${jdbc.driver}" ></property> </bean> <!-- 配置sqlSessionFactory--> <bean id = "sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean" > <property name = "dataSource" ref = "dataSource" ></property> <property name = "configLocation" value = "classpath:mybatis/mybatis-config.xml" ></property> <property name = "mapperLocations" value = "classpath:mapper/*.xml" ></property> </bean> <!-- 自動掃描mapper文件對應的接口類,將其中的接口自動創建成 MapperFactoryBean --> <bean class = "org.mybatis.spring.mapper.MapperScannerConfigurer" > <property name = "basePackage" value = "com.elgin.dao" ></property> </bean> <!-- 配置事務管理器 --> <bean id = "transactionManager" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager" > <property name = "dataSource" ref = "dataSource" ></property> </bean> <!-- 事務的傳播屬性 --> <tx:advice id = "taansactionAdvice" transaction-manager = "transactionManager" > <tx:attributes> <tx:method name = "add*" propagation = "REQUIRED" /> <tx:method name = "create*" propagation = "REQUIRED" /> <tx:method name = "delete*" propagation = "REQUIRED" /> <tx:method name = "remove*" propagation = "REQUIRED" /> <tx:method name = "update*" propagation = "REQUIRED" /> <tx:method name = "get*" read-only = "true" /> <tx:method name = "find*" read-only = "true" /> <tx:method name = "*" read-only = "true" /> </tx:attributes> </tx:advice> <!-- 參與事務的service --> <aop:config> <aop:pointcut expression = "execution(* com.elgin.service.*.*(..))" id = "servicePointCut" /> <aop:advisor advice-ref = "taansactionAdvice" pointcut-ref = "servicePointCut" /> </aop:config> </beans> |
4)、配置springMVC的配置文件:
在源碼包src/main/resources下新建xml配置文件:springmvc.xml,內容如下:
<?xml version
=
"1.0"
encoding
=
"UTF-8"
?>
<beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:context = "http://www.springframework.org/schema/context" xmlns:p = "http://www.springframework.org/schema/p" xmlns:mvc = "http://www.springframework.org/schema/mvc" xsi:schemaLocation = "http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd "> <!-- 配置spring注解掃描的包 --> <context:component-scan base-package = "com.elgin" ></context:component-scan> <!-- 開啟注解驅動 --> <!-- 會自動注冊DefaultAnnotationHandlerMapping 與AnnotationMethodHandlerAdapter 這兩個bean, 所以就沒有機會再給DefaultAnnotationHandlerMapping注入interceptors屬性,無法指定攔截器。 可以通過人工配置上面的兩個Bean,不使用 <mvc:annotation-driven />,就可以 給interceptors屬性 注入攔截器了 --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 靜態資源訪問,解決頁面無法訪問到js、img和css文件夾中的文件的問題 --> <mvc:resources location = "/imgages/" mapping = "/imgages/**" /> <mvc:resources location = "/js/" mapping = "/js/**" /> <mvc:resources location = "/css/" mapping = "/css/**" /> <!-- 視圖解析器:InternalResourceViewResolver UrlBasedViewResolver 的子類,通常用於查找 JSP(類 InternalResourceView)和 JSTL(類 JstlView,InternalResourceView 的子類)等視圖 --> <bean id = "viewResolver" class = "org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name = "viewClass" value = "org.springframework.web.servlet.view.JstlView" ></property> <property name = "prefix" value = "/WEB-INF/jsp" ></property> <property name = "suffix" value = ".jsp" ></property> </bean> <!-- 文件上傳限制 --> <bean class = "org.springframework.web.multipart.commons.CommonsMultipartResolver" > <property name = "defaultEncoding" value = "UTF-8" ></property> <property name = "maxUploadSize" value = "5242880" ></property> <property name = "maxInMemorySize" value = "20480" ></property> </bean> </beans> |
5)、配置mybatis的配置文件:
在源碼包src/main/resources下新建package:mybatis ,然后在mybatis包下新建mybatis的配置文件:mybatis-config.xml, 內容如下:
<?xml version
=
"1.0"
encoding
=
"UTF-8"
?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration> <!-- 類的別名 --> <typeAliases> <typeAlias type = "com.elgin.entities.User" alias = "User" /> </typeAliases> </configuration> |
6)、數據庫相關配置:
在源碼包src/main/resourecs下新建package:properties ,然后在properties包下新建:datasource.properties ,內容如下:
jdbc.username=root
jdbc.password=root jdbc.url=jdbc:mysql: // localhost:3306 / test jdbc.driver=com.mysql.jdbc.Driver |
7)、mybatis的dao接口映射文件:
在源碼包src/main/resourecs下新建package:mapper,然后在mapper包下新建:userMapper.xml,內容如下:
<?xml version
=
"1.0"
encoding
=
"UTF-8"
?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace = "com.elgin.dao.UserDao" > <!-- 新增一條記錄 --> <insert id = "addUser" parameterType = "User" > insert into t_user(username,password,email,phone)values(#{username},#{password},#{email},#{phone}) </insert> <!-- 刪除一條記錄 --> <delete id = "deleteUser" parameterType = "Integer" > delete from t_user where id = #{id} </delete> <!-- 更新一條記錄的數據 --> <update id = "updateUser" parameterType = "User" > update t_user set username=#{username},password=#{password},email=#{email},phone=#{phone} where id=#{id} </update> <!-- 查詢單條記錄 --> <select id = "getUser" parameterType = "Integer" resultType = "User" > SELECT * FROM t_user WHERE id = #{id} </select> <!-- 查詢多條記錄 --> <select id = "getUserList" resultType = "User" > select * from t_user </select> </mapper> |
8)、配置log4j2配置文件:
在源碼包src/main/resourecs下新建xml配置文件:log4j2.xml ,內容如下:
<?xml version
=
"1.0"
encoding
=
"utf-8"
?>
<Configuration status = "OFF" > <Appenders> <!-- 輸出到文件 --> <File name = "file" fileName = "d:/myapp.log" append = "true" > <PatternLayout pattern = "%d %-5p %c - %m%n" /> </File> <!--輸出到控制台配置--> <Console name = "Console" > <PatternLayout pattern = "%d{yyyy-MM-dd HH:mm:ss } %p %l %m%n" /> </Console> <!-- 日志文件定期整理處理 --> <RollingFile name = "RollingFile" fileName = "logs/app.log" filePattern = "d:/logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz" > <PatternLayout> <Pattern> %d{yyyy-MM-dd HH:mm:ss } %p %l %m%n </Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size = "20MB" /> </Policies> </RollingFile> </Appenders> <Loggers> <Logger level = "debug" name = "com.elgin" additivity = "false" > <AppenderRef ref = "Console" /> <AppenderRef ref = "file" /> </Logger> <Root level = "warn" > <AppenderRef ref = "file" /> <AppenderRef ref = "RollingFile" /> </Root> </Loggers> </Configuration> |
9)、開發dao,service,controller,實體entitis相關代碼:
在源碼包src/main/java中新建如下各個包:
實體類User:
package
com.elgin.entities; public class User { private Integer id; private String username; private String password; private String email; private String phone; public Integer getId() { return id; } public void setId(Integer 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; } public String getEmail() { return email; } public void setEmail( String email) { this .email = email; } public String getPhone() { return phone; } public void setPhone( String phone) { this .phone = phone; } } |
dao接口類:UserDao
package
com.elgin.dao; import java.util.List; import com.elgin.entities.User; public interface UserDao { public int addUser(User user); public int deleteUser(Integer id); public int updateUser(User user); public User getUser(Integer id); public List<User> getUserList(); } |
service接口類: UserService
package
com.elgin.service; import java.util.List; import com.elgin.entities.User; public interface UserService { public int addUser(User user); public int deleteUser(Integer id); public int updateUser(User user); public User getUser(Integer id); public List<User> getUserList(); } |
service實現類: UserServiceImpl
package
com.elgin.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.elgin.dao.UserDao; import com.elgin.entities.User; import com.elgin.service.UserService; @Service( "userService" ) public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; public int addUser(User user) { int result=userDao.addUser(user); return result; } public int deleteUser(Integer id) { int result=userDao.deleteUser(id); return result; } public int updateUser(User user) { int result=userDao.updateUser(user); return result; } public User getUser(Integer id) { User user=userDao.getUser(id); return user; } public List<User> getUserList() { List<User> list=userDao.getUserList(); return list; } } |
controller類: UserController
package
com.elgin.controller; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import com.elgin.entities.User; import com.elgin.service.UserService; @Controller public class UserController { private Logger logger = Logger.getLogger( this .getClass()); @Autowired private UserService userService; /** * @Title: addPage * @Description: 用戶添加頁面 * @param mm * @return 參數 */ @RequestMapping( "addpage.jhtml" ) public String addPage(ModelMap mm) { logger.info( "add page..." ); return "/register" ; } /** * @Title: Regiseter * @Description: 用戶添加操作 * @param request * @param response * @param user * @throws IOException * @throws ServletException 參數 */ @RequestMapping( "register.jhtml" ) public void Regiseter(HttpServletRequest request, HttpServletResponse response, User user) throws IOException, ServletException { int result = 0 ; if (user != null) { result = userService.addUser(user); } if (result > 0 ) { logger.info( "注冊成功.." ); response.sendRedirect( "/allUser.jhtml" ); } else { logger.error( "注冊失敗" ); request.getRequestDispatcher( "/500.jhtml" ).forward(request, response); } } /** * @Title: listUser * @Description: 列表顯示所有用戶 * @param mm * @return 參數 */ @RequestMapping( "allUser.jhtml" ) public String listUser(ModelMap mm) { List<User> list = userService.getUserList(); mm.put( "list" , list); return "/userlist" ; } /** * @Title: editUser * @Description: 用戶信息編輯頁面 * @param id * @param mm * @return 參數 */ @RequestMapping( "editUser.jhtml" ) public String editUser( String id, ModelMap mm) { User user = userService.getUser(Integer.parseInt(id)); mm.put( "user" , user); return "/register" ; } /** * @Title: updateUser * @Description: 更新用戶信息 * @param request * @param response * @param user * @throws Exception 參數 */ @RequestMapping( "updateUser.jhtml" ) public void updateUser(HttpServletRequest request, HttpServletResponse response, User user) throws Exception { int result = userService.updateUser(user); if (result > 0 ) { logger.info( "更新用戶數據成功" ); response.sendRedirect( "/allUser.jhtml" ); } else { logger.error( "更新用戶數據失敗" ); request.getRequestDispatcher( "/500.jhtml" ).forward(request, response); } } /** * @Title: deleteUserById * @Description: 刪除一條用戶記錄 * @param request * @param response * @param id * @throws Exception 參數 */ @RequestMapping( "deleteUser.jhtml" ) public void deleteUserById(HttpServletRequest request, HttpServletResponse response, String id) throws Exception { int result = userService.deleteUser(Integer.parseInt(id)); if (result > 0 ) { logger.info( "刪除用戶數據成功.." ); response.sendRedirect( "/allUser.jhtml" ); } else { logger.error( "刪除用戶數據失敗.." ); request.getRequestDispatcher( "/500.jhtml" ).forward(request, response); } } } |
10)、測試頁面:
根據視圖解析器的配置,在webapp/WEB-INF下新建jsp文件夾,用來保存相關頁面:
register.jsp
<%@ page language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%> <%@ taglib prefix= "c" uri= "http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html> <head> <meta http-equiv= "Content-Type" content= "text/html; charset=UTF-8" > <title>Register</title> </head> <body> <c: if test= "${empty user}" > <form action= "register.jhtml" method= "post" > </c: if > <c: if test= "${not empty user}" > <form action= "updateUser.jhtml" method= "post" > <input type= "hidden" value= "${user.id}" name= "id" > </c: if > <table> <tr> <td>用戶名:</td> <td><input type= "text" name= "username" value= "${user.username}" ></td> </tr> <tr> <td>密碼:</td> <td><input type= "password" name= "password" value= "${user.password}" ></td> </tr> <tr> <td>郵件:</td> <td><input type= "text" name= "email" value= "${user.email}" ></td> </tr> <tr> <td>電話:</td> <td><input type= "text" name= "phone" value= "${user.phone}" ></td> </tr> <tr> <td colspan= "2" align= "center" ><input type= "submit" value= "提交" ></td> </tr> </table> </form> </body> </html> |
userlist.jsp :
<%@ page language=
"java"
contentType=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%> <%@ taglib prefix= "c" uri= "http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd" > <html> <head> <meta http-equiv= "Content-Type" content= "text/html; charset=UTF-8" > <title>User List</title> </head> <body> <a href= "addpage.jhtml" />用戶注冊</a> <br/> <br/> <span >所有用戶</span> <br/> <br/> <table border= "2px" width= "800" > <tbody> <tr> <th>id</th> <th>用戶名</th> <th>密碼</th> <th>郵箱</th> <th>電話</th> <th>操作</th> </tr> <c:forEach items= "${list}" var= "user" > <tr> <td>${user.id}</td> <td>${user.username}</td> <td>${user.password}</td> <td>${user.email}</td> <td>${user.phone}</td> <td> <a href= "deleteUser.jhtml?id=${user.id}" >刪除</a> <a href= "editUser.jhtml?id=${user.id}" >編輯</a> </td> </tr> </c:forEach> </tbody> </table> </body> </html> |
三、測試結果:
將項目加載到tomcat,並啟動。
訪問:http://localhost:8080/addpage.jhtml ,進入編輯頁面
輸入數據點提交,數據保存成功並出現用戶列表頁面(編輯刪除同理):
控制台日志: