Clean Code that Works.

Session.Abandon() 요고 한줄이면 세션 클리어!!
이게 생각이 안나서 --; 검색을 해봐야 하는데 검색 않고 session("변수") = "" 이렇게 했다는 --;;;



이천수가 빨리 프리미어리그에 진출해서 시원 시원한 모습을 보여 주길 기대한다.



ASP Substring 찾다가 찾아낸 함수.
참조할 변수와 시작 점 그리고 길이를 입력 하면 된다.
참고 사이트는 http://www.w3schools.com/vbscriptASP가 비베를 사용하니깐 비베 사이트에 ~_~



The Mid function returns a specified number of characters from a string.

Tip: Use the Len function to determine the number of characters in a string.

Syntax

Mid(string,start[,length])

Parameter Description
string Required. The string expression from which characters are returned
start Required. Specifies the starting position. If set to greater than the number of characters in string, it returns an empty string ("")
length Optional. The number of characters to return

Example 1

dim txt
txt="This is a beautiful day!"
document.write(Mid(txt,1,1))
Output:
T

Example 2

dim txt
txt="This is a beautiful day!"
document.write(Mid(txt,1,11))
Output:
This is a b

Example 3

dim txt
txt="This is a beautiful day!"
document.write(Mid(txt,1))
Output:
This is a beautiful day!

Example 4

dim txt
txt="This is a beautiful day!"
document.write(Mid(txt,10))
Output:
beautiful day!

사용자 삽입 이미지

익스에서 파이어폭스 쓰다가 이번에 오페라로 넘어왔습니다.

파이어 폭스 보다도 더 가볍고. 예쁘네요.
우리나라 대부분 사이트들이 activex 를 너무 많이 쓰고 웹 표준을 준수 하지 않기 때문에...
문제가 있는 사이트들도 있지만 아주 만족 합니다.

그림 오른쪽 상단에 보면 위젯이 있는데 브라우져 주제에 다양한 위젯을 제공합니다 -ㅁ-;;

파이어폭스 기능중에 페이지를 IE로 보는 애드온이 있는데 오페라도 이 기능이 있으면 좋을듯 싶네요.
마우스 오른쪽키 눌르면 현재 페이지를 IE 창 열어서 보는 기능은 추가 할 수 있습니다.

다운 받고 싶으신 분은 www.opera.com 에 가셔서 다운 받으세요

플립형 화면 보호기 랍니다.

사용자 삽입 이미지


제작한 사람 홈페이지 http://www.hanlee.com/

유명하신 웹디자이너 이신듯 하더군요..

이번에 웹 브라우져도 오페라로 바꿔봤습니다. 빠른 속도와 인터페이스, 위젯 기능도 맘에 들어요.

다만 우리나라 대부분의 웹사이트들이 IE를 기준으로 만들어져서 불편 할 때도 있습니다.

특히 쥐마켓 할때 -ㅁ-;; 사이트가 너무 난잡해서 원..=ㅁ=;;;

이번 기말고사는 이제 두과목 남았는데 빨리 보고 JSP공부하는거 마져 봐야 겠어요.

사용자 삽입 이미지
사용자 삽입 이미지


OKJSP 여비님 글 펌입니다.

아래서부터 시작.

------------------------------------------------------------------------------------------------------


오랫동안 검색되고 또 문의 받아온 부분인데 정리해서 올린다 올린다 하다가 이제서야 올리네요 ^^;

 내용은 현재 Tomcat 5.5 까지에서도 해결이 되지 않았던 한글첨부 파일 다운로드 문제에 대한 해결책중 하나 입니다.

 java/jsp 입문이나 실무에서 사용하시라고 올립니다.

테스트환경은 windows2003/SU linux kernel 2.6.x 에서 모두 정상 동작했으며 JDK 1.5.11 에서 돌렸습니다.

도움이 되시길 바랍니다 ^^;

소스 내려갑니다~

 import java.io.*;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.*;
import com.mpage.util.db.*;

