2020. 8. 12. 10:24 DEV ENVIRONMENT
AWS EC2 스프링부트 JSP 404 에러, SpringBoot JSP Not Found Error, WAR, JAR

오늘은 어렵사리 스프링부트 프로젝트에 jsp를 적용했습니다.

로컬에서 테스트를 해보고 aws에 올렸는데,

로컬에서는 되던게 aws에서는 안되는것입니다.

코딩한것에서는 오류가 없었는데 컨트롤러에 연결되는 jsp파일을 찾지 못하는 오류가 발생합니다.

 

 

 

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Mon Aug 10 04:07:03 UTC 2020

There was an unexpected error (type=Not Found, status=404).

/WEB-INF/views/index.jsp

 

 

검색해보니 이런저런 방법들이 많이 나와있던데,

저같은 경우에는 jar패키징을 war로 변경해서 해결했습니다.

 

- 클래스가 찾는 뷰파일의 위치 확인,
- 프로젝트가 빌드될때 war로 빌드되게 변경
- war패키지 안에 jsp파일이 잘 들어있는지 확인

하면 됩니다.

 

 

1. build.gradle 파일에 war설정

plugins {
	id 'war' // 추가
}

apply plugin: 'war'  // 추가


bootWar {
	archiveBaseName="springboot" // 추가
	archiveVersion="1.0.0-SNAPSHOT" // 추가
}

 

2. 로컬에서 실행시
그래들 싱크 > gradle 탭에서 bootWar 실행 > 어플리케이션 실행

 

3. AWS EC2에서 실행시

cd 프로젝트디렉토리

./gradlew bootwar

nohup java -jar ./build/libs/스냅샷파일.war &

 

 

EX: 스프링부트에 JSP사용 설정시, 파일 위치

 

 

2019. 1. 30. 12:22 COMPUTER/JAVA, JSP
[JAVA/JSP] 사용자 IP, 접속자 IP, 클라이언트 IP 주소 가져오기 샘플코드

자바나 JSP로 클라이언트 IP주소를 알아내는 코드 샘플 입니다.


보통 request.getRemoteAddr()로 사용하죠.

IP주소를 알아내는 방법은 여러가지가 있습니다.

3가지나 준비했습니다. 골라서 사용하세요.



클라이언트 IP 주소 가져오기 #1

 
// 클라이언트 IP 주소 가져오기 #1
 
String ipAddress=request.getRemoteAddr();
System.out.println("클라이언트 IP 주소: "+ipAddress);
 



클라이언트 IP 주소 가져오기 #2

 
// 클라이언트 IP 주소 가져오기 #2
 
String header=request.getHeader("X-Forwarded-For");
String ipAddress=new StringTokenizer(header, ",").nextToken().trim();
System.out.println("클라이언트 IP 주소: "+ipAddress);
 



클라이언트 IP 주소 가져오기 #3

// 클라이언트 IP 주소 가져오기 #3
 
String ipAddress=request.getRemoteAddr();
if(ipAddress.equalsIgnoreCase("0:0:0:0:0:0:0:1")){
    InetAddress inetAddress=InetAddress.getLocalHost();
    ipAddress=inetAddress.getHostAddress();
}
System.out.println("클라이언트IP 주소: "+ipAddress);
 




2014. 2. 6. 14:14 SERVER
아파치 톰캣 8.0.1 베타버전, Apache Tomcat 8.0.1 (beta)

아직 톰캣 7로 프로젝트도 못해봤는데,

벌써 8이 나오다니요...

베타긴 하지만 조만간에 정식으로 릴리즈 될듯요...

설치는 나중에





아파치 톰캣 8.0.1 (베타) 릴리즈, Apache Tomcat 8.0.1 (beta) Released

http://tomcat.apache.org/





아파치 톰캣 8 다운로드, Apache Tomcat 8 Downloads

http://tomcat.apache.org/download-80.cgi



아파치 톰캣 8 도큐먼트, Apache Tomcat 8 Document

http://tomcat.apache.org/tomcat-8.0-doc/index.html

 

