반응형

프로젝트 중간에 요구사항으로 멀티 셀렉트를 하게 되었는데 사용할만한 UI는 대부분 부트스트랩이나 시멘틱 UI등으로

컴포넌트 적용을 해야해서 기존 개발되어있던 CSS에 영향을 미치게 되어 사용할 수 없었다.

 

모양은 이쁘지 않지만 멀티 선택이 가능한 select박스가 있어 공유한다.

 

https://www.jqueryscript.net/form/Drop-Down-Combo-Tree.html

 

Multi-Select Drop Down Tree Plugin With jQuery - Combo Tree

Combo Tree is a jQuery plugin to render a single or multi-select dropdown list from JSON data that enables the user to select one or multiple options from a hierarchical, collapsible tree view with checkboxes.

www.jqueryscript.net

 

jquery ComboTree이며 해당 URL에서 원본을 다운받아 사용하면 된다.

 

특이한 점이 있다면 input text태그에 JSON형태의 데이터를 넣어야 한다.

다운받으면 예제들이 있으니 간단하게 뜯어보고 comboTreePlugin.js부분을 원하는 형태로 조금 뜯어고쳐서 커스텀도 가능하니 원하는형태로 사용해보면 좋을 것같다.

내부에 존재하는 css에도 어려운문법이 없으니 쉽게 커스텀이 가능하다.

 

 

아래는 커스텀하여 사용한 소스와 UI이다.

index.html

<!DOCTYPE html>
<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>multiple select</title>
    <style media="screen">
      *{
        margin: 0px;
        padding: 0px;
      }
      .line{
        width: 200px;
        border: 1px solid #ddd;
        text-align: center;
        margin: 30px 0 30px 0;
        padding: 10px;
      }
    </style>
    <link rel="stylesheet" type="text/css" href="css/style.css">
    <script type="text/javascript" src="js/jquery/jquery-3.1.1.min.js"></script>
    <script type="text/javascript" src="js/comboTreePlugin.js"></script>
    <script type="text/javascript" src="js/icontains.js"></script>
    <script type="text/javascript">
      var test1, test2;

      $(document).ready(function() {
        init();
      });

      function init(){
        var test1_JSON = new Array();
        var test2_JSON = new Array();

        jsonMaker(10, test1_JSON);
        jsonMaker(10, test2_JSON);

        test1 = $("#test1").comboTree({
          source : test1_JSON,
    			isMultiple: true,
    			cascadeSelect: false
        })

        test2 = $("#test2").comboTree({
          source : test2_JSON,
    			isMultiple: true,
    			cascadeSelect: false
        })
      }

      function jsonMaker(limit, arr){
        for(i=0; i<limit; i++){
          arr.push({id: "id"+i, title: "title"+i});
        }
      }
    </script>
  </head>
  <body>
    <div class="line">
      <input type="text" id="test1" autocomplete="off" placeholder="Multiple Select">
    </div>
    <div class="line">
      <input type="text" id="test2" autocomplete="off" placeholder="Multiple Select">
    </div>
  </body>
</html>

 

멀티 선택 사용

 

선택 후 화면

 

커스텀한 소스도 첨부하니 사용하실분은 다운받아서 index.html부분을 참고하여 사용하면 될 것 같다.

jQuery_multiple_comboTree.zip
0.03MB

반응형
반응형

톰캣 공식홈페이지에서 다운로드를 하려고하면 현재 기준으로 7, 8.5, 9버전순으로 다운로드를 할 수 있는데

다른버전을 원할 경우 아카이브를 통해 다운로드가 가능하다.

 

http://archive.apache.org/dist/tomcat/

 

Index of /dist/tomcat

 

archive.apache.org

 

위 URL로 접근하면 이전 버전 다운로드가 가능하다.

 

 

Tomcat Archive

톰캣 8.0 다운로드를 진행해보겠다.

 

tomcat-8/ 클릭하여 이동한다.

