달력

52024  이전 다음

  • 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




DispatcherServlet : 클라이언트의 요청을 전달받음. 컨트롤러에게 클라이언트의 요청을 전달하고 컨트롤러가 리턴한 결과 값을 view에 전달하여 알맞은 응답을 생성하도록 한다.


HandlerMapping : 클라이언트의 요청 URL을 어떤 컨트롤러가 처리할 지를 결정

 - SimpleUrlHandlerMapping

 - BeanNameUrlHandlerMapping

 - ControllerClassNameHandlerMapping

 - DefaultAnnotationHandlerMapping


Controller : 클라이언트의 요청을 처리한 뒤, 그 결과를 DispatcherServlet에 알려줌.

 - Controller

 - AbstractController

 - AbstractCommandController

 - SimpleFormController

 - AbstractWizardFormController

 - ParameterizableViewController

 - UrlFilenameViewController

 - MultiActionController


ModelAndView : 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보를 담는다.


ViewResolver : 컨트롤러의 처리 결과를 생성할 뷰를 결정


View : 컨트롤러의 처리 결과 화면을 생성

Posted by 한설림
|

ctrl + s: 저장 및 컴파일

ctrl + i: 소스 깔끔 정리(인덴트 중심의 자동구문정리)

ctrl + space : 어휘의 자동완성(Content Assistance)

ctrl + E : 열린파일 옮겨다니기

ctrl + shift + E : 열린파일 띄우기

ctrl + M : 에디터화면 넓게

ctrl + 1 : Quick Fix(Rename에 주로 사용)

ctrl + shift + M : 캐럿이 위치한 대상에 필요한 특정클래스 import

ctrl + shift + O : 소스에 필요한 패키지의 자동 임포트

ctrl + /: 한줄 또는 선택영역 주석처리/제거

ctrl + Q : 마지막 편집위치로 가기

ctrl + L : 특정줄번호로 가기

ctrl + D : 한줄삭제

ctrl + H : Find 및 Replace

ctrl + K : 다음찾기(또는, 찾고자 하는 문자열을 블럭으로 설정한 후 키를 누른다.)

ctrl + shift + K : 이전찾기(또는, 찾고자 하는 문자열을 블럭으로 설정한 후 역으로 찾고자 하는 문자열을 찾아감.)

alt + shift + j : 설정해 둔 기본주석 달기

Ctrl + 객체클릭(혹은 F3) : 클래스나 메소드 혹은 멤버를 정의한 곳으로 이동(Open Declaration)


ctrl + shift + f : 소스 깔끔 정리

ctrl + 2 + R : Rename(리팩토링)

ctrl + shift + / : 선택영역 block comment 설정

ctrl + shift + \ : 선택영역 block comment 제거

alt + shift + up: Enclosing Element 선택(괄호의 열고 닫기 쌍 확인에 유용함)

ctrl + O : Outline창열기

ctrl + T : 상속구조 보기, 한번더 누르면 수퍼타입/서브타입 구조가 토글된다

Alt + ->, Alt + <-: 이후, 이전

해당프로젝트에서 alt + enter : Project 속성

sysout > Ctrl + Space: System.out.println();

try > Ctrl + Space : 기본 try-catch문 완성

for > Ctrl + Space : 기본 for문 완성

템플릿을 수정,추가: Preferences > java > editor > Templates

블럭 씌운상태에서 alt + shift + z : try/catch, do/while, if, for, runnable.... 등 블럭씌우기


ctrl + N : 새로운 파일 및 프로젝트 생성

ctrl + shift + s : 열려진 모든파일 저장 및 컴파일

alt + / : Word Completion

alt + shift + R : Rename

ctrl + shift + G : 특정 메써드나 필드를 참조하고 있는 곳을 찾는다.

ctrl + shift + B : 현재커서위치에 Break point설정/해제

ctrl + alt + R

ctrl + f11 : 실행

f11 : 디버깅 시작

f4 : 상속구조 클래스 보기(메소드, 멤버)

f5 : step into

f6 : step over

f8 : 디버깅 계속

ctrl + . : 다음오류부분으로 가기

ctrl + , : 이전오류부분으로 가기

f12 : 에디터로 커서이동

ALT + UP,DOWN : 현재 줄 위치 이동

