jstl에서 연산을 할 때(특히 나눗셈) 소수점이 제대로 안찍히고 자동으로 반올림이 되는 경우가 있다.


아무리 핸들링 하려고 해도 안됐지만 결국 해결


해결방법은 받아온 Data를 바로 쓰지 않고 포맷을 바꾼상태에서 사용해야 한다.


ex) result.SUM_ANSWER1이 70, result.SUM_ANSWER2가 1일 때

구성비율은

result.SUM_ANSWER1/(result.SUM_ANSWER1 + result.SUM_ANSWER2) 와

result.SUM_ANSWER2/(result.SUM_ANSWER1 + result.SUM_ANSWER2)

이다.


이것을 jstl로 표현하면

<c:set var="a" value="${result.SUM_ANSWER1/(result.SUM_ANSWER1 + result.SUM_ANSWER2)}"/>

<c:set var="b" value="${result.SUM_ANSWER2/(result.SUM_ANSWER1 + result.SUM_ANSWER2)}"/>

인데 결과는

a = 100, b=0 이 나온다.


해결방법은

<fmt:formatNumber var="sumAnswer1" value="${result.SUM_ANSWER1}" pattern="#.##"/>

<fmt:formatNumber var="sumAnswer2" value="${result.SUM_ANSWER2}" pattern="#.##"/>


<c:choose>

<c:when test="${sumAnswer1> 0}">

<fmt:formatNumber var="calAnswer1" value="${sumAnswer1/(sumAnswer1+sumAnswer2)}"/>


</c:when>

</c:choose>


받아 온 값이 int 형이면 연산을 해도 int 이기 때문에

포맷을 소수점있게 바꾼다음 연산해야 소수점연산이 제대로 된다.

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

태그 라이브러리 사용할 때

<c:if test="${not empty abcde|">

${fn:replace(abcde, '\r\n', '<br/>')}

</c:if>


를 짧게 한줄로 쓰려고


${not empty abcde ? fn:replace(abcde , '\r\n', '<br/>') : "empty" }

위와 같이 썼는데 에러난다...

? : 안에서는 역슬래쉬(\)가 제대로 먹지 않는다


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

SUBSTR을 사용하는 이유는 SYS_CONNECT_BY_PATH를 하면서 ','를 붙이기 때문에

Data의 시작이 , 로 시작한다. 그것을 잘라주기 위함임


SELECT SUBSTR(max(SYS_CONNECT_BY_PATH (COLUMN_NAME, ',')),2) AS ALIAS
  FROM (
        SELECT COLUMN_NAME, ROWNUM RNUM
          FROM TABLE_NAME
         WHERE ROWNUM <= 20
       )
START WITH RNUM = 1
CONNECT BY PRIOR RNUM = RNUM - 1


출처 : http://nadachel.tistory.com/entry/oracle-%EC%A1%B0%ED%9A%8C%EB%90%9C-%EC%84%B8%EB%A1%9C%EA%B2%B0%EA%B3%BC%EB%A5%BC-%EA%B0%80%EB%A1%9C%EB%A1%9C-%ED%91%9C%ED%98%84-%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95


몇 번이나 검색하느라... 이번에 저장해 놓고 나중에 써먹어야지 ㅋㅋ

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

Tomcat에 jenkins를 webapps 폴더에 넣고 startup을 했을 때,

8080포트가 이미 사용중어어서 충돌 날 때가 있다.


이때, 아예 Tomcat의 기본포트를 바꿔주면 ㅎㅎㅎ

/apache-tomcat-7.0.52/conf/server.xml

before

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

<Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

after

<Connector port="9000" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"
               URIEncoding="UTF-8" />

<Connector executor="tomcatThreadPool"
               port="9000" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />


startup을 했을 때 오류가 없으면 OK.

http://localhost:9000/jenkins/


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

전자정부프레임워크에 회원가입도 했고

통합개발환경도 압축을 풀고 Eclipse를 실행하는데


1. Failed to load the JNI shared library "C:\Java\jre6\bin\client\jvm.dll"


이것은 64bit를 설치하려는데 설치된 JAVA가 32bit일 수 있다.

다시 32bit로 받아서 실행해야한다.



2. 설명서대로 처음프로젝트를 생성했는데

src 폴더와 target 폴더만 생성되고 아무것도 없을 때,