이동 후 쭉 내려보면 날짜별 버전별 확인이 가능하고 마지막 배포인 8.0.53을 클릭한다.

 

 

bin으로 이동한다.

이후 원하는 파일 형태로 다운로드하면 된다.

 

본인은 zip으로 다운로드하여 사용하였다.

 

반응형
반응형

톰캣 내부 설정파일을 설정하여 메인 ROOT 디렉토리를 설정할 수 있다.

 

보통 파일명이 존재하면 컨텍스트명으로 처리가 되지만 conf/server.xml을 설정함으로써 ROOT를 지정하여

해당 프로젝트만 구동시킬 수 있다.

리눅스환경에서도 동일하지만 윈도우를 기준으로 변경법을 남긴다.

 

conf 디렉토리

 

server.xml

 

conf/server.xml 파일을 메모장이나 편집기를 활용하여 실행한다.

(관리자 권한으로 실행해준다.)

 

기본 설정상태

처음 server.xml을 열어서 맨 아래쪽을 보면 위 그림처럼 되어 있을텐데, Host태그의 appBase부분을 지정해주거나

Context태그를 추가하여 지정해줄수 있다.

 

Context 추가

<Context path="" docBase="지정경로" reloadable="false"></Context>

와 같은 태그를 추가후 톰캣 서비스를 실행하게 되면 ROOT라는 디렉토리로 배포하거나 컨텍스트명을 지정하여 접근하지 않더라도 접근이 되는것을 확인 할 수 있다.

(해당 방법은 톰캣 8.0 기준이며 지정시 상대경로가 아닌 절대경로로 지정해주었다.)

 

이러한 방법을 통해 도메인설정의 꼬이는 부분까지 해결이 가능하다.

 

 

반응형
반응형

키보드 입력시 유효성 검사를 위해 키보드 입력 제한을 처리할 필요가 있다.

 

간단하게 입력 제한을 막는 방법으로 속성값에 처리하는 방법이 있다.

 

$(document).on("keyup", "input[속성명 지정]", function() {$(this).val( $(this).val().replace( 정규식 ,"") );})

 

이러한식으로 키보드 입력이 있을때 input 태그에 지정한 속성이 있으면 정규식에 따라 처리하는 방법이다.

 

ex) 숫자만 입력

-Javascript

$(document).on("keyup", "input[numberOnly]", function() {$(this).val( $(this).val().replace(/[^0-9]/gi,"") );})

-HTML

<input type="text" value="" class="number" numberOnly/>

numberOnly속성이 추가된 input태그에는 치환처리로 인해 더이상 숫자외에는 입력이 불가하다.

 

 

ex) 숫자 및 '-' 하이픈만 입력받기

$(document).on("keyup", "input[telOnly]", function() {$(this).val( $(this).val().replace(/[^0-9-]/gi,"") );})

 

ex) 특수문자 중에 쉼표만 허용하기