Ctrl + j : 검색할 단어를 입력하면서 실시간으로 검색

Ctrl + Shift + j : 검색할 단어를 입력하면서 실시간으로 거꾸로 검색

F4 : 클래스명을 선택하고 누르면 해당 클래스의 Hierarchy 를 볼 수 있다.

ctrl + alt + up/down : 한줄 duplicate

alt + shift + 방향 : 선택

ctrl + shift + g : 객체(변수)가 참조 되는 곳을 찾아 준다

alt + shift + m : 코드 중복 해결(중복부분을 블록선택한 다음 단축키를 누르면 이부분을 별도의 메서드로 뽑아내줌)

ctrl + alt + h : 메서드 호출구조 보기

Posted by 한설림
|

웹 개발을 하다보면 로컬환경에서 이클립스의 비정상적인 종료로 인하여

WAS가 죽어버리는 현상이 발생한다.

문제는 기존에 WAS에서 사용하고 있는 port를 계속 사용중이라 

port 를 변경하지 않으면 컴퓨터를 재부팅을 해야만 WAS를 재기동 할 수 있었다.

하지만 이클립스의 eclipse.ini 파일에서

-clean 이라는 설정을 해두면 새로 이클립스를 실행할때마다 

클린을 해주게 되고 왠만한 문제점들은 다 해결 되어서 사용이 가능하다!

단!  clean 을 하고 다시 시작하는거라서 시작이 조금 느릴수도 있다는 점 ! 


-clean

-startup

plugins/org.eclipse.equinox.launcher_1.3.100.v20150511-1540.jar

--launcher.library

plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.1.300.v20150602-1417

-product

org.eclipse.epp.package.jee.product

--launcher.defaultAction

openFile

--launcher.XXMaxPermSize

256M

-showsplash

org.eclipse.platform

--launcher.XXMaxPermSize

256m

--launcher.defaultAction

openFile

--launcher.appendVmargs

-vm

C:/DEV/NCDStudio/bin/jdk1.7.0_79/bin/javaw.exe

-vmargs

-Dosgi.requiredJavaVersion=1.7

-Xms512m

-Xmx1024m

'개발툴 > Eclipse' 카테고리의 다른 글

이클립스에서 Tomcat Heap Size 설정  (0) 2017.11.15
이클립스 단축키  (0) 2016.11.30
eclipse.ini 파일 최적화  (0) 2016.11.24
Posted by 한설림
|

eclipse.ini 파일 옵션 설정

eclipse.ini 파일은 이클립스 개발환경의 전반적인 옵션이 정의되어 있는 파일입니다.


 -vmarg 하단에 아래 옵션 추가


 -Dosgi.requiredJavaVersion=1.5

 -Xverify:none

 -XX:+UseParallelGC

 -XX:+AggressiveOpts

 -XX:-UseConcMarkSweepGC

 -XX:PermSize=128M

 -XX:MaxPermSize=128M

 -XX:NewSize=128M

 -XX:MaxNewSize=128M

 -Xms2048M

 -Xmx2048M

 

* 위 예제는 8GB 램을 사용하는 PC에 맞춘 설정입니다.


 옵션

 설명

-Dosgi.requiredJavaVersion

 자바 버전 설정

-Xverify:none

 이클립스 시작시 class 유효성 검사 생략

-XX:+UseParallelGC

 병렬 가비지 컬랙션 처리

-XX:+AggressiveOpts

 컴파일러의 소숫점 최적화 기능 활성화

-XX:-UseConcMarkSweepGC

 이클립스의 GUI 응답 속도 향상

-XX:PermSize=128M

 class 로딩 기본 메모리 설정

-XX:MaxPermSize=128M

 class 로딩 최대 메모리 설정

-XX:NewSize=128M

 JVM에서 새로운 객체 생성시 로딩되는 최소 메모리 설정

-XX:MaxNewSize=128M

 JVM에서 새로운 객체 생성시 로딩되는 최대 메모리 설정

-Xms2048m

 Heap 최소 메모리 설정


 1 G 이하 - Xms256m

 2~3G - Xms512m

 4G -Xms1024m

-Xmx2048

 Heap 초대 메모리 설정


 1 G 이하 - Xmx256m

 2~3G - Xmx512m

 4G -Xmx1024m


'개발툴 > Eclipse' 카테고리의 다른 글

