728x90
300x250

[Spring-Framework] 21(번외). STS 4.4 - Spring Boot Starter 프로젝트 생성(MVC)


나의 글에서 주로 Spring Legacy Project로 환경구축에 대해서 다루었다.

하지만, 초기 STS 4.4 최신버전을 설치하면 Spring Legacy Project는 따로 구성해줘야 사용할 수 있게 된다.

(Help -> Eclipse Marketplace -> "검색어: sts" -> "Spring Tools 3 Add-on for Spring Tools 4 3.9.14.RELEASE")


Spring Boot를 소개하게 된 건, 셋팅에 있어서 그동안 조금 복잡한 과정을 거쳐야 했었는데 그런 걸 "통폐합"해서 간단하게 사용할 수 있도록 도와주고 있다.


알 필요성이 있다고 생각되서 작성하게 되었다.


[기대 효과]

(장점)

1. 복잡한 셋팅을 안 해도 된다

2. 빠른 작업이 가능해진다.


(단점)

1. Spring Framework 위주의 자동생성에서 벗어나질 못한다. ???






1. 프로젝트 생성하기


처음으로 Spring Starter Project를 생성하는 방법에 대해서 소개하도록 하겠다.



그림 1. 프로젝트 시작하기


File -> New -> Spring Starter Project를 클릭한다.



그림 2. 프로젝트 시작하기(2)


셋팅을 조금 해주면 된다.


Group명, Artifacte, Package, Description 등을 수정해도 된다.

자바 버전 등도 셋팅할 수 있다.

셋팅이 완료되었다면, Next를 클릭한다.



그림 3. 프로젝트 시작하기(3)


MySQL Driver, Oracle Driver, Spring Security, Spring Web Services를 체크한다.

Next를 누른다.



그림 4. 프로젝트 시작하기(4)


Finish를 누르면 프로젝트가 생성된다.



2. Spring Boot(Spring Starter)에서는 서블렛(Servlet) 지원하나요?


Servlet 기능이 되는지 궁금한 분들을 위해서 작성하였다.



그림 5. Servlet 생성하기 전의 모습 (결론: 생성 안 됨.)


Next를 클릭해보면, 생성할 수 없다고 나온다.


3. Run - Hello World


Spring Security를 체크한 경우에는 아래의 화면을 볼 수 있다.

Hello World 화면이라고 생각하면 된다.



그림 6. Run 누르면, 내장 톰캣으로 돌아감.


Run 아이콘을 클릭하면, 내장 톰캣 서버가 돌아간다.

웹 브라우저를 수동으로 열어서 호출 시켜보면 이런 화면이 나오면 정상이라고 보면 된다.



4. REST - 활용한 Controller "Hello, World"


REST에 대해서 소개한 적이 있다.

SpringBoot 데모에서는 JSP 파일이 없어서 REST로 태스트를 진행해야 한다.



그림 7. 클래스 만들기(1)


com.spring. (패키지폴더)를 마우스 오른쪽 버튼으로 클릭한다.

New -> Class를 클릭한다.



그림 8. 클래스 만들기(2)


예로 HomeController라고 입력하고 Finish를 누른다.

이름을 임의로 임력한다고 해서 큰 문제가 되진 않는다.




그림 9. 콘트롤러 코드 작성하기


이처럼 코드를 작성해준다.


package com.springmvc.home;


import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.bind.annotation.RestController;


@RestController

public class HomeController {

@RequestMapping("/")

public @ResponseBody String home() throws Exception{

return "home";

}

}




그림 9-1, 그림 9-2. 서버 실행과 내장 웹 브라우저 사용방법, JavaEE 인터페이스 화면


모르겠으면 한번씩 눌러보길 바란다.




그림 10. 빌드 - 웹 브라우저 열어보기(1)


계정 아이디: user

비밀번호는 Using generated security password에 생성된 보안키가 비밀번호이다.


입력하고 로그인을 눌러본다.