2012. 9. 18. 16:01 COMPUTER/JAVA, JSP
[JAVA/JSP] 데이트포멧 에러, DateFormat Error, java.lang.IllegalArgumentException: Illegal pattern character 'T' in

 

코딩 중 에러 발생...

 

2012-10-02T12:50 와 같은 날짜를 만드려고 포멧 스트링에 T를 적었습니다.

 

Unexpected Exception occurred - java.lang.IllegalArgumentException:

Illegal pattern character 'T' in "yyyy-MM-ddTHH:mm:ss"

 

데이트 포맷 스트링에 T를 잘못사용 했다는 에러 입니다.

 

 
하여 역슬레쉬 (\T)로 해봤지만 소용없음

 

 

대신 따옴표를 앞뒤로 붙이면 됩니다.


//잘못된 사용법
 
Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("Asia/Seoul"));
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-ddTHH:mm:ss");
String strBuf=dateFormat.format(calendar.getTime());
 


//올바른 사용의 예~

Calendar calendar=Calendar.getInstance(TimeZone.getTimeZone("Asia/Seoul")); 
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
String strBuf=dateFormat.format(calendar.getTime());
 


2011. 2. 25. 17:53 PROGRAMMING
[JAVA] 이미지 리사이즈용 소스, 썸네일 만들기, THUMBNAIL, IMAGE, RESIZE

사용법은 패스~

import [패키지];