이클립스에서 Tomcat Heap Size 설정  (0) 2017.11.15
이클립스 단축키  (0) 2016.11.30
이클립스 비정상 종료로 인한 Port 초기화  (0) 2016.11.24
Posted by 한설림
|

시스템 사용자께서 데이터 저장이 안된다는 문의를 받았다.

응? 그럴리가 크롬에서 확인하니깐 잘된다...

어라? IE에서 확인하니깐 안된다??  어라??


F12 누르고 개발자 모드로 보니깐 .... 

HttpRequest 결과가 304로?????  뭐지??? 

이미 서버의 메모리에 있던 값을 클라이언트에게 계속 던져주고 있다. 

200이 뜨란 말이야!! 새로 받아오라고!!




IE의 경우 ajax로 호출하는 URL이 동일하고 파라미터가 없거나 할 경우 매번 URL을 호출하는것이 아닌 Cache를 이용하여 지가 멋대로 결과값을 내보내 주고 있었다. (서버에 요청을 안한다...)


jquery 옵션을 찾아보니 cache 항목이 보인다. 해당 옵션은 default로 true로 설정되어 있는데, 해당 옵션을 false로 변경하면 IE에서 해당 오류가 사라진다.


"cache:false"를 ajaxSetup에 추가하거나 ajax 구문에 직접 넣으면 된다.


1
$.ajaxSetup({cache:false});


1
2
3
4
5
6
7
8
9
10
11
12
$.ajax({
      
    type : "GET",
    url : "test.jsp",
    dataType : "json",
    cache : false,
    error : function(){
    },
    success : function(json){
    }
      
});


Posted by 한설림
|

WEB-INF/Web.xml 파일에서 발생하는 에러에 대한 설정이 아래와 같이 가능하다


<error-page>

        <exception-type>com.lgcns.ncd.common.exception.AuthException</exception-type>

        <location>/WEB-INF/jsp/system/error/errorAuth.jsp</location>

    </error-page>


    <error-page>

        <error-code>404</error-code>

        <location>/WEB-INF/jsp/common/error/error404.jsp</location>

    </error-page>

    <error-page>

        <error-code>500</error-code>

        <location>/WEB-INF/jsp/common/error/error500.jsp</location>

    </error-page>


근데???? 크롬에서는 잘된다... 에러페이지 불러오기가


error404.jsp


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

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>404 에러페이지 </title>

<script type="text/javascript">

alert('화면을 찾을 수 없습니다. \n이전 화면으로 돌아갑니다.');

history.back();

</script>

</head>

<body>


</body>

</html>


근데 익스플로러에서는 alert 메시지도 안나오고 이전화면으로도 돌아가지도 않고

익스플로러 전용의 404 화면을 보여준다...

뭐지 싶어서 찾아본 결과로는 

브라우저 마다  response. 코드 해석이 달라서 그렇다고 한다.

익스플로러에서도 내가 지정한 에러페이지에 대한 접근이 가능하게 하려면

보고 싶은 에러지정 페이지에

<%

response.setStatus(200);

%>

를 넣어주면 끝! 



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

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%

response.setStatus(200);

%>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>404 에러페이지</title>

<script type="text/javascript">

alert('화면을 찾을 수 없습니다. \n이전 화면으로 돌아갑니다.');

history.back();

</script>

</head>

<body>


</body>

</html>


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

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%

response.setStatus(200);

%>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>500 오류 페이지</title>

<script type="text/javascript">

alert('오류가 발생하였습니다. \n서비스 오류가 발생했습니다. 시스템 담당자에게 문의해 주세요.');

history.back();

</script>

</head>

<body>


</body>

</html>


Posted by 한설림
|

text-transform 속성은 영어 대문자와 소문자를 서로 전환시킬 수 있는 속성입니다. 한글에는 쓰일 일이 없겠지만 영문에서는 종종 사용됩니다. 문장 전체를 소문자나 대문자로 바꾸는 방법과 단락의 첫 글자만 대문자를 바꿀 수도 있습니다. 그럼 샘플을 통해 어떻게 적용되는지 알아 보도록 하겠습니다.

 

▼ text-transform 속성에 값은 4가지가 있습니다. 영어 단어가 의미하는 대로 소문자와 대문자로 변경하는 속성값과 단어에서 첫 글자만 변경하는 capitalize 값이 있습니다.

 