그림 11. 빌드 - 웹 브라우저 열어보기(2)


내장 이클립스 웹 브라우저에서는 화면이 안 보이는데, 엣지나 크롬의 경우에서는 출력된 REST 화면을 볼 수 있다.




5. Web기반 - Controller 작성하기


이번에는 다소 세팅 작업이 몇 가지가 있는데 일반 jsp 웹 페이지를 출력할 수 있는 Controller(컨트롤러) 생성에 대해서 소개하겠다.



그림 12. 클래스 생성하기 (1)


패키지를 마우스 오른쪽 버튼으로 클릭한다.

New->Class를 클릭한다.




그림 13. 클래스 생성하기 (2)


Superclass의 Browse를 클릭한다.

WebSecu를 검색하면, "WebSecurityConfigurerAdapter를 선택한다.

OK를 누른다.


클래스명(Name)은 WebSecConfig를 입력한다.

Finish를 누른다.



그림 14. 클래스 생성하기 (3)


그림 14처럼 생성되면 잘 생성된 것이다.

복잡하게 코드를 만드는 게 아니다.



그림 15. 클래스 생성하기 (4)


Source -> Override/Implement Methods를 클릭한다.




그림 16. Override / Implement Methods


configure(HttpSecurity)를 체크하고 OK를 누른다.





5-1 Web기반 - SecurityConfig 설정하기


이 글을 조금 심화적으로 이해하려면, Spring Security 부분을 참고하면 된다.

자랑하는 건 아니지만, 필자의 글이 가장 잘 나와있다고 소개하고 싶다.



그림 17. Spring Security 설정하기



package com.springmvc.home.security;


import org.springframework.security.config.annotation.web.builders.HttpSecurity;

import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;


public class WebSecurityConfig extends WebSecurityConfigurerAdapter {


@Override

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests()

.antMatchers("/").permitAll()

.antMatchers("/welcome").permitAll()

.antMatchers("/page1").hasRole("ADMIN")

.anyRequest().authenticated();

}


}



파일명: WebSecurityConfig.java


[첨부(Attachments)]

WebSecurityConfig.zip




5-2 Web기반 - HomeController.java 파일 수정하기


파일 수정을 조금 해줘야 한다.

아까 전에 만든 HomeController를 변형하도록 하겠다.


파일: com.springmvc.home.HomeController.java



그림 18. HomeController.java 만들기


package com.springmvc.home;


import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.ResponseBody;

import org.springframework.web.bind.annotation.RestController;


@RestController

public class HomeController {

@RequestMapping("/")

public @ResponseBody String home() throws Exception{

return "home";

}


@RequestMapping("/page1")

public @ResponseBody String page1() throws Exception{

return "Spring Boot : 1";

}

@RequestMapping("/page2")

public @ResponseBody String page2() throws Exception{

return "Spring Boot : 2";

}

}



파일명: HomeController.java


[첨부(Attachments)]

HomeController.zip


이전의 STS ("Legacy로 작업할 때, 웹 브라우저에 자동으로 재빌드되었다.")와는 다른 점이 빌드가 조금 느리게 반응하거나 수동 빌드를 해줘야 한다.

화면이 안 바뀌면, 다시 실행(Run)을 해보기 바란다. 버그가 전혀 없는 건 아니다.




그림 19. 출력 결과 - 확인하기(1)






그림 20. 출력 결과 - 확인하기(2)





6. Web기반 - WelcomeController 생성(Controller)


그림 20의 문제를 해결할 겸 Web기반 페이지를 작성하는 방법에 대해서 소개하겠다.



그림 21. 패키지 오른쪽 버튼 메뉴


com..... 패키지를 선택한다.

마우스 오른쪽 버튼 클릭한 후, New-> Class를 클릭한다.




그림 22. WelcomeController.java 생성하기


Name: "WelcomeController"

Finish를 클릭한다.



그림 23. 코드를 입력한 상태의 WelcomeController


