레이블이 java/jsp인 게시물을 표시합니다. 모든 게시물 표시
레이블이 java/jsp인 게시물을 표시합니다. 모든 게시물 표시

2020년 5월 12일 화요일

Map에 추가한 데이터가 읽어지지 않는 현상 조치

문제) Map<String, String> 데이터를 루프를 돌려 값을 찍어보던 중 에러는 없었지만 값이 처음 몇 개만 찍히고 마지막까지 찍히지 않는 현상이 있었다.

문제가 발생된 소스

/**
 * 문제가 발생되는 소스
 * @param map
 * @return
 */
protected static Map<String, String> server2Client(Map<String, String> map) {
    LOGGER.debug("server2Client");
    Iterator iterKey = map.keySet().iterator();
    Map<String, String> resultMap = new HashMap<String, String>();

    while (iterKey.hasNext()) {
        String key = iterKey.next();
        LOGGER.debug("key="+key+" --> "+revert+", val="+map.get(key));
    }

    return resultMap;
}
2020-05-13 12:22:16,038 server2Client
2020-05-13 12:22:16,038 key=TMI_NAME val=building_04.dae
2020-05-13 12:22:16,038 key=THUMB val=_screenshot.png
2020-05-13 12:22:16,038 key=TMI_REGDATE val=2020-05-07 11:39:21.0


해결) Map 데이터를 Map<String, Object> 형식으로 수정 후 문제가 해결되었다.

문제가 해소된 소스

/**
 * 문제가 해소된 소스
 * @param map
 * @return
 */
protected static Map<String, Object> server2Client(Map<String, Object> map) {
    LOGGER.debug("server2Client");
    Iterator iterKey = map.keySet().iterator();
    Map<String, Object> resultMap = new HashMap<String, Object>();

    while (iterKey.hasNext()) {
        String key = iterKey.next();
        LOGGER.debug("key="+key+" --> "+revert+", val="+map.get(key));
    }

    return resultMap;
}
2020-05-13 12:22:40,760 server2Client
2020-05-13 12:22:40,760 key=TMI_NAME val=building_04.dae
2020-05-13 12:22:40,760 key=THUMB val=_screenshot.png
2020-05-13 12:22:40,760 key=TMI_REGDATE val=2020-05-07 11:39:21.0
2020-05-13 12:22:40,760 key=TMI_PRESYN val=D
2020-05-13 12:22:40,760 key=TMI_SEQ val=2
2020-05-13 12:22:40,760 key=ATCH_FILE_ID val=FILE_000000000000105
2020-05-13 12:22:40,760 server2Client
2020-05-13 12:22:40,760 key=TMI_NAME val=building_04.dae
2020-05-13 12:22:40,760 key=THUMB val=_screenshot.png
2020-05-13 12:22:40,760 key=TMI_REGDATE val=2020-05-07 11:47:52.0
2020-05-13 12:22:40,760 key=TMI_PRESYN val=D
2020-05-13 12:22:40,760 key=TMI_SEQ val=3
2020-05-13 12:22:40,760 key=ATCH_FILE_ID val=FILE_000000000000106

2020년 1월 22일 수요일

Invalid bound statement (not found) 오류의 처리 예

Mybatis 오류 처리



문제

아래와 같이 자바 오류가 발생하며 DB에서 데이터를 읽어오지 못한다

1월 23, 2020 9:13:12 오전 org.apache.catalina.core.StandardWrapperValve invoke
심각: Servlet.service() for servlet [action] in context with path [/ct2] threw exception [Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): eframework.pst.polyworld.mapper.PolyWorldMapper.searchNearCoodinate] with root cause
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): eframework.pst.polyworld.mapper.PolyWorldMapper.searchNearCoodinate
    at org.apache.ibatis.binding.MapperMethod$SqlCommand.(MapperMethod.java:189)
    at org.apache.ibatis.binding.MapperMethod.(MapperMethod.java:43)
    at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:58)
    ... 생략 ...


해결

경로가 바르지 않아서 생긴 문제였다.
namespace의 자바 경로를 수정하였다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="eframework.pst.polyworld.mapper.PolyWorldMapper">

    <select id="searchNearCoodinate" parameterType="map" resultType="map">
        SELECT
        ... 생략 ...

2019년 8월 27일 화요일

java에서 split 함수 사용예문

javascript --> java (구분자로 분리된 데이터를 받기)


/**
 * js에서 데이터를 구분자료 분리하여 문자열로 담음
 */
