1. 程式人生 > >Spring Boot + thymeleaf + UEditor整合

Spring Boot + thymeleaf + UEditor整合

因為公司專案需求,需要使用富文字編輯器,貨比三家選擇了百度的UEditor。然而做這個時,我這個小萌新連Spring Boot都不太清楚,所以給自己挖了很多坑,然後一直在填坑.....

首先到官網下載原始碼以及jsp版本,然後將解壓後的原始碼分別放到專案下。如圖所示,這裡需要注意的是config.json需要放到resource根目錄下。還有就是index.html放到templates下。

 接著就是pom的依賴了。

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20180130</version>
        </dependency>

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>
	</dependencies>

 這裡我要提起的是自己犯了一個令自己哭笑不得的錯誤,大佬可以自行略過...

 就是啟動類的註解,如果啟動類是放在根目錄的話,只寫@SpringBootApplication就ok了,反之則要寫三個註解:@SpringBootApplication、@EnableAutoConfiguration、@ComponentScan

接著就可以新建一個控制器UEditorController進行測試一下

@RequestMapping("/")
	public String showPage() {
		return "index";
	}

發現上傳圖片功能不能正常使用,提示說沒有獲取到配置。這裡它是通過jsp目錄下的controller.jsp進行操作的,然而我使用的是thymeleaf模板的話,我是在控制器寫了一個介面,替代了這個jsp。