초기에는 코드가 전혀 입력되어 있지 않다.

그림 23처럼 입력해준다.


package com.springmvc.home;


import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;


@Controller

public class WelcomeController {


@RequestMapping("/welcome")

public String welcome() {

return "welcome";

}

}



파일명: WelcomeController.java


[첨부(Attachments)]

WelcomeController.zip






7. application.properties 설정 - 웹 경로


웹 페이지를 사용하려면, 경로를 설정해줘야 한다.

이전 Spring Legacy나 maven project로 프로젝트를 생성했다면, web.xml가 존재했었다.

application.properties로 통합된 것으로 보인다.




그림 24. 코드를 입력한 상태의 application.properties


spring.mvc.view.prefix=/WEB-INF/views/

spring.mvc.view.suffix=.jsp


파일명: application.properties


[첨부(Attachments)]

application.zip




7-1. 웹 홈페이지 폴더와 jsp폴더 생성 - 웹 경로


이번에는 jsp 파일의 폴더를 생성하도록 하겠다.



그림 25. 폴더 만들기(1)


src/main 폴더를 오른쪽 버튼으로 클릭한다.

New->Folder를 클릭한다.




그림 26. 폴더 만들기(2)


webapp/WEB-INF/views를 입력한다.

Finish를 클릭한다.




그림 27. 파일 만들기


/src/main/webapp/WEB-INF/views 폴더 내에 파일을 만들어준다.

welcome.jsp 파일을 만든다.


서버를 재시작해준다.



그림 28. 로그인 후의 welcome(URL 주소)


그림 28의 화면이 뜨면, 잘 된 것이다.



7-2. CSS, Images, Javascript 경로


Css/images/Javascript의 경로에 관한 것이다.



그림 29. 결과 - 외부 CSS 적용


그림 29는 css 스타일이 적용된 결과이다. 



7-2-1. /src/main/java/resources/static/css/style.css


css 폴더는 /src/main/java/resources/static 내에 만들어주면 된다.

그리고 style.css 파일은 /src/main/java/resources/static/css 폴더에 만들어주면 된다.



그림 30. Style.css 위치



7-2-2. index.jsp 파일 수정하기


index.jsp 파일을 수정해주면 된다.



그림 31. index.jsp 파일 수정하기


<link rel="stylesheet" href="/css/style.css">


서버를 재시작하면 결과를 볼 수 있다.



그림 32. 출력 결과

반응형
728x90
300x250

[Spring-Framework] 12. 파일 업로드 구현하기, C태그 사용(if, else, foreach)


Spring-Framework로 파일 업로드 구현하는 방법에 대해서 소개하겠다.


[작업 환경]

* 웹 서버: Apache-tomcat-9.0.37-windows-x64

* IDE: Spring-Tool-Suite 4-4.7.2. Releases.

* Eclipse Marketplace: STS 검색 후 Spring Tools 3 Add-On for Spring Tools 4 3.9.14.Release 설치할 것

* POM 라이브러리: 

  - Apache Commons IO 2.8.0 (2020. 09)

  - Apache Commons FileUpload (2018. 12)

* C태그(JSTL)





1. Eclipse Marketplace 설치하기


help -> eclipse marketplace를 클릭한다.



그림 1. Spring Tools 3 Add-On for Spring Tools 4 3.9.14. Releases 설치하기





2. pom.xml 설정하기


http://mvnrepository.com 사이트에 접속한다.



그림 2. MVN-Repository (검색어: common-io)


검색은 "common-io"를 검색한다.



그림 3. Apache Commons IO - 2.8.0


최신 2.8.0을 클릭하여 pom을 복사한다. (maven)



그림 4. MVN-Repository (검색어: commons-fileupload)


검색은 "commons-fileupload"를 검색한다.





그림 5. Apache Commons FileUpload (1.4)


최신 1.4를 클릭하여 pom을 복사한다. (maven)