var tidTableData = '';
$('#accordion .panel.panel-default').each(function(idx) { //check 된값 배열에 담기
    if (idx > 0) tidTableData += '[@@@]';
    tidTableData += $(this).find('input[name="tidSeq"]').val();
    tidTableData += '[@,@]' + $(this).find('input[name="tidCoordinatex"]').val();
    tidTableData += '[@,@]' + $(this).find('input[name="tidCoordinatey"]').val();
    tidTableData += '[@,@]' + $(this).find('input[name="tidAltitude"]').val();
    tidTableData += '[@,@]' + $(this).find('input[name="tidXy"]').val();
    tidTableData += '[@,@]' + $(this).find('input[name="tidTitle"]').val();
    tidTableData += '[@,@]' + $(this).find('input[name="tidDescription"]').val();
    tidTableData += '[@,@]' + $(this).find('input[name="pst006"]').val();
    tidTableData += '[@,@]' + $(this).find('input[name="tidImage"]').val();
    tidTableData += '[@,@]' + $(this).find('input[name="tidVideo"]').val();
    tidTableData += '[@,@]' + $('#uploadAudioForm input[name="atchFileId"]').val();
    tidTableData += '[@,@]' + $(this).find('input[name="fileSn"]').val();
});

/**
 * js로부터 문자열로 만들어진 데이터를 넘겨받아 java 객체에 담음
 */
//관심지점 정보 문자열을 객체화
List resultDetailList = new ArrayList();
String[] tidTableDatas = assetOrDirectVO.getTidTableData().split(Pattern.quote("[@@@]")); //빈 데이터는 베열에 제외
if (tidTableDatas != null && tidTableDatas.length > 0) {
    LOGGER.debug(">>>tidTableDatas.length:"+tidTableDatas.length);
    LOGGER.debug(">>>tidTableDatas:"+tidTableDatas);
    
    InterestDetailVO interestDetailVO = null;
    for (int i = 0; i < tidTableDatas.length; i++) {
        LOGGER.debug(">>>tidTableDatas["+i+"]:"+tidTableDatas[i]);
        String[] cols = tidTableDatas[i].split(Pattern.quote("[@,@]"),-1); //빈 데이터도 배열에 포함할때 -1
        LOGGER.debug(">>>cols.length:"+cols.length);
        if (cols.length != 12) continue;
        interestDetailVO = new InterestDetailVO();
        interestDetailVO.setTidSeq(cols[0]);
        interestDetailVO.setTidCoordinatex(cols[1]);
        interestDetailVO.setTidCoordinatey(cols[2]);
        interestDetailVO.setTidAltitude(cols[3]);
        interestDetailVO.setTidXy(cols[4]);
        interestDetailVO.setTidTitle(cols[5]);
        interestDetailVO.setTidDescription(cols[6]);
        interestDetailVO.setPst006(cols[7]);
        interestDetailVO.setTidImage(cols[8]);
        interestDetailVO.setTidVideo(cols[9]);
        interestDetailVO.setAtchFileId(cols[10]);
        interestDetailVO.setFileSn(cols[11]);
        resultDetailList.add(interestDetailVO);
    }
}

2019년 1월 7일 월요일

Java로 XML 유효성 검사 수행 중 xml 파일이 해제되지 않는 문제의 해결

XML 파일의 유효성을 검사하는 기능을 구현하던 중 아래와 같은 현상이 발생하였다.

기능)
XML파일을 첨부하면 파일이 업로드 된 후 유효성 검사가 수행된다.
업로드 파일은 삭제 후 재업로드 할 수 있다.

현상)
정상적인 유효성 검사가 완료되었다면 문제가 발생하지 않았다.
유효성에 문제가 발견되면 업로드 한 파일의 삭제나 재업로드가 불가해진다.
어딘가에서 XML 파일의 자원 해제가 되지 않는다.

아래 예제 코드의 "변경 후"라고 주석친 부분과 같이 수정후 문제를 해결할 수 있었다.
/**
 * 유효성 테스트
 */