$(document).on("keyup", "input[commasOnly]", function() {$(this).val( $(this).val().replace(/[<>(){}[\]\-_=+|\/\\'\;.:\"`~!?@#$%^&*]/gi,"") );})

 

ex) 한글, 영문, 숫자만 받기

$(document).on("keyup", "input[noSpecial]", function() {$(this).val( $(this).val().replace(/[^ㄱ-힣a-zA-Z0-9]/gi,"") );})

 

정규식에 따라 자유롭게 수정하여 사용할 수 있다.

반응형
반응형

AJAX를 통해 비동기로 통신하면서 JSON형태로 데이터를 파싱하는 방법을 알아보겠다.

 

먼저 JSON 파싱을 위해 JSON-LIB을 MAVEN 등록을 해준다.

 

pom.xml

<!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib -->
<dependency>
  <groupId>net.sf.json-lib</groupId>
  <artifactId>json-lib</artifactId>
  <version>2.4</version>
  <classifier>jdk15</classifier>
</dependency>

classifier부분이 없으면 에러가 난다.

 

maven 추가를 하고 간단한 UI를 위한 jsp를 구성한다.

index.jsp

<table>
  <colgroup>
  <col width="">
  <col width="">
  </colgroup>
  <tr>
    <th>일간</th>
    <td><input type="text" value="" id="day"/> <small>(숫자만 입력하세요)</small></td>
  </tr>
  <tr>
    <th>주간</th>
    <td><input type="text" value="" id="week"/> <small>(숫자만 입력하세요)</small></td>
  </tr>
  <tr>
    <th>월간</th>
    <td><input type="text" value="" id="month"/> <small>(숫자만 입력하세요)</small></td>
  </tr>
  <tr>
    <th>연간</th>
    <td><input type="text" value="" id="year"/> <small>(숫자만 입력하세요)</small></td>
  </tr>
</table>
<button id="save">저장</button>

 

저장 버튼을 눌렀을때 동작시킬 스크립트

index.js

//저장
$("#save").click(function(){
  if(confirm("입력하신 데이터를 저장하시겠습니까?")){
    var day = $("#day").val();
    var week = $("#week").val();
    var month = $("#month").val();
    var year = $("#year").val();

    var keyValue = "REPORT";
    var params = [{key : keyValue, keydetail1 : "DAY", value : day},
                {key : keyValue, keydetail1 : "WEEK", value : week},
                {key : keyValue, keydetail1 : "MONTH", value : month},
                {key : keyValue, keydetail1 : "YEAR", value : year}];

    $.ajax({
      url: "/reportSave.do",
      contentType: "application/json; charset=utf-8",
      type: "POST",
      data: JSON.stringify(params),
      dataType: "JSON",
      success: function(args){
        var r = args.res;
        if(r > 0){
        	alert("정상적으로 등록되었습니다.");
        }else{
        	alert("등록하는데 실패하였습니다.");
        }
      },
      error: function(args){
        alert("오류가 발생하였습니다.");
        location.reload();
      }
    });
  }
});

 

스크립트에서 중요하게 봐야할 부분은 ajax 넘기는부분에서 contentType을 지정해주는것이다.

값을 지정해주지 않으면 기본값으로 처리되어 JSON을 넘기더라도 정상적으로 JAVA단에서 처리할수 없다.

"application/json"을 해주고 언어의 인코딩까지 맞춰준다.

 

이후에 data부분에서는 JSON.stringify 메소드를 통해 배열 Object값을 JSON화 시켜준다.

 

JSON화 처리가 된 데이터

 

이제 전달받을 컨트롤러 부분을 구성해보자.

 

Controller.java

@RequestMapping(value="reportSave.do", method=RequestMethod.POST)
public @ResponseBody Map<String, Object> reportSave (final HttpServletRequest request, 
final HttpServletResponse response, @RequestBody String requestData) throws Exception {
  Map<String, Object> res = new HashMap<String, Object>();

  int resValue = 0;
  List<Map<String,Object>> resultMap = JSONArray.fromObject(requestData); // JSON형태로 날라온 데이터를 파싱하여 update진행
  for(Map<String, Object> map : resultMap) {
  	resValue += userService.updateThresholdSetting(map);
  }

  res.put("res", resValue);
  return res;
}

for문 내부에서 update문을 돌리는 서비스를 구성하였는데

해당 부분에서 원하는 형태로 변경해서 사용하면 될 것이다.

 

 

ajax에서 넘기는 데이터는 @RequestBody 어노테이션을 활용하여 reqeustData라는 파라미터값으로 처리하였다.

해당값을 이번에 추가한 라이브러리 net.sf.json.JSONArray를 활용하여 List Map에 파싱을 해준다.

 

import net.sf.json.JSONArray; 라이브러리 사용

 

 

반응형
반응형

아주 오래전에 개발된 웹페이지를 맡게되어서 개발중인데, 취약점으로 엄청난 지적들이 나오고 있어서 고통을 받고 있다...

 

mybatis $문제도 문제지만 jsp에서 ${}로 데이터를 받은부분에서 XSS악성스크립트로 replace 문자열 치환을 해달라는 요청이 있어서 바꾸고 있는중인데 jstl에서 replcae사용법에 대해 알아보겠다.

 


 

 

먼저 fn 태그스크립트를 추가해준다.

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

 

기존)

<c:forEach items="${list}" var="list" varStatus="i">
<tr>
	<td>${list.no}</td>
</tr>
</c:forEach>

 

replace 처리)

<c:forEach items="${list}" var="list" varStatus="i">
<tr>
	<td>${fn:replace(fn:replace(list.no, '&lt;', ''), '&gt;', '')}</td>
</tr>
</c:forEach>

td태그 사이의 값을 보면 된다.

먼저 "<" 특수문자를 공백으로 치환후 한번더 replace하면서 ">"로 변경처리 해준다.

 

${fn:replace(대상, '대상 문자열', '변경할 문자열')}

 


 

 

fomatter와 같은 태그로 묶어서 날짜표현을 하던 데이터의 경우

 

기존)

<fmt:formatDate var="sDt" pattern="yyyy-MM-dd" value="${list.startDate}" />

 

replace 처리)

