Java

자바 한글 처리

0

개발과정 중에 부딪혔던 문제 중의 하나가 한글 처리 문제였습니다. 정확한 설명은 아니겠지만 *.jsp 파일에서 *.java로 변환되고 이것이 또 .class로 컴파일 되는 과정에서 특별히 지정을 해주지 않게되면 한글이 다 뭉그러지는 것 같았습니다.


그리하야 페이지 상단에 페이지 선언을 해줍니다. 이렇게


<%@ page contentType = “text/html; charset=euc-kr” %>


이렇게 해주면 일단 왠만한 걱정은 싸 잡으셔도 될겁니다. 두번째 방법은 문자열(String)을 직접 코드 변환해주는 방법입니다. 함수로 만들어 사용해도 좋습니다.








out.println(new String((“자바속의 한글”).getBytes(“8859_1″), “EUC-KR”));


<%!
//한글 처리
public String ko(String str) {


try{
str = new String(str.getBytes(“8859_1″), “EUC-KR”);
} catch(UnsupportedEncodingException e) {
}
return str;
}
%>


<%
out.println(ko(“자바속의 한글”));
%>

JSP(Java Server Page)

0

JSP(Java Server Page)


 


 


목차


 


1  JSP Introduction


2  Database 연동


3        Session  처리


4        JavaBeans 사용


5        예외 처리


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


JavaServer Page Introduction


 


1.          JavaServer Page 정의



Java Server Pages


 


l         Are text-based documents capable of returning dynamic content to a client browser.


l         Can contain a mix of HTML code, programming code, and simple JSP tags


l         Allow access to components


l         Are an extension of servlet technology.


 


 


 


HTML or XML 같은 문서를 동적으로 생성할 있는 쉽고 강력한 방법.


 


2.  Request and Response Mechanism


1)       클라언트가 JSP request 서버에 보냄.


2)       서버는 JSP file 대한 요청임을 확인 하고 JSP container 호출.


3)       JSP container JSP file compile하여 servlet source file (.java) 생성.


4)       Javs compiler 이용 source file compile하여 클래스 파일 생성.


5)       생성된 servlet class file service method 통해 JSP request에대한 서비스 실행.


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 



The Benefits of Java Server Page


 


l         Support a component model and software reuse through the use of components.


l         Recompile automatically when changes are made to the source file


l         Simplify page development with tags.


l         Provide clear separation of Web content and code.


l         Are platform-independent


 


 


Note )  용어 정리


       Wet developer ,  Content developer , Web application developer


 


 


 


 


 


 


 



Java Server Pages Development Preparation


 


l         Web browser


l         Web server supporting JSP and Servlet.


       JSWDK , Resin , Tomcat , LWS , GNUJSP , JRUN ……


l         Text based editer


 


 


 


 


 


 


 


 


 


 


 


 



Java Server Pages Tag


 


l         JSP에서 사용하는 Tag XML 기초


          시작 tag ,  attributes ,  body ,  종료tag


l         대소문자 구별


l         대부분 <% ……….. %> tag 사용.


          action 예외


 


 


 


1.  Java Server Page(JSP) 문법


HTML, XML 태그 외에 Java Server Page는 다음과 같은 다섯 가지 유형의 정보를 JSP


태그를 사용하여 추가할 수 있다.


이들은 .jsp 화일로부터 .java 화일을 생성할 때 JspCompiler가 이해하는 JSP 태그 정보들로서 서블릿 Java 파일 소스 내에 필요한 사항들을 정의한다.


  (1) 지시문(Directives) – 페이지에 대한 전역 정보를 제공한다. import, extends, Error처리 등의


                         정보를 설정.


(2) 선언문(Declarations) – 해당 페이지로부터 생성된 서블릿의 멤버 변수와 멤버 메쏘드


                       정의.


(3) Scriptlets – 해당 페이지로부터 생성된 서블릿의 service()메쏘드에 들어가는 자바 실행


               문장.


(4) Expressions – Scriptlets과 유사하나 해당 수식의 값이 out.println()을 이용해 출력하는


                   문장으로 전환.


  (5) Actions – JavaBeans 사용, Applet Plug-in 처리등에 대한 정의.


 


2.  주석 처리


 (1) 웹 페이지(HTML, XML)에서 사용되는 주석 처리


   <!–  주석문 –>


         해당 주석문은 JSP로부터 생성된 웹 페이지의 주석문으로 사용되기 때문에 JSP


       컨테이너는 번역하지 않고 해당 문장을 그대로 출력한다.


   <!– …. <% …. %> …. –>


       동적으로 생성되는 웹 페이지의 주석문으로 처리하는 방법도 있다.


(2) JSP 주석문


   <%– 주석문 –%>


       <%– –%>사이의 문장은 JSP주석문으로 처리되기 때문에 JSP화일에 특별한


       주석을 달거나 디버깅시 사용할 수 있다.


<% /**  주석문  **/ %>


       Java언어에서 지원하는 주석문 태그를 사용하는 방법


 


3.  Directives


DirectivesJSP 컨테이너에게 정보를 전달하는 데 사용되며 JSP 수행 결과 출력 스트림 상에 출력을 생성하지 않는다.


 -.  Syntax


     <% directive  attribute=value  * %>


  -.  Directive 종류.


    - page


    - include


    - taglib


 


(1) page directive


   JSP page 전체에 대해 적용되는 속성 지정.  


<%@ page [ language="scriptingLanguage" ]


           [ extends=" className" ]


           [ import= "importList" ]


           [ session= "true|false"  ]


           [ buffer= "none|sizekb"  ]


           [ autoFlush= "true|false"  ]          


           [ isThreadSafe = true|false ]


           [ info = into_text ]


           [ errorPage = error_url ]


           [ isErrorPage = true|false ]


           [ content_type="ctinfo" ]