그림 6. MVN-Repository (검색어: servlet)


검색은 "Java Servlet API"를 검색한다.



그림 7. Java Servlet API (2018. 4)


최신 4.0.1을 클릭하여 pom을 복사한다. (maven)




그림 8. pom.xml 파일 수정하기


javax.servlet은 버전을 바꿔준다.

commons-io, commons-fileupload는 추가해준다.


(중략)

<!-- Servlet -->

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->

<dependency>

    <groupId>javax.servlet</groupId>

    <artifactId>javax.servlet-api</artifactId>

    <version>4.0.1</version>

    <scope>provided</scope>

</dependency>

<dependency>

<groupId>javax.servlet.jsp</groupId>

<artifactId>jsp-api</artifactId>

<version>2.1</version>

<scope>provided</scope>

</dependency>

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

<version>1.2</version>

</dependency>

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->

<dependency>

    <groupId>commons-io</groupId>

    <artifactId>commons-io</artifactId>

    <version>2.8.0</version>

</dependency>

<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->

<dependency>

    <groupId>commons-fileupload</groupId>

    <artifactId>commons-fileupload</artifactId>

    <version>1.4</version>

</dependency>


(중략)


* 파일명: pom.xml



3. web.xml - Servlet 2.5 스팩 -> 3.1 스팩으로 변경하기


스팩 정보에 관한 것이다.

Spring Legacy Project의 Spring MVC Project를 생성하면, servlet 2.5버전의 web.xml가 생성되는 것을 확인할 수 있다.

Spec 2.5에서 Spec 3.1로 변경해줘야 한다.



그림 9. web.xml (servlet 2.5 -> servlet 3.1 스팩으로 변경 전)



그림 10. web.xml (servlet 2.5 -> servlet 3.1 스팩으로 변경 후)


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

version="3.1">


(중략)


* 파일명: web.xml (servlet 3.1 스팩)



4. context-common.xml - 생성하기


context-common.xml을 하나 만들어주겠다. 만드는 이유는 파일 업로드 관련해서 만드는 것이다.


경로: /src/main/webapp/WEB-INF/spring/appServlet/



그림 11. appServlet 폴더에서 마우스 오른쪽 버튼 모습


"appServlet 폴더에서 오른쪽 버튼" -> "New" -> "File"을 클릭한다.



그림 12. context-common.xml 파일 만들기


file명은 context-common.xml이라고 입력한 후 Finish를 누른다.



그림 13. context-common.xml 파일 수정하기


<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:context="http://www.springframework.org/schema/context" 

xmlns:p="http://www.springframework.org/schema/p" 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xmlns="http://www.springframework.org/schema/beans" 

xmlns:mvc="http://www.springframework.org/schema/mvc" 

xmlns:cache="http://www.springframework.org/schema/cache" 

xmlns:aop="http://www.springframework.org/schema/aop" 

xsi:schemaLocation="http://www.springframework.org/schema/beans 

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 

http://www.springframework.org/schema/context 

http://www.springframework.org/schema/context/spring-context-3.0.xsd 

http://www.springframework.org/schema/mvc 

http://www.springframework.org/schema/mvc/spring-mvc.xsd 

http://www.springframework.org/schema/cache 

http://www.springframework.org/schema/cache/spring-cache.xsd">

<!-- MultipartResolver 설정 --> 

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 

<property name="maxUploadSize" value="100000000" /> 

<property name="maxInMemorySize" value="100000000" /> 

</bean>

</beans>


* 파일명: context-common.xml


[첨부(Attachments)]

context-common.zip


[비고]

파일 크기의 제한을 두기 위한 코드이다.

예: 최대 업로드 파일 크기는 20MB, 메모리에 최대로 저장할 수 있는 파일 크기는 10MB로 제한함.

1MB = 1,024KB

10MB = 10,485,760KB(1,024*1,024*10)

20MB = 20,971,520KB(1,024*1,024*20)



