posted by 구름너머 2006. 3. 31. 11:21

개발자라면 하나는 사용해야겠죠?

아주 편리하네요...

추천합니다.

텍스트비교와병합툴인CompareIt!3.55+98%한글화 | 유용한 유틸 소개 2005.02.06 01:03
bhleejw http://cafe.naver.com/totalcommander/1348 이 게시물의 주소를 복사합니다
Compare_It!.rar

이전 게시물에서 언급한 텍스트 비교와 병합툴인 Compare It! 3.55을 한글화 해서 올립니다.

(이전 게시물 참고 ; http://cafe.naver.com/totalcommander/1287)

원본과 달리 설치후 압축을 하였으니 적당한 폴더에 압축을 풀어 사용하십시오.

거의 한글화는 했지만 어색한 부분이 있으니 필요시 korean.dic를 수정하여 사용하십시오.^^

프로그램 홈페이지의 한글화 파일이 부족한 부분이 많아 추가로 한글화하였는데 2% 부족한듯...

한글화 파일(korean.dic)은 최신 버전(3.75)/이후버전에서도 사용하실수 있습니다.

토탈 커맨더와 연결해서 사용하시려면, 버튼바에 프로그램을 등록후 다음처럼 수정하면, 소스창과 타겟창에서 선택한 파일을 버튼 클릭으로 바로 Compare It! 창에 열수 있습니다.

자료출처 ; http://www.grigsoft.com/


posted by 구름너머 2006. 3. 29. 11:24
제목 : 접속된 사용자 정보 지우기에 대해서..
글쓴이: 곽태일(cocktail) 2001/02/09 11:02:06 조회수:71 줄수:12
안녕하세요.

JSP로 서비스를 하려고 합니다. 사용자가 접속을 하면 서버에 정보를 저장을 하게
되는데요. 만약 사용자가 비정상적인 종료를 한다면, 예를들어 종료 버튼을 누르지
않고 브라우저를 닫는다거나 컴퓨터가 다운이 된다면 어떻게 그 사용자의 정보를
지워야 할지를 모르겠네요.
만약 session을 쓴다면 setMaxInactiveInterval()를 써서 그 사용자의 세션이 만료
되는 시점을 catch할 수 있는 방법이 있는지...

조그만 충고라도 저에게는 도움이 될 것 같네요.
어떤 방법을 써야 할지를 감만 잡히면 좋겠는데.
제목 : Re: 접속된 사용자 정보 지우기에 대해서..
글쓴이: 최유복(jnylove) 2001/02/10 14:34:31 조회수:1356 줄수:80
도움이 될지 모르겠습니다.
저는 다음과 같은 방법으로 브라우저를 죽이거나 컴퓨터가 다운되는등의
비정상적인 종료에 대해서 사용자의 세션을 관리했던 적이 있습니다.

우선 처음에 로그인을 하면서 세션을 만들 때, 세션에 리스너라고 하는걸 하나
넣어둡니다.
그 리스너가 하는 일은 리스너가 세션에 바인딩되거나 언바인딩 될경우 특정 메소드를
호출하도록 하였습니다.
그리고 비정상 종료에 대한 문제는 프레임을 이용해서 안보이도록 프레임을 나눠서
안보이는 곳에 jsp 파일을 뒀습니다.
이 페이지가 언로드 되면 세션의 값을 지우도록 했습니다.

Blank.jsp와 LoginCount.java, LoginListener.java에 대한 내용은 다음과 같습니다.
Blank.jsp : 로그인 하면서 리스너를 세션에 바인딩 시킴, 이 페이지가 언로드 될경우
해당 세션값 삭제
LoginCount.java : 접속자 증가/ 감소
LoginListener.java : 리스너

Blank.jsp ===============================================================
<%
session.setAttribute("login.listener", new LoginListener(getServletContext()));
%>
<script language="JavaScript">
<!--
function delSession() {
window.open('invalidate.jsp','Logout','scrollbars=no,width=400,height=200');
}
//-->
</script>
<body onUnLoad="delSession()">
<form name="logout">
<input type=hidden name="logflag" value="">
</form>
</body>

LoginCount.java =========================================================
public class LoginCount
{
public static Object lockObject = new Object();
public static int logCount = 0 ;

public static synchronized void increaseCount() {
synchronized (lockObject) {
logCount++;
}
}

public static synchronized void decreaseCount() {
synchronized (lockObject) {
logCount--;
}
}
}

LoginListener.java ======================================================
public class LoginListener implements HttpSessionBindingListener
{

ServletContext context;

public LoginListener(ServletContext context) {
this.context = context;
}

// listenter 가 session에 binding 될 때 호출
public void valueBound(HttpSessionBindingEvent event)
{
LoginCount.increaseCount();
}

// listenter 가 session에 unbinding 될 때 호출
public void valueUnbound(HttpSessionBindingEvent event)
{
LoginCount.decreaseCount();
}
}

미숙하나마 도움이 되었으면 좋겠습니다.
posted by 구름너머 2006. 3. 29. 11:14
Cookie, Session, application, pageContext, page, exception 객체 | JSP2006/02/01 12:29
http://blog.naver.com/kmis9797/120021696379

▩ cookie 객체의 사용
- Tomcat 서버가 Client에 저장하는 텍스트 파일로 된 정보
- 쿠키는 국제 표준에 따라 작성되어야 합니다.
- 보안성이 없음으로 계정과 패스워드를 동시에 쿠키에 저장하면, 쿠키의 내용을 전부 편집기로 열어 볼 수 있음으로
보안에 문제가 될 수 있습니다.
- 4Kb까지 저장할 수 있다.
- 쿠키의 저장 폴더는 2000서버의 경우 "C:\Documents and Settings\각 계정(Administrator)\Cookies"가 지정됨
- 사용예 : 하루동안 이벤트창 오픈하기, ID자동으로 저장기능 등
- setMaxAge() : 쿠키의 생존 기간, 초 단위, 12시간의 경우 12*60*60, 생존 기간이 지나면 쿠키가 Servlet Container에 의해
인식이 되지 않습니다.
- Cookie cname = new Cookie("cname", "Java"); --> Cookie cname = new Cookie(쿠키 변수명, 쿠키 값)

------------------------------------------------------------------------------
>>>>> jcookieWrite.jsp, http://127.0.0.1:8081/jsp2030/jcookieWrite.jsp
------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR" %>

<%
//쿠키 변수 선언
Cookie cname= null;
Cookie ckuk = null;
Cookie ceng = null;
Cookie cmat = null;

cname = new Cookie("cname", "Java"); //cname이란 쿠키변수에 "Java"를 저장합니다.
cname.setMaxAge(20); //20초
response.addCookie(cname); //쿠키를 Client에 저장합니다.

ckuk = new Cookie("ckuk", "100");
ckuk.setMaxAge(20);
response.addCookie(ckuk);

ceng = new Cookie("ceng", "90");
ceng.setMaxAge(20);
response.addCookie(ceng);

cmat = new Cookie("cmat", "100");
cmat.setMaxAge(20);
response.addCookie(cmat);

%>

<html>
<head>
<title>쿠키 저장하기(Cookie객체의 사용)</title>
</head>
<body>
<p>성적을 쿠키로 저장 했습니다.</p>
<p><a href="jcookieRead.jsp">쿠키로 저장된 성적 읽어오기</p>
</body>
</html>


------------------------------------------------------------------------------
>>>>>>>>>> jcookieRead.jsp
------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR" %>

<html>
<head>
<title>쿠키 읽어 오기(Cookie객체의 사용)</title>
</head>
<body>
<%
//client안에 있는 모든 쿠키를 전부 읽어 옵니다.
Cookie[] cookies = request.getCookies();
Cookie cItem=null;

String name=null;
int kuk=0;
int eng=0;
int mat=0;

for (int i = 0; i < cookies.length; i++) {
//쿠키 변수를 각각 추출합니다.
cItem = cookies[i];

if (cItem.getName().equals("cname")) name = (String)(cItem.getValue());
if (cItem.getName().equals("ckuk")) kuk = Integer.parseInt(cItem.getValue());
if (cItem.getName().equals("ceng")) eng = Integer.parseInt(cItem.getValue());
if (cItem.getName().equals("cmat")) mat = Integer.parseInt(cItem.getValue());
}

out.println ("성명 : " + name + "<br><br>");
out.println ("국어 : " + kuk + "<br><br>");
out.println ("영어 : " + eng + "<br><br>");
out.println ("수학 : " + mat + "<br><br>");
out.println ("총점 : " + (kuk+eng+mat) + "<br><br>");
out.println ("평균 : " + (kuk+eng+mat)/3 + "<br><br>");
%>
</body>
</html>

http://127.0.0.1:8081/jsp2030/jcookieWrite.jsp

▩ session 객체의 사용
- javax.servlet.http.HttpSession Interface
- 서버의 메모리상에 저장되는 정보
- 보안성이 높으나 서버의 메모리를 사용함으로 비용이 많이 발생되어 사용을 최대한 줄여야 함
- 아이디, 패스워드, 쇼핑카트등 로그인 정보를 저장함
- 사용자가 웹사이트에 접속시 접속자별로 웹서버는 세션ID를 생성해 줌
- 서버상에서 세션의 유지시간은 초단위로 session.setMaxInactiveInterval(600); 로 지정합니다.
만약 사용자가 JSP페이지를 열어놓고 링크를 마우스 클릭등의 작업을 하지 않아도 session은 삭제됩니다.
- 서버상에 있는 세션 변수의 값을 삭제하려면 session.invalidate();을 이용합니다.
- Session ID는 서블릿컨테이너가 부여하는 것으로 접속자의 상태를 파악해서 일정 시간이 흐르면
session을 삭제할 것인지를 결정하게 됩니다. 개발자는 이 Session ID값을 읽어 올수만 있습니다.
- Session ID외에 개발자는 필요한 만큼 Session 변수를 만들어 사용할 수 있습니다.

- 페이지 흐름도 YES
ⓐ main.jsp -----> 로그인여부 판단 -----┬----> main.jsp -----> logout.jsp -----> ⓐ

│NO
└----> login.jsp -----> session.jsp -----> ⓐ


------------------------------------------------------------------------------
>>>>>>>>>> login.jsp
------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR" %>

<html>
<head>
<title>session객체 사용하기</title>
</head>
<body>
<center>

<form method="post" action="session.jsp">

<table border=1 cellspacing=1 cellpadding=0>
<tr>
<th>ID</th>
<td><input type="text" name="id" value='java'></td>
</tr><tr>
<th>Password</th>
<td><input type="password" name="passwd" value='1234'></td>
</tr><tr>
<td colspan="2" align="center"><input type="submit" value="Login"></td>
</tr>
</table>

</form>

* 인증을 위한 ID는 java, Password는 1234입니다.

</center>
</body>
</html>


------------------------------------------------------------------------------
>>>>>>>>>> session.jsp
------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR" %>

<html>
<head>
<title>session처리 페이지</title>
</head>
<body>

<%
String inid = request.getParameter("id");
String inpasswd = request.getParameter("passwd");

//System.out.println("id : " + inid+ " passwd:" + inpasswd);

String id = "java";
String passwd = "1234";

//== : 참조값 비교
if (!id.equals(inid)){
%>
<script Language="JavaScript">
alert("등록된 아이디가 아닙니다.");
history.back();
</Script>

<%}

if (!passwd.equals(inpasswd)){
%>
<script Language="JavaScript">
alert("비밀번호가 잘못되었습니다.");
history.back();
</Script>

<%}

if (id.equals(inid) && passwd.equals(inpasswd)) {
//session 변수 생성
session.setAttribute("user", id);
response.sendRedirect("main.jsp");
}
%>
</body>
</html>


------------------------------------------------------------------------------
>>>>>>>>>> main.jsp
------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR" import="java.util.*"%>
<% session.setMaxInactiveInterval(600); %>
<html>
<head>
<title>회원 전용 메인 페이지</title>
</head>
<body>
<font size=5>
<%
try {
if (session.getAttribute("user")!=null){
%>
<p>로그인 된 아이디 : <%=session.getAttribute("user")%><p>
<p>현재 session ID : <%= session.getId() %></p>

<%
Date dd = new Date(session.getCreationTime());

Calendar rightNow = Calendar.getInstance();

rightNow.setTime(dd);

int year = rightNow.get(Calendar.YEAR);
int month = rightNow.get(Calendar.MONTH)+1;
int day = rightNow.get(Calendar.DATE);

int hour = rightNow.get(Calendar.HOUR);
int min = rightNow.get(Calendar.MINUTE);
int sec = rightNow.get(Calendar.SECOND);

String sd = year + "년 " + month + "월 " + day + "일 ";
sd += hour + "시 " + min + "분 " + sec + "초 ";

%>
<p>session이 만들어진 시각 : <%=sd%></p>
<p>설정된 session Timeout 시간 : <%= session.getMaxInactiveInterval() %></p>
<p><a href="logout.jsp">로그 아웃하기</a></p>
<%}else{%>
<p>회원만 이 페이지에 접속할 수 있습니다.</p>
<Script Language='JavaScript'>
alert("로그인을 해주세요......");
location.href='login.jsp';
</Script>
<%}
} catch(NullPointerException e) {
System.out.println("에러가 발생했습니다. 원인: "+e.toString());
}
%>
</font>
</body>
</html>


------------------------------------------------------------------------------
>>>>> logout.jsp
------------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=EUC-KR" %>

<html>
<head>
<title>로그 아웃</title>
</head>
<body>
<%
session.invalidate();
//response.sendRedirect("main.jsp");
%>
<p>로그아웃 되었습니다. 이용하여 주셔서 감사합니다.</p>
<a href='main.jsp'>메인화면으로 가기</a>
</body>
</html>


http://127.0.0.1:8081/jsp2030/main.jsp

▩ application 객체
- javax.servlet.ServletContext Interface

1. 서블릿 또는 어플리케이션의 외부 환경 정보(Context) 제공
------------------------------------------------------------------------------
>>>>> application.jsp
------------------------------------------------------------------------------
<%@ page contentType="text/html;charset=EUC-KR"%>
<%
String serverInfo = application.getServerInfo();
String mimeType = application.getMimeType("test.html");
String realPath = application.getRealPath("/");
application.log("application 내부 객체 로그 테스트");
%>
<h1>application.jsp</h1>
서블릿 컨테이너의 이름과 버전 : <%=serverInfo%><p>
test.html의 MIME Type : <%=mimeType%><p>
로컬 파일 시스템 경로 : <%=realPath%>

▩ exception 객체
- java.lang.Throwable

1. 에러 처리 페이지에 에러를 전달하는 역활을 함

------------------------------------------------------------------------------
>>>>> errorStart.jsp
------------------------------------------------------------------------------
<%@ page contentType="text/html;charset=EUC-KR" errorPage="error.jsp"%>
<%
int one = 1;
int zero = 0;
%>
<h1>errorStart.jsp</h1>
one / zero = <%=one/zero%><p>

------------------------------------------------------------------------------
>>>>> error.jsp
------------------------------------------------------------------------------
<%@ page contentType="text/html;charset=EUC-KR" isErrorPage="true"%>
<%
String message = exception.getMessage();
String objectMessage = exception.toString();
%>
<h1>error.jsp</h1>
에러 메세지 : <b><%=message%></b><p>
에러 실체의 클래스명과 에러 메세지 : <b><%=objectMessage%></b><p>

http://127.0.0.1:8081/jsp2030/errorStart.jsp

posted by 구름너머 2006. 3. 29. 10:36
내장객체(request,response,pageContext,session,application,out....) | java2006/02/20 14:48
http://blog.naver.com/smilejwb/90001882178
내장객체
===================

-----------------
request 내장객체
-----------------
1. 클라이언트에서 서버로 보내는 요청을 담고있는 객체
2. 요청범위를 가지며 javax.servlet.ServletRequest 클래스의 한인스터스이다.
3. 컨테이너는 이객체를 _jspService()메소드의 한인자로서 JSP에게 넘겨준다.

--------------------
response 내장객체
--------------------
1.서버에서 클라이언트로의 응답을 담고 있다.
2. 페이지 범위를 가지며javax.servlet.ServletResponse 클래스의 한 인스턴스이다.
3. 이것은 JSP에 의해 생성된 , 클라이언트에 보내질 응답을 캡슐화 한것이다.
4. 이객체는 컨테이너에 의해 생성되어 _jspService()메소드의 한 인자로서 JSP에게
전달되며JSP는 그메소드안에서 적절하게 response 객체를 수정한다.
5. JSP에서는 클라이언트로의 출력 스트림에 버퍼링이 적용되므로 일단 어떠한 출력이
있은후에 HTTP상태코드나 응답헤더를 설정해도 오류가 생기지 않는다.

----------------------
pageContext 내장객체
----------------------
1. 페이지 범위를 가지며, javax.servlet.jsp.PageContext 클래스의 한인스턴스이다.
2. 해당 JSP Page의 페이지문맥을 캡슐화 한것
3. 다른 명시적 객체에 접근하는 여러가지 편리한 함수제공
4. pageContext객체는 현재 페이지의 제어권을 다른 페이지로 넘기는 방법을 제공한다. 5. 잠시 줄수도 있고 영구히 줄수도 있다. <jsp:include> <jsp:forward>등이 해당
JSP 컨테이너에 의해 실행되기전 자동으로 서블릿의 javax.servlet.jsp.PageContext
객체로 변환되어 해석된다.
6. Abstract java.lang.Object.getAttribute(java.lang.String name)
- “name”이라는 객체를 반환, 없을경우null반환
Abstract vod removeAttribute(java.lang.String name)
- “name” 이라는 이름의 객체를 삭제
Abstract vod setAttribute(java.lang.String name, java.lang.Object attribute)
- attribute에 해당하는 “name” 이라는 이름의 객체생성

--------------------
session 내장객체
--------------------
1. 세션범위를 가지며 , javax.servlet.http.HttpSession 객체의 한 인스턴스이다.
이것은 요청을 보낸 클라이언트에 대해 생성된 대표하며 HTTP 요청에 대해서만
유효하다.
2. 세션은 자동적으로 생성되므로 이 객체는 세션을 사용하지 않는 경우에도 유효하다.
유일한 예외는 page지시자의 session특성을 이용해서 session을 끈 경우인데,
그런경우 이객체를 참조하려고 하면 컴파일 시점에 오류가 생긴다.
3. JSP의 세션객체는 JSP컨테이너에 의해 서블릿의 javax.servlet.http.HttpSession
객체로 변환된다. 결국 JSP의 session객체와 HttpSession는 같은 것이다.
4. 메소드
getId() : session ID를 돌려줌
getCreateTime() : session이 생성된 시간을 돌려줌
getLastAccessedTime() : session이 마지막으로 액세스된 시간을 돌려준다.
getMaxInactiveInterval() : session이 유지되는 시간을 얻음(초단위)
setMaxInactiveInterval(time) : session이 유지되는 시간을 설정(초단위)
isNew() : 웹브라우저가 session을 생성한적인 있는지 확인 있다면 true를 넘겨줌
isNew() : 웹브라우저가 session을 생성한적인 있는지 확인 있다면 true를 넘겨줌
invalidate() : session 객체를 소멸시킨다. Session에 저장되어 있던 정보는 모두
삭제된다.

-------------------
application 내장객체
-------------------
1. application 범위를 가지며, javax.servlet.ServletContext 클래스의 한 인스턴스이다.
2. JSP가 실행되고 있는 문맥(서블릿문맥)을 대표한다.
3. JSP 컨테이너에 의해 자동으로서블릿의 ServletContext 객체로 변환된다.
4. session객체의 경우 각 사용자마다 하나의 세션을 공유하나, application 객체의
경우 각 서버내에 있는 모든 JSP File들은 하나의 application 객체를 공유한다.
5. application 객체의 getServerInfo() 메소드를 이용하여 컨테이너의 버전과 이름을
알수있다.


--------------------
out 내장객체
--------------------
1.페이지 범위를 가지며, javax.servlet.jsp.JspWriter 클래스의 한 인스턴스이다.
클라이언트에게 전달될 출력 스트림을 대표한다.
2.클라이언트에게 실제 출력을 보내는것은 PrintWriter이며 JspWriter는response
객체를 좀더 유용하게 하기위해서 PrintWriter에 버퍼링 기능을 추가한 것이다.
3.page 지시자의 buffer특성을 이용해서 버퍼크기를 변경도 가능하며 버퍼링 자체를
끌수도 있다.

--------------------
page 내장객체
--------------------
1. 페이지 범위를 가지며, java.lang.Object 클래스의 한 인스턴스이다.
2. JSP 페이지 자체를 가르키는 것으로 this참조 변수로서 접근이 가능하다.

--------------------
config 내장객체
--------------------
1. 페이지 범위를 가지며, javax.servlet.ServletConfig 객체의 한 인스턴스이다.
서블릿설정을 대표한다.
2. JSP페이지가 JSP 컨테이너에 의해 초기화될때 전달받는 객체이다.
3. getInitParameterNames() : 모든 초기화 파라미터를 Enumeration 형태의
객체형식으로 가져온다.
4. getInitParameter(String name) : 지정된 name 초기화 파라미터를 가져온다.


--------------------
exception 내장객체
--------------------
1. 페이지 범위를 가지며, java.lang.Throwable클래스의 한 인스턴스이다.
2. 에러페이지(isErrorPage=true)안에서만 사용이 가능하다.
3. 대부분의 컨테이너들은 예외를 request객체의 한 특성으로 포함시켜
(ServletRequest.setAttribute() 메소드를 이용)에러페이지에게 전달하고
에러페이지 에서는 request.getAttribute(String name) 메소드를 이용하여 예외를
뽑아내는 방식을 취하고 있다.
posted by 구름너머 2006. 3. 29. 09:20
[본문스크랩] [JAVA/SCJP강좌]Map(HashMap, TreeMap, Hashtable) | 나의 관심정보 메모 삭제 2006/03/29 09:19
damool2 http://memolog.blog.naver.com/damool2/25
출처 카페 > 오라클OCP/MCSE/SCJ.. / 신죤
원본 http://cafe.naver.com/spszone/260
# Collection #


◎ Map은 key와 value를 가진 집합이며, 중복을 허용하지 않는다.
◎ 즉, 한개의 key에 한개의 value가 매칭된다.
◎ java.util 패키지에 여러 집합들을 사용하기 위한 여러 interface와 class 들이 정의되어 있다.


# HashMap #


◎ HashMap은 Map interface를 implements 한 클래스로서 중복을 허용하지 않는다.
◎ Map의 특징인 key와 value의 쌍으로 이루어지며, key 또는 value 값으로써 null을 허용한다.
◎ 아래의 예는 HashMap을 사용한 간단한 예제이다.


public class HashMapTest
{
public static void main(String argv[])
{
HashMap hm = new HashMap();
System.out.println(hm.put("aaa", "111"));
System.out.println(hm.put("bbb", "222"));
System.out.println(hm.put("aaa", "444"));
System.out.println(hm.put("ccc", "333"));
System.out.println(hm.put("ccc", null));

System.out.println("HashMap size : " + hm.size());

Set set = hm.keySet();
Object []hmKeys = set.toArray();
for(int i = 0; i < hmKeys.length; i++)
{
String key = (String)hmKeys[i];
System.out.print(key);
System.out.print(" - ");
System.out.println((String)hm.get(key));
}
}
}
/**
실행:java HashMapTest
결과:
null
null
111
null
333
HashMap size : 3
ccc - null
bbb - 222
aaa - 444
*/

# TreeMap #


◎ TreeMap역시 중복을 허용하지 않으며, key와 value의 쌍으로 이루어져 있다.
◎ HashMap과 다른 점은 SortedMap을 implements 하였으므로, key 값들에 대한 정렬이 이루어진다는
점이다.
◎ 아래의 예는 TreeMap을 사용하여 각 요소가 몇몇 이나 나왔는지 알아보는 간단한 예제이다.

import java.util.*;

public class Freq {
private static final Integer ONE = new Integer(1);

public static void main(String args[]) {
Map m = new TreeMap();

// Initialize frequency table from command line
for (int i=0; i < args.length; i++) {
Integer freq = (Integer) m.get(args[i]);
m.put(args[i], (freq==null ? ONE :
new Integer(freq.intValue() + 1)));
}

System.out.println(m.size()+" distinct words detected:");
System.out.println(m);
}
}
/**
실행:java Freq if it is to be it is up to me to delegate
결과:
8 distinct words detected:
{be=1, delegate=1, if=1, is=2, it=2, me=1, to=3, up=1}
*/

# Hashtable #


◎ Hashtable Map interface를 implements 한 클래스로서 중복을 허용하지 않는다.
◎Map의 특징인 key와 value의 쌍으로 이루어지며, key 또는 value 값으로써 null을 허용하지 않는다.
(HashMap과의 차이점)
아래의 예는 HashTable을 사용한 간단한 예제이다.

public class HashtableTest
{
public static void main(String argv[])
{
Hashtable ht = new Hashtable();
System.out.println(ht.put("aaa", "111"));
System.out.println(ht.put("bbb", "222"));
System.out.println(ht.put("aaa", "444"));
System.out.println(ht.put("ccc", "333"));

System.out.println("Hashtable size : " + ht.size());

System.out.println("aaa value : " + (String)ht.get("aaa");

}
}
/**
실행:java HashMapTest
결과:
null
null
111
null
Hashtable size : 3
aaa value : 444
*/
posted by 구름너머 2006. 3. 29. 09:17

기본적인 동작은 HashTable이나 HashMap은 같습니다.

즉 Key object - Value object 를 쌍으로 저장하여 seek타임을 줄이기 위해 hash값을 이용합니다.

Hashtable

Hashtable 은 키나 값에 Null을 허용하지 않습니다. 또한 Object에 정의된 hashCode()와 equals()메소드를 재정의하는 객체들만 저장할 수 있습니다.

다행히도 자바 내장 클래스들은 대부분 hashCode()구현되어 있다는 것을 아실겁니다.

특히 String 타입이 hashCode(), equals()메소드 두개 모두 구현되어 있지요.

Hashtable은 Map 클래스와 마찬가지로 반복자(interator)를 직접제공 하지 않습니다

다음 두가지 방식으로 HashTable 내용을 출력합니다.

Hashtable hashtable = new Hashtable();

hashtable.put("jakarta", "project");

hashtable.put("apache", "tomcat");

Enumertaion keys = hashtable.keys();

while(keys.hasMoreElements()) {

key = (String)keys.nextElement();

System.out.println(hashtable.get(key));

}

혹은

Setset = hashtable.keySet();

Iteratorkeys = set.interator();

while(keys.hasNext()) {

key = (String)keys.next();

System.out.println(hashtable.get(key));

}

HashMap

HashMap은 키나 값에 Null을 허용 합니다.

HashMap 출력방법은 다음 한가지 이네요. (Enumeration 지원 안함)

HashMap hashmap = new HashMap();

hashmap.put("jakarta", "project");

hashmap.put("apache", "tomcat");

Set set = hashmap.entrySet();

Iterator keys = set.iterator();

while (keys.hasNext()) {

key = (String)keys.next();

System.out.println(hashmap.get(key));

}

또한 Hashtable은 thread safe 한 객체이지만 HashMap은 그렇지 못해 unsynchronized 합니다. 이말은 즉 멀티 쓰레드 환경이 아니면 HashMap을 쓰면 속도가 빠르다는 말입니다.

굳이 동기화 하자면 다음과 같이 사용해야 겠지요

Map m = Collections.synchronizedMap(new HashMap(...));

간단히 정리하자면

HashMap이 HashTable에 비해 좀더 실용적으로 변한 형태라고 보면 되겠네요 ^^

일반적으로 쓴다면 HashMap을 사용하세요

posted by 구름너머 2006. 3. 29. 09:13
Hashtable과 HashMap의 차이점 알고 싶습니다..
평점 :
+ 1 (1 명)나도 평가하기tmslzl80 조회 :1153답변 : 1
답변이 완료된 질문입니다. (2004-11-15 10:55 작성)신고
이 둘의 차이점을 잘 모르겠네요
책에는 HashMap이 Hashtable보완되어 나왔다고만 되어 있는데
사용하는거 보니깐 그렇지 않은거 같아서요
아직도 Hashtable을 많이 사용도 되고 있는거 같고....
질문자가 선택한 답변
re: Hashtable과 HashMap의 차이점 알고 싶습니다..
bomb100 (2004-11-15 12:37 작성)
이의제기 | 신고
질문자 평
HashMap 이나 Hashtable 이나 둘다 Map 인터페이스를 implements 하고있지만 프로그래밍 환경에 따라서 적절한 놈으로 골라써야 합니다.



java API 문서에 보면

The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls

"간략히 말해서 HashMap 은 Hashtable과 같다, 다만 HashMap 이 unsynchronized 하고 null 값을 허용할 뿐이다."

그러면 Hashtable 에는 null 값이 들어갈 수 없다는건가? 이건 잘 모르겠지만 님께서 Hashtable 만들어놓고 null 키값과 null value 를 함 넣어보시면 확인하실 수 있을 듯...

중요한 건 HashMap은 멀티쓰레드 환경에서 사용하면 안된다는 겁니다.

여러개의 쓰레드가 동시에 HashMap 을 건드려서 key, value 를 써넣게 되면 문제가 발생할 수 있다, 뭐 이런것 같습니다. 멀티쓰레드 프로그래밍 환경에서는 HashMap 을 쓰면 안되고 Hashtable 을 써야 한다는 거죠...

단일 쓰레드 환경에서 Hashtable 을 쓰더라도 별 문제는 없는데, HashMap보다는 성능이 저하될 수 있습니다.

'JAVA' 카테고리의 다른 글

Map(HashMap, TreeMap, Hashtable)  (0) 2006.03.29
HashTable vs HashMap 사용법  (0) 2006.03.29
Jsp 기초 - 스크립트 프로그래밍  (0) 2006.02.17
Runtime.getRuntime().exec( cmd )  (1) 2005.11.25
StringTokenizer for JDK1.5.0  (0) 2005.11.25
posted by 구름너머 2006. 2. 17. 10:27

본 강좌는 jsp를 통해 동적 웹 페이지를 어떻게 개발하고 향상시킬 수 있는 가에 관한 내용을 담고 있습니다.
Jsp 강좌를 시작하기에 앞서 본 강좌는 현재로서는 어느 정도 웹개발에 친숙한 분을 가정하여 아주 기초부터 설명을 드리지는 않습니다. 물론 추후에 계속된 업데이트와 수정을 거쳐 세상에서 가장 쉬운 설명이 되도록 노력하겠습니다.

Jsp는 Asp와 마찬가지로 자바를 모르더라도 사용할 수 있는 스크립트 언어로써 웹개발에 사용되지만 자바의 원래 가지고 있던 장점들을 고스란히 Jsp페이지에서 구현할 수 있으려면 먼저 어느정도의 자바기초문법에 대한 이해와 그에 따른 Servlet 구조를 나름대로 알고 있으셔야 합니다.제대로된 그리고 나름대로 특화된 웹개발을 하고자 하시는 분은 이 순서를 꼭 밟으시기를 권해드리면서 추후에 이 모든 강좌를 이곳에서 보실수 있도록 하겠습니다.


Jsp 기초 - 스크립트 프로그래밍

  • Jsp 지시자(directive) 사용하기 - 문서를 어떻게 처리할 것인가?
  • Jsp 스크립트 요소(scripting element) - 스크립트 언어로 작성된 내용을 삽입
  • 주석(comment) - 세가지를 지원

1. Jsp 태그의 유형

1)스크립트 지향 태그 : ASP와 같은 스크립트 류에서 사용되는 형식의 이 태그는 구분자로 쉽게 알아 볼 수 있습니다. <% 로 시작하여 %> 로 끝나는 것이 기본이며 부가적으로 !, @, = 등과 같은 문자를 추가해 줌으로써 태그가 가지는 의미를 부여하고 있습니다.

2)XML기반의 태그 : XML문법과 XML태그 규칙을 따르는 태그이다. XML태그는 몸체를 가지는 태그와 몸체를 가지지 않는 태그로 구분됩니다.
*몸체를 가지지 않는 태그의 예
<jsp:forward page=login.jsp />


