Tuesday, October 13, 2009

jsp 이메일

실험을 몇번해보고 인터넷되 찾아봤지만..

결과적으로 메일은 오지 않았습니다..-_-

아마도 전산실(학교입니다..;;)에서 막아놓은것 같지만..

실력이 안되니...알수있는방법도없고......

그래도 인터넷 찾아보고 책에서도 보고해서 올립니다..

1. http://java.sun.com/products/javamail/에서 javamail_1_4_2.zip를 다운받습니다.

2. 해당 zip파일에서 mail.jar를 찾아 해당 파일을 톰캣 라이브러리 폴더에 추가합니다.

3. SMTP서버 설치를 위해 제어판 프로그램 추가/제거 에서 Windows 구성 요소 추가/제거 를 클릭합니다.(왼쪽 위에서 3번째)

4. Window구성요서 마법사 에서 인터넷 정보 서비스(IIS)를 눌러 자세히를 클릭합니다.

5. 목록중에서 SMTP Service를 체크하고 확인을 누룹니다.

6. 설치시 필요한 CD를 삽입합니다.

7. 설치 완료 후 제어판의 관리도구로 들어갑니다..

8. 관리도구에서 인터넷 정보 서비스를 선택합니다.

9. 기본 SMTP 가상 서버에서 오른쪽 마우스 클릭후 엑서스탭으로 들어갑니다.

10. 마지막에 있는 릴리즈 제한을 클릭후 아래목목만 제외를 클릭후 확인을 누룹니다.

11. 도움말 아래쪽에 있는 정지버튼을 클릭후 재생버튼을 다시 불러 재생시합니다.

javamail-1[1].4.2.zip

form.jsp

sendmail.jsp

Monday, October 12, 2009

javascript URL GET

window.location문법은 정상적인 문법이 아닙니다.

location은 하나의 객제로서 하위에 많은 변수값들이 존재합니다.

주소를 알아내기 위한 정확한 문법은 window.location.href입니다.

href속성말고도 여러가지 속성이 있으며 아래에 열거 하였습니다.



hostname = window.location.hostname;
href = window.location.href;
host = window.location.host;
port = window.location.port;
pathname = window.location.pathname;
search = window.location.search;
protocoal = window.location.protocol;



alert(href);






즐거운 하루 되세요!
의문나시는 부분 있으시면 언제든지 쪽지주세요!

페이지가 닫혔는지 알아내기



html - window.close()

study/language 2009/03/26 22:13


기본은
window.close();
self.close();
opener.close();
document.close();

닫을때 확인 메시지 없이 닫을려고 하면
opener=self;self.close();
opener.open('about:blank', '_self').close();

a페이지가 닫혔는지 알아내기..
function openNewWindow() {

newWin = window.open('a페이지', '', '');
window.setInterval("onClosed(alert('a'));", 1000, "JavaScript");

}
function onClosed(evalStr) {
if (newWindow.closed)

eval(evalStr);

}


예)
var webConsol = null;
function webConsolWindow(url) {
 var sStatus = "width=1024,height=768,directories=no,location=no,menubar=no,resizable=no,scrollbars=no,status=yes,titlebar=no,toolbar=no";
 webConsol = window.open(url, 'webConsol', sStatus);
 window.setInterval("webConsolWindowClosed();", 100, "JavaScript");
}

function webConsolWindowClosed() {
 if (webConsol.closed) {
  window.location.href="/login.jsp";
 }
}

 

저작자 표시





'study > language' 카테고리의 다른 글





















html - window.close()  (0) 2009/03/26
html - IE 6/7에서의 Select 옵션 잘림 현상  (0) 2009/03/24
java - HttpURLConnection  (1) 2009/02/18
javascript - 0, ""  (0) 2009/02/13
javascript - stack overflow at line  (0) 2008/12/22
javascript - parseInt, parseFloat  (0) 2008/12/09

Trackback 0 : Comment 0

Thursday, October 8, 2009

가로를 세로로 바꾸는 SQL 작성 방법

가로를 세로로 바꾸는 SQL 작성 방법

Advanced Oracle 2008/02/28 10:00

오동규 님의 블로그에 세로로 출력되는 데이터를 가로로 출력하는 몇 가지 재미있는 기법들 소개되고 있다.

즉 아래와 같은 데이터를

SELECT DEPTNO, ENAME
FROM EMP;