%>


page directiveJSP 페이지 전체에 적용되는 속성들을 적용하기 때문에 page directive 의 위치는 생성되는 Java 파일에 영향을 주지 않는다.


import 속성만 여러번 정의가 가능.


 


       1) language


language 속성은 스크립트 언어를 정의하기 위해 사용한다.


defaultJava언어.


 <%@ page language=”java” %>
*  JSP
Life cycle method.


          -  jspInit() : JSP 페이지 로딩시 처음 호출됨. 서블릿의 init()과 같음.


          -  jspDestroy() : JSP페이지 객체가 메모리에서 제거될 때 호출. destroy()에서 호출.


-          _jspService(HttpServletRequest request,HttpServletResponse response) : 서블릿의


    service() 메쏘드와 같은 역할.


    이 메쏘드는 JSP 컴파일러에 의해 자동으로 생성되므로 개발자가 정의할 수


    없다.


 


       2) import


import변수는 Java언어의 import문을 지원한다. , 해당 JSP 페이지에서 참조하는


packageclass목록을 정의한다. 참조하는 값이 하나 이상일 경우 컴마(,)로 분리


하여 표시할 수 있고 JSP 화일에서 여러 번 정의할 수 있다.


<%@ page import = “java.io.*, java.util.*” %>


<%@ page import = “java.sql.*” %>


Default import package  : javax.servlet.*,  javax.servlet.http.*,  javax.servlet.jsp.*  


                      javax.servlet.jsp.tagext.*


 


       3) session


현재 page에서 ‘session 이라는 이름의 implicit object reference 사용여부를 지정.  


sessionjavax.servlet.http.HttpSession 객체에 대한 JSP 생성 서블릿 에서의 레퍼


런스 변수 이름이다.


default값은 true이며, false로 지정하면 session 변수를 사용할 수 없다.


           <%@ page session = “false %>


 


       4) isThreadSafe


여러 클라이언트로부터 동시에 요청이 들어올 때, 이 속성을 “true”로 지정하면


여러 요청들을 multiple Invoker 쓰레드로서 동시에 처리한다.


default값은 “true”인데, 동시에 처리하면 영향을 받는 공유 데이터가 있는지 주의


해야 한다. (synchronize문제)


           <%@ page isThreadSafe = “false” %>


           * false로 지정한 경우가 SingleThreadModel을 구현한 서블릿이 된다.


        5) info


현재 page에 대한 정보를 제공하기 위해 지정하는 속성 .


Servlet.getServletInfo()를 통해서 얻을 수 있는 정보이다.


           <%@ page info = “xxx JSP ver 1.0″ %>


 


        9) isErrorPage


현재 page가 다른 JSP page의 에러 페이지로 사용되고 있는지 알려주는 속성.


이 값이 “true”이면 다른 JSP 페이지에서 발생한 Exception 객체에 대한 레퍼런스


‘exception’이라는 implicit object reference를 사용해 접근할 수 있다.


default 값은 “false”이고, 이 경우엔 ‘exception’ 변수를 사용할 수 없다.


일반적으로 공통 에러 처리 JSP화일에서 사용.


           <%@ page isErrorPage = “true” %>


 


        10) errorPage


현재 page에서 catch하지 않는 exception이 발생했을 경우에 보여줄 화면의 url


지정하는 속성.


           <%@ page errorPage = “errorpage.jsp” %>


 


       11) contentType


JSP로 부터 생성된 서블릿 클래스가 동적으로 만들어내는 파일의 MIME type


문자 엔코딩 방식을 지정한다.


type의 디폴트값은 “text/html”이고, charset은 “ISO-8859-1”이다.


           <%@ page contentType = “text/html; charset=KSC5601″ %>


 


 (2)  include directive


     지정한 file혹은 codeJSP 페이지 내에 번역 시점에 포함시키고자 할 때 사용할 수


     있는 directive.


   <%@ include file=copyright.html %>


   <%@ include file=common.jsp %>


 


   데이터를 JSP 페이지 내에 포함시키는 것은 include Directive말고도 <jsp:include page=….


   /> action 요소도 JSP에서 지원한다. include Directive에서 지정한 파일은 해당 JSP 파일내


   에 복사되어 들어와 같이 번역되고 <jsp:include page=… /> Action은 실행 시점에 해당 리


   소스를 호출하여 수행 결과를 포함하는 방법으로 서로가 의미가 다른다.


 


 (3) taglib directive


  custom tag들을 가진 “tag library”를 사용할 있도록 지정하는 directive


      <%@ taglib uri=”http://java.apache.org/tomcat/examples-taglib” prefix=”eg” %>  


   uri : custom tag들의 library가 있는 uri를 지정


   prefix : custom tag를 구분하기 위한 구분자 prefix


 



4.  Declarations


JSP 페이지에서 생성된 서블릿 클래스의 member 변수와 메쏘드 정의.


<%! ………  %>  tag 지원.


예제 코드  


   <%!


        int totalCount = 1;


 


        private synchronized int getCount() {


            return totalCount;


        }


        private synchronized void incrementCount() {


            totalCount ++;


        }


%>


 


Life Cycle을 적용하기 위해서는 jspInit()/jspDestroy()<%!  %>안에 정의해 줌으로서