*몸체를 가지는 태그의 예
<jsp:forward page=login.jsp >
<jsp:param name=scmd value=log />
<jsp:param name=uid value=zezz />
<jsp:param name=token value=<%=token%> />
</jsp:forward>

2. JSP 지시자(Directive)

: Jsp Container(혹 무슨 단어인지 모르다면 Jsp 파일을 컴파일하고 처리하는 일종의 작은 서버라고 생각해 두고 넘어갑시다.) 에게 현 Jsp 페이지와 관련된 여러가지 정보들을 보내는 역할을 합니다. 예를 들어 현재 페이가 사용할 수 있는 스크립팅 언어를 지시한다거나 다른 페이지의 코드 그 자체를 현 페이지에 그대로 삽입할 것을 지시한다거나(마치 CSS처럼)하는 일 등을 말합니다.

<%@ 지시자 속성1=값 속성2=값2 ……..%>

1) Page 지시자 : page 지시자는 JSP페이지 전체에 대한 정보값들을 설정하는데 사용됩니다. page 지시자는 좀 종류가 많습니다. 다만 주로 사용하는 것만 사용하고 나머지는 기본값을 사용하므로 다 기억하고 있으실 필요는 없을 듯 싶군요. 그리고 대소문자를 자바에서는 철저히 구분한다는 것 아시죠? 여기서도 역시 마찬가지입니다.