public String test(String xsdFileFolder, String xmlFileName) {
    ... 생략 ...
    File xsdFile = new File(xsdFileName);
    File xmlFile = new File(xmlFileName);

    InputStream inputStream = null;

    try {
        Schema schema = factory.newSchema(xsdFile);
        Validator validator = schema.newValidator();

        //exception 발생시 자바가 여기서 xml 파일을 물고 있어서 해제되지 않음.
        //파일 삭제 및 재 업로드도 안됨.
        //서버 재구동 해야만 XML 파일이 해제되었음.
        //Source source = new StreamSource(xmlFile); //변경 전
        inputStream = new FileInputStream(xmlFile); //변경 후
        Source source = new StreamSource(inputStream); //변경 후

        try {
            validator.validate(source);
            LOGGER.debug(xmlFileName + " validates.");
        }
        catch (SAXException ex) {
            //유효성 검사에 실패시
            LOGGER.debug(xmlFileName + " fails to validate because: \n");
            LOGGER.debug(ex.getMessage());
        }
        ... 생략 ...
    } catch (SAXException sch) {
    ... 생략 ...
    } finally {
        //변경 후(추가부분)
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return message;
}

java로 Collada 파일의 유효성 검사하기

collada 파일의 유효성 검사하기

/**
 * Collada 유효성 검사
 */
package egovframework.pst.main.web;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import egovframework.pst.util.FileUtil;
import egovframework.rte.fdl.string.EgovStringUtil;

public class ColladaValidate {

    private static final Logger LOGGER = LoggerFactory.getLogger(ColladaValidate.class);
    private Map colladaSchema;
    private String colladaSchemaFilename;

    /**
     * Collada Schema 정보 초기화
     */
    public ColladaValidate() {
        colladaSchema = new HashMap();
        colladaSchema.put("1.4.1", "collada_schema_1_4_1.xsd");
        colladaSchema.put("1.5", "collada_schema_1_5.xsd");

        colladaSchemaFilename = colladaSchema.get("1.4.1"); //default 지정
    }

    /**
     * 유효성 검사 실행
     * @param mXSDFileFolder
     * @param mXMLFileName
     * @return
     */
    public String test(String mXSDFileFolder, String mXMLFileName) {
        String message = null;

        setColladaVersion(mXMLFileName); //콜라다 파일 버전 세팅
        String mXSDFileName = mXSDFileFolder + colladaSchemaFilename;

        SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");

        File XSDFile = new File(mXSDFileName);
        File XMLFile = new File(mXMLFileName);

        InputStream inputStream = null;

        try {
            Schema schema = factory.newSchema(XSDFile);
            Validator validator = schema.newValidator();

            inputStream = new FileInputStream(XMLFile);
            Source source = new StreamSource(inputStream);

            try {
                validator.validate(source);
                LOGGER.debug(mXMLFileName + " validates.");
                message = null;
            }
            catch (SAXException ex) {
                //유효성 검사에 실패
                LOGGER.debug(mXMLFileName + " fails to validate because: \n");
                LOGGER.debug(ex.getMessage());
                message = "* " + FileUtil.getFileName(mXMLFileName, "/") + " 파일의 유효성 검사에 실패하였습니다."
                        + "\n" + ex.getMessage();
            }
            catch (IOException io) {
                LOGGER.debug("Error reading XML source: " + mXMLFileName);
                LOGGER.debug(io.getMessage());
                message = "* " + FileUtil.getFileName(mXMLFileName, "/") + " 파일 읽기에 실패하였습니다.";
            }
        } catch (SAXException sch) {
            LOGGER.debug("Error reading XML Schema: " + mXSDFileName);
            message = "* " + FileUtil.getFileName(mXMLFileName, "/") + " 파일 읽기에 실패하였습니다.";
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return message;
    }

    /**
     * Collada 파일의 version 확인하기
     * Collada 파일을 열어 version 속성 값을 조회한다
     * @param physicalPath
     * @return
     */
    private void setColladaVersion(String physicalPath){
        String version = "";
        InputStream inStreamXml = null;
        try{
            inStreamXml = new FileInputStream(physicalPath);
            DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            Document doc = docBuilder.parse(inStreamXml);
            doc.normalize();

            NodeList nodeList = doc.getElementsByTagName("COLLADA"); //COLLADA 노드 목록 읽음

            if (nodeList.getLength() > 0){
                Node node = nodeList.item(0);
                Element e = (Element)node; //COLLADA 요소로 변경
                version = e.getAttribute("version"); //version 속성값 취득
            }
        } catch ( FileNotFoundException e ){
            e.printStackTrace();
        } catch ( ParserConfigurationException e ){
            e.printStackTrace();
        } catch ( SAXException e ){
            e.printStackTrace();
        } catch ( IOException e ){
            e.printStackTrace();
        } finally {
            if (inStreamXml != null) {
                try {
                    inStreamXml.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        if (!EgovStringUtil.isNull(version) && colladaSchema.containsKey(version)) {
            colladaSchemaFilename = colladaSchema.get(version);
        }
        LOGGER.debug(">>> COLLADA file name " + colladaSchemaFilename);
    }
}

아래의 자료를 참고하였다.
참고자료 주소 : https://github.com/amouat/xsd-validator

2018년 12월 27일 목요일

자바(Java)에서 다양한 방법으로 루프 돌리기 예

자바(Java)에서 for문 사용 예문

//예문1)
String[] numbers = {"one", "two", "three"};
for (int i=0; i<numbers.length; i++) {
     LOGGER.debug(">>>:"+numbers[i]);
}

//예문2)
String[] numbers = new String[] {"a", "b", "c", "d"};
for (String number : numbers) {
    LOGGER.debug(">>>:"+number);
}

//예문3)
List<ContentsVO> contentsList = contentsService.selectContentsList();
int index = 0;
for (ContentsVO contents : contentsList) {
    LOGGER.debug(">>>index:"+index);
    LOGGER.debug(">>>name:"+contents.getName());
    index++;
}

//예문4)
List<ContentsVO> contentsList = contentsService.selectContentsList();
for (Iterator<ContentsVO> iter = contentsList.iterator(); iter.hasNext();) {
    ContentsVO contents = iter.next();
    LOGGER.debug(">>>:"+contents.getSeq());
}

2018년 1월 11일 목요일

Java Heap space와 PermGen spac

Java Heap space와 PermGen spac


Java는 메모리 영역을 두 부분으로 구분하여 사용한다.
1. 일반적인 처리에 사용하는 Java Heap space
2. Class와 같은 Permenant Generation 대상 데이터를 두기 위한 PermGen space

Java Heap space

큰 해상도의 이미지 resize시 Java Heap space 부족 현상이 나타났다. 동일한 소스, 동일한 자바, 톰캣 버전일때 톰캣으로 서버를 따로 잡은 경우는 문제가 없었지만, 이클립스 상의 동일버전 톰캣 개발환경에서는 고해상도 이미지 resize시 Java Heap space 부족 현상이 있었다.

java.lang.OutOfMemoryError: Java heap space
위 에러가 발생한다면 -Xmx(Java heap space)를 늘려주고 PermSize도 체크 해봐야 하는지 테스트 해봐야겠다.

-Xmx(Java Heap space) 최대 허용 용량
현재 사중 중인 이클립스 환경에서는 1200까지 설정 가능했고 1300 부터는 이클립스 구동이 되지 않았다.
-Xmx는 32 비트 JRE에서 1200-1300m 정도가 가능하다고 하고, 64 비트 JRE에는 이론적인 제한이 없다고 한다.

PermGen space

일반적인 경우 기본 PermGen Size로 충분한 모양이다. 어딘가에서 256M까지면 충분하다고 한 내용을 본 기억이 있다. 그다지 크게 설정할 부분은 아닌가보다.
여러 컨텍스트를 잡아서 사용할 경우나 이클립스 사용시 클래스가 많아져서 모자랄 경우가 있는 듯 하다. 클래스 변경시 리로딩 하면서 PermGen 오류가 자주 발생하곤 한다.

PermGen space는 -XX:PermSize, -XX:MaxPermSize 옵션으로 설정할 수 있다.


톰캣 구동시 메모리 설정

톰캣에 메모리 부분을 아래의 값으로 적용해서 현재 잘 사용하고 있다.
Java Heap space (Xms, Xmx) : 512M ~ 1024M
PermGen space (PermSize, MaxPermSize) : 64M ~ 256M

위 값을 catalina.bat에 아래처럼 설정했다.
set "CATALINA_OPTS=-Xms512M -Xmx1024M -XX:PermSize=64M -XX:MaxPermSize=256M"

이클립스 구동시 메모리 설정

eclipse -vm /usr/lib/jvm/java-1.5.0-sun/bin/java -vmargs -XX:MaxPermSize=128m -Xms128m -Xmx512m

2018년 1월 4일 목요일

잘 되던 tomcat이 갑자기 구동 안될 때

어제까지 잘 사용하던 톰캣이 갑자기 구동되지 않는다
startup.bat을 실행하면 번쩍 하면서 콘솔창이 떳다가 순식간에 사라진다.

톰캣 사용 버전
apache-tomcat-7.0.75-32bit

겨우 문제를 해결했는데 다름 아닌 catalina.bat에 설정해 놓았던 메모리 설정이 문제였던 것이다. 특별히 고친 부분은 없었지만 수 개월 동안 잘 되던 것이 오늘부터 안되는지 알 수가 없다.

catalina.bat의 기존 설정
-------------------------------------------------------------------------------
rem setlocal
set "CATALINA_OPTS=-Xms512M -Xmx1024M -XX:PermSize=256M -XX:MaxPermSize=512M"
-------------------------------------------------------------------------------

catalina.bat의 변경한 설정
-------------------------------------------------------------------------------
setlocal
set "CATALINA_OPTS=-Xms512M -Xmx1024M -XX:PermSize=64M -XX:MaxPermSize=256M"
-------------------------------------------------------------------------------

어쨋든 지금은 된다.

2017년 12월 25일 월요일

JAVA에서 split() 메서드 사용하기

JAVA에서 split() 메서드 사용하기


String[] tfihDetails = resultDetail.getTfihDetail().split("[@@@]");

위 처럼 split 메서드에 구분 문자열을 넣어서 배열을 만들었더니 잘 되지 않았다. "-"와 같은 간단한 하나의 문자인 경우 잘 되는 듯 했지만 긴 문자열을 구분자로해서 사용시 원하는 결과가 나오지 않았다

긴 문자열을 구분자로 문자 배열을 만들고자 하는 경우 아래처럼 수정하여 원하는 결과를 얻을 수 있었다.

String[] tfihDetails = resultDetail.getTfihDetail().split(Pattern.quote("[@@@]"));


만일 대상 문자열의 구분자 사이가 아래 예문과 같이 비어있다면 배열의 길이는 2가 된다. 배열의 길이가 4가 되길 원한다면 split 함수의 두번째 인자에 -1을 할당하면 된다.

String[] arr1 = "테스트1[@@@]2017-12-01[@@@][@@@]".split(Pattern.quote("[@@@]"));
arr1.length ---> 2

String[] arr2 = "테스트1[@@@]2017-12-01[@@@][@@@]".split(Pattern.quote("[@@@]"),-1);
arr2.length ---> 4

2017년 12월 24일 일요일

윈도우에서 자바 구동이 안되는 문제의 해결

윈도우에서 자바 구동이 안되는 문제의 해결

문제)

환경 : exe 파일을 통해 설치된 톰캣7
증상 : 서비스에 등록된 tomcat을 시작시 시작이 되지 않음
        탐색기에서 tomcat7.exe 파일 더블클릭시 실행 창이 닫히며 구동되지 않음
커맨드 창을 열어 직접 tomcat7 명령을 타이핑하여 실행시에도 아무 메시지가 나타나지 않고 바로 커맨드가 떨어졌다.

해결)

아래처럼 커맨드 창에서 tomcat7 run 명령을 실행하면 톰캣이 왜 죽는지 알수 있다
버전에 따라 아래처럼 실행할 명령이 다를 수 있다
bin 디렉터리 내의 실행 명령의 구성에 따라 catalina run 또는 tomcat7 run 명령을 사용한다

C:\BIS\Tomcat 7.0\bin>tomcat7 run

[2015-08-17 12:42:30] [warn]  No service name provided
[2015-08-17 12:42:30] [error] Load configuration failed
[2015-08-17 12:42:30] [error] 시스템이 입력된 환경 옵션을 찾을 수 없습니다.
[2015-08-17 12:42:30] [error] Commons Daemon procrun failed with exit value: 2 (
Failed to load configuration)
[2015-08-17 12:42:30] [error] 시스템이 입력된 환경 옵션을 찾을 수 없습니다.

C:\BIS\Tomcat 7.0\bin>

원인)

이번에 발생된 문제는 tomcat7 properties 창의 java 탭에 등록된 jvm.dll 경로가 맞지 않아서 발생된 문제임
자바 자동 업그레이드하면서 jvm 버전이 바뀌었거나 임의로 지워서 그런 것 같음

2017년 9월 13일 수요일

egovframework에서 템플릿 프로젝트 생성하기

egovframework에서 템플릿 프로젝트 생성하기

전자정부 표준프레임워크(egovframework 3.5.1 기준)에서 프로젝트의 규모에 따라 기본 뼈대로 사용할 수 있도록 템플릿을 제공하고 있다.
템플릿은 다음과 같은 4가지를 제공한다.

Simple Homepage

단순홈페이지 기능 구현시 필수적인 부분만 사용 가능하도록 경량화 된 실행환경 제공
* 제공기능 : 메인페이지, 사용자관리, 공지사항 관리, 게시판 관리, 안내 관리

Portal Site

포털사이트 기능 구현시 필수적인 부분만 사용 가능하도록 경량화 된 실행환경 제공
* 제공기능: 포털 공지사항 관리, 사용자관리, 권한관리, 포털 초기화면 관리, 포털 공지사항 관리, 포털 FAQ관리, 포털 행사참가 관리

Enterprise Business

내부업무 기능 구현시 필수적인 부분만 사용 가능하도록 경량화 된 실행환경 제공
* 제공기능 : 메인 페이지, 업무사용자 관리, 공지사항 관리, 게시판 관리, 권한 관리, 프로그램 관리, 메뉴 관리

Common All-in-one

공통컴포넌트 220종의 모든기능 제공함.
*readme.txt 파일 참조.
*프로젝트 생성시 다소 시간(3 ~ 5분)이 걸릴 수 있다.

템플릿 생성 방법

템플릿 생성은 전자정부 표준프레임워크에서 제공하는 개발환경(eclipse) 구성 후 가능하다.
eclipse 실행 후 eGovFrame 메뉴를 통해 템플릿 생성을 진행한다.
eGovFrame > Start > New Template Project > Next > Project name, Group Id, Artifact Id 입력 후 > Finish

기업용 템플릿 초기 로그인 정보

ID/PW : admin/1, user1/1

공통컴포넌트 초기 로그인 정보

ID : TEST1, USER, webmaster, ENTERPRISE --> 3개
PW : rhdxhd12(공통12) --> 3개 계정 모두 동일


2017년 6월 27일 화요일

ibatis, mybatis 사용문 비교

구분 ibatis mybatis
//변수간 값 비교할때
if (start == end) {
}
<isEqual property="start" compareProperty="end">
</isEqual>
<if test="start == end">
</if>
//변수와 값을 비교할때
if (start == "Y") {
}
<isEqual property="start" compareValue="Y">
</isEqual>
<if test="start == 'Y'">
</if>
if (type == "P01") {
} else if (type == "P02") {
} else {
}
<choose>
<when test="type == 'P01'">
</when>
<when test="type == 'P02'">
</when>
<otherwise></otherwise>
</choose>


2017년 6월 10일 토요일

JSP : 별도의 파일에 카운트 정보를 저장하고 읽어오기

<%@ page contentType="text/html;charset=EUC-kr" %>
<%@ page import="java.io.*" %>



<%
File f = new File(config.getServletContext().getRealPath("/test")+"/countsu.txt");
RandomAccessFile file = null;
if ( f.exists() ) {
file = new RandomAccessFile(f, "rw");
} else {
file = new RandomAccessFile(f, "rw");
file.writeInt(0);
file.seek(0);
}

int su = file.readInt();
out.print(++su);
file.seek(0);
file.writeInt(su);
file.close();
%>

JSP : java와 javascript를 이용하여 날짜 계산하기

<%
//날짜계산
String month;
String day;
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int fmonth = now.get(Calendar.MONTH) + 1;
if(fmonth < 10){
month = "0"+fmonth;
}else{
month = String.valueOf(fmonth);
}
int fday = now .get(Calendar.DAY_OF_MONTH);
if(fday < 10){
day = "0"+fday;
}else{
day = String.valueOf(fday);
}
%>



<SCRIPT LANGUAGE="JavaScript">
<!--
//###############날짜 관련 함수정의########################
function addDay(yyyy, mm, dd, pDay) // 년, 월, 일, 계산할 일자 (년도는 반드시 4자리로 입력)
{
var oDate; // 리턴할 날짜 객체 선언
dd = dd*1 + pDay*1; // 날짜 계산
mm--; // 월은 0~11 이므로 하나 빼준다
oDate = new Date(yyyy, mm, dd) // 계산된 날짜 객체 생성 (객체에서 자동 계산)
return oDate;
}

function addMonth(yyyy, mm, dd, pMonth) // 년, 월, 일, 계산할 월 (년도는 반드시 4자리로 입력)
{
var cDate; // 계산에 사용할 날짜 객체 선언
var oDate; // 리턴할 날짜 객체 선언
var cYear, cMonth, cDay // 계산된 날짜값이 할당될 변수
mm = mm*1 + ((pMonth*1)-1); // 월은 0~11 이므로 하나 빼준다
cDate = new Date(yyyy, mm, dd) // 계산된 날짜 객체 생성 (객체에서 자동 계산)
cYear = cDate.getFullYear(); // 계산된 년도 할당
cMonth = cDate.getMonth(); // 계산된 월 할당
cDay = cDate.getDate(); // 계산된 일자 할당
oDate = (dd == cDay) ? cDate : new Date(cYear, cMonth, 0); // 넘어간 월의 첫쨋날 에서 하루를 뺀 날짜 객체를 생성한다.
return oDate;
}

function calcDate(gu,am)
{

var cDate;
var y,m,d,i;
var frm = document.inqry_form;

//현재 서버날짜를 셋팅한다.
y = <%=year%>;
m = <%=month%>;
d = <%=day%>;
//몇개월을 +시킬것인가? 1년이면 12임.
i = am;


frm.to_dt.value = "<%=year%>/<%=month%>/<%=day%>";

if(gu=="a"){//전체
frm.from_dt.value = "0000/00/00";
}else if(gu=="c"){//입력기간
frm.from_dt.value = "";
}else{
cDate = addMonth(y, m, d, i);
year = cDate.getFullYear();
month = cDate.getMonth()+1;
day = cDate.getDate();
if(month < 10){month = "0"+month;}
if(day < 10){day = "0"+day;}
frm.from_dt.value = year+"/"+month+"/"+day+"";
}
}
//###############날짜 관련 함수정의 끝 ########################
//-->
</SCRIPT>
</head>
<body>
<form name="inqry_form" method="post">
<a href="javascript:calcDate('a','0');"><img src="/external/img/bt_datea.gif" style="margin:0 7 0 0;"></a>
<a href="javascript:calcDate('b','-3');"><img src="/external/img/bt_date3.gif" style="margin:0 7 0 0;"></a>
<a href="javascript:calcDate('b','-6');"><img src="/external/img/bt_date6.gif" style="margin:0 7 0 0;"></a>
<a href="javascript:calcDate('b','-12');"><img src="/external/img/bt_date12.gif" style="margin:0 7 0 0;"></a>
<a href="javascript:calcDate('c','0');"><img src="/external/img/bt_datein.gif" style="margin:0 7 0 0;"></a>
</form>
</body>
</html>

2017년 5월 22일 월요일

JSP : 프로그램 오류 없이 URL에 접속하지 못하는 오류의 처리

아래와 같이 오류가 발생하는 경우의 해결 책

====================================================
Internet Explorer에서 웹 페이지를 표시할 수 없습니다.

가능성이 높은 원인:
인터넷에 연결되어 있지 않습니다.
웹 사이트에 문제가 발생했습니다.
주소에 오타가 있을 수 있습니다.
====================================================

* 증상
    - 위와 같은 오류를 내면서 페이지에 접속하지 못한다.
    - 속성에는 res://ieframe.dll/dnserror.htm#http://cybr.kr:8000/.... 으로 시작하는 URL이 나타난다.
    - 브라우저 주소란의 주소는 매우 길다.
    - 새로고침하면 페이지가 제대로 뜬다.

* 원인 및 대책
    - 지나지게 긴 URL이 페이지 접속을 방해한다.
    - URL이 너무 길지 않도록 소스를 수정해서 문제를 해결하였다.




실제 오류가 발생했던 URL 예시)

http://cybr.kr:8000/dic/dic_srch.jsp?step=&key=group&value=%E3%84%B4&lang=%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C+%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9+%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41+%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41+%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41+%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B4+1%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41+%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C+%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C+%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C+%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80+%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9+%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B4+1%ED%95%9C%EA%B8%80+%EC%9A%A9%EC%96%B41+%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41.%0D%3Cbr%3E%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41+%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C+%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9+%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C+%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9+%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B4+1%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41+%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C+%EA%B8%80%EC%9A%A9%EC%96%B41+%ED%95%9C%EA%B8%80+%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C+%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C+%EA%B8%80%EC%9A%A9%EC%96%B41.%0D%3Cbr%3E%0D%3Cbr%3E%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9+%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9+%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C+%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B4+1%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80+%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9+%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9+%EC%96%B41%ED%95%9C+%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B4+1%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B4+1%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41+%ED%95%9C%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C+%EA%B8%80%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80+%EC%9A%A9%EC%96%B41%ED%95%9C%EA%B8%80%EC%9A%A9+%EC%96%B41%ED%95%9C%EA%B8

2017년 5월 21일 일요일

서버 환경에 따른 CLOB insert 성공 사례

서버 환경에 따라서 아래처럼 코드를 달리하여야만 했다


/*
* 서버1 기존 - 개발 PC에서 잘 되었으나, 운영 서버에서 ClassCastException 나던 소스
* classes12.jar
*/
//rs 로 부터 OracleResultSet로 형 변환 후 getCLOB 메소드를 호출하는 방식
CLOB cl = ((OracleResultSet)rs).getCLOB("CTNT");
BufferedWriter writer = new BufferedWriter(cl.getCharacterOutputStream());
writer.write(_content);
writer.close();


/*
* 서버1 수정 후 - 운영서버에 적용한 소스
* classes12.jar
*/
//rs 로 부터 getClob 메소드 결과 값을 CLOB로 형 변환하는 방식
CLOB cl = (oracle.sql.CLOB)rs.getClob(1);
BufferedWriter writer = new BufferedWriter(cl.getCharacterOutputStream());
writer.write(_content);
writer.close();


/*
* 서버2
* ojdbc14.jar
*/
//rs 로 부터 OracleResultSet로 형 변환 후 getCLOB 메소드를 호출하는 방식
CLOB clob = ((OracleResultSet)rset).getCLOB(1);
BufferedWriter writer1 = new BufferedWriter(clob.setCharacterStream(0)); //유의할 부분
writer1.write(Util.toUTF8(content));
writer1.close();

서블릿 객체

* 서블릿 객체

Servlet : 작성한 서블릿 객체. 자동으로 쓰레드 사용. doGet(), doPost()를 자동 호출.
ServletConfig : 하나의 서블릿 클래스마다 존재. web.xml 파일에 설정한 사항, 환경변수 등의 설정 사항을 가짐.
ServletContext : 수많은 서블릿 중에서도 하나만 존재. 여러 서블릿에서 공유해서 사용한다. 서블릿간 공유해야할 데이터를 다룬다.

JDK에서 제공하는 실행파일(bin 디렉토리의 실행파일)


1) javac : 자바 컴파일러이다.
    사용 예 : javac HelloApp.java
    -classpath '경로' : javac가 클래스를 검색할 경로를 지정한다.
        이 값을 지정하면 이미 지정된 CLASSPATH 환경 변수 값은 오버라이드된다. 디렉토리 구분은 세미 콜론(;)으로 한다.
        사용 예 :
        javac -classpath .;C:\java\lib\classes.zip HelloApp.java
        javac -classpath ../.. Test.java <-- 이렇게하면 부모의 부모경로를 기준으로하여 기존 클래스를 찾는다.
    -d '디렉토리' : 클래스 계층 구조의 루트 디렉토리를 지정한다.
        사용 예 : javac -d C:\java\demo\hello HelloApp.java
    -g : 디버깅 테이블을 생성하게 해준다.
          디버깅 테이블은 줄 번호와 지역 변수 정보-자바 디버깅 도구에 의해 사용되는 정보-를 포함하고 있다.
          최적화(-O) 선택사항이 함께 주어지지 않으면 단지 줄 번호만 생성된다.
    -nowarn : 경고 메시지를 출력하지 않는다.
    -O : static, final and private 도구들에 인라인 기법을 사용하여 최적화한다.
          이렇게 되면 클래스 파일은 크기가 커진다.
    -verbose : 컴파일러와 링커에게 현재 컴파일되고 있는 소스 파일과 적재되는 클래스 파일의 이름을 출력하게 한다.