JSP에서도 서블릿의 Life Cycle특징을 그대로 사용할 수 있다.


   <%!


        public void jspInit() {


            String fileName = getServletConfig().getInitParameter( “surveyFile” );


            ….       


 


        public void jspDestroy() {


            ….


       


%>


 


5.  Scriptlet


              ScriptletJSP화일의 HTML tag에 추가 시킨 java코드를 의미. 


       scriptlet내에 자바언어가 지원하는 어떤 코드도 다 사용 가능.


       Scriptlet<% %>태그 사이에 정의.


       <%  scriptlet   %>               


             






<html>


  ….


 


<br> 쇼핑한 품목들이 다음과 같습니다.  


   <%


             String[] items = cart.getItems();


                  for (int inx=0; inx < items.length; inx++)


   %>


       <li> <%= items[inx] %>


   <%   %>


….


</html>


     


                  scriptlet blockJSP로 부터 생성되는 JSP 서블릿 클래스의 _jspService() 메쏘드   구현부분에 삽입되므로 실질적인 동적 서비스를 담당.


         HTML 태그와 적절히 혼용하여 JSP처리 부분을 구현.   


 


6.  Expressions


    표현되는 값은 String형태로 out 객체에 의해 응답 처리된다.


     <%= %>안에 정의.


    <%=  expression %>


   






<html>


….


   <% EmpModel [] emps = empService.getEmployees(); %>


   <table broder=0 witdh=95%>


      <th>No      <th>사번      <th>이름      <th>부서      <th> 입사일자


       <% for ( int inx=0; inx < emps.length; inx ++  )  %>


          <tr>


            <td> <%= count++ %>


            <td> <%= emps[inx].getEmpno() %>


            <td> <%= emps[inx].getName() %>


            <td> <%= emps[inx].getDept() %>


            <td> <%= emps[inx].getHiredate() %>


       <%  %>


   </table>


….


</html>


 


                 



7.       Implict Object Reference


 






request – 사용자 입력 정보를 읽어 올 수 있는


          javax.servlet.http.HttpServletRequest 객체에 대한 참조 변수


 


response – 사용자 요청에 대한 응답을 처리하는


          javax.servlet.http.HttpServletResponse 객체에 대한 참조 변수


 


pageContext – 현재 pagecontext 값을 참조할 수 있는


            javax.servlet.jsp.PageContext 객체에 대한 참조 변수


 


session – 클라이언트의 요청에 의해 생성된 session 정보를 갖고 있는


           javax.servlet.http.HttpSession 객체에 대한 참조 변수


 


application – getServletConfig().getContext()로 얻을 수 있는 


           javax.servlet.ServletContext 객체에 대한 참조 변수


 


out – javax.servlet.jsp.JspWriter 객체에 대한 참조 변수


      JSP의 _jspService() 메쏘드에서는 PrintWriterBufferedWriter의 일부 기능을


      구현한 JspWriter 객체를 출력 스트림으로 사용한다.


 


config – javax.servlet.ServletConfig 객체에 대한 참조 변수


 


page – client의 요청에 의해 현재 수행되고 있는  class 객체에 대한 참조 변수


       java.lang.Object type.


 


exception – Error JSP page에서 유용하게 사용할 수 있는


            java.lang.Throwable 객체에 대한 참조 변수


 


 


 



7.   Actions


       actionout 스트림에 영향을 주거나, 객체를 생성, 수정하는 역할을 수행한다.       


다음 세가지 actionjava bean객체를 다루는 기능을 가진다.


<jsp:useBean>


<jsp:setProperty>


<jsp:getProperty>


      다음의 3가지 action들은 부가적인 기능을 수행한다.


<jsp:include>


<jsp:forward>


<jsp:plugin>


 


 (1) <jsp: include > action의 사용


 action을 이용하면 다른 uri에 있는 내용을 현재 page에 포함시킬 수 있다.


 <%@ include file=”uri” %>로 명기한 페이지(HTML, JSP)는 해당 JSP페이지 내에 복사된 형태로 들어와 같이 번역되고 컴파일되어 하나의 JSP 서블릿을 생성하는 방식이고, <jsp:include page=uri …> actionJSP페이지 실행 시점에 해당 uri를 실행 시켜서 그 결과를 포함하는 방식이다. 그럼으로 <jsp:include> Action을 사용할 경우 해당 리소스의 동적 수행 결과를 포함할 수 있는 장점이 있다. 


    <jsp:include page=uri flush=true />   


    또는


    <jsp:include page=uri flush=true >


            <jsp:param …. />  *


    </jsp:include>


 


page : 포함시키고자 하는 fileurl.   <jsp:param …>을 사용한 경우 해당 파라미터를 요청


      시점의 속성값으로 받아들인다.


flush : 반드시 지정해야 하는 속성으로서 현재 JSP1.1 명세에서는 “true”값만 사용할


      .  true는 out buffer  flush를 의미함.


) <jsp:include page=/jsp/include/foo.jsp flush=true/>


 


include action은 동적인 수행 결과를 포함하기 때문에 HTML, JSP, 서블릿등을 URI에 줄 수가 있다.


 


다음은 include action 사용예다.


 






<html>


<body bgcolor=”white”>


 


<font color=”red”>


 


<%@ page buffer=”5″ autoFlush=”false” %>


 


<p>In place evaluation of another JSP which gives you the current time:


 


<%@ include file=”foo.jsp” %>


 


<p> <jsp:include page=”/jsp/include/foo.html” flush=”true”/> by including the output of another JSP:


 


<jsp:include page=”foo.jsp” flush=”true”/>


 


:-)


 


</html>


 


위의 예에서 foo.jsp의 내용이 변경된 경우 include Directive는 동적으로 반영을 못하지만 include action은 변경된 사항을 실행 시점에 반영하는 결과를 알 수 있다.


 


(2) <jsp: forward > action의 사용


 action을 이용하면 현재 page의 실행을 종료하고 지정한 다른 page를 실행한 결과를   


 JSP요청 결과 전체에 포함시켜 돌려 준다.


  syntax :


    <jsp:forward page=uri />


    또는


    <jsp:forward page=uri >


            <jsp:param …. />  *


    </jsp:forward>