(1)language 속성 : Jsp 페이지의 모든 스크립트 요소에서 사용되는 스크립트 언어를 지정한다. 기본값은 Java 이며 Jsp Container에 따라서 자바 이외의 다른 스크립트언어를 지원할 지의 여부가 결정된다.

<%@ page language=java %>

(2) contentType 속성 : Jsp 페이지가 생성하는 문서의 MIME(Multipurpose Internet Mail Extentions) 타입을 나타내는 데 사용됩니다. 기본값은 text/html 입니다.

<%@ page contentType =text/html %>

또한, contentType 속성을 Jsp페이지에서 사용하는 문자셋을 지정하는데 사용할 수 있습니다. 기본값은 ISO-8859-1 입니다.

<%@ page contentType =text/html; charset=EUC-KR %>

(3) info 속성: 페이지를 설명해 주는 문자열입니다. 값의 내용이나 길이의 제한은 없으며 기본값은 입니다.

<%@ page info=Copyright 2000 by JspStudy.co.kr %>

(4) import 속성:패키지의 이름을 명시하지 않고 클래스를 참조하고자 하는 경우에 사용됩니다.

<%@ page import=java.util.* , java.io.*, java.sql.* ,…. %>

(5) session 속성 :session 속성은 jsp페이지가 세션관리에 참여하는지를 나타냅니다. 값으로 false 또는 true 값을 가질 수 있으며 기본값은 true 입니다.

