1. public static void main(String[] args){} ????

 - java로 처음 "Hello, World!"를 쓸 때 써본거.

 - java application의 시작점


2. 소스

 1) 전체보기

/**
* Java Entry Class
*
* @author geunspage
*/
public class MainTest {

public static void main(String[] args) {
System.out.print("Hello, World!");
}
}


 2) public

  (1) 접근 제어자(Access Modifier)

- defualt, private, protected, public

- private -> default -> protected -> public 순으로 보다 많은 접근이 가능하다.

  (2) 해당 값 변경 또는 제거 할 경우

/**
* Java Entry Class
*
* @author geunspage
*/
public class MainTest {

private static void main(String... args) {
System.out.print("Hello, World!");
}
}

 - 찾지 못함.

오류: MainTest 클래스에서 기본 메소드를 찾을 수 없습니다. 다음 형식으로 기본 메소드를 정의하십시오.

   public static void main(String[] args)

또는 JavaFX 애플리케이션 클래스는 javafx.application.Application을(를) 확장해야 합니다.


 3) static

  (1) 설명

- java가 처음 실행되면 클래스의 객체가 없기 때문에, 해당 메소드는 static(인스턴스를 생성하지 않고도 호출이 가능해짐)이어야 접근이 가능하다.


  (2) 해당 값 변경 또는 제거 할 경우

/**
* Java Entry Class
*
* @author geunspage
*/
public class MainTest {

public void main(String... args) {
System.out.print("Hello, World!");
}
}

 - 찾지 못함.

오류: MainTest 클래스에서 기본 메소드가 static이(가) 아닙니다. 다음 형식으로 기본 메소드를 정의하십시오.

   public static void main(String[] args)


 4) void 

  (1) 설명

- Method의 리턴 유형

- void는 아무것도 돌려주지 않겠다는 내용.

- Main Method의 실행이 끝나면 프로그램이 종료되기 때문에, 아무것도 돌려줄 필요가 없다.


  (2) return 0 추가


  (3) 중간에 종료하기

- 아래 "Hello, World! 2" 는 실행되지 않는다.

- 아래와 같이 작성할 경우, 대부분의 툴에서는 Dead Code라고 뜬다.



 5) main

  (1) java application 실행시 main 으로 실행한다는 약속된 값.

  (2) 변경시

/**
* Java Entry Class
*
* @author geunspage
*/
public class MainTest {

public static void mainTest(String... args) {
System.out.print("Hello, World!");
}
}

  - 찾지 못한다.

오류: MainTest 클래스에서 기본 메소드를 찾을 수 없습니다. 다음 형식으로 기본 메소드를 정의하십시오.

   public static void main(String[] args)

또는 JavaFX 애플리케이션 클래스는 javafx.application.Application을(를) 확장해야 합니다.


 6) String[] args or String... args

  (1) command line arguments 

  (2) 예제

/**
* Java Entry Class
*
* @author geunspage
*/
public class MainTest {

public static void main(String... args) {
for (String arg : args) {
System.out.println("arg : " + arg);
}

}
}

 - 실행(intellij)


 - 실행 Command Line

javac MainTest.java

java MainTest 1 2 3


 - 결과



'프로그래밍 > JAVA' 카테고리의 다른 글

Java에서 Tuple 사용하기.  (0) 2018.04.11
try-catch-resources  (0) 2018.04.11
public static void main(String[] args){}  (0) 2018.04.03
javax.net.ssl.SSLHandshakeException에 대한 해결방법  (0) 2017.02.14
websocket 사용 간단 채팅  (0) 2016.08.23
URL Image DownLoad  (0) 2016.08.14

1. 증상

 - java에서 HTTPS로 Remote Site에 연결할 경우 아래와 같은 Exception이 발생한다.

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target


2. 원인

 - $JAVA_HOME/jre/lib/security 폴더(인증기관 인증서 목록(keystore)) 내에 접속하고자 하는 IP or HOST의 SSL 서버에서 유효한 인증서가 존재하지 않을 경우 발생함.


3. 해결

 - 아래 소스를 복사해서 넣는다.



 - 또는 아래 링크를 통해 소스를 받는다.

git clone https://gist.github.com/64ca41fe18ae1ed85659c49adb866d3f.git

 

 - InstallCert.java를 컴파일 한다.

cd  ./InstallCert

javac InstallCert.java 

 

 - InstallCert.class를 실행한다.