page : 새롭게 실행하려는 pageurl. 파라미터를 준 경우 해당 파라미터를 요청 파라미터


포함시켜 받아들인다.


 


forward ActionRequestDisparcher 클래스의 forward() 메쏘드를 이용한 것과 동일한 형태의 결과를 제공하고, HttpServletResponsesendRedirect() 와는 의미상 조금 다르다.


forward()는 해당 요청한 JSP(서블릿) 수행이 종료되고 forward()로 요청된 리소스가 수행되는 형태고 sendRedirect()는 호출 JSP(서블릿)은 계속 수행될 수 있고, 새로운 컨텍스트가 sendRedirect()에 의해 수행된다.


 


다음은 forward를 이용한 JSP의 사용예다






<!–  forward.jsp  –>


<html>


<%


   double freeMem = Runtime.getRuntime().freeMemory();


   double totlMem = Runtime.getRuntime().totalMemory();


   double percent = freeMem/totlMem;


   if ( percent < 0.5 ) 


%>


    <jsp:forward page=”/jsp/forward/one.jsp”/>


<%  else  %>


    <jsp:forward page=”two.html”/>


<%  %>


</html>


 


 



Database 연동


 


1.  JDBC (Java Database Connectivity)


     Java 환경에서 Database 연결을 위한 표준 API  제공.


     개발자 측면에서는 java.sql 패키지의 API 클래스 사용법만 알면 이를 지원하는 어떠한


     Database와도 일관된 database 통신을 있다.


     Database 벤더는 개발 플랫폼에 필요한 여러 가지 클라이언트 API 모듈을 별도로 개발


     필요가 없이 JDBC API 클래스만 구현 하면 된다.


2.  JDBC Driver


     JDBC API 구현한 클래스 .


     Database 벤더에서 제공. ( Oracle classes111.zip,  classes12.zip )


 


3.  java.sql 패키지의 인터페이스


JDBC를 구성하는 java.sql package에는 다음과 같은 interface가 있으며 각 DBMS 제품의JDBC Driver에는 이러한 interface들이 구현 되어 있다.


 


Driver – DBMS와의 연결을 맺기 위한 인터페이스


Connection – DBMS와의 세션을 유지하는 객체.


Statement – SQL을 처리할 수 있는 객체. 대부분의 SQL처리는 이 인터페이스를 이용


PreparedStatement – PrecompileSQL을 처리


CallablStatement – Stored Procedure를 처리하는 인터페이스


ResultSet – Statement를 이용한 SQL질의 결과를 나타내는 인터페이스. 일반적으로 Cursor를 의미함. JDBC 2.0에서는 커서 스크롤링 기능이 추가되었음(first(), next(), previes(), last()). 또한 Update 커서 기능이 추가되고 Fetch 사이즈 결정 및 ResultSet의 크기등의 정보를 제공한다.


ResultSetMetaData – ResultSet의 컬럼 정보를 제공


       DatabaseMetaData – Database 전체에 대한 정보를 제공


 


4.       DirverManager


    Dirver 객체 관리. (Driver Object 등록 삭제등)


    메모리에 load Driver 객체를 찾아 DBMS Connection 형성.


 


5.       Oracle JDBC Driver 설치


        Oracle 7 Driver :  classes111.zip


        Oracle 8 Driver :  classes12.zip


      설치 위치 :  jdk1.2.2\jre\lib\ext\


                   혹은 classpath dirver 압축 file 위치 설정.


 


6.       Database 연동 절차


1)       Driver loading.


  Class.forName( racle.jdbc.driver.OracleDriver );


2)       Connection 객체 획득


   String  jdbcUrl =  “jdbc:oracle:thin:@nuriproj.javanuri.com:1521:ora8″;


   String user =  “scott”;


   String password = “tiger”;


       Connection conn = DriverManager.getConnection ( jdbcUrl, user, password );


3)  Statement 객체 획득


            Statement stmt = conn.createStatement ();


4)        SQL 실행


    public ResultSet executeQuery(String sql) : SELECT문 발행시 사용                


    public int executeUpdate(String sql) : UPDATE/DELETE/INSERT 문 발행시 사용


        public boolean execute(String sql) : CREATE등의 DDL(Data Definition Language) 사용


5)       결과를 ResultSet객체로 받아 처리


         Row 이동 :  next( );


         Column 이동 :  getXXX( )        XXX: return data type(첫자 대문자)


 


7.       JSP에서 JDBC programming


Declaration jspInit()에서 database 연결 맺고, jspDestroy()에서 연결을 해제한다.


 


 


 


 


 


 


 


 


 


 


 


 


 


JSP / Session 처리


 


Stateless :  HTTP 트랜잭션은 매번 요청에 대해 독립적 이다.


          브라우저를 통한 클라이언트의 연속적인 작업이 유지되지 않으며, 해당 정보


          보관하지 않는다.


          Data 추적이나 사용자 인식 등의 서비스가 어렵다.


Stateless 단점을 보안하는 방법


          Cookie  or  Session


Cookie  :  cookie 통해 client 정보를 web browser상에 저장하는 메커니즘.


Session  :  하나의 브라우저와 서버간에 만들어진 HTTP 트랜잭션들에 연관된 데이터


           집합.  (특정 client 정보를 서버에 저장하기위한 메커니즘)


 


1.       JSP에서 Session 객체 획득


1)       DefaultScriptlet에서 session 이라는 명시적 객체 레퍼런스를 제공하여 HttpSession


    객체를 지원한다.  GetSession() method를 내부적으로 호출하여 생성한다.


    그러나 page Directive에서 <%@ page session=”false” %>로 설정하면 session 객체를


    사용할 없다.