<%@ page session=false %>

(6) buffer 속성:bufer 속성은 페이지로부터 출력되는 내용을 처리하는 JspWriter의 버퍼링 상태를 지정한다. 기본값은 8kb 입니다.

<%@ page buffer=none %>

<%@ page buffer=16kb %>

버퍼를 사용함으로 생각해 볼 점은 페이지가 생성중인 출력스트림을 즉각적으로 보내지 않고 버퍼에 담아 둠으로 다른 페이지로 제어를 옮긴다거나 에 러가 발생했을 경우 버퍼에 저장된 스트림을 취소하여 원하는 출력물을 사용자에게 보여 지도록 할 수 있다는 것이다.

(7) autoflush 속성 :버퍼가 다 찰 경우 어떻게 페이지를 처리할 것인가를 지정합니다. 다시 말해 true로 설정해 놓으면 버퍼가 다 찼을 경우 자동적으로 비워지게 되어 요청한 내용을 웹브라우저에게 전송하기 위해 HTTP서버에 보내지게 됩니다. 기본값은 true 이며 만약 buffer 속성의 값이 none 일 경우 autoflush 속성을 false로 지정할 수 없습니다.

<%@ page autoflush=false %>

(8) isThreadSafe 속성 :페이지에 대한 여려명의 사용자의 요청이 동시에 들어 올 경우에 안전하게 응답할 수 있는지의 여부를 나타날 때 사용됩니다. 기본값은 true 이며 이 속성값을 false 로 지정해 놓으면 요청을 동시에 처리하지 않고 요청한 순서대로 처리하므로 사용자의 내용을 처리하는데 상당히 오랜 시간이 걸릴 수 있으므로 충분히 처리시간을 고려하여 결정하셔야 합니다.