설정된 JVM이 8일 수 있다.


eclipse 실행시 JDK1.8 대신 JDK6 이나 7로 바꾸고 프로젝트를 생성해본다.

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

여러 요인이 있겠지만...


? 를 써야하는데 :변수를 써서 나는 경우도 있다.

하지만 테이블명@계정으로 별칭을 준 경우에

Merge INTO 절은 위 에러

(

java.sql.SQLException: ORA-01008: 일부 변수가 바인드되지 않았습니다.

)를 뱉어낸다.


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절


지도 API를 사용호출시 브라우저에서 호출하면 정상인데

JAVA 소스에서 호출하면 다음과 같은 에러가 떴다.

(parameter : 서울특별시 강남구 강남대로)

[Fatal Error] :3:22: An invalid XML character (Unicode: 0x1c) was found in the CDATA section.


문제는 브라우저에서 호출할 때, UrlEncoding을 해서 보내는데

그것을 JAVA에서 Decoding을 하고 그대로 사용하니

결국 Encoding안된 parameter가 넘어가서 에러가 나는듯 하네


try{

String address = URLEncoder.encode(addr, "UTF-8");

String apiKey = "Naver 지도API";

String encoding = "utf-8";

String coord = "latlng";//latlng, tm128(navigation 용 : default)

String target = "http://openapi.map.naver.com/api/geocode.php";

String params = "?key=" + apiKey + "&encoding=" + encoding + "&coord=" + coord + "&query=" + address;

URL url = new URL(target+params);

URLConnection connection = url.openConnection();

try{

InputStream in = connection.getInputStream();

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

DocumentBuilder builder = factory.newDocumentBuilder();

Document doc = builder.parse(in);

NodeList itemNodes = doc.getElementsByTagName("item");

for(int i = 0; i < itemNodes.getLength(); i++){

Node item = itemNodes.item(i);


NodeList childNodes = item.getChildNodes();

//public static final short ELEMENT_NODE = 1;

//public static final short ATTRIBUTE_NODE = 2;

//public static final short TEXT_NODE = 3;

 

for( int j = 0 ; j < childNodes.getLength(); j++){

Element ele = null;

Node childNode = childNodes.item(j);

if (childNode.getNodeType() != Node.ELEMENT_NODE){

continue;

}

String eleTag = childNode.getNodeName();

if( "point".equals(eleTag)){

NodeList pointList = childNode.getChildNodes();

for(int m = 0; m < pointList.getLength(); m++){

Node aPoint = pointList.item(m);

String pointName = aPoint.getNodeName();

if("x".equals(pointName)){

//logger.debug(aPoint.getNodeName() + " : " + aPoint.getTextContent());

}else if("y".equals(pointName)){

//logger.debug(aPoint.getNodeName() + " : " + aPoint.getTextContent());

}

}

break;

}

if( "address".equals(eleTag)){

continue;

}

if( "addrdetail".equals(eleTag)){

continue;

}

}//end of for j

}//end of for i

}catch(Exception e){

e.printStackTrace();

}

}catch(Exception e){

e.printStackTrace();

    }


신고
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

ps -ef | grep java.*tomcat

한 뒤에 나타난 process 를 kill

kill xxxxx



신고
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

String s = "abc def";

s.split("\\s");

\D : 숫자 빼고
\d : 숫자만
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