2)       <% HttpSession session = request.getSession(false); %> session객체 혹은 null return.


2.  Login / page access 제한


1)   Login : Login 정보를 받아들이는 JSP또는 서블릿에서 사용자 로그인 정보가 정상적


          이면 getSession()으로 세션을 새로 생성.


2)   Page access 제한 : 로긴한 사용자만이 접근할 수 있는 JSP에서는


                      getSession(false)로 체크해서 리턴이 null이면 로그인을 하지 않은


                      상용자로 판단 한다.


       JSP에서 위와 같은 로직을 구사하려면 <%@ page session=”false” %> session객체를


       getSession()으로 획득하는 것을 방지하고 Scriptlet의 제일 처음 시작에서


       <% HttpSession session = request.getSession(false); %> session객체를 getSession(false)


       부터 생성하여 체크하는 로직을 구현할 수 있다.


3.  표준 세션 속성 정보(세션IDContext)를 지원하는 메쏘드


String getId() – HttpSession 객체의 ID를 리턴


boolean isNew() – HttpSession객체가 새로 생성된 것인지를 체크


long getCreationTime() – HttpSession객체가 생성된 시간을 리턴


long getLastAccessedTime()


int getMaxInactiveInterval() – 해당 세션의 유효 시간을 리턴


void setMaxInactiveInterval(int ) – 해당 세션의 유효 시간을 설정. 초단위


void invalidate() – 해당 세션에 bind된 어플리케이션 객체들을 해제시킴.


  4.  어플리케이션 데이터를 저장하거나 접근하는 메쏘드


이것은 Hashtable과 마찬가지로 key/value쌍으로 저장하고 keyvalue를 검색한다. 여기서 keyString이고 valueObject 타입이므로 어떠한 종류의 어플리케이션 데이터도 세션에 저장할 수 있다.


Object getValue(String name) : HttpSession 객체로부터 name값을 갖는 어플리케이션 데


                         이터를 가져옮.


void putValue(String name, Object value) : HttpSession 객체에 namekey값으로 해서


                         value객체를 binding. 이미 같은 이름의 객체가 있는


                         경우 replace.


String [] getValueNames() – HttpSession 객체에 저장된 어플리케이션 데이터의 key값들


                         String [] 객체로 리턴


       void removeValue(String name) – HttpSession 객체에 저장된 어플리케이션 데이터를


                                 name이라는 key값으로 찾아서 삭제


  


  5.  Session구현 가이드


       (1)  세션은 브라우져상에서 생성되는 것이 아니고 서블릿에서 생성하는 것이다.


           브라우져에는 생성된 세션 객체에 대한 ID정보가 보내지고, 요청이 들어왔을 때,


           서블릿에서 세션ID를 통해 세션객체와 연결한다.


       (2)  브라우져의 요청이 들어왔을 때 서블릿은 URL요청으로 부터 세션ID를 읽어 세


           이 존재하는지를 체크한다. 


(3)        세션을 요청하는 모든 서블릿들은 같은 서블릿 컨텍스트 영역에 있을 경우 하


     의 클라이언트당 하나의 세션을 공유하여 사용한다.


       (4)  비즈니스 로직에 의해 현재 사용되고 있는 세션을 서블릿에서 무효화 시키는


            방법이 제공된다. session.invalidate()를 호출하면 해당세션은 그 즉시 사용이


            중지된다.


        (5)  세션 객체는 또한 Time out이 되면 무효화된다. 세션 관리자는 주기적으로


            생성된 모든 세션 객체의 LastAccessTime을 체크하여 default30분이


            지난 것은 invalidate()호출을 통해 무효화 시킨다.    


        (6)  보안을 위해 세션ID 값을 암호화 할 수 있다.


        (7)  Java Servlet 2.2 명세부터는 분산 서블릿 엔진에서 세션을 공유할 수 있는


             방법을 제공하고 있다. 이를 위해 HttpSessionsetAttribute() / putValue()


             메쏘드는 Serializable 객체만을 바인딩한다.


 


 


 


 


Java Beans 사용


 


JavaBean :  Java언어로 개발된 포터블하고, 플랫폼 독립적인 컴포넌트 모델을 의미한다.


컴포넌트란 :  소프트웨어 레고 블록, 또는 부품으로 표현될 수 있는 잘 설계된 독립된


              모듈을 의미한다.


JSPJavaBeans 컴포넌트를 결합하고자 하는 이유는 웹에서 필요한 공통적인 기능들을 매번 JSP에서 코딩하지 않고 JavaBeans컴포넌트로 개발하여 재사용 하자는 데 의미가 있는 것이다.


1. Introspection


     Bean의 속성과 메쏘드를 찾아 제어할 수 있는 특징.


     JavaBeans 컴포넌트 명세에서는 Naming Convention을 제시.


2. Customization


     개발자는 해당 Bean을 디자인 시점에 자신의 어플리케이션 상황에 적합하도록


     커트마이징 할 수 있다.


3. Event


     Java 위임형 이벤트 모델을 적용하여 빈과 빈간의 통신과 연결이 가능하다.


     Listener 인터페이스 구조로 서로 연결될 수 있다.


4. Properties


     Bean은 속성을 가지고 있고, 속성을 핸들링 할 수 있는 get/set 메쏘드를 제공한다.


     성을 변경하면 자동으로 get/set 메쏘드가 수행될 수 있도록 할 수 있다. 이것은 JSP


     getProperty/setProperty 태그와 관련이 된다.


5. Bean class


     Bean도 하나의 Java Class이고, Java Beans API명세에서 제시하는 Naming Convention을 따


     름으로서 introspection이 가능한 클래스를 Bean이라고 한다.