<%@ page isThreadSafe=false %>

(9) errorPage 속성 : Jsp 페이지를 처리하는 도중 페이지에서 오류가 발생할 경우 자신이 오류를 처리하지 않고 다른 페이지에서 처리하도록 지정할 수 있는 속성입니다. 직접 에러를 처리할 페이지의 로컬 URL을 적어 주시면 됩니다.

<%@ page errorPage=/error/error.jsp %>

URL에는 위의 예처럼 절대 URL을 사용할 수도 있고 상대 URL을 사용할 수 있습니다. 절대 경로는 '/'를 포함하며 상대경로는 '/'를 URL 맨 처음에 포함하지 않고 시작합니다.

(10) isErrorPage 속성: 현재 자신의 페이지가 에러처리를 담당할 페이지임을 나타냅니다.

<%@ page isErrorPage=true %>

기본값은 false 이며 에러페이지로 지정될 경우 예외에 관한 객체인 exception 객체를 사용할 수 있게 된다. (11)extends 속성 : 강의를 하지 않았습니다만 Jsp 페이는 Jsp 컨테이너의 의해 일단 Servlet으로 변환된 후(서블릿은 그냥 기존의 CGI를 자바언어로 대체하기 위한 특별한 목적의 순수자바소스코드라고 생각하시면 됩니다.) 요철을 처리하고 그 결과를 웹서버에 전송하여 클라이언트에게 보여 주게 됩니다. 이 때 컴파일 시점에서 자신이 상속을 받을 클래스를 지정할 수 있는데 이때 extends 속성을 사용할 수 있습니다. 물론 대부분의 컨테이너가 알아서 적정할 클래스들을 상속시켜 변환해 줌으로 거의 사용할 일은 없으리라 생각됩니다.

