MSSQL 의 pivot table 을 리턴하는 프로시저를 실행하여 

해당 데이터를 화면에 뿌려주기 위한 작업.

 

dynamic 컬럼을 만드는 방법은 이전 포스팅에 있음

https://oyesji.tistory.com/60

 

Pivot 결과로 컬럼, 로우 총합 구하기

https://www.codeproject.com/Articles/232181/SQL-Pivot-with-Grand-Total-Column-and-Row SQL Dynamic Pivots Introduction Microsoft SQL Server has introduced the PIVOT and UNPIVOT commands as enhancemen..

oyesji.tistory.com

 

1. mybatis xml

resultType 주의!

<select id="selectTest" parameterType="int" resultType="java.util.LinkedHashMap">
	--selectTest
	EXEC dbo.TEST
		@IDX = #{idx}
</select>

 

2. service

dynamic 컬럼명을 별도로 추출해야함.

List< Map< String, Object > > rList = this.mapper.selectTest( idx );
Set<String> header = null;

LinkedList< Map< String, Object > > list = new LinkedList<>();
list.addAll( rList );

if ( list != null && list.size() > 0 ) {
	//컬럼명 추출
  for ( ListIterator< Map< String, Object > > it = (ListIterator< Map< String, Object > >) list.iterator(); it.hasNext(); ) {
    Map< String, Object > column = it.next();
    if( NumberUtils.toInt( Objects.toString( column.get( "SEQ" ) ) ) == 0 ) {
    	header = column.keySet();
    }
  }
}

 

3. view

<c:forEach items="${list}" var="item" varStatus="row" >
	<tr>
		<c:forEach items="${header}" var="h" varStatus="col">
			<c:set var="headerName" value="${h}"></c:set>
			${item[headerName]}
		</c:forEach>
	</tr>
 </c:forEach>

 

'Language > JAVA' 카테고리의 다른 글

Attribute로 XML Parse 하기 (htmlTag 포함)  (0) 2017.09.12


아이디 마스킹

id = id.replace(/(?<=.{3})./gi, "*");    // 세자리 이후엔 * 처리



추가>

IE 에서는 위 정규식이 오류가 남.

map 과 join 을 사용하는 걸로 변경.



//id 마스킹 function maskingId(id) { var mask = id.split('').map(function(o, i){ if( i < 3 ) { return o; } else { return '*'; } }).join(''); return mask; } //name 마스킹 function maskingName(name) { name = name.substring(0, 1) + name.substring(1, 2).replace(/./g, "*") + name.substring(2, name.length); return name; }

XML 파싱