2) java
    자바 인터프리터이다. 클래스 파일을 실행한다.
    사용 예 : java HelloApp
    javaw : 같은 자바 인터프리터이지만 콘솔(윈도우 95에서 도스 창)에서 독립된 윈도우를 만들어낸다.
              콘솔로의 출력은 행하지 않는다. 예를 들어 애플릿뷰어를 다음과 같은 방법으로 실행해서 두 결과를 비교해 보라.
    java(w) sun.applet.AppletViewer example1.html
    javaw로 실행한 경우에는 콘솔로 출력을 하지 않을 것이다.

3) javadoc
    class 파일의 패키지, 계층 구조, 도구 등을 HTML 문서로 만들어준다. 클래스 이름을 인자로 받는다.
    사용 예 : javadoc HelloApp
                javadoc -d doc jhg\db\*.java jhg\web\*.java (대상을 디렉토리로 지정)
                javadoc -d \doc jhg.web jhg.db (대상을 패키지로 지정)
                javadoc -d \doc jhg\db\*.java jhg\exception\*.java jhg\ext\*.java jhg\mail\*.java jhg\web\*.java

4) javah
    해당 애플러케이션의 C 스텁 헤더 파일을 생성해준다. 인자로 클래스 이름을 받는다.
    사용 예 : javah HelloApp