l  none : 기본값이며 원본 그대로 유지한다.

l  capitalize : 단어의 첫 번째 문자를 대문자로 변경한다.

l  uppercase : 적용한 모든 문자를 대문자로 바꾼다.

l  lowercase : 적용한 모든 문자를 소문자로 바꾼다.

 

▼ 샘플 소스는 4가지 text-transform 속성에 값을 적용한 것입니다. 결과 화면을 보시면 좀더 쉽게 이해가 가실 겁니다.

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
<!DOCTYPE HTML>
<html>
<head>
<meta charset="euc-kr">
<title>CSS</title>
<style type="text/css">
    body {
        background-color: #e7e7e7;
        font-size:14pt;
        width: 500px;
    }
    p { background-color: #d4d4f2;
        border-style: solid;
        border-width: 1px;
        padding: 5px;
    }
    .texttransform1{ text-transform: none; }
    .texttransform2{ text-transform: capitalize; }
    .texttransform3{ text-transform: uppercase; }
    .texttransform4{ text-transform: lowercase; }
</style>
</head>
<body>
    <code>text-transform: none</code>
    <p class="texttransform1">
    The current push to implement labor market</p>
     
    <code>text-transform: capitalize</code>
    <p class="texttransform2">
    The current push to implement labor market</p>
     
    <code>text-transform: uppercase</code>
    <p class="texttransform3">
    The current push to implement labor market</p>
     
    <code>text-transform: lowercase</code>
    <p class="texttransform4">
    The current push to implement labor market</p>
</body>
</html>

Posted by 녹두장군

Posted by 한설림
|

JSP 개발 디렉토리와 서비스 디렉토리의 구조의 차이


이클립스를 사용해서 개발을 하는 것은 기존 텍스트 에디터를 이용해서 작업하는 것과 많은 차이를 갖고 있다. 특히 웹 애플리케이션 개발에서는 더 많은 차이가 있게 되는데, 우선 언급해 볼 것이 서비스에 구성된 디렉토리와 개발에 사용되는 디렉토리의 차이점이다.

웹 애플리케이션은 서블릿 스펙에 따라서 디렉토리가 정해진 규칙을 갖고 있다. 

/WEB-INF/ 브라우저를 통해서 접근이 불가능한 웹 애플리케이션 핵심정보들을 포함하고 있는 디렉토리
/WEB-INF/classes/ 패키지에 따른 디렉토리별 class파일과 properties 파일이 위치하는 곳
/WEB-INF/lib/ 웹 애플리케이션에서 사용되는 jar 파일이 존재하는 곳
/META-INF/context.xml 톰캣에서 사용되는 manager를 통한 배포용 웹 애플리케이션 Context정보 파일
브라우저를 통해서 접근 가능한 리소스들은 그 외의 디렉토리에 놓으면 된다.
특히 브라우저의 JVM 위에서 돌아가는 애플릿 class와 관련 jar 들은 /WEB-INF/ 밖에 위치해야 한다.
이 디렉토리들을 묶어서 Context 라고 얘기한다.

서비스와 관련된 디렉토리 구조가 위와 같고, 개발용 디렉토리 구조는 java 파일이라는 특징 때문에 다음과 같이 구성한다.

/src 패키지에 따른 디렉토리별 java 파일과 properties 파일이 존재하는 곳
/WebContent/ 앞에 언급한 브라우저를 통해서 접근 가능한 리소스들. 웹 애플리케이션의 컨텍스트 루트 디렉토리에 해당.
/WebContent/WEB-INF/ 앞에 언급했던 /WEB-INF/ 디렉토리와 같은 성격
/build/classes  /src 하위 자바파일의 컴파일된 class 들이 놓이는 곳. properties 파일은 자동 복사되는 곳.


개발 디렉토리와 WAS의 서비스되는 디렉토리의 매핑 즉 자연스런 연결은 빌드 툴인 ant를 통하거나 Eclipse같은 IDE에서 자동으로 해준다.