<%@ page extends=kr.co.jspstudy.board.lecture.JspPage %>


2)include 지시자 : 지시자 중 두번째인 include 지시자는 단어 뜻 그대로 다른 페이지의 내용을 현재 페이지에 포함시킬 때 사용됩니다.

<%@ include file=로컬URL%>

URL은 상대경로와 절대경로 모두 가능하며 슬래쉬 '/' 의 유무에 따라 구분합니다.(error 속성 참조) <html>
<body>
<%@ include file=/board/Board.jsp %>
</body>
</html>
include 지시자외에 뒤에서 배울 액션태그를 통해서도 페이지 삽입이 가능합니다. 다만 둘의 의미가 약간의 차이가 있습니다. include 지시자는 한마디로 include 시킬 파일의 내용(소스자체)을 전부 페이지에 넣어 함께 서블릿으로 컴파일을 시킨답니다. 이렇게 될 경우 포함될 페이지가 포함될 페이지의 모든 지역변수들을 사용할 수 있다는 의미가 됩니다. 그러나 앞으로 설명할 액션태그의 경우에는 소스자체를 포함시키는 것이 아니라 해당시점에 해당 리소스를 호출하여 수행결과를 포함하는 방법을 취하고 있습니다.

3)taglib 지시자 : 태그라이브러리란 Jsp기능을 확장할 때 사용하는 커스텀태그의 집합을 말합니다. 한마디로 Jsp태그(액션태그)가 지원하지 못하는 부분을 사용자가 직접 작성하여 그 태그를 불러다 사용하겠다는 말이지요. Jsp로 동적인 웹페이지를 구현할 때 가장 좋은 점은 구현부와 표현부를 분리하여 디자이너와 프로그래머가 상호 개별적으로 작업을 수행할 수 있다는 것인데 기존의 태그만으로 이런한 상호 분리를 완전히 해 내지 못할 때가 있습니다. 기존의 빈 관련태그만으로는 이러한 분리를 완벽히 소화해 낼 수 없다는 것이지요. 그래서 복잡한 코드가 JSP 파일안에 들어갈 수 밖에 없게 된다는 것입니다. 이런 경우 커스텀태그를 사용자가 직접 만들어 taglib지시자를 사용하여 호출하여 사용함로써 이러한 부분을 보완 할 수 있습니다.
참고로 말씀드리면 커스텀태그를 사용하기 위해서는 XML문법을 어느정도 아셔야 합니다. 따라서 여기서는 이런 것이 있다는 정도만 아시고 XML의 기초부분만이라도 공부를 하시는 것이 좋을 듯 싶군요. 여기서는 이런것이 있다는 정도만 알고 넘어가도록 하죠. 추후 장을 달리하여 XML과 함께 설명을 드리도록 하겠습니다.