java -cp ./ InstallCert  IP or HOST(ex. google.com)


 - 아래 메시지가 나오면 1을 눌러 저장한다.

Enter certificate to add to trusted keystore or 'q' to quit: [1]


 -아래 메시지와 같이 나오면 저장된거다.

Added certificate to keystore 'jssecacerts' using alias 'IP or HOST(ex. google.com)'


 - 해당 파일을 아래 경로로 복사해 넣는다.

$JAVA_HOME/jre/lib/security


4. TIP

 - $JAVA_HOME/jre/lib/security 하위로 복사하지 않고 소스에서 바로 임포트 시킬수도있다.

System.setProperty("javax.net.ssl.trustStore", "인증서 경로");


'프로그래밍 > JAVA' 카테고리의 다른 글

Java에서 Tuple 사용하기.  (0) 2018.04.11
try-catch-resources  (0) 2018.04.11
public static void main(String[] args){}  (0) 2018.04.03
javax.net.ssl.SSLHandshakeException에 대한 해결방법  (0) 2017.02.14
websocket 사용 간단 채팅  (0) 2016.08.23
URL Image DownLoad  (0) 2016.08.14

1. pom

<!-- WebSocket -->
<dependency>
<groupId>javax.websocket</groupId>
<artifactId>javax.websocket-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>

2. java source 

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Set;

@ServerEndpoint(value = "/websocket/chat/{clientId}")
public class ChatAnnotation {

private static final Set<ChatAnnotation> connections = new CopyOnWriteArraySet<>();

private String nickname;
private Session session;

@OnOpen
public void start(@PathParam("clientId") String clientId, Session session) {
this.nickname = clientId;
this.session = session;
connections.add(this);
}

@OnClose
public void end() {
connections.remove(this);
}

@OnMessage
public void incoming(String message) {
// Never trust the client
String filteredMessage = String.format("%s: %s", nickname, message.toString());
broadcast(filteredMessage);
}

@OnError
public void onError(Throwable t) throws Throwable {
//log.error("Chat Error: " + t.toString(), t);
}

private static void broadcast(String msg) {
for (ChatAnnotation client : connections) {
try {
synchronized (client) {
String message = "{clId:'" + client.nickname + "',msg:'" + msg + "'}";
client.session.getBasicRemote().sendText(filter(message));
}
} catch (IOException e) {
connections.remove(client);
try {
client.session.close();
} catch (IOException e1) {
// Ignore
}
String message = String.format("* %s %s", client.nickname, "has been disconnected.");
broadcast(message);
}
}
}

private static String filter(String message) {

if (message == null)
return (null);

char content[] = new char[message.length()];
message.getChars(0, message.length(), content, 0);
StringBuilder result = new StringBuilder(content.length + 50);
for (int i = 0; i < content.length; i++) {
switch (content[i]) {
case '<':
result.append("&lt;");
break;
case '>':
result.append("&gt;");
break;
case '&':
result.append("&amp;");
break;
case '"':
result.append("&quot;");
break;
default:
result.append(content[i]);
}
}
return (result.toString());

}
}

3. jsp page

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<style type="text/css">
.scrollup {
position: fixed;
bottom: 0px;
right: 0px;
z-index: 99999;
text-align: right;
padding-right: 10px;
}
.chat{
list-style: none;
margin: 0;
padding: 0;
}

.chat li{
margin-bottom: 10px;
padding-bottom: 5px;
border-bottom: 1px dotted #B3A9A9;
}

.chat li.left .chat-body{margin-left: 60px;}
.chat li.right .chat-body{margin-right: 60px;}


.chat li .chat-body p
{
margin: 0;
color: #777777;
}

.panel .slidedown .glyphicon, .chat .glyphicon
{
margin-right: 5px;
}

.panel-body
{
overflow-y: scroll;
height: 250px;
}

::-webkit-scrollbar-track
{
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,0.3);
background-color: #F5F5F5;
}

::-webkit-scrollbar
{
width: 12px;
background-color: #F5F5F5;
}