이클립스의 경우 Servers 라는 프로젝트가 웹 프로젝트와 별개로 생성이 된다. 여기에서 설정되는 서버의 세팅은 기본적으로 설치된 세팅과 별도로 운영된다. 즉 톰캣이 설치된 디렉토리의 conf 에 있는 설정과는 별개로 Servers하위의 서버별 server.xml 의 파일에 설정된 내용으로 동작이 된다는 뜻이다.
<%= request.getRealPath("/") %> 를 통해서 확인해 보면 이클립스에서 운영하는 디렉토리가 완전히 엉뚱한 곳에 존재함을 알 수 있다. 웹 프로젝트에서 파일을 변경하면 자동으로 파일이 해당 위치로 복사된다.


Posted by 한설림
|

import java.io.*;
import java.net.URLEncoder;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.FilenameUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

 

@Controller
public class Test {

 @RequestMapping("/fileView.do")
 public void fileDownLoad(HttpServletRequest request ,HttpServletResponse response) throws IOException {

  System.out.println(request.getParameter("file_id"));
  String getfile = "C:/DATA001/attachFiles/201610/Koala[20161018010740425].jpg";
  //String path = "C:/DATA001/attachFiles/201610/"; //paramMap.get("filePath"); //full경로
     //String fileName =  "Koala[20161018010740425].jpg"; //paramMap.get("fileName"); //파일명
     File f = new File("C:/DATA001/attachFiles/201610/Koala[20161018010740425].jpg");
     String path = f.getParent().toString();
     String fileName = f.getName();
     System.out.println("파일크기 ?" + f.length());
     FilenameUtils.getExtension(getfile);
     System.out.println("path : " + path);
     System.out.println("fileName : " + fileName);
     File file = new File(path+"/"+fileName);
     FileInputStream fileInputStream = null;
     ServletOutputStream servletOutputStream = null;

     try{
         String downName = null;
         String browser = request.getHeader("User-Agent");
         //파일 인코딩
         if(browser.contains("MSIE") || browser.contains("Trident") || browser.contains("Chrome")){//브라우저 확인 파일명 encode

             downName = URLEncoder.encode(fileName,"UTF-8").replaceAll("\\+", "%20");

         }else{

             downName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");

         }

         response.setHeader("Content-Disposition","attachment;filename=\"" + downName+"\"");
         response.setContentType("application/octer-stream");
         response.setHeader("Content-Transfer-Encoding", "binary;");

         fileInputStream = new FileInputStream(file);
         servletOutputStream = response.getOutputStream();

         byte b [] = new byte[1024];
         int data = 0;

         while((data=(fileInputStream.read(b, 0, b.length))) != -1){

             servletOutputStream.write(b, 0, data);

         }

         servletOutputStream.flush();//출력

     }catch (Exception e) {
         e.printStackTrace();
     }finally{
         if(servletOutputStream!=null){
             try{
                 servletOutputStream.close();
             }catch (IOException e){
                 e.printStackTrace();
             }
         }
         if(fileInputStream!=null){
             try{
                 fileInputStream.close();
             }catch (IOException e){
                 e.printStackTrace();
             }
         }
     }
 }
}

 

Posted by 한설림
|

JQuery checkbox 컨트롤


1. checkbox checked 여부:
id인 경우:  $('input:checkbox[id="checkbox_id"]').is(":checked") == true
name인 경우: $('input:checkbox[name="checkbox_name"]').is(":checked") == true



2. checkbox 전체 갯수(이 경우는 name인 경우만 가능)
$('input:checkbox[name="checkbox_name"]').length;



3. checkbox 선택된 갯수(이 경우는 name인 경우만 가능)
$('input:checkbox[name="checkbox_name"]:checked').length;



4. checkbox 전체 순회하며 처리(동일한 name으로  여러 개인 경우)
$('input:checkbox[name="checkbox_name"]').each(function(){
      this.checked = true; //checked 처리
      if(this.checked){
         alert(this.value);
      }
});



5.checkbox 전체 값을 순회하며, 비교하여 checked 처리
$('input:checkbox[name="checkbox_name"]').each(function(){
     if(this.value == "비교값"){
        this.checked = true;
     }
});



6.checkbox value값 가져오기(단일건)
$('input:checkbox[id="checkbox_id"]').val();



7. checkbox checked 처리하기(단일건)
$('input:checkbox[id="checkbox_id"]').attr("checked", true);



8. checkbox checked 여부 확인(단일건)
$("#checkbox_id").is(":checked");


Posted by 한설림
|