<html>
    <head>
        <title>sorting a Table</title>
        
        <script type="text/javascript">
        var dataset = new Array();// 모든 data를 가지고 있고 정렬시 사용.
        
        /*
             작은것이 가장 위로 정렬
            colIndex : 원하는 columnIndex
        */
        function asc(colIndex){
            var sortArray = new Array();
            // 정렬을 수행 할 수 있는 행을 추출
            for(var i = 0; i < dataset.length; i++){
                sortArray[i] = dataset[i][colIndex];
            }

            // 해당 행으로 정렬을 수행
            var first, second, min;
            for(first = 0; first < sortArray.length-1; first++){
                //a[j]...a[a.length]사이에 가장작은 원소의 인덱스를 찾음
                for(second = first+1, min = first; second < sortArray.length; second++){
                    if(sortArray[second] < sortArray[min])
                        min = second;
                }
                swap(sortArray, min, first, min, first);
            }
        }
        // 정렬 중 필요한 인자들의 위치를 바꿔줌
        function swap(array, first, second, arrayIndexA, arrayIndexB){
            var temp = array[first];
                array[first] = array[second];
                array[second] = temp;

            var tempDataSet = dataset[arrayIndexA];
            dataset[arrayIndexA] = dataset[arrayIndexB];
            dataset[arrayIndexB] = tempDataSet;
        }
        /*
             큰것이 가장 위로 정렬
             colIndex : 원하는 columnIndex
        */
        function desc(colIndex){
            var sortArray = new Array();
            // 정렬을 수행 할 수 있는 행을 추출
            for(var i = 0; i < dataset.length; i++){
                sortArray[i] = dataset[i][colIndex];
            }
            // 해당 행으로 정렬을 수행
            var first, second, max;
            for(first = 0; first < sortArray.length-1; first++){
                //a[j]...a[a.length]사이에 가장큰  원소의 인덱스를 찾음
                for(second = first+1, max = first; second < sortArray.length; second++){
                    if(sortArray[second] > sortArray[max])
                        max = second;
                }
                swap(sortArray, first, max, first, max);
            }
        }

        /*
            List 생성 : 실제로는 가져온 Data를 뿌려 줄 때 JSP등에서 직접 생성하므로 필요 없을 듯 함.
        */
        function create(tName, tBodyId){
            //var tbody = document.getElementById(id).getElementsByTagName("TBODY")[1];
            var tbody = document.getElementById(tBodyId);
                          
                  for(var i = 1; i < 14; i++){
                      var row = document.createElement("TR");
                      var td1 = document.createElement("TD");
                      var td2 = document.createElement("TD");
                      var td3 = document.createElement("TD");
                      var td4 = document.createElement("TD");
                      var td5 = document.createElement("TD");
                      
                      td1.appendChild(document.createTextNode(i));
                    td2.appendChild(document.createTextNode("id " + i));
                    td3.appendChild(document.createTextNode("title "+ i));
                    td4.appendChild(document.createTextNode("name " + i));
                    td5.appendChild(document.createTextNode("date " + i));
                    
                    row.appendChild(td1);
                    row.appendChild(td2);
                    row.appendChild(td3);
                    row.appendChild(td4);
                    row.appendChild(td5);
                              
                    tbody.appendChild(row);

                    // rowData create
                    var rowDatas = new Array();
                    rowDatas[0] = i;
                    rowDatas[1] = "id" + i;
                    rowDatas[2] = "title" + i;
                    rowDatas[3] = "name" + i;
                    rowDatas[4] = "date" + i;

                    dataset.push(rowDatas);
                  }
        }
        /*
        List 생성
        필요인자 :
            tBodyId : List할 table 아래에 <TBODY>로 이름지은 elementID
            colNum  : number of columns
        */
        function update(tName, tBodyId, colNum){
            clearTable(tName);
                
            for(var i = 0; i < dataset.length; i ++){
                var row = document.createElement("tr");
                var rowArray = dataset[i];

                for(var j = 0; j < colNum; j++){
                    row.appendChild(createCellWithText(rowArray[j]));                    
                }

                document.getElementById(tBodyId).appendChild(row);
            }
        }

        function createCellWithText(text){
            var cell = document.createElement("td");
            cell.appendChild(document.createTextNode(text));
            return cell;
        }
        /*
            해당 Table의 주어진 index의 Row를 삭제
        */
        function deleteRow(tName, rowIndex){
            var tbody = document.getElementById(tName).getElementsByTagName("TBODY")[1];
            tbody.removeChild(rowIndex);
        }
        /*
            해당Table 의 첫번째 Row를 제외한 나머지 Row 모두 제거
        */
        function clearTable(tName){            
              var tbody = document.getElementById(tName).getElementsByTagName("TBODY")[1];
            var trows = tbody.rows.length;
            //for(var i = trows ; i > 1; i--){
            while(tbody.rows.length > 0){
                tbody.removeChild(tbody.lastChild);
            }            
        }

        /*
            엑셀출력.
            1. Title
            2. Body
             - 실제 Data는 표에 있는 내용이 아니라 이미 저장해 놓은 dataset으로 뿌려줌.
        */
        function AutomateExcel(xTitle, xColumns){
            if(xTitle == null){
                xTitle = "Excel download";
            }
            if(xColumns == null){
                xColumns = "Num,ID,Title,Writer,Date";
            }
            var cols = xColumns.split(",");

            var left = "A";
            var top = 3;
            var right = indexToAlphabet(cols.length);
            var bottom = dataset.length + top;
            
            

            
            // Start Excel and get Application object.//
            try{
                var oXL = new ActiveXObject("Excel.Application");

                oXL.Visible = true;

                // Get a new workbook.
                var oWB = oXL.Workbooks.Add();
                var oSheet = oWB.ActiveSheet;

                //Format Title as bold, vertical alignment = center.
                //Title --------------------------------------------------------
                oSheet.Range("A1", "E1").Font.Bold = true;
                oSheet.Range("A1", "E1").VerticalAlignment =  -4108; //xlVAlignCenter
                oSheet.Cells(1, 1).Value = xTitle;
 
                //BODY  --------------------------------------------------------
                //Format Table header
                oSheet.Range("A2", "E2").Font.Bold = true;
                oSheet.Range("A2", "E2").VerticalAlignment =  -4108; //xlVAlignCenter
 
                // Add table headers going cell by cell.
                for(var i = 0; i < cols.length; i++){
                    var j = i+1;
                    oSheet.Cells(2, j).Value = cols[i];
                }
 
                // Create an array to set multiple values at once.
                // Range
                
                //oSheet.Range(left + top + "," + right + bottom).Font.Bold = true;
                //oSheet.Range(left + top + "," + right + bottom).VerticalAlignment = -4108;
 
                for(var m = 0; m < (bottom-top); m++){
                    var nowCol = indexToAlphabet(m);
                    var c = m + 3;

                    for(var l = 0; l < cols.length; l++){
                        var r = l + 1;
                        //oSheet.Cells(c, r).Value = m + " : " + r;
                        oSheet.Cells(c, r).Value = dataset[m][l];
                    }
                }

                ///////////////// options of saving //////////////////////////
                // Make sure Excel is visible and give the user control
                // of Excel's lifetime.
                //oXL.Visible = true;
                //oXL.UserControl = true;

                // save as a file directly
                oWB.SaveAs("c:\\test.xls");
                oXL.Quit();
            }catch(e){
                alert("브라우저 옵션 > 도구 > 인터넷옵션 > 보안 > 안전하지 않는 것으로 표시된 ActivX 컨트롤 초기화 및 스크립트 > 확인 ");
            }
        }
        /*
            원하는 칼럼의 알파벳을 찾기위한 function
        */
        function indexToAlphabet(idx){
            var alphabet = new Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z");
            return alphabet[idx];
        }
        </script>
        
        
    </head>
    
    <body>
        <input type="button" value="asc" onClick="asc(0);"/>
        <input type="button" value="desc" onClick="desc(0);"/>
        <input type="button" value="create" onClick="create('tblMain', 'employeeList');"/>
        <input type="button" value="update" onClick="update('tblMain', 'employeeList', 5);"/>
        <input type="button" value="clear" onClick="clearTable('tblMain');"/>
        <input type=button value="Download Excel" onclick="AutomateExcel();">
        
        <p>
        <span id="employeeListSpan">
    
        <h2>게시판Test : </h2>
        
        <table id="tblMain" border="1" width="80%">
        
            <tr>
                <td>Num</td>
                <td>ID</td>
                <td>Title</td>
                <td>Writer</td>
                <td>Date</td>
            </tr>
            <tbody id="employeeList"></tbody>
        </table>
        </span>
        
        
        
    </body>

</html>
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

BLOG main image
"그게 뭐 어쨌다는 거냐?" 늘 누가 나에게 나에대한 말을할 때면 이말을 기억해라. by nobang

카테고리

nobang이야기 (1549)
Life With Gopro (7)
Life With Mini (66)
Diary (899)
너 그거 아니(do you know) (103)
난 그래 (104)
속지말자 (9)
Project (34)
Poem (12)
Song (0)
Study (119)
Photo (112)
낙서장 (45)
일정 (0)
C.A.P.i (2)
PodCast (0)
nobang (27)
고한친구들 (4)
recieve (0)
History (0)
android_app (2)

최근에 받은 트랙백

Total : 409,384
Today : 79 Yesterday : 285