File fileSource=new File("C:\ORIGINAL\","SOURCE.JPG");
File fileThumb=new File("C:\TEST\","AHNDOORI.JPG");  
ImageUtil.resizeImage(fileSource,fileThumb,128,96);

 

package [패키지];

import java.io.File;
import java.io.IOException;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.awt.image.PixelGrabber;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class ImageUtil{
 public static final int RATIO=0;
 public static final int SAME=-1;

 // 소스파일, 타겟파일, 최대값
 public static void resizeImage(File src,File dest,int boxsize) throws IOException{
  int width=0;
  int height=0;
  Image srcImg=setImage(src);
  int srcWidth=srcImg.getWidth(null);
  int srcHeight=srcImg.getHeight(null);

  if(srcWidth>srcHeight){
   width=boxsize;
   height=(int) ((double) boxsize/(double) srcWidth);
  }else if(srcWidth<srcHeight){
   width=(int) ((double) boxsize/(double) srcHeight);
   height=boxsize;
  }else {
   width=boxsize;
   height=boxsize;
  }

  try{
   if(srcWidth<=boxsize && srcHeight<=boxsize) resizeImage(src, dest, -1, -1);
   else resizeImage(src, dest, width, height);
  }catch(IOException e){
   throw e;
  }
 }

 // 소스파일, 타겟파일, 넓이, 높이
 public static void resizeImage(File src,File dest,int width,int height) throws IOException{
  Image srcImg=setImage(src);

  int srcWidth=srcImg.getWidth(null);
  int srcHeight=srcImg.getHeight(null);
  int destWidth=-1, destHeight=-1;

  if(width==SAME) destWidth=srcWidth;
  else if(width>0) destWidth=width;

  if(height==SAME) destHeight=srcHeight;
  else if(height>0) destHeight=height;

  if(width==RATIO && height==RATIO){
   destWidth=srcWidth;
   destHeight=srcHeight;
  }else if(width==RATIO){
   double ratio=((double) destHeight)/((double) srcHeight);
   destWidth=(int) ((double) srcWidth*ratio)-1;
  }else if(height==RATIO){
   double ratio=((double) destWidth)/((double) srcWidth);
   destHeight=(int) ((double) srcHeight*ratio)-1;
  }

  Image imgTarget=srcImg.getScaledInstance(destWidth,destHeight,Image.SCALE_SMOOTH);
  int pixels[]=new int[destWidth*destHeight];
  PixelGrabber pg=new PixelGrabber(imgTarget, 0, 0, destWidth, destHeight, pixels, 0, destWidth);
  try{
   pg.grabPixels();
  }catch(InterruptedException e){
   throw new IOException(e.getMessage());
  }
  BufferedImage destImg=new BufferedImage(destWidth, destHeight, BufferedImage.TYPE_INT_RGB);
  destImg.setRGB(0, 0, destWidth, destHeight, pixels, 0, destWidth);
  ImageIO.write(destImg, "jpg", dest);
 }

 private static Image setImage(File src) throws IOException{
  Image srcImg=null;
  String suffix=src.getName().substring(src.getName().lastIndexOf('.')+1).toLowerCase();
  if(suffix.equals("bmp")) srcImg=ImageIO.read(src);
  else srcImg=new ImageIcon(src.toURI().toURL()).getImage();
  return srcImg;
 }

}

2011. 2. 1. 15:19 COMPUTER/JAVA, JSP
[JAVA/JSP] 쌩 JSP, 레알 초간단 파일 다운로드 소스

인터넷에 떠도는 '초간단 파일다운로드 소스'는 IBboard라는 라이브러리가 필요합니다.
그 소스는 개초보는 사용할 수 없습니다.
당신이 개초보라면 이 소스를 사용하는것이 정신건강에 좋습니다.

1. 소스에 '절대경로'를 실제 다운로드 받을 파일이 있는 위치로 수정하세요.
    윈도우라면 (C:\디렉토리\...), 리눅스라면 (/디렉토리/디렉토리/...)
2. 수정한 내용을 서버 루트에 'download.jsp'로 저장하십시요. (물론 이렇게 안해도 좋습니다.)
3. 브라우저를 키고 'http://서버주소/download.jsp?file=파일명' 으로 테스트하면 됩니다.
* 파일명은 서버에 존재해야합니다.

<%@ page contentType="application;" %>
<%@ page import="java.util.*,java.io.*,java.sql.*,java.text.*"%>
<%
String strFilename=java.net.URLDecoder.decode(request.getParameter("file"));
String strFilenameOutput=new String(strFilename.getBytes("euc-kr"),"8859_1");
File file=new File("절대경로"+strFilename);
byte b[]=new byte[(int)file.length()];
response.setHeader("Content-Disposition","attachment;filename="+strFilenameOutput);
response.setHeader("Content-Length",String.valueOf(file.length()));
if(file.isFile()){
 BufferedInputStream fin=new BufferedInputStream(new FileInputStream(file));
 BufferedOutputStream outs=new BufferedOutputStream(response.getOutputStream());
 int read=0;
 while((read=fin.read(b))!=-1){outs.write(b,0,read);}
 outs.close();
 fin.close();
}
%>

이것도 안되면,
아래 댓글창에 질문을 올리거나,
머리를 쥐어뜯어버리세요.
2010. 10. 13. 11:08 DEV ENVIRONMENT
[ECLIPSE] JSP, JAVA 이외의 파일 에러, 경고 마커 해제
이클립스 프로젝트 파일들중에 특히 javascript파일들에서 에러가 나는 경우가 많이 있습니다.
에러도 아닌데 에러라고...
문제는 이런 에러가 쌓이면 다른 java에러들과 겹쳐서
마커탭에서 도통 살펴볼수가 없습니다.

Window > Preferences > Validation > Disable All





2010. 10. 11. 17:54 COMPUTER/JAVA, JSP
[JAVA/JSP] java.lang.NoClassDefFoundError: org/apache/xpath/XPathAPI
jdk1.5이상 버전에서 import org.apache.xpath.XPathAPI; 가 포함되면 에러가 납니다.

1.5부터는 XPathAPI의 경로가 com.sun.org.apache.xpath.internal 로 변경됬습니다.

1. 임포트 줄을 변경하거나
2. 예전 xpath를 넣어주는것으로 문제를 해결 할 수 있습니다.

xalan-2.4.1에 XPathAPI가 포함되어있습니다.
WEB-INF/lib폴더에 복사하면 됩니다.



2010. 10. 11. 16:54 DEV ENVIRONMENT
[JAVA/ECLIPSE] 이클립스 에러 Multiple markers at this line, Enumeration cannot be resolved to a variable.
옛날소스중에 변수명 enum을 사용한 소스가 있으면 나는 에러입니다.
Enumeration 을 가장 많이 사용하는 변수명이 enum일수밖에 없죠. ㅎㅎ

에러가 나는 이유는 JDK 1.5부터 'enum'이 예약어가 됬기 때문입니다.

에러날때 'Multiple markers at this line' 이라고 '이줄에 여러개의 마커가 있습니다.'
실제 에러는 두번째줄
'Enumeration cannot be resolved to a variable.'
'이넘을 해당 변수로 정의할 수 없습니다.'

해결하려면 enum 변수명을 교체하면 됩니다.

2010. 10. 5. 12:45 COMPUTER/JAVA, JSP
[JAVA/JSP] 날짜용 유틸 함수
자바에서 날짜처리할때 사용하는 함수들 입니다.
파일명.java로 저장
클래스명은 파일명과 맞춰주세요.

package common.util;

import java.util.*;
import java.text.*;

public class 클래스명
{
    private static Date date;
    private static Calendar cal;
    private static String result;
    private static String pattern = "yyyy년 M월 d일  a h시 m분";
    private static SimpleDateFormat formatter;
    private static Locale nation = new Locale("ko","KOREA");

    /**
     * 내용  : 오늘 날짜를 Default Format으로 return
     * 입력 값 :
     * 출력 값 : String result
     */
    public static String getToday()
    {
        date = new Date();
        cal = Calendar.getInstance();
        cal.setLenient(true);
        cal.setTime(date);
       
        formatter = new SimpleDateFormat(pattern, nation);
        result = formatter.format(date);
        return result;
    }
   
    /**
     * 내용  : 오늘 날짜를 입력한 Format으로 return
     * 입력 값 : String datePattern
     * 출력 값 : String result
     */
    public static String getToday(String datePattern)
    {
        date = new Date();
        cal = Calendar.getInstance();
        cal.setLenient(true);
        cal.setTime(date);
       
        formatter = new SimpleDateFormat(datePattern, nation);
        result = formatter.format(date);
        return result;
    }

    /**
     * 내용  : 원하는 시기의 일단위로 입력한 숫자에 해당하는 날짜를 Default Format으로 return
     * 입력 값 : int change
     * 출력 값 : String result
     */
    public static String getDayDate(int change)
    {
        date = new Date();
        cal = Calendar.getInstance();
        cal.setLenient(true);
        cal.setTime(date);
       
        formatter = new SimpleDateFormat(pattern, nation);
  cal.add(Calendar.DATE, change);
  Date setDate = cal.getTime();
  result = formatter.format(setDate);
  return result;
    }

    /**
     * 내용  : 원하는 시기의 일단위로 입력한 숫자에 해당하는 날짜를 입력한 Format으로 return
     * 입력 값 : String datePattern, int change
     * 출력 값 : String result
     */
    public static String getDayDate(String datePattern, int change)
    {
        date = new Date();
        cal = Calendar.getInstance();
        cal.setLenient(true);
        cal.setTime(date);
       
        formatter = new SimpleDateFormat(datePattern, nation);
  cal.add(Calendar.DATE, change);
  Date setDate = cal.getTime();
  result = formatter.format(setDate);
  return result;
    }

    /**
     * 내용  : 원하는 시기의 주단위로 입력한 숫자에 해당하는 날짜를 Default Format으로 return
     * 입력 값 : int change
     * 출력 값 : String result
     */
    public static String getWeekDate(int change)
    {
        date = new Date();
        cal = Calendar.getInstance();
        cal.setLenient(true);
        cal.setTime(date);
       
        change = change * 7;
        formatter = new SimpleDateFormat(pattern, nation);
  cal.add(Calendar.DATE, change);
  Date setDate = cal.getTime();
  result = formatter.format(setDate);
  return result;
    }

    /**
     * 내용  : 원하는 시기의 주단위로 입력한 숫자에 해당하는 날짜를 입력한 Format으로 return
     * 입력 값 : String datePattern, int change
     * 출력 값 : String result
     */
    public static String getWeekDate(String datePattern, int change)
    {
        date = new Date();
        cal = Calendar.getInstance();
        cal.setLenient(true);
        cal.setTime(date);
       
        change = change * 7;
        formatter = new SimpleDateFormat(datePattern, nation);
  cal.add(Calendar.DATE, change);
  Date setDate = cal.getTime();
  result = formatter.format(setDate);
  return result;
    }

    /**
     * 내용  : 원하는 시기의 월단위로 입력한 숫자에 해당하는 날짜를 Default Format으로 return
     * 입력 값 : String datePattern, int change
     * 출력 값 : String result
     */
    public static String getMonthDate(int change)
    {
        date = new Date();
        cal = Calendar.getInstance();
        cal.setLenient(true);
        cal.setTime(date);
       
        formatter = new SimpleDateFormat(pattern, nation);
  cal.add(Calendar.MONTH, change);
  Date setDate = cal.getTime();
  result = formatter.format(setDate);
  return result;
    }

    /**
     * 내용  : 원하는 시기의 월단위로 입력한 숫자에 해당하는 날짜를 입력한 Format으로 return
     * 입력 값 : String datePattern, int change
     * 출력 값 : String result
     */
    public static String getMonthDate(String datePattern, int change)
    {
        date = new Date();
        cal = Calendar.getInstance();
        cal.setLenient(true);
        cal.setTime(date);
       
        formatter = new SimpleDateFormat(datePattern, nation);
  cal.add(Calendar.MONTH, change);
  Date setDate = cal.getTime();
  result = formatter.format(setDate);
  return result;
    }

    /**
     * 내용  : 원하는 시기의 년단위로 입력한 숫자에 해당하는 날짜를 Default Format으로 return
     * 입력 값 : String datePattern, int change
     * 출력 값 : String result
     */
    public static String getYearDate(int change)
    {
        date = new Date();
        cal = Calendar.getInstance();
        cal.setLenient(true);
        cal.setTime(date);
       
        formatter = new SimpleDateFormat(pattern, nation);
  cal.add(Calendar.YEAR, change);
  Date setDate = cal.getTime();
  result = formatter.format(setDate);
  return result;
    }

    /**
     * 내용  : 원하는 시기의 년단위로 입력한 숫자에 해당하는 날짜를 입력한 Format으로 return
     * 입력 값 : String datePattern, int change
     * 출력 값 : String result
     */
    public static String getYearDate(String datePattern, int change)
    {
        date = new Date();
        cal = Calendar.getInstance();
        cal.setLenient(true);
        cal.setTime(date);
       
        formatter = new SimpleDateFormat(datePattern, nation);
  cal.add(Calendar.YEAR, change);
  Date setDate = cal.getTime();
  result = formatter.format(setDate);
  return result;
    }

 /**
     * 내용  : form부터 to까지 일수를 구하여 결과값 return
     * 입력 값 : String from, String to, String pattern
     * 출력 값 : int result
     */
 public static int daysBetween(String from, String to, String pattern)
 {
  SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.KOREA);
  Date date1 = null;
  Date date2 = null;

  try
  {
   date1 = format.parse(from);
   date2 = format.parse(to);
  }
  catch(ParseException e)
  {
   return -999;
  }

  if(!format.format(date1).equals(from))
  {
   return -999;
  }
  
  if(!format.format(date2).equals(to))
  {
   return -999;
  }

  long duration = date2.getTime() - date1.getTime();

  return (int)(duration/(1000 * 60 * 60 * 24));
 }
}



2010. 3. 24. 12:15 COMPUTER/JAVA, JSP
[JAVA/JSP] 정규표현식 스크립트 제거 Regex Replace Function
<script~, onclick=~, onmouseover=~, onmouseout=~ 제거함수

정규표현식 클래스 임포트
import java.util.regex.*;

함수 
public String getRemoveScript(String strContent){
  Pattern patternTag=Pattern.compile("\\<(\\/?)(\\w+)*([^<>]*)>");
  Pattern patternScript=Pattern.compile("(?i)\\<script(.*?)</script>");
  Pattern patternMouseOver=Pattern.compile("(?i) onmouseover=[\"']?([^>\"']+)[\"']*");
  Pattern patternMouseOut=Pattern.compile("(?i) onmouseout=[\"']?([^>\"']+)[\"']*");
  Pattern patternMouseClick=Pattern.compile("(?i) onclick=[\"']?([^>\"']+)[\"']*");
  Matcher matcherContent=patternScript.matcher(strContent);
  strContent=matcherContent.replaceAll("");
  Matcher matcherMouseOver=patternMouseOver.matcher(strContent);
  strContent=matcherMouseOver.replaceAll("");
  Matcher matcherMouseOut=patternMouseOut.matcher(strContent);
  strContent=matcherMouseOut.replaceAll("");
  Matcher matcherMouseClick=patternMouseClick.matcher(strContent);
  strContent=matcherMouseClick.replaceAll("");
  return strContent;
 }
2010. 3. 19. 14:00 PROGRAMMING
[JSP] 레퍼러 Referer
HTTP Header Referer
이전에 있던 페이지명을 리턴한다.

request.getHeader("referer")

out.println(request.getHeader("referer"))


전페이지가 없으면 referer값도 없다.
2010. 3. 12. 04:46 COMPUTER/JAVA, JSP
[JSP/JAVA] 최상위, 파일 경로 알아내기
JSP/Servlet 사이트 경로 1 (드라이브:\사이트경로\)
String strRoot=request.getSession().getServletContext().getRealPath("/");
out.println(strRoot);

JSP/Servlet 사이트 경로 2 (드라이브:\사이트경로\)
String strRoot=getServletContext().getRealPath("/");
out.println(strRoot);

JSP/Servlet 특정 페이지 경로
String strRealPath=getServletContext().getRealPath("경로/파일명");
strRealPath=strRealPath.substring(0,strRealPath.lastIndexOf(System.getProperty("file.separator")));
out.println(strRealPath);

JSP/Servlet 현재 페이지 경로
String strRealPath=getServletContext().getRealPath(request.getRequestURI());
strRealPath=strRealPath.substring(0,strRealPath.lastIndexOf(System.getProperty("file.separator")));
out.println(strRealPath);

JAVA - 현재 클래스 경로
this.getClass().getResource("").getPath();


JAVA - 클래스 디렉토리 경로
this.getClass().getResource("/").getPath();
2010. 2. 11. 17:12 COMPUTER/JAVA, JSP
[JAVA/JSP] JSP Request 객체에서 모든변수 뽑기, 출력, Request, Enumeration

Request는 페이지에서 넘어오면 생성되는 JAVA객체입니다.
이 문서는 enumeration을 이용해 Request객체 안에 들어있는 모든 변수를 출력하는 예제입니다.

JSP용이므로,
JAVA에서는 out.println대신에 system.out.println을 사용하시면 됩니다.

<%
String query="";
Enumeration enum = request.getParameterNames();
while(enum.hasMoreElements()){  
	String key=(String)enum.nextElement();
	String value=request.getParameter(key);
	query+="&"+key+"="+value;
}
query="?"+query.substring(1);
out.println(query);
%>
2009. 12. 3. 19:16 PROGRAMMING
[JSP/PHP] JSP vs PHP 서버변수 모음
PHP 변수 > JSP 클래스.메소드

SERVER_NAME > request.getServerName()
SERVER_SOFTWARE > request.getServletContext().getServerInfo()
SERVER_PROTOCOL > request.getProtocol()
SERVER_PORT > request.getServerPort()
REQUEST_METHOD > request.getMethod()
PATH_INFO > request.getPathInfo()
PATH_TRANSLATED > request.getPathTranslated()
SCRIPT_NAME, PHP_SELF > request.getServletPath()
DOCUMENT_ROOT > request.getRealPath("/")
QUERY_STRING > request.getQueryString()
REMOTE_HOST > request.getRemoteHost()
REMOTE_ADDR > request.getRemoteAddr()
AUTH_TYPE > request.getAuthType()
REMOTE_USER > request.getRemoteUser()
CONTENT_TYPE > request.getContentType()
CONTENT_LENGTH > request.getContentLength()
HTTP_ACCEPT > request.getHeader("Accept")
HTTP_USER_AGENT > request.getHeader("User-Agent")
HTTP_REFERER > request.getHeader("Referer")

최근에 올라온 글

최근에 달린 댓글