DEPTNO ENAME
------ ----------
10 CLARK
10 KING
10 MILLER
20 SMITH
20 ADAMS
20 FORD
20 SCOTT
20 JONES
30 ALLEN
30 BLAKE
30 MARTIN
30 JAMES
30 TURNER
30 WARD


아래와 같이 출력하기를 원한다.

DEPTNO ENAME
------- ------------------------------------
10 CLARK,KING,MILLER
20 SMITH,JONES,SCOTT,ADAMS,FORD
30 ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES


이런 요구사항은 매우 빈번하고 또 일반적이다.

이 블로그에서는 Oracle, MySQL, SQL Server 등에서 이런 출력을 가능하게 하는 다양한 방법을 소개하고 있다. Oracle에서 사용 가능한 방법은 다음과 같이 소개되어 있다.

select deptno,
ltrim(sys_connect_by_path(ename,','),',') ename
from (
select deptno,
ename,
row_number() over (partition by deptno order by empno) rn,
count(*) over (partition by deptno) cnt
from emp
)
where level = cnt
start with rn = 1
connect by prior deptno = deptno and prior rn = rn-1 ;


analytic function과 connect by를 적절히 이용하는 강력한 기법이다. (MySQL는 간단한 함수 하나로 이것을 할 수 있다는게 부러울 따름이다!)

이에 덧붙여 Oracle에서 비슷한 효과를 낼 수 있는 간단한 기법 하나를 소개하고자 한다.
간단한 기법이란 아래와 같이 Cursor 함수를 사용하는 것이다.

SCOTT@ukja10> select
2 e.deptno, cursor(select ename from emp where deptno = e.deptno)
3 from emp e
4 group by e.deptno
5 ;


출력 결과는 다음과 같다.