6. Naming Convention


     (1) Bean Property – getXXX() / setXXX() accessor method제공


    (i) read-only – getXXX()만 제공


    (ii) write-only – setXXX()만 제공


    (iii) read/write – getXXX()/setXXX() 제공


     (2) Boolean Property – isXXX() / setXXX() access method제공


           여기서 XXXProperty 이름이고 첫 문자는 대문자로 시작


7. JSP에서 다음 세 가지 표준 action 태그는 bean 객체를 다루는 기능을 제공한다.


<jsp:useBean>


<jsp:setProperty>


      <jsp:getProperty>


 


(1) <jsp:useBean> action의 사용


    다음은 <jsp:useBean> action을 사용하는 문법이다.


    <jsp:useBean id=name scope=page|request|session|application  typeSpec />


typeSpec  :: =class=className |


            type=typename |


     class=className type=typeName |


     beanName=beanName type=typeName |


해당 Actionbody를 가질 경우엔 다음과 같다.


    <jsp:useBean id=name scope=page|request|session|application  typeSpec >


         body


      </jsp:useBean>


    id=“name”


       선언한 범위 내에서 Bean이나 object 클래스를 참조하는 변수 명을 정의한다. 


       _jspService() 메쏘드 내에서 해당 Bean객체를 참조하는 로칼 변수를 정의한다고 생각


       하면 된다.


    scope


       scope 속성은 선언한 Bean객체의 Life Cycle을 의미한다.


       default 값은 page이다.


page : 현재 page  javax.servlet.jsp.PageContext 로부터 객체를 찾는다.


             객체는 현재 요청 기간 동안 살아 있다.


request : 현재 pageServletRequest 객체에서 getAttribute( name )메쏘드를


         이용해 Bean객체를 찾고, 없으면 새로 객체를 생성해서


         setAttribute( “name”, name )으로 저장한다.


session : 현재 page가 소속된 HttpSession object에서 객체를 찾고 없으면, bean


        객체를 생성한 후, session에 등록한다. 같은 session의 다른 page에서


        같은 bean을 사용하는 경우엔 이미 생성된 bean을 이용하게 된다.


        객체는 현재 session기간 동안 살아 있다.


        application : 현재 pageServletContext object에서 객체를 찾는다.


    class


해당 객체가 생성될 class이름을 fully qualified name으로 지정한다.


    type


id=”name”에서 정의한 참조 변수의 데이터 타입을 지정한다. classtype 또는, classsuper class 또는 classimplement했던 interface등을 지정할 수 있다.


    beanName


       Bean 클래스 이름을 지정한다.


 


      (2) <jsp:setProperty> action의 사용


action을 이용해서 <jsp:useBean>을 통해 생성된 bean객체에 사용자의


HttpRequest를 통해 빈 객체의 속성에 값을 저장할 수 있다.


  name: <jsp:useBean>에서 정의한 빈 객체의 name


  property : 값을 저장하려는 bean객체의 property 이름을 명시한다.


            값이 “*”인 경우엔, HttpRequest으로부터 전달된 필드들의 이름과


            일치되는 property에 값을 저장한다.  null string이 전달되는


            경우엔 beanproperty에 아무 영향도 미치지 않는다.


  param : bean의  property 이름과 지정하고자 하는 request parameter 이름이


          다른 경우 사용한다.  생략하면 property 값과 동일하다고 간주한다.


  value : bean property에 지정하고자 하는 값을 지정한다.


        여기에는 expression도 사용할 수 있다.


               ) <jsp:setProperty name=results property=row value=<%= i + 1 %> />


 


     (3) <jsp: getProperty > action의 사용


  action을 이용하면 bean객체의 property값을 쉽게 가져올 수 있다.


  해당 propertygetXXX()메쏘드가 있는 경우 사용이 가능하다.


  syntax :


        <jsp:getProperty name=beanName property=propName />


  name : <jsp:useBean>으로 생성한 bean객체의 이름


         property : 값을 읽어 오려는 property의 이름


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


예외 처리


 


1.  Runtime Exception


1)        Run-time Exception 복구 있는 error program 실행 시에 발생 한다.


2)        JSP에서 exception 정보는 exception 이라는 implicit object reference 의해 아낼 있다.


3)        exception reference 이용해 client에게 발생한 exception 대한 정보를 보여 있는 JSP 생성할 있다.


 


2.  Creating an Exception Tracking Solution


1)       JSP scriptlet 이나 components에서  발생할 exception 규정한다.


직접 개발한 component 아닐 경우는 개발자에게 발생 exception 정보 문의.


2)       JSP page exception page명을 include .


Page directive errorPage attribute exception 처리 page 명시.


3)       exception page 개발.


4)       exception page에서 exception reference 이용 exception 정보를 얻어냄.


        Page directive isErrorPage attribute ‘ture’ 지정.


5)       (Optional)  -  exception 발생시 user 무슨 일을 하고 있었는지 알아 있도록 추적 메커니즘을 구현 하여라.


 


3.  The exception Implicit Object Reference


   <%= exception.toString() %>  :  exception 출력.


   <% exception.printStackTrace() %>  :  error stream 모든 error list 출력.


   <%= exception.getMessage() %>  :  error 상세 정보 출력.


 


 

인코딩 캐릭터셋

0

 

 

System.out.println(“file.encoding:” + System.getProperty(“file.encoding”));

Locale loc = Locale.getDefault();

System.out.println(loc.getDisplayLanguage(Locale.US));

 

SELECT * FROM v$nls_parameters
WHERE parameter=’NLS_CHARACTERSET’ or
parameter=’NLS_LANGUAGE’

 

select userenv(‘LANGUAGE’) from dual

 