<fmt:formatDate var="sDt" pattern="yyyy-MM-dd" value="${list.startDt}" />

${fn:replace(fn:replace(sDt, '&lt;', ''), '&gt;', '')}

 

var에 먼저 패턴에 따른 형변환을 처리한 후 변수값을 이용하여 replace를 해주면 적용이 가능하다.

반응형
반응형

한국 지도 사용에 대해 알아 보겠습니다.

 

https://www.amcharts.com/svg-maps/

 

Free SVG Maps - amCharts

 

www.amcharts.com

amchart에 가시면 각국 나라를 무료로 다운받아서 커스텀해서 사용할 수 있습니다.

 

 

 

그중 한국을 클릭하여 접근하여 svg파일을 다운로드합니다.

 

 

 

 

 

 

이동하여 원하는 파일(High, Low 버전)을 받으시면 svg파일을 다운로드 받으실 수 있습니다.

 

 

 

 

다운로드 받아서 열어보면 간단하게 특별시, 광역시, 도 정도로 된 한국맵을 볼 수 있는데,

간단하게 색상 변경이나 클릭이벤트를 추가해보겠습니다.

 

 

 

열어보면 굉장히 복잡한 태그들이 보일텐데 우린 여기서 중요하게 볼건

path 태그들입니다.

 

 

각각의 path들이 지도를 그리고 있으므로 해당부분의 아이디값에 click이벤트 또는 인라인 스타일 태그나 클래스값을

개별적으로 처리하여 색상처리를 하면 값을 바꿀 수 있습니다.

 

기본적으로 처리되어있던 클래스 title이 서울로 되어있는 부분에 class를 추가한 후 파란색으로 변경해보겠습니다.

 

 

SeoulLand라는 클래스를 추가한 후 style태그에서 fill을 추가하였습니다.

SeoulLand css

 

 

 

그럼 아래와 같이 지도가 변경된 걸 볼 수 있습니다.

특정 지역만 색 변경

 

 

 

좀 더 그럴싸 해보이도록 hover속성도 추가해보겠습니다.

 

 

 

모든 지역인 path태그들은 land 클래스가 처리 되어있으므로 land클래스에 hover속성을 추가하여 간단하게 변경이 가능합니다.

 

 

 

hover 효과

 

 

 

 

 

 

클릭 이벤트 또한 간단한 예시를 보겠습니다.

 

 

id에 이벤트 처리를 하셔도 되지만 간단한 예제를 보기 위해 태그 내부에 onclick속성을 주었습니다.

서울 부근을 클릭하게 되면 아래와 같이 alert가 동작하는 것을 볼 수 있습니다.

클릭 이벤트 추가

svg내부의 태그가 길어서 간단하게 소스들을 캡처로 대처하였습니다.

 

 

 

