public static void showProcedureNameList() {
		Connection connection = null;
		ResultSet resultSet = null;
		try {
			Class.forName(className);
			connection = DriverManager.getConnection(url, user, password);
			resultSet = connection.getMetaData().getProcedures(null, connection.getMetaData().getUserName(), null);
			ResultSetMetaData resultSetMetaData = resultSet.getMetaData();
			while (resultSet.next()) {
				if (resultSet.getInt(8) == 1) { ⁄⁄ StoredProcedure
					System.out.println("Procedure Name : " + resultSet.getString(3));
				} 
				for (int i = 1; i < resultSetMetaData.getColumnCount(); i++) {
					System.out.println("\t" + i + ". ColumnName : " + resultSetMetaData.getColumnName(i));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (resultSet != null) {
					resultSet.close();
				}
				
				if (connection != null) {
					connection.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}


ResultSetMetaData 정보를 통하여 8번째 인덱스값이 프로시저 타입을 가져오는 인덱스인걸 알수가 잇습니다. 

프로시저같은경우에는 타입이 1번이 되겠고 함수는 2번이 되겠습니다.

블로그 이미지

행복그리고..

,
     public static void run() {
		Connection conn = null;
		ResultSet rs = null;
		try {
			String theClassName = "", 
					  theURL = "", 
					  theUser = "", 
					  thePassword = "", 
					  theFunctionName = "";
			
			Class.forName(theClassName);
			conn = DriverManager.getConnection(theURL, theUser, thePassword);
			DatabaseMetaData dbmd = conn.getMetaData();
			rs = dbmd.getProcedureColumns(null, null, theFunctionName, null);
			ResultSetMetaData rsmd = rs.getMetaData();
			
			int columnIndex = 1;
			boolean setNoCount = true;
			String productName = dbmd.getDatabaseProductName();
			while (rs.next()) {
				if (productName.indexOf("Microsoft") != -1) {
					if (getParameterType(rs.getInt(5)).equalsIgnoreCase("Return") && setNoCount == true) {
						setNoCount = false;
						continue;
					}
				}
				System.out.println("----------------------------------------");
				System.out.println("Parameter " + columnIndex++);
				System.out.println("Parameter Type : " + getParameterType(rs.getInt(5)));
				System.out.println("Name : " + rs.getString(4));
				System.out.println("Data Type : " + rs.getString(7));
				for (int i = 1; i < rsmd.getColumnCount(); i ++) {
					System.out.println("\t" + i + " - ColumnLabel : " + rsmd.getColumnLabel(i) + " : " + rs.getString(i));
					System.out.println("\t\tColumnClassName : " + rsmd.getColumnClassName(i));
					System.out.println("\t\tColumnName : " + rsmd.getColumnName(i));
					System.out.println("\t\tColumnType : " + rsmd.getColumnType(i));
					System.out.println("\t\tColumnTypeName : " + rsmd.getColumnTypeName(i));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}

				if (conn != null) {
					conn.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	private static String getParameterType(final int metadataType) {
		switch (metadataType) {
		case DatabaseMetaData.procedureColumnUnknown :
            return "Unknown";
        case DatabaseMetaData.procedureColumnIn :
        	return "In";
        case DatabaseMetaData.procedureColumnInOut :
        	return "InOut";
        case DatabaseMetaData.procedureColumnOut :
        	return "Out";
        case DatabaseMetaData.procedureColumnReturn :
            return "Return";
        case DatabaseMetaData.procedureColumnResult :
            return "Result";
        default:
        	return "Unknown";
		}
	}

Oracle, SQLServer를 기준으로 작성하였습니다. SQLServer같은 경우에는 첫번째 파라미터로 setNoCount가 오므로 두번째 파라미터부터 해당 프로시저의 첫번째 파라미터의 정보를 가져올수가 있습니다.

블로그 이미지

행복그리고..

,

예를들어 스윙 어플리케이션에서 Progress를 뛰어주고 싶을경우에 사용하면 되겠습니다. 


Progress를 JDialog에서 생성하여 뛰워줘도 됩니다. 하지만 Progress 라는 것은 어떠한 작업을 할 경우


1. DataBase

2. File Load


... 등등이 되겠지요 가져오는 값들이 대용량일 경우에는 시간이 걸리기 때문에 이러한 상황에 대부분 Progress를 사용합니다. 

이러한 경우 타이틀바가 필요가 없게되고 작업이 다 끝났을 경우 Progress 는 사라지기 때문에 JDialog보다는 JWindow를 사용하여 구현하는게 좋겟지요 UI상에서도 보기 좋습니다.


Source Code

 

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.io.File;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JWindow;
import javax.swing.SwingUtilities;


class SwingApp extends JFrame implements ComponentListener {

	private static final long serialVersionUID = -1706061272770838668L;
	private static final int APP_WIDTH = 600;
	private static final int APP_HEIGHT = 400;
	
	private ProgressWindow theProgressWindow;
	
	public SwingApp(String title) {
		super(title);
		setSize(APP_WIDTH, APP_HEIGHT);
		
		Dimension theScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
		Dimension theFrameSize = getSize();
		int x = (int) (theScreenSize.getWidth() - theFrameSize.getWidth()) / 2;
		int y = (int) (theScreenSize.getHeight() - theFrameSize.getHeight()) / 2;
		
		this.setLocation(x, y);
		this.setResizable(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.addComponentListener(this);
	}
	
	public void appearView() {
		this.setVisible(true);
		theProgressWindow = new ProgressWindow(this);
		Thread destoryThread = new Thread(new Runnable() {
			public void run() {
				try {
					Thread.sleep(5000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				theProgressWindow.dispose();
			}
		});
		destoryThread.start();
	}
	
	public void componentResized(ComponentEvent e) { }
	public void componentMoved(ComponentEvent e) {
		this.theProgressWindow.setLocationRelativeTo(e.getComponent());
	}
	public void componentShown(ComponentEvent e) { }
	public void componentHidden(ComponentEvent e) { }
}
 
class ProgressWindow extends JWindow {
	
	private static final long serialVersionUID = -6524167698066722942L;
	private static final String userDir = System.getProperty("user.dir");
	
	private static final int PROGRESS_WIDTH = 50;
	private static final int PROGRESS_HEIGHT = 50;
	
	private JLabel imageLabel = new JLabel();
	
	public ProgressWindow(JFrame theFrame) {
		super(theFrame);
		
		setSize(200, 150);
		this.setLayout(null);
		this.getRootPane().getContentPane().setBackground(Color.YELLOW);
		String filePath = userDir + File.separator + "ajax-loader.gif";
		ImageIcon imageIcon = new ImageIcon(filePath);
		
		Dimension theWindowSize = getSize();
		Dimension theLabelSize = new Dimension(PROGRESS_WIDTH, PROGRESS_HEIGHT);
		int x = (int) (theWindowSize.getWidth() - theLabelSize.getWidth()) / 2;
		int y = (int) (theWindowSize.getHeight() - theLabelSize.getHeight()) / 2;
		
		imageLabel.setIcon(imageIcon);
		imageLabel.setBounds(x, y, PROGRESS_WIDTH, PROGRESS_HEIGHT);
		this.add(imageLabel);
		setLocationRelativeTo(theFrame);
		this.setVisible(true);
	}
}

public class SwingTest {
	public static void run() {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				SwingApp theApp = new SwingApp("Swing App");
				theApp.appearView();
			}
		});
	}
	
	public static void main(String[] args) {
		run();
	}
}

ajax-loader.gif File Download

URL :  http://www.ajaxload.info/ 

블로그 이미지

행복그리고..

,

http://msdn.microsoft.com/ko-kr/library/ms378422.aspx

블로그 이미지

행복그리고..

,

패키지명(Package name)

 domain (영역, 범위, 소유지) 

 단위로 표현할 수 있고 원자성을 띄는 자바빈 클래스, Enum 클래스 등이 위치한다. 다른 곳에서 VO라고 하는 것을 본적이 있는데 필자는 domain이란 이름이 더 마음에 든다

 dao (Data Access Object)

 데이터액세스 계층과 관련된 클래스와 인터페이스들이 자리한다. DB과 관련된 작업을 한다면 사용할 수 있는 패키지명이다.

 service (근무, 봉사, 편익, 이용…) 

 역시 웹에서 사용되는 계층 중 하나이며 대개 dao를 조합하고 트랜잭션의 경계가 설정되는 구간이기도 하다.

 core (속, 중심부, 핵심

 어플리케이션의 핵심적인 역할을 수행하는 클래스와 인터페이스들이 자리하는 구간이다.

 task (일, 과업, 과제…

 단어와는 가장 딴판으로 사용되는 용어 중 하나이다. 자바에서 스레드와 관련된, java.lang.Runnable 클래스의 활동을 지원하는 클래스들이 위치한다.

 access (접근, 진입로, 증가…) 

 DB 뿐만이 아니라 다른 리소스의 자원을 불러들이고 이를 자바에서 사용가능한 상태로 가공해주는 클래스들이 위치한다.

 support (지지, 지원…) 

 가장 잘 이해하고 사용해야 할 패키지명이며 어느 어플리케이션이든 기본적으로 하나씩은 포함되곤 한다. 스프링 프레임워크에서는 대개 구현체를 지원하는 팩토리빈 클래스라던가 객체를 다른 클래스에서 요구하는 형태로 가공해주는 역할의 클래스들이나 부모 패키지의 인터페이스들이 구현된 클래스들이 위치해 있었다.

 config (구성, 설정)

 다른 언어 또는 외부 자원을 자바의 형태로 파싱해주고 그 설정을 Builder와 같은 설정 구현체에 저장해주는 역할을 담당한다.

 validation (확인)

 부모 패키지의 객체들을 검증하는 검사자 클래스들이 위치한다.

 util (유용한, 쓸모 있는...)

 부모 패키지의 객채들에 대해 기본적인 CRUD(Create · Remove · Update · Delete)작업을 해주거나 컬렉션 프레임워크과 비슷한, 혹은 좀 더 복잡한 작업을 도와주는 도구 클래스들이 위치한다.



메소드명(Method Name)


1. 접두어로의 사용

 get… 

 어떠한 리소스를 리턴하는 메서드

 set… 

 프로퍼티에 해당 리소스를 내장시키는 역할의 메서드 

 init… 

 초기값이 필요하다면 초기값을 설정하고 내부에서 관련 validate를 실행하는 역할의 메서드

 load… 

 전달인자를 기준으로 어떠한 값을 불러와 내장시켜주거나 카운팅하는 역할의 메서드

 is… 

 불리언 메서드에서 사용되는 접두어이다. 용도는 get과 같다.

 has… 

 contains 메서드처럼 어떠한 값을 가지고 있는지 확인해준다. 다른 점이 있다면 contains는 좀 더 범위가 넓지만 has는 특정 값으로 범위가 한정되있다.

 register… 

 기본적으로 set과 동작하는 방식이 같지만 set은 자바빈 규약에 얽혀있기 때문에 복잡한 연산을 포함할 수 없다. 보다 지능적인 set이 요구될 때 register과 같은 접두어를 사용한다.

 create… 

 register…는 보통 void 형태이지만 create는 전달인자를 통해 새로운 객체를 만든 뒤에 이 객체를 리턴해준다. 등록과 생성은 엄밀히 다르므로 create를 register처럼 써서는 안될 것이다.


 to… 

 많이 만들어두면 참 좋은 접두어 메서드이다. 해당 객체를 다른 형태의 객체로 변환해준다.


2. 전치사로의 사용

 A-By-B

 B를 기준으로 A를 하겠다는 뜻

ex) getUserByName(String name) : 이름값을 통해 유저를 불러옴

 A-With-B

 B와 함께 A를 하겠다는 뜻

ex) registerWithGeneratedName(BeanDefinition beanDefinition) : beanDefinition으로 다른 메서드를 통해 GeneratedName 값을 불러와 함께 저장.


3. 접미사로의 사용

 With 

 무엇과 함께 있는지, indexOf와 비슷한 성격의 접미사이다.

 …s 

 해당 객체가 복수의 객체를 반환하는지 단일 객체를 반환하는지 구분하는 것은 매우 중요하다. 복수형으로 표현해야 하는 메서드는 반드시 복수형으로 표현하여야 한다.


자바 명명규칙(Java Naming Rule)

http://www.oracle.com/technetwork/java/codeconventions-135099.html



블로그 이미지

행복그리고..

,

Tomcat에서 WebServer를 구동후 MySQL에 접속하는 jsp를 호출하였는데 아래와 같이 Exception이 발생하였다.


com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago.


이와 같이 Exception이 발생한 경우에는 해당 catalina.policy 파일의 수정이 필요하다.

catalina.policy 파일 위치는 해당 Tomcat/conf/catalina.policy 되겠다.


catalina.policy

// ========== WEB APPLICATION PERMISSIONS =====================================



// These permissions are granted by default to all web applications

// In addition, a web application will be given a read FilePermission

// and JndiPermission for all files and directories in its document root.

grant { 

· 

·

·

    permission java.net.SocketPermission "해당아이피:포트", "connect";


    // Precompiled JSPs need access to these system properties.

    permission java.util.PropertyPermission

     "org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER", "read";

    permission java.util.PropertyPermission "org.apache.el.parser.COERCE_TO_ZERO", "read";

};



블로그 이미지

행복그리고..

,

기본적으로 AWT/Swing Component에서 제공되는 기본 Component(JFileChooser,  JColorChooser)들의 

Text는 Default Locale로 표현된다. 영어로 Component를 사용하려면 아래와 같이 Default Locale을 변경하면 되겠다.

import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Locale;

import javax.swing.JButton;
import javax.swing.JColorChooser;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

class MySwing extends JFrame implements ActionListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = -5148305495409346518L;

	private static final int APP_FRAME_WIDTH = 500;
	private static final int APP_FRAME_HEIGHT = 300;
	
	private static Dimension theScreenSize = createScreenSize();
	
	
	public MySwing(String title) {
		super(title);
		
		setSize(APP_FRAME_WIDTH, APP_FRAME_HEIGHT);
		
		Dimension theFrameSize = getSize();
		int x = (int) (theScreenSize.getWidth() - theFrameSize.getWidth()) / 2;
		int y = (int) (theScreenSize.getHeight() - theFrameSize.getHeight()) / 2;
		setLocation(x, y);
		
		JPanel panel = new JPanel();
		JButton fileChooserButton = new JButton("JFileChooser");
		fileChooserButton.addActionListener(this);
		JButton colorChooserButton = new JButton("JColorChooser");
		colorChooserButton.addActionListener(this);
		panel.setLayout(new FlowLayout(FlowLayout.CENTER));
		panel.add(fileChooserButton);
		panel.add(colorChooserButton);
		add(panel);
		setVisible(true);
	}
	
	private static Dimension createScreenSize() {
		return Toolkit.getDefaultToolkit().getScreenSize();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String actionCommand = e.getActionCommand();
		if (actionCommand.equals("JFileChooser")) {
			JFileChooser fileChooser = new JFileChooser();
			fileChooser.showOpenDialog(this);
		} else if (actionCommand.equals("JColorChooser")) {
			JColorChooser.showDialog(this, "MySwing ColorChooser", Color.WHITE);
		}
	}
}

public class SwingTest {
	public static void main(String[] args) {
		try {
		    for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
		        if ("Nimbus".equals(info.getName())) {
		            UIManager.setLookAndFeel(info.getClassName());
		            break;
		        }
		    }
		} catch (Exception e) {
		   e.printStackTrace();
		}
		JComponent.setDefaultLocale(Locale.ENGLISH);
		// Locale.setDefault(Locale.ENGLISH);
		new MySwing("MySwing App");
	}
}

블로그 이미지

행복그리고..

,
public static String[] getEnvironmentVariables() {
	String variables = System.getenv("Path");
	String[] arrVariable = variables.split(";");
	return arrVariable;
}


블로그 이미지

행복그리고..

,

Jeus 6.0 을 Quick Start로 서버로 구동을 해 WebAdmin 페이지를 로그인을 하려고 하였는데 

계속 로그인에 실패하였다. Jeus 설치시에 입력하였던 패스워드를 똑같이 입력하였는데도 말이다.


원인은 Quick Start시 USERNAME과 PASSWORD는 bin파일에 있는 jeus-quickstart.properties.cmd 파일에 매핑되어있는 속성으로 로그인을 해야한다.


jeus-quickstart.properties.cmd

rem Set up administrator name

SET USERNAME=jeus


rem Set up administrator password

SET PASSWORD=jeus


TITLE TmaxSoft JEUS 6 QuickStart


파일을 메모장으로 여러보면 서버 구동을위한 환경정보가 세팅되어있는데 USERNAME과 PASSWORD만 보면 기본적으로 jeus로 세팅되어있다.



블로그 이미지

행복그리고..

,

Label에 대한 Font를 나눔고딕(NanumGothic)으로 설정.

UIManager.put("Label.font", new Font("NanumGothic", Font.PLAIN, 12));


다른 Component의 Font를 설정하고 싶을때에는 해당 Key 값을 변경하면 되겠다.

Swing Component의 Font Key 값은 아래와 같다.


Swing Platform FontUIResources.

Key : OptionPane.buttonFont

Key : List.font

Key : TableHeader.font

Key : Panel.font

Key : TextArea.font

Key : ToggleButton.font

Key : ComboBox.font

Key : ScrollPane.font

Key : Spinner.font

Key : RadioButtonMenuItem.font

Key : Slider.font

Key : EditorPane.font

Key : OptionPane.font

Key : ToolBar.font

Key : Tree.font

Key : CheckBoxMenuItem.font

Key : FileChooser.listFont

Key : Table.font

Key : MenuBar.font

Key : PopupMenu.font

Key : Label.font

Key : MenuItem.font

Key : MenuItem.acceleratorFont

Key : TextField.font

Key : TextPane.font

Key : CheckBox.font

Key : ProgressBar.font

Key : FormattedTextField.font

Key : CheckBoxMenuItem.acceleratorFont

Key : Menu.acceleratorFont

Key : ColorChooser.font

Key : Menu.font

Key : PasswordField.font

Key : InternalFrame.titleFont

Key : OptionPane.messageFont

Key : RadioButtonMenuItem.acceleratorFont

Key : Viewport.font

Key : TabbedPane.font

Key : RadioButton.font

Key : ToolTip.font

Key : Button.font



해당 Swing Component 전체 Font를 나눔고딕(NanumGothic)으로 설정.

setUIFont(new javax.swing.plaf.FontUIResource("NanumGothic", java.awt.Font.PLAIN, 12));
	
public static void setUIFont(javax.swing.plaf.FontUIResource f) {
	java.util.Enumeration keys = UIManager.getDefaults().keys();
    while (keys.hasMoreElements()) {
        Object key = keys.nextElement();
        Object value = UIManager.get(key);
        if (value instanceof javax.swing.plaf.FontUIResource) {
        	 UIManager.put(key, f);
        }
    }
}



Swing Application을 실행하기 전에 적용하고 실행하면 되겠다.


Writing...



블로그 이미지

행복그리고..

,