::-webkit-scrollbar-thumb
{
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
background-color: #555;
}
</style>
<script type="text/javascript">
var chat = {};
chat.socket = null;
chat.connect = (function(host) {
if ('WebSocket' in window) {
chat.socket = new WebSocket(host);
} else if ('MozWebSocket' in window) {
chat.socket = new MozWebSocket(host);
} else {
chatContent.append('Error: WebSocket is not supported by this browser.', 'left');
return;
}

chat.socket.onopen = function () {
chatContent.append('Info: WebSocket connection opened.', 'left');
document.getElementById('chat').onkeydown = function(event) {
if (event.keyCode == 13) {
chat.sendMessage();
}
};
};

chat.socket.onclose = function () {
document.getElementById('chat').onkeydown = null;
chatContent.append('Info: WebSocket closed.', 'left');
};

chat.socket.onmessage = function (message) {
chatContent.append(message.data, 'right');
};
});
chat.initialize = function() {
if (window.location.protocol == 'http:') {
//console.log(window.location.host);
chat.connect('ws://' + window.location.host + '/websocket/chat/${login_empnm}');
} else {
chat.connect('wss://' + window.location.host + '/websocket/chat/${login_empnm}');
}
};

chat.sendMessage = (function() {
var message = document.getElementById('chat').value;
if (message != '') {
chat.socket.send(message);
document.getElementById('chat').value = '';
}
});
var chatContent = {};
chatContent.append = (function(message,addClassNm){
var chatContainer = document.getElementById('chat_li');
var li = document.createElement('li');
var span = document.createElement('span');
span.style.wordWrap = 'break-word';


console.log("msg : "+message);
span.innerHTML = message;


span.className = "pull-"+addClassNm
li.appendChild(span);
li.className = "clearfix ";
li.className = li.className +" "+addClassNm;
chatContainer.appendChild(li);

document.getElementById('chat_body').scrollTop = document.getElementById('chat_body').scrollHeight;

while (chatContainer.childNodes.length > 25) {
chatContainer.removeChild(chatContainer.firstChild);
}
});

chat.initialize();

function chkMyMsg(msgJson){

}
</script>
<div>
<p>

</p>
<div id="console-container">
<div id="console"></div>
</div>
</div>


<div class="scrollup span4">
<div class="row-fluid">
<div class="box dark">
<header>
<h5>Chat</h5>
<div class="toolTip">
<a class="btn btn-primary btn-small" data-toggle="collapse" data-parent="#accordion"
href="#collapseOne" style="margin-top: 5px; margin-right: 2px;">
Open
</a>
</div>
</header>
<div class="body collapse" id="collapseOne">
<div class="panel-body" id="chat_body">
<ul id="chat_li" class="chat"></ul>
</div>
<div>
<div class="input-group">
<input type="text" placeholder="type and press enter to chat" id="chat" >
<span class="input-group-btn">
<button class="btn btn-warning btn-sm" id="btn-chat">
Send</button>
</span>
</div>
</div>
</div>
</div>
</div>
</div>

 

 


'프로그래밍 > JAVA' 카테고리의 다른 글

Java에서 Tuple 사용하기.  (0) 2018.04.11
try-catch-resources  (0) 2018.04.11
public static void main(String[] args){}  (0) 2018.04.03
javax.net.ssl.SSLHandshakeException에 대한 해결방법  (0) 2017.02.14
websocket 사용 간단 채팅  (0) 2016.08.23
URL Image DownLoad  (0) 2016.08.14

1. ImageIO 를 활용해서 이미지 다운로드

 

String imgUrl = "http://img.naver.net/static/www/u/2013/0731/nmms_224940510.gif"; //Image URL

String savePath = "/Users/kimhyeonggeun/dev_folder/image/"; //저장 경로


try {

URL url = new URL(imgUrl);

String fileName = imgUrl.substring(imgUrl.lastIndexOf('/') + 1, imgUrl.length()); // 이미지 파일명 추출

String ext = imgUrl.substring(imgUrl.lastIndexOf('.') + 1, imgUrl.length()); // 이미지 확장자 추출

BufferedImage img = ImageIO.read(url);


System.out.println("fileName : " + fileName);

System.out.println("ext : " + ext);

ImageIO.write(img, ext, new File(savePath + fileName));


} catch (Exception e) {

System.out.println(e.getMessage() + "/" + e);

}


'프로그래밍 > JAVA' 카테고리의 다른 글

Java에서 Tuple 사용하기.  (0) 2018.04.11
try-catch-resources  (0) 2018.04.11
public static void main(String[] args){}  (0) 2018.04.03
javax.net.ssl.SSLHandshakeException에 대한 해결방법  (0) 2017.02.14
websocket 사용 간단 채팅  (0) 2016.08.23
URL Image DownLoad  (0) 2016.08.14

+ Recent posts