KO16KSC5601
KO16MSWIN949
UTF8       
AL32UTF8

 

  String aa = request.getParameter(“search_value”);
  System.out.println(aa);
  if(aa == null) aa = “”;

  int i = 1;
  System.out.println(i++ + new String(aa.getBytes(“euc-kr”)));
  System.out.println(i++ + new String(aa.getBytes(“MS949″)));
  System.out.println(i++ + new String(aa.getBytes(“UTF-8″)));
  System.out.println(i++ + new String(aa.getBytes(“ksc5601″)));
  System.out.println(i++ + new String(aa.getBytes(“8859_1″))); // 5
  
  System.out.println(i++ + new String(aa.getBytes(“euc-kr”) , “euc-kr”));
  System.out.println(i++ + new String(aa.getBytes(“MS949″) , “euc-kr”));
  System.out.println(i++ + new String(aa.getBytes(“UTF-8″) , “euc-kr”));
  System.out.println(i++ + new String(aa.getBytes(“ksc5601″), “euc-kr”));
  System.out.println(i++ + new String(aa.getBytes(“8859_1″), “euc-kr”));  // 10
  
  System.out.println(i++ + new String(aa.getBytes(“euc-kr”) , “MS949″));
  System.out.println(i++ + new String(aa.getBytes(“MS949″) , “MS949″));
  System.out.println(i++ + new String(aa.getBytes(“UTF-8″) , “MS949″));
  System.out.println(i++ + new String(aa.getBytes(“ksc5601″), “MS949″));
  System.out.println(i++ + new String(aa.getBytes(“8859_1″), “MS949″)); //15
  
  System.out.println(i++ + new String(aa.getBytes(“euc-kr”) , “UTF-8″));
  System.out.println(i++ + new String(aa.getBytes(“MS949″) , “UTF-8″));
  System.out.println(i++ + new String(aa.getBytes(“UTF-8″) , “UTF-8″));
  System.out.println(i++ + new String(aa.getBytes(“ksc5601″), “UTF-8″));
  System.out.println(i++ + new String(aa.getBytes(“8859_1″), “UTF-8″));  //20
  
  System.out.println(i++ + new String(aa.getBytes(“euc-kr”) , “ksc5601″));
  System.out.println(i++ + new String(aa.getBytes(“MS949″) , “ksc5601″));
  System.out.println(i++ + new String(aa.getBytes(“UTF-8″) , “ksc5601″));
  System.out.println(i++ + new String(aa.getBytes(“ksc5601″), “ksc5601″));
  System.out.println(i++ + new String(aa.getBytes(“8859_1″) , “ksc5601″));  // 25
  
  System.out.println(i++ + new String(aa.getBytes(“euc-kr”) , “8859_1″));
  System.out.println(i++ + new String(aa.getBytes(“MS949″) , “8859_1″));
  System.out.println(i++ + new String(aa.getBytes(“UTF-8″) , “8859_1″));
  System.out.println(i++ + new String(aa.getBytes(“ksc5601″), “8859_1″));
  System.out.println(i++ + new String(aa.getBytes(“8859_1″) , “8859_1″));  // 26

 

 

[출처] 인코딩 캐릭터셋|작성자 와로

JSP Tag Library

0

































JSP Tag Library


kenu
2001-08-27 2:04오전

JSP Tag Library 란 custom tag 를 만들어서 사용하는 JSP 의 고급기술이라고 할 수 있는 것 중의 하나입니다. Bean 보다 진일보된 개념으로 MVC(Model View Control) 을 완벽하게 구현해줍니다.

<% %> 를 사용하지 않고도 동적인 표현을 가능하게 하므로 소스코드에 대해서 디자이너가 보다 쉽게 접근할 수 있습니다. (^^ 아직 저도 실무에 적용해보진 않았습니다.)

아직 저도 실력이 미천한 관계로, 책보고 공부한 것을 정리 겸 해서 썰을 풀어보겠습니다. 사실 소스 설명보다는 파일 위치만 알려주는 정도일 것이니 너무 기대는 하지마세요.

일단 jsp tag library 를 사용하시려면 jsp 엔진이 jsp spec 1.1 이상이어야 합니다. jsp 1.0 은 tag library 를 지원하지 않습니다. 이 강좌를 테스트한 jsp 엔진은 Tomcat 3.2.3 입니다.

기초적인 단계로 tag 를 이용해서 단순히 text 를 출력하는 것을 시도해보겠습니다. 소스의 출처는 Manning출판사에서 나온 JSP Tag Libraries 책 chapter3 입니다. 제가 경로랑 text를 약간 수정한 것입니다.

일단 tag handler class 는 java 파일인데, javax.servlet.jsp.* 을 import 하기 때문에 servlet.jar 파일이 classpath 에 잡혀있어야 합니다. resin 일 경우 jsdk22.jar 나 jsdk23.jar 파일이 상응합니다. jakarta-tomcat/lib/ 디렉토리에 있는 servlet.jar 파일을 다음 위치로 복사해줍니다. 권장은 시스템 재부팅입니다. 안해도 먹히는 경우가 있지만, ^^; 어디까지나 권장입니다. 다른 방법은 환경변수(classpath)에 추가해도 되겠지만 전 이 방법을 더 선호합니다. 편하니까요. 어느 위치냐 하면 jdk1.3/jre/lib/ext 아래입니다.

tag handler class 인 OkTag.java 파일입니다. tag 를 처리(handle)해주는 것이죠. 파일의 위치는 package 와 관계있습니다. 물론 classpath 에 자신이 있으신 분들은 자유롭게 위치시켜주세요. 아닌 분들은 절 따라오시구요. 일단 ROOT 디렉토리가 c:/jakarta-tomcat/webapps/ROOT 라고 가정하고 이것은 / 로 표시를 하겠습니다. /WEB-INF 는 c:/jakarta-tomcat/webapps/ROOT/WEB-INF 와 같은 뜻입니다. (^^; 사실 경로 부분 설명하기가 제일 힘듭니다.) 이 소스를 /WEB-INF/classes/ok/tag/OkTag.java 위치에 저장합니다.
OkTag.java
package ok.tag;