5) javap
    자바 역어셈블러이다.
    클래스 파일을 원시 코드로 역어셈블해준다.
    완전한 소스 파일을 구할 수는 없다.
    인자로 클래스 이름을 받으며 역어셈블한 결과를 표준 출력(콘솔)으로 내보낸다.
    사용 예 : javap -c HelloApp > HelloApp.txt

6) jdb
    자바 디버거이다.
    유닉스의 디버거인 dbx와 유사한 기능을 갖고 있으며 인자로 클래스 이름을 받는다.
    디버거 프롬프트에서 help를 입력하면 사용가능한 명령어들을 알 수 있다.
    디버거를 제대로 사용하려면 클래스 파일을 컴파일할 때 dbx의 경우와 같이 -g 옵션으로 컴파일해야 한다.
    (예 : javac -g HelloApp.java)
    사용 예 : jdb HelloApp

7) appletviewer
    HTML 문서에 포함되어 있는 애플릿을 실행시켜준다.
    일종의 웹 브라우저로서 <applet> 태그만 찾아서 애플릿을 보여준다.
    인자로 URL이나 HTML 문서 파일 이름을 받는다.

패키지 파일 압축하기

■ 패키지 파일 압축하기

jar -[옵션] [압축할_파일명] [앞축대상의_경로]
jar -cvf web.jar .
jar -cvf web.jar web
jar -cvf proj.jar web db exception mail ext
C:\j2sdk1.4.2_11\bin\jar -cvf proj.jar proj


참고!
jar 명령은 jdk를 설치시 함께 설치가 된다.
jar 압축 명령은 bin 디렉터리 내에 위치한다

JDK, JRE, JVM 용어

■ JAVA
JDK : 개발용, 실행과 컴파일 모두 포함
JRE : 실행환경만 제공
JVM : 컴파일 환경