Java代碼的時候,經常會涉及到重復性的操作,這個時候就會想要是有這樣一個插件就好了,如果是大家都會遇到的場景,IDE或許已經提供了,再不然也有可能有人編寫了相關的插件。
要是這個操作是你們的編碼環境特有的,那就只能自己寫工具了。所以這里來學學如何編寫IDEA插件,讓自己的編程環境更加強大,更好的進行裝x。
開發IDEA插件有以下這些依賴:
你可能已經安裝了Ultimate版本,但是你還是需要安裝[IDEA][]的社區版本。因為商業版是閉源的,所以在調試時無法調試核心代碼。
社區版的安裝包里是不包含源碼的,所以我們需要手動從github上clone一份:
git clone --depth 1 git://git.jetbrains.org/idea/community.git idea
關于從源碼運行IDEA的方法參考 Check Out And Build Community Edition:
http://www.jetbrains.org/intellij/sdk/docs/basics/checkout_and_build_community.html
雖然不知道原因,但是根據Check Out And Build Community Edition:
http://www.jetbrains.org/intellij/sdk/docs/basics/checkout_and_build_community.html
我們需要建立一個 IDEA jdk來運行插件:
除非你在Mac上使用官方JDK,否則你需要手動添加 /lib/tools.jar到classpath中。關注微信公眾號:匠心零度,在后臺回復:idea,可以獲取我整最新 IDEA 教程,都是干貨。
打開 File|ProjectStructure新建一個 IntelliJPlatformSDK:
Java SDK選擇我們剛剛建立的 IDEA jdk:
然后我們可以把下載的IDEA社區版源碼添加到源碼路徑中,這樣在調試時,就可以調試IDEA自身的代碼了:
我們來編寫一個最簡單的插件來學習編寫一個插件的完整步驟。
選擇 IntellJPlatformPlugin,然后Project SDK指定剛剛新建的plugin sdk:
新建的插件項目:
插件根目錄下有兩個目錄 src和 resources。src是插件代碼目錄, resource是插件資源目錄,其中 META-INF/plugin.xml是插件的描述文件,就像Java web項目的 web.xml一樣。
plugin.xml默認的內容如下:
<idea-plugin> <id>com.your.company.unique.plugin.id</id> <name>Plugin display name here</name> <version>1.0</version> <vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor> <description><!\[CDATA\[ Enter short description for your plugin here.<br> <em>most HTML tags may be used</em> \]\]></description> <change-notes><!\[CDATA\[ Add change notes here.<br> <em>most HTML tags may be used</em> \]\]> </change-notes> <!\-\- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting\_started/build\_number_ranges.html for description --> <idea-version since-build="145.0"/> <!\-\- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting\_started/plugin\_compatibility.html on how to target different products --> <!\-\- uncomment to enable plugin in all products <depends>com.intellij.modules.lang</depends> --> <extensions defaultExtensionNs="com.intellij"> <!\-\- Add your extensions here --> </extensions> <actions> <!\-\- Add your actions here --> </actions> </idea-plugin>
插件擴展IDEA最常見的方式就是在菜單欄或者工具欄中添加菜單項,用戶通過點擊菜單項來觸發插件功能。IDEA提供了 AnAction類,這個類有一個虛方法 actionPerformed,這個方法會在每次菜單被點擊時調用。
新建一個自定義的Action有兩個步驟:
1、 繼承 AnAction類,在 actionPerformed方法中實現插件邏輯 2、 注冊action,有兩種方式,通過代碼注冊和通過 plugin.xml注冊
我們先寫一個簡單的Action類:
publicclass TextBoxes extends AnAction { // 如果通過Java代碼來注冊,這個構造函數會被調用,傳給父類的字符串會被作為菜單項的名稱 // 如果你通過plugin.xml來注冊,可以忽略這個構造函數 public TextBoxes() { // 設置菜單項名稱 super("Text _Boxes"); // 還可以設置菜單項名稱,描述,圖標 // super("Text _Boxes","Item description",IconLoader.getIcon("/Mypackage/icon.png")); } public void actionPerformed(AnActionEvent event) { Project project = event.getData(PlatformDataKeys.PROJECT); String txt= Messages.showInputDialog(project, "What is your name?", "Input your name", Messages.getQuestionIcon()); Messages.showMessageDialog(project, "Hello, " \+ txt + "!\n I am glad to see you.", "Information", Messages.getInformationIcon()); } }
然后我們在 plugin.xml中注冊這個Action:
<actions> <group id="MyPlugin.SampleMenu" text="_Sample Menu" description="Sample menu"> <add-to-group group-id="MainMenu" anchor="last" /> <action id="Myplugin.Textboxes"class="Mypackage.TextBoxes" text="Text _Boxes" description="A test menu item" /> </group> </actions>
這里我們新建了一個菜單組,其中text字符串的下劃線表示這個字母作為快捷鍵。這個菜單顯示的效果如下:
除了手動新建Action,IDEA還提供了快速新建的方法,在代碼目錄上點擊新建,可以看到Action:
可以在這個面板中填寫你要新建的Action信息,IDEA會幫你新建類,還有在plugin.xml中幫你注冊:
運行插件特別簡單,和運行普通Java代碼一樣,點擊運行或者調試的按鈕,就會啟動一個新的IDEA實例,這個實例中插件是生效的。
點擊Text Boxes就可以看到插件的效果了。
地址:https://www.jetbrains.com/idea/download/other.html
打開電腦上的控制面板-->程序-->程序和功能,找到舊版IDEA,卸載時勾選提示的兩個復選框,然后點擊Uninstall。
點擊Next >
自定義安裝路徑,點擊Next >
個人感覺只需要在64-bit launch前面打鉤就行,下面的12345的功能如下:
點擊Next >
點擊install進行安裝。
安裝成功,點擊Finish結束
第一次運行idea會讓選擇設置,我們選擇第二個默認的即可。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>hello</title>
</head>
<body>
你好!初學者,我是SpringBoot的簡單啟動頁面!
</body>
</html>
package com.springboot.demo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author
* @version 1.0
* @date 2021/09/07 10:50 上午
*/
/**
* Web層:就是Controller層,實現與web前端的交互。
*/
@RestController
@RequestMapping("/ceshi")
public class HelloWorldController {
@RequestMapping("/index")
public String sayHello(){
System.out.println("測試開始");
return "index";
}
}
spring:
datasource:
name: test #數據庫名
url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useSSL=false #url
username: root #用戶名
password: 123456 #密碼
# 升級后的mysql驅動類,Driver位置由com.mysql.jdbc.Driver 變為com.mysql.cj.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver #數據庫鏈接驅動
mybatis:
mapper-locations: classpath:mapper/*.xml #配置映射文件
type-aliases-package: package com.springboot.demo.bean #配置實體類
(1)DAO層:包括XxxMapper.java(數據庫訪問接口類),XxxMapper.xml(數據庫鏈接實現);(這個命名,有人喜歡用Dao命名,有人喜歡用Mapper,看個人習慣了吧)
(2)Bean層:也叫model層,模型層,entity層,實體層,就是數據庫表的映射實體類,存放POJO對象;
(3)Service層:也叫服務層,業務層,包括XxxService.java(業務接口類),XxxServiceImpl.java(業務實現類);(可以在service文件夾下新建impl文件放業務實現類,也可以把業務實現類單獨放一個文件夾下,更清晰)
(4)Web層:就是Controller層,實現與web前端的交互。
依照上面四層,創建目錄結構如下:
(1)在application配置文件中添加MyBatis配置:
spring:
datasource:
name: test #數據庫名
url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useSSL=false #url
username: root #用戶名
password: 1qaz2wsx #密碼
# 升級后的mysql驅動類,Driver位置由com.mysql.jdbc.Driver 變為com.mysql.cj.jdbc.Driver
driver-class-name: com.mysql.cj.jdbc.Driver #數據庫鏈接驅動
mybatis:
mapper-locations: classpath:mapper/*.xml #配置映射文件
type-aliases-package: package com.springboot.demo.bean #配置實體類
(2)pom.xml文件配置信息
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>test</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
(3)Bean實體類,依據數據庫表,生成set和get方法;
package com.springboot.demo.bean;
/**
* @author
* @version 1.0
* @date 2021/09/07 4:27 下午
*/
/**
* Bean層:也叫model層,模型層,entity層,實體層,就是數據庫表的映射實體類,存放POJO對象;
* 依據數據庫表,生成set和get方法;
*/
public class UserBean {
private int id;
private String name;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
(4)DAO層訪問數據庫接口文件:
package com.springboot.demo.mapper;
import com.springboot.demo.bean.UserBean;
/**
* @author
* @version 1.0
* @date 2021/09/07 4:41 下午
*/
/**
* DAO層訪問數據庫接口文件
*/
public interface UserMapper {
UserBean getInfo(String name,String password);
}
5)DAO層訪問數據庫實現文件(需在resource包下創建mapper文件夾,然后再創建一個UserMapper.xml.在application配置文件中mybatis:mapper-locations:對應的就是該文件地址),注意<mapper>標簽的namespace屬性要填寫 訪問數據庫接口類文件路徑:
<?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.springboot.demo.mapper.UserMapper">
<select id="getInfo" parameterType="String" resultType="com.springboot.demo.bean.UserBean">
SELECT * FROM user WHERE name = #{name} AND password = #{password}
</select>
</mapper>
(6)Service層業務接口類編寫:
package com.springboot.demo.service;
import com.springboot.demo.bean.UserBean;
import org.springframework.stereotype.Repository;
/**
* @author
* @version 1.0
* @date 2021/09/07 4:29 下午
*/
/**
* Service層:也叫服務層,業務層,包括XxxService.java(業務接口類),XxxServiceImpl.java(業務實現類);
* (可以在service文件夾下新建impl文件放業務實現類,也可以把業務實現類單獨放一個文件夾下,更清晰
*/
@Repository
public interface UserService {
UserBean loginIn(String name,String password);
}
(7)Service層業務實現類編寫,注意要注解@Service,注入DAO:
package com.springboot.demo.impl;
import com.springboot.demo.bean.UserBean;
import com.springboot.demo.mapper.UserMapper;
import com.springboot.demo.service.UserService;
/**
* @author
* @version 1.0
* @date 2021/09/07 4:48 下午
*/
/**
* Service層業務實現類編寫,注意要注解@Service,注入DAO:
*/
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserServiceImpl implements UserService {
//將DAO注入Service層
@Autowired
private UserMapper userMapper;
@Override
public UserBean loginIn(String name, String password) {
return userMapper.getInfo(name,password);
}
}
8)項目啟動類要添加注解@MapperScan項目啟動時掃描mapper接口,否則會報錯找不到mapper文件:
package com.springboot.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.springboot.demo.mapper")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class);
}
}
(9)編寫測試類,看是否能成功 訪問數據庫,獲取數據庫信息:
package com.springboot.demo;
import com.springboot.demo.bean.UserBean;
import com.springboot.demo.service.UserService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestApplicationTests {
@Autowired
UserService userService;
@Test
public void contextLoads() {
UserBean userBean = userService.loginIn("springboot", "123456");
System.out.println("該用戶ID為:");
System.out.println(userBean.getId());
}
}
(10) controller層,注意添加@controller注解,注入Service服務:
package com.springboot.demo.controller;
/**
* @author
* @version 1.0
* @date 2021/09/07 4:58 下午
*/
import com.springboot.demo.bean.UserBean;
import com.springboot.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class LoginController {
//將Service注入Web層
@Autowired
UserService userService;
@RequestMapping("/login")
public String show(){
return "login";
}
@RequestMapping(value = "/loginIn",method = RequestMethod.POST)
public String login(String name,String password){
UserBean userBean = userService.loginIn(name,password);
if(userBean!=null){
return "success";
}else {
return "error";
}
}
}
(11)html文件:
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form role="form" action = "/loginIn" method="post">
賬號:<input type="text" id="name" name = "name"> <br>
密碼:<input type="password" id = "password" name = "password"> <br>
<input type="submit" id = "login" value = "login">
</form>
</body>
</html>
success.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>success</title>
</head>
<body>
<h1>登錄成功!</h1>
</body>
</html>
error.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>error</title>
</head>
<body>
<h1>登錄失?。?lt;/h1>
</body>
</html>
項目到這里就算完美結束了,對自己說一聲,加油,努力學習。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。