예제 변경처리의 파일로 첨부하도록 하겠습니다.

southKoreaHigh.svg
0.10MB

반응형
반응형

자바 프로그램이 동작할 때 최초 한번만 메모리를 할당하고 할당된 메모리에서만 사용하는 방식을 말한다.

즉, 고정된 메모리영역을 사용하여 메모리 낭비를 줄이고 공통된 객체를 사용할 때 매번 객체를 새로 생성하지 않는 방식을 말한다.

자바에서 객체를 새로 생성할때 new 연산자를 통하여 매번 메모리에 새로 할당을 하는데, 싱글톤 패턴은 기본 생성자 자체를

private으로 생성하여 new 연산자를 통해 생성하지 못하도록 제약을 둔다.

그럼 생성자를 통해 객체를 생성을 못하는데 어떻게 객체를 생성하고 가져올까?

이때 자바의 setter, getter의 느낌인 getIntance() 메소드를 통하여 객체를 반환시킨다.

예제를 보겠다.

 

SingleTon.java

public class SingleTon {
	//전역 객체변수로 사용하기 위해 static 객체변수로 생성
	static SingleTon instance;
	
	//생성자를 priavte로 만들어 접근을 막는다
	private SingleTon(){}
	
	//getInstance 메소드를 통해 한번만 생성된 객체를 가져온다.
	public static SingleTon getInstance(){
		if(instance == null){ //최초 한번만 new 연산자를 통하여 메모리에 할당한다.
			instance = new SingleTon();
		}		
		return instance;
	}
}

 

SingleTonMain.java

public class SingleTonMain {

	public static void main(String[] args) {
		SingleTon st = SingleTon.getInstance();
		System.out.println(st);
	}
}

 

 

예제와 같이 SingleTon class에서 생성자를 private로 생성하여 new 연산자로 생성을 방지하고, 객체 변수인 instance를 통하여

최초 null인 경우에만 new SingleTon(); 으로 메모리에 한번 할당시킨다.

main문을 확인해보면 일반적으로 객체를 사용하던 SingleTon st = new SingleTon(); new 연산자 방식이 아닌

getInstance() 메소드를 통해 할당하고 있는것을 볼 수 있다.

이렇게 적어놓은 개념이 이해가 안될 수 있을 것 같다.

그럼 일반적인 new 연산자를 통한 객체 선언과 getInstance() 메소드를 통한 싱글톤 패턴의 차이를 보겠다.

NormalClass.java

public class NormalClass {
	public NormalClass(){		
	}
}

 

SingleTonMain.java

public class SingleTonMain {

	public static void main(String[] args) {
		//싱글톤 getInstance() 메소드를 통한 객체 사용
		SingleTon st1 = SingleTon.getInstance();
		SingleTon st2 = SingleTon.getInstance();
		SingleTon st3 = SingleTon.getInstance();
		
		System.out.println(st1);
		System.out.println(st2);
		System.out.println(st3);
		
		//일반적인 new 연산자를 통한 객체 사용
		NormalClass nc1 = new NormalClass();
		NormalClass nc2 = new NormalClass();
		NormalClass nc3 = new NormalClass();
		
		System.out.println(nc1);
		System.out.println(nc2);
		System.out.println(nc3);
	}
}

싱글톤과 new연산자를 통한 주소값의 차이


기존에 생성해놓은 SingleTon 객체를 3번 선언한것과 새로 만든 NormalClass 객체를 3번 생성한것을 비교한 소스이다.

sysout을 통해 주소값을 확인해보면 확연한 차이를 알 수 있다.

싱글톤 방식은 3번이나 생성한 것 같아보이지만 getInstance() 메소드에 의해 한번만 할당된 객체의 주소값을 참조하는걸 알 수 있다.

반면 new연산자는 객체를 생성할때 마다 메모리에 새로 만들기 때문에 3개 모두 다른 메모리값으로 처리된 걸 볼 수 있다.

반응형