/**
 * Servlet implementation class for Servlet: FileDownHelper
 *
 */
 public class FileDownHelper extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
    /**
  *
  */
 private static final long serialVersionUID = 1L;

 /* (non-Java-doc)
  * @see javax.servlet.http.HttpServlet#HttpServlet()
  */
 public FileDownHelper() {
  super();
 }    
 
 /* (non-Java-doc)
  * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  Connection con = null;
  Statement st = null;
  ResultSet rs = null;
 
  String idx = request.getParameter("idx");
 
  ServletContext sc = getServletContext();
 
  OutputStream out = null;
 
  try{
   File file = null;
   FileInputStream fis = null;
   byte[] buffer = null;
   String fileName = "";
   String ext = "";
   
   con = DBConnector.getConnection("mysql");
   st = con.createStatement();
   rs = st.executeQuery("select file_name, org_file from board where id=" + idx); // DB 에서 파일명을 가지고 온다.
   
   if(rs != null && rs.next()){
    String seper = "";
    if(System.getProperty("os.name").startsWith("Windows")){ // OS를 구분하여 구분자를 가지고 온다. -- 귀찮아서 프로퍼티에서 가져오기로 수정안함
     seper = "\\";
    }else{
     seper = "/";
    }
    String filePath = sc.getRealPath("/fileUpload") +seper+ rs.getString(1); // 현재 context의 실제 경로 하위의 경로를 설정
    fileName = rs.getString(2);
    ext = rs.getString(2).substring(rs.getString(2).lastIndexOf("."));
   
    file = new File(filePath);
    int size = 0;       // File available size 를 구해서 Buffer 의 크기 설정
   
    fis = new FileInputStream(file);
    size = fis.available();  // 파일의 사이즈를 가져온다
    buffer  = new byte[size];
    fis.read(buffer);
   
    fis.close();
   }
   /*
    * MIME type 설정하는 구문 (필요하면 더 추가하면 됨
    */
   if("zip".equals(ext)){
    ext = "application/zip";
   }else if("ppt".equals(ext)){
    ext = "application/vnd.ms-powerpoint";
   }else if("xls".equals(ext)){
    ext = "application/vnd.ms-excel";
   }else if("doc".equals(ext)){
    ext = "application/msword";
   }else if("txt".equals(ext)){
    ext = "text/plain";
   }else if("html".equals(ext)){
    ext = "text/html";
   }else if("htm".equals(ext)){
    ext = "text/html";
   }else if("jpg".equals(ext)){
    ext = "image/jpeg";
   }else if("jpeg".equals(ext)){
    ext = "image/jpeg";
   }else if("gif".equals(ext)){
    ext = "image/gif";
   }else if("psd".equals(ext)){
    ext = "image/x-photoshop";
   }else{
    ext = "application/zip";
   }
   response.setContentType(ext);
   out = response.getOutputStream();
   
   fileName = fileName.replaceAll(" ", "");
   
   // Browser 설정에 영향이 미치는 부분 처리
   if (request.getHeader("User-Agent").indexOf("MSIE 5.5") > -1) {
    response.setHeader("Content-Disposition", "filename=" +java.net.URLEncoder.encode(fileName, "euc-kr") + ";");
   }else if (request.getHeader("User-Agent").indexOf("MSIE 6.0") > -1) {
    response.setHeader("Content-Disposition", "filename=" +java.net.URLEncoder.encode(fileName, "UTF-8") + ";");
   }else{
    response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "euc-kr") + ";");
   }
   
   if(buffer != null && buffer.length > 0){
    out.write(buffer);
   }
   out.close();
  }catch(Exception e){
   //e.printStackTrace();
  }finally{
   if(out != null){try{out.flush();out.close();}catch(Exception e1){}}
  }
 }   
 
 /* (non-Java-doc)
  * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  // TODO Auto-generated method stub
 }          
}

1. 생성자는 파라미터가 없어야 한다.

2. 자바 빈즈 컴포넌트의 속성(Property)들은 읽기, 쓰기 중 적어도 하나 이상의 기능을 수행 할 수 있어야 한다.

3. getXXX()는 파라미터를 받지 않은 구조이어야 한다.

4. setXXX()는 반다시 하나의 파라미터를 받는 구조이어야 한다.

JSP 공부중..

먼저 교환권을 가져가세요

문맥 : 쓰레드(Client)가다른 쓰레드에 처리를 의뢰하고 있어 Client는 처리의 실행 결과도 얻고 싶다고 합시다.

문제 : 처리를 의뢰한 때에 실행 결과를 기다리고 있어 응답성이 저하되어 버리고 맙니다.

해결법
  우선 처리 결과와 같은 인터페이스(API)를 가진 Future를 만듭시다. 그리고 처리 개시의 시점에서 Future를 반환값으로 합니다. 처리 결과는 나중에 Future에 set합니다. 이렇게 하면 Client는Future를 경유해서 처리 결과를 좋아하는 타이밍으로 얻는(기다리는)것이 가능합니다. 이것이 Future 패턴입니다.

관련
  Client가 처리 결과를 기다리는 부분에서는 Guarded Suspention 패턴을 사용합니다.
  Future 패턴은 Thread-Per-Message 패턴으로 처리 결과를 얻고 싶을 때 사용합니다.
  Future 패턴은 Worker Thread 패턴으로 처리 결과를 얻고 싶을 때에 사용합니다.


- 자바로 배우는 디자인 패턴 입문 -

일이 올 때까지 기다리고 일이 오면 일한다.

별명 : Thread Pool, Background Thread

문맥 : 쓰레드(Client)가 인스턴스(Host)의 메소드를 호출하고 있다고 합시다.

문제
  메소드의 처리에 시간이 걸리면 응답성이 낮아지게 됩니다. 응답성을 높이기 위해서 새로운 쓰레드를 기동해서 메소드를 처리시키면 쓰레드 기동의 시간만큼 스루풋은 저하됩니다. 또 다수의 리퀘스트를 내면 다수의 쓰레드가 기동하게 되어 버려서 용량을 저하시킵니다.

해결법
  우선 처리를 실행하는 쓰레드(워커 쓰레드)를 사전에 기동해 둡시다. 그리고 리퀘스트를 표현하는 인스턴스를 워커 쓰레드에 건네는 것입니다. 그렇게 하면 새로운 쓰레드를 매회 기동할 필요가 없게 됩니다.

관련
  워커 쓰레드의 처리 결과를 호출하는 측에 건내줄 때에는 Future 패턴을 사용합니다.
  리퀘스트를 표현하는 인스턴스를 워커 쓰레드에 건내줄 떼에는 Producer-Consumer 패턴을 사용합니다.

- 자바로 배우는 디자인 패턴 입문 -