<%@ taglib URI=tagLibraryURI prefix=tagPrefix %>

URI 는 커스텀 태그라이브러리가 있는 URI를 지정하며 prefix는 커스텀 태그를 구분하기 위한 구분자를 표시합니다.



3. 스크립트 요소(Scripting elements)

: 스크립트 요소란 한마디로 Jsp페이지에 직접 코드를 삽입할 수 있도록 해 줍니다. 기본적으로 <% … %>사이에 넣으며 ! 기호 및 = 기호를 추가하여 특별한 다른 의미를 부여하기도 합니다. 따라서 세가지로 구분할 수 있는데 <%…%>, <%!….%>, <%=….%> 입니다.

1)표현식(Expressions) : 표현식의 결과를 출력스트림에 추가합니다.<%= Expression ........... %>

Current time: <%= new java.util.Date() %>
<%=2000/345%>

2)스크립트릿(Scriptlets) : ASP 나 PHP와 유사한 형태로 스크립트 언어를 사용할 수 있게 해 주는 부분이다. 일반적으로 자바가 스크립트 언어가 된다. <% Java Code %>

<% String queryData = request.getQueryString(); out.println(Attached GET data: + queryData); %> <% if (Math.random() < 0.5) { %> Have a nice day! <% } else { %> Have a lousy day! <% } %> <table> <% for(int i=0;i<10;i++) {%> <tr> <td><%=i%>번</td> </tr> <%}%> </table>