import java.io.IOException;

import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;

public class OkTag
extends TagSupport {

public int doStartTag()
throws JspException
{
try {
pageContext.getOut().print(“OKJSP 태그라이브러리”);
} catch(IOException ioe) {
throw new JspTagException(“Error: IOException while writing to the user”);
}
return SKIP_BODY;
}
}




아주 가장 기본적인 tag handler 입니다. 이 뼈대를 갖고 점진적으로 확장을 하면서 코딩을 하게 되죠. 기초라는 얘기는 아주 쉽다란 뜻도 있지만, 없어서는 안된다는 뜻도 갖고 있습니다. 코드 하나 하나를 눈여겨 보시면 됩니다. 뭐 굳이 외울 필요까지는… 왜냐하면 3번이상 반복하면 저절로 외워지게 됩니다.(*_*; 천재냐구요? 옙 저는 천재, 퍽# 크헉#$%#$,~ T_T; 자꾸 사용하면 저절로 외워진다는 뜻임다. 그게 와땀니다.)

컴파일은 도스창(cmd 창) 띄우고 cd c:/jakarta-tomcat/webapps/WEB-INF/classes/ok/tag 로 가서, javac OkTag.java 하시면 됩니다.

다음에 필요한 파일은 tld(Tag Library Descriptor) 설명파일입니다. tag handler file의 위치와 필요한 속성들을 설명해주는 파일이죠. jsp 엔진으로 하여금 tag handler 를 빨리 인식하도록 해주는 역할을 하는 파일입니다. 소스의 문법은 xml 입니다. 어~ 저기 가지마세요. xml 별로 어려운 거 아니니까요. 아주 기본적인 xml 규칙만 알고 있으면 됩니다. 그거 별거 없슴다. 20줄도 안됨다. 고저 우리 연변에서는 20줄짜리 tld는 tld 축에도 못낍니다. 100줄짜리 정도 되야 좀 쓸만한 tld 구나라고 생각합니다. 10000줄짜리 tld 파일 보셨슴니까. 퍽#@#$#!@ (^^; 죄송합니다. 수다맨이 요즘 너무 좋아서리… 좀 따라해봤습니다.)

oktags.tld
<?xml version=”1.0″ encoding=”ISO-8859-1″ ?>
<!DOCTYPE taglib PUBLIC “-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN”
“http://java.suncom/j2ee/dtds/web-jsptaglibrary_1_1.dtd”>

<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>oktg</shortname>
<uri> http://www.okjsp.pe.kr/ok-taglib </uri>
<info>
A simple sample tag library
</info>

<tag>
<name>oktag</name>
<tagclass>ok.tag.OkTag</tagclass>
<bodycontent>empty</bodycontent>
<info>
Just Beginning.
</info>
</tag>
</taglib>




다음에 필요한 파일은 tld(Tag Library Descriptor) 설명파일입니다. tag handler file의 위치와 필요한 속성들을 설명해주는 파일이죠. 또한 jsp 소스에서 사용되는 이름을 지정해줍니다. oktag 라는 tag를 사용하게 될 것입니다. 소스의 문법은 xml 입니다. 어~ 저기 가지마세요. xml 별로 어려운 거 아니니까요. 아주 기본적인 xml 규칙만 알고 있으면 됩니다. 그거 별거 없슴다. 20줄도 안됨다. 고저 우리 연변에서는 20줄짜리 tld는 tld 축에도 못낍니다. 100줄짜리 정도 되야 “좀 쓸만한 tld 구나”라고들 말 합니다. 10000줄짜리 tld 파일 보셨슴니까. 퍽#@#$#!@ (^^; 죄송합니다. 수다맨이 요즘 너무 좋아서리… 좀 따라해봤습니다.). 파일의 위치는 /WEB-INF/oktags.tld 입니다.

파일의 위치는 /WEB-INF/web.xml 입니다. 문서의 맨 첫줄은 반드시 <?xml version=”1.0″ encoding=”ISO-8859-1″?> 로 시작해야 합니다. 이 웹 xml은 tld 파일을 jsp 엔진 하여금 tag handler 를 빨리 인식하도록 해주는 역할을 하는 파일입니다. <taglib-uri> 에 관해서는 jsp 소스에서 지정하는 uri와 맞아야합니다만 현재로서는 저도 명확하게 이해를 하지 않은 부분입니다.
web.xml
<?xml version=”1.0″ encoding=”ISO-8859-1″?>

<!DOCTYPE web-app
PUBLIC “-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN”
“http://java.sun.com/j2ee/dtds/web-app_2_2.dtd”>

<web-app>
<taglib>
<taglib-uri>

http://www.okjsp.pe.kr/ok-taglib

</taglib-uri>
<taglib-location>
/WEB-INF/oktags.tld
</taglib-location>
</taglib>
</web-app>




이상 3개의 파일을 사용하는 jsp 파일은 다음과 같습니다. 이 파일을 /jsptag.jsp 로 저장( / 디렉토리)한 다음에 브라우저에서 http://localhost/jsptag.jsp 를 호출해 보십시오.
jsptag.jsp
<%@ page contentType=”text/html;charset=euc-kr”%><%@ taglib
uri=”http://www.okjsp.pe.kr/ok-taglib”
prefix=”jspx” %>
<html>
<title><jspx:oktag/></title>
<body>
Exceuting your first custom tag… <b><jspx:oktag/></b>
</body>
</html>

Go to Top