5. web.xml - context-common.xml 파일 인식시켜주기


web.xml을 연다.



그림 14. web.xml 수정 모습


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"

version="3.1">


<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/spring/root-context.xml</param-value>

</context-param>

<!-- Creates the Spring Container shared by all Servlets and Filters -->

<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>


<!-- Processes application requests -->

<servlet>

<servlet-name>appServlet</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>

/WEB-INF/spring/appServlet/servlet-context.xml

/WEB-INF/spring/appServlet/context-common.xml

</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>appServlet</servlet-name>

<url-pattern>/</url-pattern>

</servlet-mapping>



<!-- UTF-8 -->

<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>

</web-app>



파일명: web.xml


[첨부(Attachments)]

web.zip



6. (직접 파일구현에 있어서 연관이 있는지?): 아니다.

MemberVO.java


* 패키지 경로: com.example.postget.vo


package com.example.postget.vo;


public class MemberVO {


private int num;

private String id;

private String passwd;

private String address;

public int getNum() {

return num;

}

public void setNum(int num) {

this.num = num;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getPasswd() {

return passwd;

}

public void setPasswd(String passwd) {

this.passwd = passwd;

}

public String getAddress() {

return address;

}

public void setAddress(String address) {

this.address = address;

}

}



파일명: MemberVO.java


[첨부(Attachments)]

MemberVO.zip




7. Controller와 View 영역


지금 작업부터는 사용자 관점에서 파일 업로드를 구현하면 된다.

어떠한 작업을 할 것인지 개략적인 프로세스로 살펴보겠다.



그림 15. 프로세스 정의 - 파일 업로드


[첨부(Attachments)]

process.zip

process.pptx




8. Controller - BoardController.java 설정하기


POST 방식으로 /board/uploadResult를 호출하면, 파일 업로드 프로세스를 처리해주는 과정이 담긴 코드이다.

물론 루트 경로 등은 따로 별도로 재정의를 해서 사용하면 좋을 듯 싶다.

여력이 되면, 수정해봐도 좋을 듯 하다.


* 패키지 경로: com.example.postget.controller



그림 16, 그림 17. BoardController의 업로드 핵심 내용


POST 방식으로 업로드 처리에 관한 것이다.


(중략)


@RequestMapping(value = "uploadResult", method = RequestMethod.POST)

public String uploadResult(Model model, MemberVO memberVO, MultipartHttpServletRequest request) {

     // 루트 경로

           String rootUploadDir = "C:"+File.separator+"Upload"; // C:/Upload

           File dir = new File(rootUploadDir + File.separator + "testfile"); 

        

           if(!dir.exists()) { //업로드 디렉토리가 존재하지 않으면 생성

                dir.mkdirs();

           }

     Iterator<String> iterator = request.getFileNames(); // 다중 업로드 지원

           ArrayList<String> list = new ArrayList<String>();

        

           int fileLoop = 0;

           String uploadFileName;

           MultipartFile mFile = null;

           String orgFileName = ""; // 진짜 파일명

           String sysFileName = ""; // 변환된 파일명

        

            list.add("루트경로:" + dir + File.separator );

        

            while(iterator.hasNext()) {

       

                 fileLoop++;

            

                 uploadFileName = iterator.next();

                 mFile = request.getFile(uploadFileName);

            

                 orgFileName = mFile.getOriginalFilename();

                 logger.info(orgFileName);

            

                 if(orgFileName != null && orgFileName.length() != 0) { //sysFileName 생성

                

                   SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMDDHHmmss-" + fileLoop);

                   Calendar calendar = Calendar.getInstance();

                   sysFileName = simpleDateFormat.format(calendar.getTime()); //sysFileName: 날짜-fileLoop번호

                

                

                    try {

                        logger.info("try 진입");

                        mFile.transferTo(new File(dir + File.separator + sysFileName)); // C:/Upload/testfile/sysFileName

                        list.add("원본파일명: " + orgFileName + ", 시스템파일명: " + sysFileName);

                        list.add("파일크기: " + mFile.getSize() + ", 파일형식: " + mFile.getContentType() );

                    

                    }catch(Exception e){

                         list.add("오류: 파일 업로드 중 에러발생!!!");

                    }

                

                }//if

            

            }//while

        

            model.addAttribute("list", list);

return "/board/uploadResult";

}


(중략)


파일명: BoardController.java


[첨부(Attachments)]

BoardController.zip




9. View - board/insert.jsp


사용자 화면에 관한 것이다.


그림 18. /board/insert 페이지


미리 살펴보는 /board/insert 페이지에 대한 것이다.

파일 업로드 영역에 관한 핵심은 아래의 그림과 같다.



그림 19. views/board/insert.jsp



<!-- 파일 업로드 영역 -->

<h3>파일 업로드</h3>

<form method="POST" action="uploadResult" enctype="multipart/form-data">

<table style="width:900px; height:70px;">

<tr>

<td style="width:10%">아이디(UserID)</td>

<td style="width:90%">

<input type="text" name="id" class="login_id">

</td>

</tr>

<tr>

<td>

비밀번호(Password)

</td>

<td>

<input type="password" name="passwd" class="login_pwd">

</td>

</tr>

<tr>

<td colspan="2">

<input type="file" name="uploadFile" multiple>

</td>

</tr>

<tr>

<td colspan="2">

<input type="submit" value="로그인">

</td>

</tr>

</table>

</form>


파일명: insert.jsp


[첨부(Attachments)]

insert.zip



10. View - board/uploadResult.jsp


uploadResult 페이지에 대한 것이다.

앞서 Controller에서 정의된 것을 출력하는 페이지를 가리킨다.



그림 20. /board/uploadResult 페이지


소스코드는 다음과 같다.

c태그를 간단하게 if, else문도 적용시켜보았으니 참고해보면, 좋을 듯 싶다.


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>업로드 - 결과</title>

</head>

<body>


<!-- 업로드 결과 (출력) -->

<c:set var="i" value="1" />

<c:set var="num" value="1" />


<table style="width:700px; border:1px;">

<c:forEach items="${list}" var="list">

<c:choose>

<c:when test="${i == 1}">

<tr>

<td colspan="2" style="background-color:#e2e2e2;">

<c:out value="${num}" />

</td>

</tr>

</c:when>

</c:choose>

<c:choose>

<c:when test="${i <= 3}">

<tr>

<td><c:out value="${i}" /></td>

<td>${list}</td>

<c:set var="i" value="${i + 1}" />

</tr>

</c:when>

<c:otherwise>

<c:set var="i" value="1" />

<c:set var="num" value="${num + 1}" />

</c:otherwise>

</c:choose>

</c:forEach>

</table>

</body>

</html>


* 파일명: uploadResult.jsp


[첨부(Attachments)]

uploadResult.zip



11. 파일 업로드 결과 - 실제 업로드된 모습



그림 21. 파일 업로드 모습 (2020-09-24)



12. 맺음글(Conclusion)


파일 업로드 방법에 대해서 살펴보았다.



* 참고자료(References)


1. Maven Repository: commons-fileupload » commons-fileupload » 1.4, https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload/1.4, Accessed by 2020-09-24, Last Modified 2018-12-24.

2. Maven Repository: commons-io » commons-io » 2.8.0, https://mvnrepository.com/artifact/commons-io/commons-io/2.8.0, Accessed by 2020-09-24, Last Modified 2020-09-09.

3. web.xml 서블릿 버전별 DTD, https://antop.tistory.com/entry/webxml-%EC%84%9C%EB%B8%94%EB%A6%BF-%EB%B2%84%EC%A0%84%EB%B3%84-DTD#footnote_link_145_1, Accessed by 2020-09-24, Last Modified 2013-03-03.


반응형

+ Recent posts