3)선언부(Declarations) : JSP 페이지에 사용될 변수와 메소드를 정의하는 영역입니다.<%! 선언부분 ........... %>

<%! private int accessCount = 0; %> 서버가 재 기동되기전까지 계속적으로 증가 <%= ++accessCount %>



4. 주석(Comment)


1) HTML 형식의 주석 : HTML을 작성할 때와 같은 주석의 형태입니다. JSP 페이지내에 이러한 주석이 있을 경우 페이지가 서블릿으로 컴파일 되고 사용자의 브라우저에 출력할 때는 소스보기를 통해 주석코드가 보여 집니다. <!-- 주석내용 --> 만일 주석태그 내에 표현식을 사용하면 사용자가 원하는 주석을 동적으로 생성시킬 수도 있습니다.

<!-- 나의 이름은 <%=name%> -->

만일 name의 값이 '천풍' 이였다면 브라우저에서 소스보기할때 <!-- 나의 이름은 천풍 -->과 같은 코드가 보여집니다.

2) JSP 형식의 주석 : 이 주석은 오직 JSP 소스파일에만 사용되며 출력결과를 브라우저상에서 소스보기를 해도 이 태그를 사용한 주석처리는 나타나지 않습니다. 당연히 서블릿으로 코드 전환될 때에 이 주석은 아예 무시를 하게 됩니다. <%-- 주석내용 --%>

<%-- 나의 이름은 <%=name%> --%>

여기서 한가지 집고 넘어가야 할 부분이 있습니다. HTML 주석의 경우는 서블릿으로 코드 전환시 주석을 무시하는 것이 아니라 생성되는 출력물에 주석으로서 처리되어 들어가게 되므로 주석안에 있는 표현식을 같이 컴파일 하게 됩니다. 따라서 name이라는 변수가 없다면 정의되어 있지 않은 변수입니다 라는 에러메시지를 띄우게 되는 것이지요. 하지만 JSP주석의 경우에는 아예 주석문 안에 있는 코드 전부를 무시해 버리므로 name이라는 변수가 없더라도 에러메시를 띄우지 않게 되는 것입니다. 아시겠죠?

3) 스크립트 언어 주석 : 스크립트릿이나 선언부에 사용되는 스크립트 언어가 지원하는 주석표기를 사용하는 것입니다. Resin 서버 같은 경우 스크립트언어로 자바스크립트까지 지원한다 하지만 JSP 파일을 생성하면서 자바언어를 사용하지 않는 다는 건 제 개인적인 생각으로 상상할 수가 없군요.. 그럼 자바언어의 경우 주석처리는 하는 법을 보겠습니다. <% ....... /* 주석 */ (여러줄 주석) ...... %> <% ..... // 주석(한줄 주석) .... %>


'JAVA' 카테고리의 다른 글

HashTable vs HashMap 사용법  (0) 2006.03.29
Hashtable과 HashMap의 차이점  (0) 2006.03.29
Runtime.getRuntime().exec( cmd )  (1) 2005.11.25
StringTokenizer for JDK1.5.0  (0) 2005.11.25
weblogic JDBC 설정...  (0) 2005.11.04