DEPTNO CURSOR(SELECTENAMEFR
---------- --------------------
30 CURSOR STATEMENT : 2

CURSOR STATEMENT : 2

ENAME
------------------------------
ALLEN
WARD
MARTIN
BLAKE
TURNER
JAMES

6 rows selected.

20 CURSOR STATEMENT : 2

CURSOR STATEMENT : 2

ENAME
------------------------------
SMITH
JONES
SCOTT
ADAMS
FORD

10 CURSOR STATEMENT : 2

CURSOR STATEMENT : 2

ENAME
------------------------------
CLARK
KING
MILLER


엄밀하게 말하면 가로로 출력하는게 아니라 Cursor를 컬럼처럼 리턴받아서 이 Cursor에 대해 Fetch를 하는 방식이다. JDBC 등에서 이를 출력받아서 Fetch 하면서 디스플레이하면 마치 가로로 출력한 것과 동일한 효과를 얻을 수 있다. 이 방법의 장점 하나는 매우 복잡한 요구 사항도 쉽게 처리가 가능하다는 것이다.

comet

자바 서블릿 컨테이너의 Comet 지원 2 - Tomcat 소스

자바 서블릿 컨테이너의 Comet 지원 2 - Tomcat

Corund 님의 글을 보고 테스트한 샘플코드를 올립니다.comet_tomcat.zip

* 스크립트라이브러리로 jQuery를 사용했습니다.
* chat.jsp 의 pollMessage 의 url을 조금 수정했습니다. - IE(7.0)에서 url을 캐싱하는 바람에 ajax request가 안가서요..
* Corund 님 설명대로 ChatMessageSenderListener 를 만들고 web.xml에서 등록했습니다.
* ChatMessageSenderListener는 MessageSender만들고 컨텍스트에 setAttribute합니다.
* BroadcasterServlet 의 init()에서 MessageSender를 getAttribute합니다.
* CometProcessor를 구현했더니.. getServletContext()가 null네요. 왜그럴까요??
* event()메소드 CometEvent.EventType.END 에 event.close() 한줄 추가 했습니다.
* ChatServlet 의 init()에서 MessageSender를 getAttribute합니다.
* 한글 깨지지 말라고 doPost()에 request.setCharacterEncoding("UTF-8"); 한줄 추가 했습니다.
* apache-tomcat-6.0.18 에서 테스트 했습니다.

이상 원글에서 수정한것들입니다.

BoarecasterServlet에서 CometEvent.EventType.ERROR 와 CometEvent.EventType.END 이벤트가 발생하면 event.close()이 실행되는데.. 여기서 response 는 상태코드 200을 갖고 스트림이 종료되된다. 이로인해 클라이언트측(chat.jsp)의 폴링메소드의 complete 가 실행되어 "롱폴링"이 일어나는 것이다.

CometEvent.EventType.END 는 MessageSender에서 각 클라이언트로 메세지 보내낸 후 response.flushBuffer();가 실행되면 발생한다.

Comet 타임아웃 설정
CometEvent.EventType.BEGIN 이벤트 발생하면 event.setTimeout(30 * 1000)와 같이 타임아웃을 설정할 수 있다. 타임아웃이 되면 CometEvent.EventType.ERROR를 발생시킨다.

참.. server.xml에서 아래 밑줄 잊지 마세요..
protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>

http://localhost:8080/comet_tomcat/chat 접속해 보면..

comet

자바 서블릿 컨테이너의 Comet 지원 2 - Tomcat

이전글

Tomcat 에서는 버전 6.0의 Advanced IO 지원을 통해 Comet 모델을 효과적으로 구현할 수 있게 되었다. Tomcat 6.0 에서는 Jetty 와는 달리 서블릿을 확장하는 형태로 지원하고 있다.

javax.servlet.Servlet 인터페이스를 확장한 org.apache.catalina.CometProcessor 가 그것인데 이 인터페이스는 Servlet 인터페이스를 상속한 것이다. 이 인터페이스에는 event(CometEvent) 메서드가 있는데 이 인터페이스를 구현한 클래스가 서블릿으로 등록되어 있으면 Tomcat 은 요청을 처리할 때 기존 서블릿의 service(...) 메서드를 호출하지 않고 이 event(...) 메서드를 호출하게 된다. 이 메서드는 한 요청 처리 트랜잭션에서 여러번 호출될 수 있으며 이벤트 정보가 인자로 넘어오게 된다. 이 인자로 넘어온 객체를 통해 여러 정보를 알 수 있고 IO도 처리할 수 있다. 입력(input)은 이 이벤트 처리 메서드 안에서 이루어져야 하지만, 출력(output)은 이 이벤트 처리 메서드 밖에서도 처리할 수 있다.

CometProcessor 를 사용하기 위해서는 Tomcat 설정을 조금 손봐야 한다. CometProcessor 는 Tomcat connector 가 Native 또는 NIO connector 여야 한다. 자바 1.4 버전 이상이라면 NIO 를 쓰면 되며 Tomcat 설정 파일을 다음과 같이 수정하면 된다.



protocol="org.apache.coyote.http11.Http11NioProtocol" useComet="true" redirectPort="8443"/>


event 메서드는 BEGIN, READ, END, ERROR 이벤트가 발생할 때 호출되는데 이때 인자로 org.apache.catalina.CometEvent 객체가 넘어온다. 이 객체에는 위의 Event Type 을 얻는 메서드와 HttpServletRequest, HttpServletResponse 객체를 얻는 메서드 등이 있다.

이전 Jetty 의 경우와 마찬가지로 채팅 예제로 실제 사용법을 알아본다. 먼저 ChatServlet 과 chat.jsp 는 이전 jetty 의 경우와 같다. BroadcasterServlet 은 CometProcessor 를 사용해야 하는데 코드는 다음과 같다.

public class BroadcasterServlet extends HttpServlet implements CometProcessor {
...
@Override
public void event(CometEvent event) throws ServletException, IOException {
HttpServletRequest request = event.getHttpServletRequest();
HttpServletResponse response = event.getHttpServletResponse();
String sessionId = request.getSessionId();

if (CometEvent.EventType.BEGIN == event.getEventType()) {
// 요청을 최초로 처리할 때 호출됨.
response.setContentType("text/html; charset=utf-8");
messageSender.addSession(sessionId, event);
} else if (CometEvent.EventType.ERROR == event.getEventType()) {
// IO 에러가 발생했을 때.
messageSender.removeSession(sessionId);
event.close(); // 요청 처리 완료.
} else if (CometEvent.EventType.END == event.getEventType()) {
// 요청 처리가 완료되었을 때
log("End event");
} else if (CometEvent.EventType.READ == event.getEventType()) {
log("Read event");
}
}
...
}


요청을 최초로 처리할 때 BEGIN 이벤트가 발생하며 이때 Request 정보를 읽는 작업을 한다. 여기서는 채팅 메시지가 있을 때 메시지를 보낼 수 있도록 event 객체를 messageSender 객체에 저장해 놓는 작업도 한다.

요청에서 읽을 데이타가 준비되었을 때 (즉 request.getInputStream() 등) READ 이벤트가 발생하며, 에러가 발생했을 때 ERROR 이벤트가 요청 처리가 완료되면 END 이벤트가 발생한다. 여기서는 ERROR 이벤트가 발생하였을 때 관련 정보를 messageSender 에서 삭제하고 요청을 마치는 작업을 한다.

MessageSender 클래스는 다음과 같다. Jetty 의 경우와 조금 다른데 메시지를 실제로 보내는 작업도 여기서 처리하고 있다. CometProcessor 에 원하는 때 이벤트를 발생시킬 수 없기 때문이다. 따라서 이벤트가 발생할 때 출력을 하기 위해 미리 CometEvent 객체를 저장하여 HttpServletResponse 객체를 얻어 출력을 한다.

MessageSender.java
public class MessageSender implements Runnable {
private volatile boolean running = true;
private final BlockingQueue messages =
new LinkedBlockingQueue();
private final Map sessions =
new ConcurrentHashMap();
private final ExecutorService executor = Executors.newFixedThreadPool(5);

public void send(String message) {
try {
messages.put(message);
} catch (InterruptedException ignore) {
// ignore
}
}

public void addSession(String id, CometEvent event) {
sessions.put(id, event);
}

public void removeSession(String id) {
sessions.remove(id);
}

public void stop() {
this.running = false;
this.executor.shutdown();
}

@Override
public void run() {
while (running) {
String message = null;
try {
message = messages.take();
} catch (InterruptedException ignore) {
// ignore
}
for (String id : sessions.keySet()) {
executor.submit(new Task(id, message));
}
}
}

private class Task implements Runnable {
private String sessionId;
private String message;

public Task(String id, String msg) {
sessionId = id;
message = msg;
}

public void run() {
CometEvent event = sessions.get(sessionId);
if (null == event) {
return;
}
HttpServletResponse response = event.getHttpServletResponse();
PrintWriter out = null;
try {
out = response.getWriter();
out.println(message);
out.flush();
response.flushBuffer();
} catch (IOException naive) {
naive.printStackTrace();
} finally {
try { out.close(); } catch (Exception ignore) {}
try { event.close(); } catch (Exception ignore) {}
sessions.remove(sessionId);
}
}
}
}


Jetty 의 경우와 달리 Tomcat 은 Servlet 인터페이스를 확장하여 웹 요청 단계에 따라 이벤트를 발생시키는 방식으로 작동한다. 네트워크 서버가 많이 취하고 있는 방식이라 쉽게 이해할 수 있다. 그러나 실제 프로그래밍을 하려면 번거로운 점이 있다. Jetty 처럼 원하는 때 resume 을 시킬 수 없기 때문에 long polling 처럼 원하는 때 출력을 하려면 서블릿 코드 밖에서 출력을 해야 하며 따라서 직접 스레드를 관리할 필요가 생긴다. 또한 Error 시에 적절히 자원을 정리하는 코드도 필요하다.

정리하자면 Tomcat 의 Comet 지원은 일반 네트워크 서버 스타일에 가깝다고 볼 수 있다. 좀더 웹 프로그래밍 스타일에 가깝게 만들었으면 좋지 않았을까 하는 생각이 든다.

by Corund | 2008/07/30 19:31 | 트랙백(1) | 핑백(1) | 덧글(1)

트랙백 주소 : http://corund.egloos.com/tb/1910202
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from 나는 해피엔딩이 좋아 at 2009/06/02 19:25

제목 : 자바 서블릿 컨테이너의 Comet 지원 2 - To..
자바 서블릿 컨테이너의 Comet 지원 2 - Tomcat Corund 님의 글을 보고 테스트한 샘플코드를 올립니다. * 스크립트라이브러리로 jQuery를 사용했습니다. * chat.jsp 의 pollMessage 의 url을 조금 수정했습니다. - IE(7.0)에서 url을 캐싱하는 바람에 ajax request가 안가서요.. * Corund 님 설명대로 ChatMessageSenderListener 를 만들고 web.xml에서......more

more

Linked at 점프와 쉼없는 나아감 : 자바.. at 2008/08/01 09:35

... 이전글 Comet 에 대하여 자바 서블릿 컨테이너의 Comet 지원 1 - Jetty자바 서블릿 컨테이너의 Comet 지원 2 - Tomcat Resin 은 버전 3.1에서 Comet 모델을 지원한다. Tomcat 과 마찬가지로 javax.servlet.Servlet 을 확장한 인 ... more

Commented by 민예원 at 2009/05/29 11:15
좋은글 잘 보고 갑니다. 감사합니다.

comit server

http://corund.egloos.com/1910202

http://yewon.egloos.com/2335303