Spring MVC — загрузка файлов, создание (генерация) Excel и PDF документов
Рассмотрим как можно загрузить файл в приложении Spring MVC. Также рассмотрим создание .xls и .pdf документов с помощью Spring MVC.
Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
Используемые технологии и библиотеки
- Spring MVC 4.2.4.Release
- Apache commons file upload 1.3.1
- Apache POI 3.12
- iText 2.1.15
- Maven 3.2.5
- IntelliJ IDEA 15.0.2
1. Описание задачи
Рассмотреть каким образом можно загружать на сервер различные файлы в приложении на основе Spring MVC. Изучить применение библиотек Apache POI и iText для создания документов Microsoft и PDF соответственно.
2. Структура проекта
Для этой задачи были добавлены java классы для загрузки файла (FileUploadController), создания excel и pdf документов (ExcelDocument, PDFDocument), класс-модель (Cat) и контроллер, который будет обрабатывать запросы с jsp страницы (ExcelPDFController). Для отображения результата используется представление /file/file.jsp. Дополнительно, начиная с этой части, будет использоваться шаблоны для формирования jsp страниц, чтобы не дублировать повторяющиеся части страницы (здесь header и footer вынесены в шаблон).
3. Подключение зависимостей pom.xml
Для выполнения задачи нам понадобятся три библиотеки. Комментарии поясняют для чего каждая зависимость необходима:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<!-- Apache Commons File Upload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <!-- Excel view --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.12</version> </dependency> <!-- PDF view --> <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.1.5</version> </dependency> |
pom.xml со всеми зависимостями:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
<?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>ru.javastudy</groupId> <artifactId>mvc_html5_angular</artifactId> <version>1.0</version> <properties> <!-- Generic properties --> <java.version>1.8</java.version> <!-- Web --> <jsp.version>2.2</jsp.version> <jstl.version>1.2</jstl.version> <servlet.version>3.1.0</servlet.version> <!-- Spring --> <spring-framework.version>4.2.4.RELEASE</spring-framework.version> </properties> <dependencyManagement> <!--all spring dependencies --> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>${spring-framework.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!--bootstrap webjars.org--> <dependencies> <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <!-- Other Servlet Web dependencies --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>${jsp.version}</version> <scope>provided</scope> </dependency> <!-- Apache Commons File Upload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <!-- Excel view --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.12</version> </dependency> <!-- PDF view --> <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.1.5</version> </dependency> </dependencies> <!--http://startbootstrap.com/template-overviews/modern-business/ this is theme--> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.0</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerArgument>-Xlint:all</compilerArgument> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> </configuration> </plugin> </plugins> </build> </project> |
4. Настройка конфигурации Spring MVC
Для загрузки файлов нам понадобится прописать в mvc-config.xml интерфейс MultipartResolver. Для создания pdf, excel документов был добавлен отдельный xml конфигурационный файл и с помощью XmlViewResolver был подключен к конфигурации спринг. Обратите внимание, что относительно предыдущей части была добавлена строчка <mvc:annotation-driven/>, которая «включит» наши @Component бины.
Настройки mvc-config.xml для этой части:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<!-- mvc:annotation-driven configures Spring MVC annotations Support for validating @Controller inputs with @Valid, if a JSR-303 Provider is present on the classpath. HttpMessageConverter support for @RequestBody method parameters and @ResponseBody method return values from @RequestMapping or @ExceptionHandler methods. --> <mvc:annotation-driven/> <!-- ViewResolver bean config for mapping strings to jsp views --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- Example: a logical view name of 'showMessage' is mapped to '/WEB-INF/jsp/showMessage.jsp' --> <property name="order" value="1" /> <property name="prefix" value="/WEB-INF/view/" /> <property name="suffix" value=".jsp" /> </bean> <!-- File Upload bean config--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- set the maximum file size in bytes --> <property name="maxUploadSize" value="1000000"/> </bean> <!--Excel and PDF xml view configuration --> <bean class="org.springframework.web.servlet.view.XmlViewResolver"> <property name="order" value="0" /> <property name="location"> <value>/WEB-INF/config/excel-pdf-config.xml</value> </property> </bean> <mvc:view-controller path="/index.html" view-name="/index"/> <mvc:view-controller path="/about.html" view-name="/about/about"/> <mvc:view-controller path="/file.html" view-name="/file/file"/> |
excel-pdf-config.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?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"> <!-- When a controller returns excelDocument render the model with the spring.mvc.excelpdf.ExcelDocument class --> <bean id="excelDocument" class="ru.javastudy.mvcHtml5Angular.mvc.excelpdf.ExcelDocument" /> <!-- When a controller returns pdfDocument render the model with the spring.mvc.excelpdf.PDFDocument class --> <bean id="pdfDocument" class="ru.javastudy.mvcHtml5Angular.mvc.excelpdf.PDFDocument"/> </beans> |
В этом конфигурационном файле указываются два бина из пакета ../mvc, которые будут использоваться для работы с документами.
Полный файл mvc-config.xml:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- context:component-scan This tag will scan @Component, @Repository, @Service, @Controller and also resolves @Autowired and @Qualifier --> <context:component-scan base-package="ru.javastudy.mvcHtml5Angular.mvc" /> <!-- mvc:annotation-driven configures Spring MVC annotations Support for validating @Controller inputs with @Valid, if a JSR-303 Provider is present on the classpath. HttpMessageConverter support for @RequestBody method parameters and @ResponseBody method return values from @RequestMapping or @ExceptionHandler methods. --> <mvc:annotation-driven/> <!-- ViewResolver bean config for mapping strings to jsp views --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- Example: a logical view name of 'showMessage' is mapped to '/WEB-INF/jsp/showMessage.jsp' --> <property name="order" value="1" /> <property name="prefix" value="/WEB-INF/view/" /> <property name="suffix" value=".jsp" /> </bean> <!-- File Upload bean config--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- set the maximum file size in bytes --> <property name="maxUploadSize" value="1000000"/> </bean> <!--Excel and PDF xml view configuration --> <bean class="org.springframework.web.servlet.view.XmlViewResolver"> <property name="order" value="0" /> <property name="location"> <value>/WEB-INF/config/excel-pdf-config.xml</value> </property> </bean> <mvc:view-controller path="/index.html" view-name="/index"/> <mvc:view-controller path="/about.html" view-name="/about/about"/> <mvc:view-controller path="/file.html" view-name="/file/file"/> </beans> |
Файл application-context.xml остался без изменений.
5. web.xml
Для работы с русскими символами вам нужно добавить в дескриптор развертывания фильтр, который на лету будет преобразовывать их в кодировку UTF-8. В противном случае вы получите что-то вроде ???###?.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<!--Позволяет работать с русскими символами--> <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> |
6. Java классы для работы с PDF, Excel, FileUpload
6.1. Загрузка файла
Для загрузки файла Spring MVC используется свой интерфейс MultipartResolver (мы будем использовать реализующий его класс CommonsMultipartResolver). Работа с ним очень простая. Всё что нужно сделать — указать маппинг, по которому контроллер перехватит запрос на закачку файла. Далее в классе используется стандартная работа с потоками байт и запись файла.
FileUploadController:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
package ru.javastudy.mvcHtml5Angular.mvc.file; import org.springframework.stereotype.Controller; 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 org.springframework.web.multipart.MultipartFile; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; /** * Created for JavaStudy.ru on 23.02.2016. */ @Controller public class FileUploadController { @RequestMapping(value = "/uploadFile", method = RequestMethod.POST) public @ResponseBody String handleFileUpload(@RequestParam("file") MultipartFile file) { if (!file.isEmpty()) { try { byte[] fileBytes = file.getBytes(); String rootPath = System.getProperty("catalina.home"); System.out.println("Server rootPath: " + rootPath); System.out.println("File original name: " + file.getOriginalFilename()); System.out.println("File content type: " + file.getContentType()); File newFile = new File(rootPath + File.separator + file.getOriginalFilename()); BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(newFile)); stream.write(fileBytes); stream.close(); System.out.println("File is saved under: " + rootPath + File.separator + file.getOriginalFilename()); return "File is saved under: " + rootPath + File.separator + file.getOriginalFilename(); } catch (Exception e) { e.printStackTrace(); return "File upload is failed: " + e.getMessage(); } } else { return "File upload is failed: File is empty"; } } } |
6.2. Создание PDF, Excel документов
Для работы с документами от майкрософт (xls, doc..) мы используем библиотеку от Apache. Для работы с PDF документами будет использоваться библиотека iText.
Хочу отметить, что iText использует встроенный в spring класс org.springframework.web.servlet.view.document.AbstractPdfView, но есть более современная библиотека для работы с PDF — iTextPDF 5.5.1 (она не поддерживает библиотеки из этого примера). Работа с iTextPDF 5.5.1 показана в похожей статье Spring Web Flow — создание PDF и Excel документов.
Нам понадобится создать два класса, в которых будет генерироваться соответствующий документ, а так же контроллер, который будет обрабатывать запросы от клиента. Дополнительно был создан класс-заглушка Cat чисто для формирования таблиц. Описывать подробно классы не буду, т.к. все названия методов и переменных показывают их назначение (pdfHeader, addCell и т.п.).
ExcelDocument:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
package ru.javastudy.mvcHtml5Angular.mvc.excelpdf; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.springframework.web.servlet.view.document.AbstractExcelView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; /** * Created for JavaStudy.ru on 23.02.2016. */ public class ExcelDocument extends AbstractExcelView { @Override protected void buildExcelDocument( Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception { //New Excel sheet HSSFSheet excelSheet = workbook.createSheet("Simple excel example"); //Excel file name change response.setHeader("Content-Disposition", "attachment; filename=excelDocument.xls"); Font font = workbook.createFont(); font.setFontName("Arial"); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); font.setColor(HSSFColor.WHITE.index); //Create Style for header CellStyle styleHeader = workbook.createCellStyle(); styleHeader.setFillForegroundColor(HSSFColor.BLUE.index); styleHeader.setFillPattern(CellStyle.SOLID_FOREGROUND); styleHeader.setFont(font); //Set excel header setExcelHeader(excelSheet, styleHeader); //Get data from model List<Cat> cats = (List<Cat>) model.get("modelObject"); int rowCount = 1; for (Cat cat : cats) { HSSFRow row = excelSheet.createRow(rowCount++); row.createCell(0).setCellValue(cat.getName()); row.createCell(1).setCellValue(cat.getWeight()); row.createCell(2).setCellValue(cat.getColor()); } } public void setExcelHeader(HSSFSheet excelSheet, CellStyle styleHeader) { //set Excel Header names HSSFRow header = excelSheet.createRow(0); header.createCell(0).setCellValue("Name"); header.getCell(0).setCellStyle(styleHeader); header.createCell(1).setCellValue("Wieght"); header.getCell(1).setCellStyle(styleHeader); header.createCell(2).setCellValue("Color"); header.getCell(2).setCellStyle(styleHeader); } } |
PDFDocument:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
package ru.javastudy.mvcHtml5Angular.mvc.excelpdf; import com.lowagie.text.Document; import com.lowagie.text.Element; import com.lowagie.text.Phrase; import com.lowagie.text.pdf.PdfPCell; import com.lowagie.text.pdf.PdfPTable; import com.lowagie.text.pdf.PdfWriter; import org.springframework.web.servlet.view.document.AbstractPdfView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; /** * Created for JavaStudy.ru on 23.02.2016. */ public class PDFDocument extends AbstractPdfView { @Override protected void buildPdfDocument( Map<String, Object> model, Document document, PdfWriter writer, HttpServletRequest request, HttpServletResponse response) throws Exception { PdfPTable table = new PdfPTable(3); PdfPCell header1 = new PdfPCell(new Phrase("Name")); PdfPCell header2 = new PdfPCell(new Phrase("Weight")); PdfPCell header3 = new PdfPCell(new Phrase("Color")); header1.setHorizontalAlignment(Element.ALIGN_LEFT); header2.setHorizontalAlignment(Element.ALIGN_LEFT); header3.setHorizontalAlignment(Element.ALIGN_LEFT); table.addCell(header1); table.addCell(header2); table.addCell(header3); //Get data from model List<Cat> cats = (List<Cat>) model.get("modelObject"); for (Cat cat : cats) { table.addCell(cat.getName()); table.addCell(String.valueOf(cat.getWeight())); table.addCell(cat.getColor()); } document.add(table); } } |
ExcelPDFController:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package ru.javastudy.mvcHtml5Angular.mvc.excelpdf; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import java.util.ArrayList; import java.util.List; @Controller public class ExcelPDFController { @RequestMapping(value = "/excel", method= RequestMethod.GET) public ModelAndView excel() { System.out.println("ExcelPDFController excel is called"); List<Cat> cats = createCats(); //excelDocument - look excel-pdf-config.xml return new ModelAndView("excelDocument", "modelObject", cats); } @RequestMapping(value = "/pdf", method= RequestMethod.GET) public ModelAndView pdf() { System.out.println("ExcelPDFController pdf is called"); List<Cat> cats = createCats(); //pdfDocument - look excel-pdf-config.xml return new ModelAndView("pdfDocument", "modelObject", cats); } private List<Cat> createCats() { List<Cat> cats = new ArrayList<>(); for (int i = 0; i <10; i++) { Cat cat = new Cat("cat" + i, "color" + i, i); cats.add(cat); } return cats; } } |
Cat:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class Cat { private String name; private String color; private int weight; public Cat(String name, String color, int weight) { this.name = name; this.color = color; this.weight = weight; } .. } |
7. JSP представление
7.1 Использование шаблонов
Начиная с этой части в приложении будут использованы шаблоны для построения страниц. Т.к. на всех страницах у нас повторяется header и footer, то они были вынесены в файл template.tag. Описание применения шаблонов не входит в тему статьи, но кратко опишу на что обратить внимание. В начале .tag или .jsp страницы прописывается такая конструкция:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
ДЛЯ JSP страницы, которая будет загружать шаблон (смотрите тег page, который указывает на путь к шаблону) <!DOCTYPE html> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@ taglib prefix="page" tagdir="/WEB-INF/tags" %> ДЛЯ ФАЙЛА ШАБЛОНА (обратите внимание на первые строчки) <!DOCTYPE html> <%@tag description="Template Site tag" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@taglib prefix="spring" uri="http://www.springframework.org/tags" %> |
7.2. JSP представление по загрузке и генерации файлов
Результат работы будет выводиться на странице file.jsp.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
<!DOCTYPE html> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> <%@ taglib prefix="page" tagdir="/WEB-INF/tags" %> <page:template> <jsp:body> <!-- Page Content --> <div class="container"> <!-- Page Heading/Breadcrumbs --> <div class="row"> <div class="col-lg-12"> <h1 class="page-header">Пример загрузки файла <small>pdf или excel</small> </h1> <ol class="breadcrumb"> <li><a href="index.html">Home</a> </li> <li class="active">Пример загрузки файла</li> </ol> </div> </div> <!-- /.row --> <c:url value="/uploadFile" var="fileUploadControllerURL" /> <!-- Content Row --> <div class="row"> <div class="col-lg-12"> <p>Пример загрузки файла с помощью Spring MVC </p> <form action="${fileUploadControllerURL}" method="post" enctype="multipart/form-data"> <table> <tr> <td><b>File:</b></td> <td><input type="file" name="file"></td> <td><input type="submit" value="загрузить файл"></td> </tr> </table> </form> <br /> <c:url value="/excel" var="excelController"/> <c:url value="/pdf" var="pdfController"/> <a href="${excelController}">Excel</a> <br /> <a href="${pdfController}">PDF</a> </div> </div> <!-- /.row --> <hr> </div> <!-- /.container --> </jsp:body> </page:template> |
Обратите внимание на использование тегов jsp:page (указывает на файл шаблона, см. описание тега в начале страницы) и jsp:body (контент внутри этого тега будет вставлен в необходимое место, указанное в шаблоне).
8. Запуск приложения
Результаты работы приложения можно увидеть на этих скриншотах:
Общий вид страницы:
Созданный xls файл:
PDF документ:
После загрузки файла:
Исходные коды
MVC_AngularJS_Html5 full project — полный проект Spring MVC + AngularJS + Bootstrap + HTML5.
2. Upload File, Pdf, Excel — код для этой части
Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
16
4 thoughts on “Spring MVC — загрузка файлов, создание (генерация) Excel и PDF документов”
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.
я все сломал, не грузятся стили и при переходе по ссылкам выдает
Servlet.init() for servlet dispatcherServlet threw exception
exception
root cause
Я так понимаю в artifacs не добавились библиотеки для загрузки файлов… Я удалил его и добавил заново… и все заработало )
Привет, надеюсь, ты еще поддерживаешь этот офигенский сайт. Столкнулся с такой проблемой.
Сделал по образу и подобию, но когда пытаюсь зайти на ../uploadFile в лицо вылетает
HTTP Status 405 — Request method ‘GET’ not supported.
Попробовал взять архив с сайта, та же проблема. Не знаешь, с чем может быть связано?
_____
Разобрался, понял, что нужно сначала было проследовать на file.html. А от туда уже по клику идет Get на uploadFiles.
PS Вчера была такая же ошибка, так что одним пониманием двух зайцев 😉
Добрый день!
Спасибо большое за этот ресурс! Только недавно начал изучать Spring.
Предыдущий пример работает нормально, а в этом и последующих начинаются проблемы.
Использую Idea 21016.1.4 , беру сразу ваши исходники для данного примера.
Maven сразу подчеркивает красным зависимости, соответственно проект не компилируется.
Удаление-вставка не помогают. Подскажите, пожалуйста, в какую сторону рыть.
_________
Сам себе отвечу! Пути к Maven были неправильные!