@RequestMapping(value="/config")
    public void config(HttpServletRequest request, HttpServletResponse response) {
        response.setContentType("application/json");
        String rootPath = request.getSession().getServletContext().getRealPath("/");
        try {
            String exec = new ActionEnter(request, rootPath).exec();
            PrintWriter writer = response.getWriter();
            writer.write(exec);
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }

ConfigManager的getConfigpath方法:

private String getConfigPath () {
		//return this.parentPath + File.separator + ConfigManager.configFileName;
		try {
			//獲取classpath下的config.json路徑
			return this.getClass().getClassLoader().getResource("config.json").toURI().getPath();
		} catch (URISyntaxException e) {
			return null;
		}
	}

BinaryUploader:

public class BinaryUploader {  
  
    public static final State save(HttpServletRequest request,  
            Map<String, Object> conf) {  
        // FileItemStream fileStream = null;  
        // boolean isAjaxUpload = request.getHeader( "X_Requested_With" ) != null;  
  
        if (!ServletFileUpload.isMultipartContent(request)) {  
            return new BaseState(false, AppInfo.NOT_MULTIPART_CONTENT);  
        }  
  
        // ServletFileUpload upload = new ServletFileUpload(  
            //  new DiskFileItemFactory());  
        //  
        // if ( isAjaxUpload ) {  
        //     upload.setHeaderEncoding( "UTF-8" );  
        // }  
  
        try {  
            // FileItemIterator iterator = upload.getItemIterator(request);  
            //  
            // while (iterator.hasNext()) {  
            //  fileStream = iterator.next();  
            //  
            //  if (!fileStream.isFormField())  
            //      break;  
            //  fileStream = null;  
            // }  
            //  
            // if (fileStream == null) {  
            //  return new BaseState(false, AppInfo.NOTFOUND_UPLOAD_DATA);  
            // }  
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;  
            MultipartFile multipartFile = multipartRequest.getFile(conf.get("fieldName").toString());  
            if(multipartFile==null){  
                return new BaseState(false, AppInfo.NOTFOUND_UPLOAD_DATA);  
            }  
  
            String savePath = (String) conf.get("savePath");  
            //String originFileName = fileStream.getName();  
            String originFileName = multipartFile.getOriginalFilename();  
            String suffix = FileType.getSuffixByFilename(originFileName);  
  
            originFileName = originFileName.substring(0,  
                    originFileName.length() - suffix.length());  
            savePath = savePath + suffix;  
  
            long maxSize = ((Long) conf.get("maxSize")).longValue();  
  
            if (!validType(suffix, (String[]) conf.get("allowFiles"))) {  
                return new BaseState(false, AppInfo.NOT_ALLOW_FILE_TYPE);  
            }  
  
            savePath = PathFormat.parse(savePath, originFileName);  
  
            String basePath=(String) conf.get("basePath");
            String physicalPath = basePath + savePath;  
  
            //InputStream is = fileStream.openStream();  
            InputStream is = multipartFile.getInputStream();  
            State storageState = StorageManager.saveFileByInputStream(is,  
                    physicalPath, maxSize);  
            is.close();  
  
            if (storageState.isSuccess()) {  
                storageState.putInfo("url", PathFormat.format(savePath));  
                storageState.putInfo("type", suffix);  
                storageState.putInfo("original", originFileName + suffix);  
            }  
  
            return storageState;  
        // } catch (FileUploadException e) {  
        //  return new BaseState(false, AppInfo.PARSE_REQUEST_ERROR);  
        } catch (IOException e) {  
        }  
        return new BaseState(false, AppInfo.IO_ERROR);  
    }  
  
    private static boolean validType(String type, String[] allowTypes) {  
        List<String> list = Arrays.asList(allowTypes);  
  
        return list.contains(type);  
    }  
}

config.json增加如下的程式碼,這裡的地址是可以自己修改的。

“basePath”:“E:/image/”,

ConfigManager的getConfig方法裡增加一條,下面的兩條只是給個位置:

conf.put( "basePath", this.jsonConfig.getString("basePath") );

//這下面的兩行程式碼只是提供一個位置
conf.put( "savePath", savePath );
conf.put( "rootPath", this.rootPath );

然後我的application.properties檔案配置:

server.port=8088
server.servlet.context-path=/
server.tomcat.uri-encoding=UTF-8

spring.mvc.view.prefix=/
spring.mvc.view.suffix=.html

spring.thymeleaf.prefix=classpath:templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type=text/html 
spring.thymeleaf.cache=false

web.upload-path=E:/images/static/
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${web.upload-path}

好啦,完成可以正常上傳以及顯示了.

相關推薦

Spring Boot + thymeleaf + UEditor整合

因為公司專案需求,需要使用富文字編輯器,貨比三家選擇了百度的UEditor。然而做這個時,我這個小萌新連Spring Boot都不太清楚,所以給自己挖了很多坑,然後一直在填坑..... 首先到官網下載原始碼以及jsp版本,然後將解壓後的原始碼分別放到專案下。如圖所示,這裡需

Spring boot+Thymeleaf+easyui整合:js建立元件頁面報錯

開發工具:Ideal        使用場景:Demo 前提:        環境:Spring boot +Thymeleaf+easyui  &nbs

Spring Boot 2.0 整合Thymeleaf 模板引擎

reporting 配置信息 name www. title 建模 type 引擎 suffix 本節將和大家一起實戰Spring Boot 2.0 和thymeleaf 模板引擎 1. 創建項目 2. 使用Spring Initlizr 快速創建Spring Boot

spring-boot-thymeleaf

高精度 put ive 引入 function rri chang 解決方案 osi https://github.com/kolorobot/spring-boot-thymeleaf http://docs.spring.io/spring-boot/do

spring boot Thymeleaf模板引擎 最簡單輸出例子

test leaf att map 控制器 輸出 span blog hello spring boot Thymeleaf模板引擎 最簡單輸出例子 控制器代碼如下: @GetMapping(value = "/test")public String test(Mo

spring boot + thymeleaf 報錯 org.thymeleaf.exceptions.TemplateInputException

serve pac result http 返回 render lba div ble org.thymeleaf.exceptions.TemplateInputException: Error resolving template "admin/verifyPas

spring boot(十五)spring boot+thymeleaf+jpa增刪改查示例

ali 遍歷 config link examples 技術分享 返回 stat 業務 快速上手 配置文件 pom包配置 pom包裏面添加jpa和thymeleaf的相關包引用 <dependency> <groupId>org.sprin

spring boot: thymeleaf模板引擎使用

sage homepage 順序 object tomcat fig component art format spring boot: thymeleaf模板引擎使用 在pom.xml加入thymeleaf模板依賴 <!-- 添加thymeleaf的依賴 --

Spring Boot之Swagger2整合

一、Swagger2簡單介紹   Swagger2,它可以輕鬆的整合到Spring Boot中,並與Spring MVC程式配合組織出強大RESTful API文件。它既可以減少我們建立文件的工作量,同時說明內容又整合入實現程式碼中,讓維護文件和修改程式碼整合為一體,可以讓我們在修改程式碼邏輯的同時方便的修

spring boot MongoDB的整合和使用

前言 上一章節,簡單講解了如何整合Spring-data-jpa。本章節,我們來看看如何整合NoSQL的Mongodb。mongodb是最早熱門非關係資料庫的之一,使用也比較普遍。最適合來儲存一些非結構資料了,適合對大量或者無固定格式的資料進行儲存,比如:日誌、快取等。 一點知識

從零實現 Spring Boot 2.0 整合 weixin-java-mp(weixin-java-tools) 獲取 openId,用於微信授權

步驟: 一、內網穿透申請二級域名(有伺服器和域名者可略過) 二、申請微信公眾平臺測試號(有已認證的微信服務號者可略過) 三、搭建 Spring Boot 2.0 專案實現獲取openId 一、內網穿透: 因為要直接用內網本機開發除錯,微信網頁授權在回撥時要訪問本機,所以直接

使用spring boot + Thymeleaf實現web小頁面

本文章只是介紹下如何使用spring boot + Thymeleaf,實現簡單的web頁面步驟和流程 幾點說明: Spring boot開發web專案,通常打成jar包,使用內建的web伺服器 Tomcat、Jetty、undertow 來執行。  靜態資源(css、js、圖片等)預

Spring Boot起步以及整合themaleaf

1、建立專案 2、選擇Maven專案 Maven配置檔案 開啟專案 檢視專案結構 新增依賴pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs

Spring Boot的shiro整合(中)

一 配置 1 MyShiroRealm類 package com.wzq.shiro.config; import javax.annotation.Resource; import org.apache.shiro.authc.AuthenticationExc

Spring Boot的shiro整合(上)

一 新建pom <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>

spring-boot 2.0 整合 dubbo

spring-boot 2.0 整合 dubbo 新增如下依賴,需要執行 zookeeper <dependencies> <!-- Spring Boot Dubbo 依賴 --> <dependency> &

Spring Boot的shiro整合(下)

一 執行程式,MySQL生成5張資料表 1 sys_permission CREATE TABLE `sys_permission` ( `id` int(11) NOT NULL AUTO_INCREMENT, `available` bit(1) DEFA

Spring Boot中MyBatis整合Druid

Spring Boot中MyBatis整合Druid MyBatis整合Druid 1. 引入依賴 2. 配置application.properties 3. DruidConfiguration 4. DruidStatFil

Spring Boot -- Thymeleaf

Spring Boot -- Thymeleaf Thymeleaf簡介 1. pom.xml 2. application.properties Thymeleaf的預設配置 常用配置 3.建立Thymeleaf

Spring Boot中級篇-整合Swagger2分組文件

Swagger配置檔案 這裡配置兩個分組admin【後臺管理介面】、wechat【微信管理介面】 @Configuration @EnableSwagger2 public class Swagger2 { public static final String SWAGGE