public XMLParseTest() { this.doc = null; this.xpath = null; try { URL url = new URL( XML_URL ); URLConnection connection = url.openConnection(); this.doc = parseXML( connection.getInputStream() ); this.xpath = XPathFactory.newInstance().newXPath(); } catch ( Exception e ) { } } private Document parseXML( InputStream stream ) throws Exception { DocumentBuilderFactory objDocumentBuilderFactory = null; DocumentBuilder objDocumentBuilder = null; Document doc = null; try { objDocumentBuilderFactory = DocumentBuilderFactory.newInstance(); objDocumentBuilder = objDocumentBuilderFactory.newDocumentBuilder(); doc = objDocumentBuilder.parse( stream ); } catch ( Exception ex ) { throw ex; } return doc; } public String item( String key ) { String str = ""; try { //str = StringUtils.stripToEmpty( Objects.toString( xpath.evaluate( "//*[@key='" + key + "']", doc, XPathConstants.STRING ) ) ); //str = str.replaceAll( "\t", "" ); // Node node = (Node) xpath.evaluate( "//*[@key='" + key + "']", doc, XPathConstants.NODE ); Element el = (Element) xpath.evaluate( "//*[@key='" + key + "']", doc, XPathConstants.NODE ); System.out.println( "### node : " + elementInner2String( el ) ); } catch ( Exception e ) { e.printStackTrace(); } return str; } private static String elementInner2String( Element el ) throws TransformerFactoryConfigurationError, TransformerException { final NodeList children = el.getChildNodes(); final StringBuilder sb = new StringBuilder(); for ( int i = 0; i < children.getLength(); i++ ) { final Node child = children.item( i ); sb.append( node2String( child ) ); } return sb.toString(); } private static String node2String( Node node ) throws TransformerFactoryConfigurationError, TransformerException { final Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "yes" ); final StringWriter writer = new StringWriter(); transformer.transform( new DOMSource( node ), new StreamResult( writer ) ); return writer.toString(); }

더 간단한 방법은 Html Tag 가 있는 부분은 <![CDATA[ ]]> 로~


'Language > JAVA' 카테고리의 다른 글

PIVOT의 dynamic 컬럼 가져오기  (0) 2020.02.05
$(document).ready(function() {
		$.extend({
		    redirectPost: function(location, args) {
				$("#frm1")
				.attr("action", location);
				
				$.each(args, function(key, value) {
					$("").attr({
						type: "hidden",
						name: key,
						value: value
					}).appendTo("#frm1");
				});
				$("#frm1").submit();
		    }
		});
});

		function aa() {
			if("${param.redirectUrl}" != '') {
				var redirect = "${param.redirectUrl}";
				if(redirect.indexOf("?") > -1) {
					var search = redirect.substring(redirect.indexOf("?") + 1, redirect.length);
					var url = redirect.substring(0, redirect.indexOf("?"));
					var params = JSON.parse('{"' + decodeURI(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}');
				} else {
					url = redirect;
				}
				
				$.redirectPost(url, params);
			}
		}

http://www.appelsiini.net/projects/lazyload




참고] http://oops.tistory.com/2

/**
  * 이미지 썸네일을 불러오는 function
  * @param html : input 필드의 dom을 인자로 받는다. 물론 타입은 file
  * @param $target : 불러온 이미지를 적용할 jquery 객체.
  **/
function getThumbnail(html, $target) {
    if (html.files && html.files[0]) {
        var reader = new FileReader();
        reader.onload = function (e) {
            $target.css('background-image', 'url(\"' + e.target.result + '\")');
        }
        reader.readAsDataURL(html.files[0]);
    }
}
[출처] http://fimtrus.tistory.com/entry/Javascript-input-file-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EB%AF%B8%EB%A6%AC%EB%B3%B4%EA%B8%B0




http://ionicframework.com/


ionic 이라는건데, cordova + angularJS를 기반으로 제작합니다. 화면은 Html과 javascript로 구성하니, 웹 개발처럼 하면서 API는 cordova 혹은 ngCordova(AngularJS) 를 사용하면 편리하게 개발할수있습니다




[출처] http://cafe.naver.com/jzsdn/21091 

 혹시 필요하신 분이 계실지 몰라서 미리 공유합니다. 
안드로이드는 아이폰에 비해서 네튁이 강하더군요.
 예를 들자면 멀티미디어 학과 학생이라면 아이폰을 공부하시는게 좋겠고. 
전산학과나 컴공학과 학생들은 안드로이드를 해야할듯합니다. 
안드로이드냐 아이폰이냐 따지기전에 자기특기에 적합한 플랫폼을 선택 하시면 될듯합니다.

 정적함수인 DownloadHtml 가 스트링형태로 html문서내용을 리턴해줍니다. 페이지에따라 시간이 오래 걸릴수 있으니 쓰레드를 활용 하셔야 합니다. 
Thread의 run 함수에 넣고 사용 하시면 됩니다.

   


[출처] http://ismydream.tistory.com/130



안드로이드 비동기 처리하기 AsyncTask


비동기 처리를 하기 위해서는 별도의 Thread 를 생성하여 public void run()  메소드를 구현하면 되지만 안드로이드에서는 직접 Thread 를 생성하기 보다는 AsyncTask 를 사용하길 권장합니다.

AsyncTask 내부에는 자체 ThreadPool 이 있어 Thread 가 무한정 늘어나 메모리에 부담을 주지 않도록 관리 하고 있기 때문에

따로 ThreadPool 을 관리하지 않는다면 AsyncTask 를 사용하는게 무난할 것 같습니다.


아래는 비동기적으로 ImageView에 Bitmap을 로드하는 코드입니다.


doInBackground 메소드는 기존의 Thread 에서의 run() 메소드라고 보시면 됩니다.

AsyncTask 는 처리할 데이터에 따라 파라미터 타입을 정의할 수 있습니다. 정의하는 부분은 클래스를 정의하는 부분에 있습니다.

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap>{


 Integer

  execute, doInBackground 의 파라미터 타입

 Void

  onProgressUpdate 의 파라미터 타입

 Bitmap

  doInBackground 의 리턴값, onPostExecute 의 파라미터로 설정됩니다.


AsyncTask 소스를 보면 좀더 정확히 확인하실 수 있습니다.


또한 AsyncTask 는 실행 전후로 전처리, 후처리를 할 수 있는 콜백 메소드를 제공합니다.

onPreExecute(), onPostExecute( Bitmap)


class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap>{

private final WeakReference<ImageView> imageViewReference;

private int data = 0;

public BitmapWorkerTask( ImageView imageView){

// WeakReference 를 사용하는 이유는 image 처럼 메모리를 많이 차지하는 객체에 대한 가비지컬렉터를 보장하기 위해서입니다.

imageViewReference = new WeakReference<ImageView>(imageView);

}

@Override

protected Bitmap doInBackground( Integer... params){

data = param[0];

return decodeSampledBitmapFromResource( getResources(), data, 100, 100);

}

@Override

protected void onPostExecute( Bitmap bitmap){

if( imageReference != null && bitmap != null){

final ImageViewReference imageView = imageViewReference.get();

if( imageView != null){

imageView.setImageBitmap( bitmap);

}

}

}

}


위처럼 AsyncTask 를 확장하는 클래스를 생성한후 실행하면 됩니다.

public void loadBitmap( int resId, ImageView imageView){

BitmapWorkerTask task = new BitmapWorkerTask( imageView);

task.execute( resId);

}


AsyncTask 는 execute( Runnable) 메소드도 제공하기 때문에 별도의 스레드 작업을 할때도 사용할 수 있습니다.

[별도의 카메라 앱을 실행시켜 사진을 촬영하는 코드]

AsyncTask.execute( new Runnable(){

public void run() {

Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

try{

mImageF = createImageFile();

// 이미지가 저장될 파일은 카메라 앱이 구동되기 전에 세팅해서 넘겨준다.

openCameraIntent.putExtra( MediaStore.EXTRA_OUTPUT, Uri.fromFile( mImageF)); 

mActivity.startActivityForResult( openCameraIntent, RequestCodes.REQUESTCODE_CAMERA_PICTURE);

}catch( IOException e){

e.printStackTrace();

}

}

});




[출처] http://ismydream.tistory.com/130


아쉽게도 API 는 아직 한글화가 안되어 있다.


Dev Guide 만 한글화가 되어있다. 


http://www.kandroid.org/guide/basics/what-is-android.html



+ Recent posts