지난 2009년 5월 18일, SUN의 CEO인 Jonathan Schwartz는 자신의 블로그에서

"Will the Java Platform Create The World's Largest App Store?"


라는 제목으로 영상 포스팅을 올렸습니다. 그는 거기서 아래처럼 말했습니다. 의역이 많이 들어갔습니다. ㅡ0-);; A4 2페이지분량의 글이었지만, 핵심은 마지막 몇줄 안되더군요. A4 2페이지 읽는데 많은 시간이 걸리네요.ㅠㅅ-) 영어만 보면 졸려.
  오는 2009년 6월 2일, 샌프란시스코에서 JavaOne(http://java.sun.com/javaone/) 을 통해 SUN 사에서는 새로운 플랫폼이라고 할 수 있는 JavaFX(http://www.sun.com/software/javafx/index.xml, 공식 홈페이지 : http://www.javafx.com/)를 공식적으로 선보일 예정이다. 이 JavaFX를 기반으로 하는 Project Vector도 선보일 것으로 보입니다.


RIA 개발 플랫폼이라고도 할 수 있는 JavaFX가 공식 발표되면사람들의 많은 관심과 함께 새로운 흐름을 만들어내지 않을까라는 당연한 생각을 하게 됩니다. ^^ 조만간 JavaFX를 통해제작된 세계최대의 app Store의 탄생을 기다려 봅니다. 이클립스에서도 JavaFX 관련한 Plug-in을 내놓을까요??




● SUN CEO Jonathan's blog
http://blogs.sun.com/jonathan

● JavaFX 관련 홈페이지
http://www.sun.com/javafx
http://www.javafx.com

● 플랫폼(PlatForm) 이란 무엇인가?
http://www.ihoney.pe.kr/353

● 대표적인 App Sotre (APPLICATION Store)
애플 스토어 : http://store.apple.com/kr
MS 앱스토어 : http://www.microsoft.com/emea/windowsmobileapps/default.mspx
SK 앱스토어(9월 출시예정) : http://tvpot.daum.net/my/MyClipView.do?clipid=14651110&ownerid=.ywpQd7EUPU0

● JavaFX란 무엇인가? 많이 부족해서 부끄럽군요....ㅡ0-);;
http://java.ihoney.pe.kr/9
http://java.ihoney.pe.kr/26

Contact.java

  1. import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class Contact extends HttpServlet {

        public void doGet(HttpServletRequest req, HttpServletResponse res){
            try {
                res.setContentType("text/html; charset=KSC5601");
                PrintWriter out  = res.getWriter();
                req.setCharacterEncoding("KSC5601");
                String number = req.getParameter("number");
                String name = req.getParameter("name");
                String address = req.getParameter("address");
                out.println("<html>");
                out.println("<head><title>Contact 서블릿 실행하기</title></head>");
                out.println("<body><h3> " +number + " 번 당신!!<h3><br>");
                out.println("이름은 " + name + " 이고!!!");
                out.println("사는 곳은 " + address + " 가 맞지!?");
                out.println("조사하면 다나와~~ ㅡㅅ-)ㅋ");
                out.println("</body>");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

어제 작성했던 doPost()를 doGet() 방식으로 변경했다. GET 방식은 실행될 때, 주소표시줄에 파라메터(인자)의 값이 모두 나타난다.

그래서 주소 표시줄에서 http://localhost:8080/servlet/Contact?number=700&name=허니몬&address=경기도 라고 입력하면 doGet() 메소드가 호출되어 나타난다. GET 방식으로 넘어갈 때는 서블릿 뒤에서 ? 부터 시작하여, 각 파라메터마다 & 으로 연결이 된다.

MessageServlet.java

  1. import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class MessageServlet extends HttpServlet {
        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

            res.setContentType("text/html;charset=KSC5601");
            // setContentType 를 잘못 입력할 경우, 컴파일 시 다운로드 하시겠습니까? 라고 나온다.
            PrintWriter out = res.getWriter();

            //태그<tag> 사용할 때는 보다시피 .println() 메소드 안에 사용해주면 된다.
            out.println("<html>");
            out.println("<head><title>Hello Servlet</title></head>");
            out.println("<body>");
            out.println("Message Servlet : ");
            out.println("<a href='HelloServlet'>HelloServlet Link</a>");
    out.println("<a href='Contact?number=700&name=허니몬&address=경기도'>Contact Servlet Link</a>"); //에서 보는 것처럼 서블릿을 호출하면서 뒤에 ?로 하여 매개변수들을 직접 지정해줄 수도 있다.
            out.println("</body>");
            out.println("</html>");
            out.close();

        }
    }

doPost() 메소드는 반드시 HTML <FORM METHOD=POST> 에 의해서만 호출되어 사용이 가능하다.

 

● 폼 데이터 처리(09/05/18 배운 내용 하단부에 입력됨)

HTML의 폼에서 태그에 사용된 이름이 유일한 경우에는 getParameter9)로 값을 알아볼 수 있었다. 하지만, 동일한 이름이 여러 번 사용된 경우에는 어떻게 될까? 이러한 경우에는 전달되는 값도 여러 개이다. 따라서 값을 얻을 때 여러 개의 값을 저장할 수 있는 배열 형태를 사용해야 한다. HttpServletRequest는 이러한 용도로 getParameterValues() 메소드를 제공한다. 이 메소드는 다음 예와 같은 방법으로 사용할 수 있다. 이 메소드를 사용할 때 주의할 점은 해당 이름으로 값이 전달되지 않는 경우에 리턴 값이 "null"이 올 수도 있기 때문에 "null"인지 여부를 반드시 확인하여야 한다.

폼처리는 중요합니다~!!! Check it up now!! Bebe!! 베뤼베뤼 임포딴뜨!!! 유노우!!!! 푸햐햐햐햣!!

 

예 : 값이 여러 개 전달되는 경우

  1. String values[] = res.getParameterValues("name");
    if ( values != null) {
       ...
    }

※ 전달되는 값

HTML 의 폼(Form)에서 Input 타입이 text인 경우에는 사용자가 입력한 문자열이 서블릿에 전달된다. 그런데 입력 타입이 checkbox나 radio인 경우에는 어떤 값들이 전달될까? HML 폼에서 체크박스를 사용하면 선택된 체크 박스의 value 속성으로 기술된 값만 서블릿에 전달된다. 만약 HTML 폼의 체크 박스에 value 속성을 기술하지 않으면 'on' 값이 서블릿에 전달되기 때문에 주의해야 한다.

 

예 : 파라미터 이름을 모를 경우(잘 사용하지 않는다.)

  1. import java.util.Enumeration; //필요

    Enumeration e = req.getParameterNames(); // 이전에서 사용한 파라메터들을 몽땅 주머니에 때려넣는 거라고 생각하면 된다.
    while( e.hasMoreElements() ) {
       String name = (String) e.nextElement();
       String value = req.getParameter(name);
       if (values != null){
          for(int i = 0; i < values.length; i++ ) {
             out.println("<li>" + name + " : " + values[i]);
          }
       }
    }

 

resin.conf를 수정하여, 작업하는 폴더를 변경하기

resinConfEdit.JPG

이 작업(resin.conf를 변경한 다음 웹엔진 다시 시작하기)을 마친 다음에 C:\myservlet 폴더에 가면 resin 작동에 필요한 폴더들을 스스로 생성한다.

앞으로 서블릿 작업은 c:\myservlet\WEB-INF\classes에서 사용하면 된다.

resinConfEditCreateFolder.JPG

서블릿을 제외한 파일들은 c:\myservlet\ 에 저장하면 된다.

 

JdbcOracleServlet.java

  1. import java.io.*;
    import java.sql.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class JdbcOracleServlet extends HttpServlet {
        String connect = new String("jdbc:oracle:thin:@127.0.0.1:1521:cjedu");
        String user = "scott";
        String passwd = "tiger";

        public void init(ServletConfig conf) throws ServletException {
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("Constructor Succeeded");
        }

        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
            Connection con;
            PrintWriter out;
            Statement stat;

            res.setContentType("text/html; charset=euc-kr");
            out = res.getWriter();
            try {
                con = DriverManager.getConnection( connect, user, passwd );
                stat = con.createStatement();
                ResultSet rs = stat.executeQuery("SELECT * FROM customer");

                out.println("<html><head><title>JdbcServlet Test</title></head>");
                out.println("<body>");
                out.println("<h1>JdbcOracleServlet Test</h1>");
                out.println("<p>This is the out form of the JdbcOracleServlet Test</p>");

                while ( rs.next() ) {
                    String num = rs.getString(1);
                    String name = rs.getString(2);
                    String address = rs.getString(3);
                    out.println( num + " -- " + name + " -- " + address );
                    out.println("<p>");
                }

                out.println("</body></html>");

                out.close();
                rs.close();
                stat.close();
                con.close();

            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    }

컴파일 후, http://localhost:8080/servlet/JdbcOracleServlet 하면 된다. ㅡㅅ-)b

JdbcOracleServlet Test (이렇게 나오면 된다.)

This is the out form of the JdbcOracleServlet Test

111 -- dada -- seoul

211 -- dayon -- seoul

311 -- mel gibson -- la

411 -- tom cruise -- seoul

511 -- hue grant -- la

611 -- diane soyer -- london

711 -- tom hanks -- london

811 -- gim carry -- seattle

911 -- shone cornery -- seattle

121 -- george cloony -- florida

131 -- michel phiper -- tokyo

141 -- allec boldwin -- beijing

337 -- bella -- la

418 -- jerry -- la

586 -- tom -- seoul

739 -- merry -- paris

200 -- honeymon -- gyunggi

333 -- kim -- gyounggi

444 -- kim -- nara

  1. //코드를 살짝 수정하면!!!
  2. import java.io.*;
    import java.sql.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class JdbcOracleServlet extends HttpServlet {
        String connect = new String("jdbc:oracle:thin:@127.0.0.1:1521:cjedu");
        String user = "scott";
        String passwd = "tiger";

        public void init(ServletConfig conf) throws ServletException {
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("Constructor Succeeded");
        }

        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
            Connection con;
            PrintWriter out;
            Statement stat;

            res.setContentType("text/html; charset=euc-kr");
            out = res.getWriter();
            try {
                con = DriverManager.getConnection( connect, user, passwd );
                stat = con.createStatement();
                ResultSet rs = stat.executeQuery("SELECT * FROM customer");

                out.println("<html><head><title>JdbcServlet Test</title></head>");
                out.println("<body>");
                out.println("<h1>JdbcOracleServlet Test</h1>");
                out.println("<p>This is the out form of the JdbcOracleServlet Test</p>");
                out.println("<table border=1  width=300>");
                out.println("<tr><th>번호</th><th>이름</th><th>주소</th></tr>");

                while ( rs.next() ) {
                    String num = rs.getString(1);
                    String name = rs.getString(2);
                    String address = rs.getString(3);
                    out.println("<tr>");
                    out.println("<td>"+ num + "</td><td>" + name + "</td><td>" + address + "</td>");
                    out.println("</tr>");
                }
                out.println("</table>");

                out.println("</body></html>");

                out.close();
                rs.close();
                stat.close();
                con.close();

            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    }

요렇게도 된다. +_+)

JdbcOracleServlet.JPG

 

서블릿(Form method = get) 을 이용하여 CustomerFind 서블릿에서 파라메터를 받아서 쿼리를 처리하여 출력하여 보자. <input> 태그들에 name 과 value를 입력하는 걸 잊지 말자. req.getParameter('name');으로 빼와야 한다.

JdbcOracleServlet.java

  1. import java.io.*;
    import java.sql.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class JdbcOracleServlet extends HttpServlet {
        String connect = new String("jdbc:oracle:thin:@127.0.0.1:1521:cjedu");
        String user = "scott";
        String passwd = "tiger";

        public void init(ServletConfig conf) throws ServletException {
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println("Constructor Succeeded");
        }

        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
            Connection con;
            PrintWriter out;
            Statement stat;

            res.setContentType("text/html; charset=euc-kr");
            out = res.getWriter();
            try {
                con = DriverManager.getConnection( connect, user, passwd );
                stat = con.createStatement();
                ResultSet rs = stat.executeQuery("SELECT * FROM customer");

                out.println("<html><head><title>JdbcServlet Test</title></head>");
                out.println("<body>");
                out.println("<h1>JdbcOracleServlet Test</h1>");
                out.println("<p>This is the out form of the JdbcOracleServlet Test</p>");
                // <Form> 태그 추가
                out.println("<form method = 'get' action = '/servlet/CustomerFind'>");
                out.println("<table border=1  width=300>");
                out.println("<tr>");
                out.println("<select name='title'>");
                out.println("<option value='num'>번호");
                out.println("<option value='name'>이름");
                out.println("<option value='address'>주소</select>");
                out.println("<input type='text' name='search'><input type='submit'>");

                out.println("</tr>");
                out.println("<tr><th>번호</th><th>이름</th><th>주소</th></tr>");

                while ( rs.next() ) {
                    String num = rs.getString(1);
                    String name = rs.getString(2);
                    String address = rs.getString(3);
                    out.println("<tr>");
                    out.println("<td>"+ num + "</td><td>" + name + "</td><td>" + address + "</td>");
                    out.println("</tr>");
                }
                out.println("</table></form>");

                out.println("</body></html>");

                out.close();
                rs.close();
                stat.close();
                con.close();

            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    }

 CustomerFindSearch.JPG

CustomerFind.java

  1. import java.io.*;
    import java.sql.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class CustomerFind extends HttpServlet {
        private String connect = new String("jdbc:oracle:thin:@127.0.0.1:1521:cjedu");
        private String user = "Scott";
        private String passwd = "tiger";


        public void init(ServletConfig conf) throws ServletException {
            // JDBC 드라이버 등록하기
            try {
                Class.forName("oracle.jdbc.driver.OracleDriver");
            } catch (Exception e) {
                e.printStackTrace();
            }


        }

        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
            Connection con; //Connect 생성
            Statement stat; //Statement 생성
            PrintWriter out;//PrintWriter 생성

            res.setContentType("text/html; charset=euc-kr");
            out = res.getWriter();
            try {
                con = DriverManager.getConnection( connect, user, passwd );
                stat = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
                String stitle = req.getParameter("title");
                String search = req.getParameter("search");
                String sql = "Select * from customer where " + stitle + " like '%" + search + "%'";

                ResultSet rs = stat.executeQuery(sql);
                out.println("<html><head><title>CustomerFind Servlet Execute</title></head><body>");
                out.println("<h1>JdbcOracleServlet Execute CustomerFind Servlet</h1>");
                out.println("INPUT Query : " + sql +"<br><br>");

               
                // 검색된 결과값 출력하기
                if ( rs.next() == true ) {
                    rs.beforeFirst();
                    out.println("<table border=1 width=350>");
                    out.println("<tr><th>번호</th><th>이름</th><th>주소</th></tr>");
                    while ( rs.next() ) {
                        String num = rs.getString(1);
                        String name = rs.getString(2);
                        String address = rs.getString(3);
                        out.println("<tr>");
                        out.println("<td>" + num + "</td><td>" + name + "</td><td>" + address +"</td>");
                        out.println("</tr>");
                    }
                } else {
                    out.println("<h4>아쉽지만, 찾으시는 데이터가 없습니다.</h4>");
                }


                out.println("</table></body></html>");
               
                out.close();    //PrintWriter 파이프 종료
                rs.close();        //ResultSet 종료
                stat.close();    //Statement 종료
                con.close();    //Connection 종료
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }

CustomerFindSearchResult.JPG

 

CustomerFindSearchNoResult.JPG

 


storedata.sql

  1. create table store(pid varchar2(3) primary key,
    pkind varchar2(20) not null, -- 종류
    pname varchar2(20) not null, --이름
    pexp varchar2(50) not null, -- 설명
    pnum number(3) not null, -- 수량
    pmaker varchar2(100) ); -- 제조사

    insert into store values('111','세탁기','통돌이 세탁기','통이 도는 강력 세탁기',20,'LG');
    insert into store values('121','세탁기','신바람 세탁기','첨단 FUZZY 세탁기',25,'SAMSUNG');

    insert into store values('211','디스켓','IMATION','3M의 새 디스켓',100,'3M');
    insert into store values('221','필름','SUPER100','KODAK의 자동 카메라용 필름',300,'KODAK');
    insert into store values('231','필름','MONO2000','KONICA흑백 필름',300,'KONICA');

    insert into store values('311','청소기','싹싹이','구석 구석 말끔히- 강력 진공 청소기',15,'LG');
    insert into store values('321','청소기','동글이','소음 걱정 없는 조용한 청소기',80,'DAEWOO');

    insert into store values('411','자동차','트라제XG','품위 있는 레져카 ',96,'HYUNDAI');
    insert into store values('412','자동차','아반테','실속파의 선택',30,'HYUNDAI');

    insert into store values('421','자동차','코란도','강력한 4륜 구동 RV ',88,'SSANGYONG');
    insert into store values('431','자동차','엘란','20C 마지막 스포츠카 ',30,'KIA');

    commit;

DadaStore.JPG

 

 

 

이 글은 스프링노트에서 작성되었습니다.

과제풀이

내용 정리


 

자바 서버 페이지(JSP)

위키백과 ― 우리 모두의 백과사전.

자바 서버 페이지(JavaServer Pages, JSP)는 HTML내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹 브라우저에 돌려주는 언어이다. Java EE 스펙 중 일부로 웹 애플리케이션 서버에서 동작한다.

자바 서버 페이지는 실행시에는 자바 서블릿으로 변환된 후 실행되므로 서블릿과 거의 유사하다고 볼 수 있다. 하지만, 서블릿과는 HTML 표준에 따라 작성되므로 웹 디자인하기에 편리하다. 이와 비슷한 구조인 것인 PHP, ASP, ASP.NET 등도 있다.

아파치 스트럿츠자카르타 프로젝트JSTL 등의 JSP 태그 라이브러리를 사용하는 경우에는 자바 코딩없이 태그만으로 간략히 기술이 가능하므로 생산성을 높일 수 있다.

● JSP - 위키백과 : http://ko.wikipedia.org/wiki/자바_서버_페이지

● OKJSP(JSP 전문 사이트) : http://okjsp.pe.kr

● JSP development (API and implementation) : https://jsp.dev.java.net/

● JAVA EE 5 API DOCS : http://java.sun.com/javaee/5/docs/api/

● JSP에 대한 설명 : http://en.wikipedia.org/wiki/JavaServer_Pages

● JavaServer Pages Technology pages of SUN : http://java.sun.com/products/jsp/

 

자바 서블릿

위키백과 ― 우리 모두의 백과사전.

 

자바 서블릿(Java Servlet)은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다.

자바 서블릿은 Java EE사양의 일부분으로, 주로 이 기능을 이용하여 쇼핑몰이나 온라인 뱅킹 등의 다양한 웹 시스템이 구현되고 있다.비슷한 기술로는 등을 이용한 CGI, PHP를 아파치 웹 서버 프로세스에서 동작하게 하는 mod_php, 마이크로소프트사의 IIS에서 동작하는 ASP 등이 있다. CGI는 요청이 있을 때마다 새로운 프로세스가 생성되어 응답하는 데 비해, 자바 서블릿은 외부 요청마다 프로세스보다 가벼운 쓰레드로써 응답하므로 보다 가볍다. 또한, 자바 서블릿은 자바로 구현되므로 다양한 플랫폼에서 동작한다.

서블릿은 동적인 콘텐츠를 생성하기 위해 자바로 작성한 웹 컴포넌트이다. 서블릿은 자바 클래스 형태로 작성할 수 있으며, 웹 컨테이너에 의해서 관리된다. 서블릿은 자바 언어를 이용해서 작성하지만, 기존의 C 혹은 C++ 언어를 사용하는 CGI 프로그램에 비해 성능이 뛰어나다. 이것은 CGI가 프로세스(Process) 기반으로 동작하는 것에 비해, 서블릿은 스레드(Thread) 기반으로 동작하기 때문이다. 스레드에 비해서 프로세스는 생성 속도가 느리며, 시스템 자원을 많이 소모한다.

 

서블릿의 장점

● 플랫폼 독립성

서블릿은 자바를 이용해서 작성하기 때문에 플랫폼에 독립적이다. 따라서 작성한 서블릿 프로그램은 변경하지 않더라도 UNIX, 윈도우 등의 컴퓨터 플랫폼에 상관없이 실행할 수 있다.

● 서버 독립성

서블릿은 거의 모든 웹 서버에서 지원하기 때문에 웹 서버와 무관하게 실행될 수 있다.

● 확장성

서블릿은 자바로 작성하기 때문에 다른 업체에서 지원하는 다양한 클래스들을 바로 사용할 수 있다

● 개발 용이성

CGI 프로그램을 개발하려는 경우 적당한 통합 개발 환경(IDE)이 없지만, 자바의 경우는 다수의 통합 개발환경들이 있다. 프로그램 디버깅 층면에서도 Perl 이나 C로 작성된 CGI 프로그램은 예외처리가 되지 않아서 에러가 발생한 곳이 어딘지를 찾기가 어렵다. 이에 반해 자바는 예외 처리 기능과 통합 개발 환경을 이용해서 쉽게 에러를 발견할 수 있다. 이런 여러가지 측면에서 크고 복잡한 프로그램 개발에는 서블릿이 CGI 프로그램보다 적합하다.

 

● 자바 서블릿 관련 API : j2eeri-1_4-Servlet-doc-api.zip

● 참조 : http://java.sun.com/products/servlet/docs.html

[1]. JSP는 .JSP로 저장한다.

[2]. JAVA 파일이 아니기 때문에 컴파일(Compile)을 필요로 하지 않는다.

● JSP -> 자바 서블릿 으로 변환되어 실행

 

웹 응용프로그램(Web Application)

웹 서버의 기능을 확장함으로써 비즈니스 로직(Bussiness Logic)을 서버 측에 배포(설치, Deploy)하고, 클라이언트로 웹 브라우저를 사용하는 클라이언트/버서 형태의 프로그램이다.

 

팻클라이언트(Fat Client) - 클라이언트에 대용량의 실행파일을 설치해야하는 경우를 의미

팻서버(Fat Server) - 팻클라이언트 못지 않게 서버도 실행파일을 설치해둬야한다.

 

클라이언트 티어(Client Tier)

이에 해당하는 웹 브라우저는 사용자와 상호 작용하는 인터페이스 역할을 수행하며, 웹 사용자에게 HTML, CSS, 플래시, 자바 스크립트, 그림 파일 등으로 작성된 내용들을 보여준다. 웹 브라우저는 Thin Client(Fat Client의 반대의미)이기 때문에 비즈니스 로직을 가지고 있지 않으며, 사용자를 위한 GUI와 유효성 검사(Validity Check) 기능만을 가지고 있다.

 

미들 티어(Middle Tier)

비즈니스 로직을 수행하고 동적인 콘텐츠를 제공한다. 웹 응용프로그램 중에서 미들 티어는 가장 핵심적인 역할을 수행하는 부분으로서 주로 CGI, ASP, PHP, JSP, 서블릿 등의 기술을 이용해서 프로그램을 작성한다. 우리는 JSP와 서블릿을 이용해서 미들 티어 부분의 프로그램을 작성할 것이다.

 

서버 티어(Server Tier)

데이터를 저장하고 관리하는 역할을 수행하는 부분으로, 데이터를 저장하기 위해 대부분 오라클, MS SQL, MySQL과 같은 DBMS를 이용한다. 미들 티어가 서버 티어에 있는 데이터베이스에 접근하려면, JDBC, ODBC 등과 같은 표준화된 API와 DBMS에서 제공하는 고유의 API를 사용해야 한다.

 

웹 응용프로그램을 작성하기 위해서는 클라이언트에서 사용하는 HTML, 플래시, 자바 스크립트와 같은 기술과 미들 티어에서 사용하는 CGI, PHP, ASP, JSP, 서블릿과 같은 기술을 함께 사용할 수 있어야 한다.

 

컨테이너(Container)

서버(Server)라고 생각하면 된다. JSP와 서블릿을 실행시킬수 있는 소프트웨어를 웹 컨테이너(Web Container) 혹은 서블릿 컨테이너(Servlet Container)라고 한다. 엔진 이라고도 한다. 대표적인 웹 컨테이너로는 자카르타 톰캣, Resin, 웹로직 등이 있다.

 

[1]. editplus + Resin

[2]. Eclipse + Tomcat

[3]. WebLogic

 



Resin 설치하기

http://caucho.com/ 에서 Resine 을 다운 받는다.

현재 업계에서 사용되는 것은 2.1.17 버전( resin-2.1.17.zip )이라고 한다.

압축파일을 풀고 /BIN 폴더로 들어가면 httpd.exe를 실행하면 아래화면을 볼 수 있다. 브라우저에서 http://localhost:8080 을 입력하면 Resine 서버가 작동되고 있는 것을 확인할 수도 있다.

ResinRun.JPG


 이 부분이 서블릿에서 가장 핵심이지 싶다. ㅡㅅ-);

● 서블릿을 만들어서 C:\Program Files\resin-2.1.17\doc\WEB-INF\classes 폴더에 저장해주어야 한다.
..\doc\WEB-INF\classes      (서블릿)JAVA 인 것을 저장.

 

● C:\Program Files\resin-2.1.17\doc 에는 html, jsp, txt, jpg 등을 에 넣어두어야 한다.
..\doc

 

http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html 참조바람.

 



서블릿 프로그램 작성

서블릿은 두 개의 패키지로 구성되어 있다. 이 패키지들은 웹 컨테이너에 포함되어 있다.

javax.servlet         : 일반 서비스를 위한 서블릿 패키지

javax.servlet.http   : HTTP 서비스를 위한 패키지

 

아래 그림에 있는 jsdk23.jar 파일을 복사해서

  lib_jsdk23.JPG

아래 폴더의 위치에 붙여넣기 해준다.

copyTOextJSDK23.JPG

다시 resin 폴더로 이동해서 resin.conf (resin 설정(Configure) 파일)을 열어본다. 특별히 수정할 필요는 없다.

resineConf.JPG

 



HelloServlet.java 작성

  1. import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class HelloServlet extends HttpServlet {
        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

            res.setContentType("text/html;charset=KSC5601");
            // setContentType 를 잘못 입력할 경우, 컴파일 시 다운로드 하시겠습니까? 라고 나온다.
            PrintWriter out = res.getWriter();

            out.println("<html>");
            out.println("<head><title>Hello Servlet</title></head>");
            out.println("<body>");
            out.println("Hello Servlet");
            out.println("</body>");
            out.println("</html>");
            out.close();

        }
    }

 

작성 후

[1]. HelloServlet.java 프로그램을 컴파일하고, HelloServlet.class 파일을 <Resin>\doc\WEB-INF\classes 에 복사한다. 만약, class 디렉토리가 없는 경우에는 새로 만들도록 한다(본인의 경우에는 귀찮아서.... classes 폴더에서 자바(.java)를 작성하기로 결심했다).

classInResin_classes.JPG

[2]. http://localhost:8080/servlet/MessageServlet  라고 입력하면 HelloServlet.JPG

Hello Servlet 이라고 나오는 걸 볼 수 있을 것이다.

 

HelloServlet 과 MessageServlet을 서로 찾게 만드는 코드.

MessageServlet.java

  1. import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class MessageServlet extends HttpServlet {
        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

            res.setContentType("text/html;charset=KSC5601");
            // setContentType 를 잘못 입력할 경우, 컴파일 시 다운로드 하시겠습니까? 라고 나온다.
            PrintWriter out = res.getWriter();

            //태그<tag> 사용할 때는 보다시피 .println() 메소드 안에 사용해주면 된다.
            out.println("<html>");
            out.println("<head><title>Hello Servlet</title></head>");
            out.println("<body>");
            out.println("Message Servlet : ");
            out.println("<a href='HelloServlet'>HelloServlet Link</a>");
            out.println("</body>");
            out.println("</html>");
            out.close();

        }
    }

HelloServlet.java

  1. import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class HelloServlet extends HttpServlet {
        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

            res.setContentType("text/html;charset=KSC5601");
            // setContentType 를 잘못 입력할 경우, 컴파일 시 다운로드 하시겠습니까? 라고 나온다.
            PrintWriter out = res.getWriter();

            //태그<tag> 사용할 때는 보다시피 .println() 메소드 안에 사용해주면 된다.
            out.println("<html>");
            out.println("<head><title>Hello Servlet</title></head>");
            out.println("<body>");
            out.println("Hello Servlet : ");
            out.println("<a href='MessageServlet'>MessageServlet Link</a>");
            out.println("</body>");
            out.println("</html>");
            out.close();

        }
    }

 

그림 파일을 넣는 방법

HelloWorld.java

  1. import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class HelloWorld extends HttpServlet {
        public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

            res.setContentType("text/html;charset=KSC5601");
            // setContentType 를 잘못 입력할 경우, 컴파일 시 다운로드 하시겠습니까? 라고 나온다.
            PrintWriter out = res.getWriter();

            //태그<tag> 사용할 때는 보다시피 .println() 메소드 안에 사용해주면 된다.
            out.println("<html>");
            out.println("<head><title>Hello Servlet</title></head>");
            out.println("<body>");
            out.println("Hello Servlet : ");
            out.println("<a href='MessageServlet'>MessageServlet Link</a>");
            out.println("<img src = '/images/comics.gif>");
            out.println("</body>");
            out.println("</html>");
            out.close();

        }
    }

docImages.JPG

 

HTTP 관련 오류코드

오류 1) http://localhost:8080/servlet/HelloWorld 8  라고 할 경우.

500 Servlet Exception

javax.servlet.ServletException: Class `HelloWorld 8' was not found in classpath.

Classes normally belong in /WEB-INF/classes.

at com.caucho.server.http.Application.instantiateServlet(Application.java:3198)

at com.caucho.server.http.Application.createServlet(Application.java:3104)

at com.caucho.server.http.Application.loadServlet(Application.java:3065)

at com.caucho.server.http.QServletConfig.loadServlet(QServletConfig.java:435)

at com.caucho.server.http.Application.getFilterChainServlet(Application.java:2809)

at com.caucho.server.http.Application.buildFilterChain(Application.java:2765)

at com.caucho.server.http.Invocation.service(Invocation.java:313)

at com.caucho.server.http.CacheInvocation.service(CacheInvocation.java:135)

at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:253)

at com.caucho.server.http.HttpRequest.handleConnection(HttpRequest.java:171)

at com.caucho.server.TcpConnection.run(TcpConnection.java:139)

at java.lang.Thread.run(Thread.java:619)

Resin 2.1.17 (built Tue Jul 11 09:01:03 PDT 2006)

 



오류 2) http://localhost:8080/test.html 라고 할 경우(404 에러)  파일이 존재하지 않을 때

404 Not Found

/test.html was not found on this server.


Resin 2.1.17 (built Tue Jul 11 09:01:03 PDT 2006)

 

 



오류 3) http://localhost:8080/servlet/HelloWorld 하고 발생할 경우(405 에러) Get 메소드가 쓰여야할 곳에 doPost()를 사용했을 때 발생.

  1. import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class HelloWorld extends HttpServlet {
        public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

            res.setContentType("text/html;charset=EUC-KR");
            // setContentType 를 잘못 입력할 경우, 컴파일 시 다운로드 하시겠습니까? 라고 나온다.
            PrintWriter out = res.getWriter();

            //태그<tag> 사용할 때는 보다시피 .println() 메소드 안에 사용해주면 된다.
            out.println("<html>");
            out.println("<head><title>Hello Servlet</title></head>");
            out.println("<body>");
            out.println("Hello Servlet : ");
            out.println("<a href='MessageServlet'>MessageServlet Link</a>");
            out.println("<img src = '/images/comics.gif>");
            out.println("</body>");
            out.println("</html>");
            out.close();

        }
    }

405 GET not supported

 


Resin 2.1.17 (built Tue Jul 11 09:01:03 PDT 2006)

 

 

서블릿 라이프 사이클

서블릿은 init(), service(), destroy() 메소드를 호출하는 라이프 사이클을 가진다.

 

init()

처음에 서블릿이 메모리에 로드(Load)되면 init() 메소드가 수행된다. init() 메소드는 서블릿이 서비스 하기 위해 필요한 초기화 작업을 수행한다. 따라서 init()메소드는 서블릿이 실행되기 위해서 필요한 각종 환경을 설정하기 위한 목적으로 사용한다. 예를 들어, 필요한 파일을 열고, 데이터베이스에 연결하는 등의 작업을 수행한다(자바로 치면 생성자 정도 되려나?).

 

service()

초기화된 서블릿은 클라이언트의 요청이 있을 때마다 스레드가 생성되어서 병행적으로 service() 함수를 수행한다. 따라서 서블릿을 개발할 때 병행성 문제를 고려해야 한다. 클라이언트의 요청이 있을 때마다 service() 메소드가 호출되고, service() 메소드가 HTTP의 method 타입에 따라 GET 방식이면 doGet() 메소드를, POST 방식이면 doPost() 메소드를 호출한다.

 

destroy()

서블릿이 더 이상 서비스를 하지 않거나 메모리가 부족하면 웹 컨테이너에 의해 서블릿은 메모리에서 언로드(Unload)된다. 이때 메모리에서 언로드 되기 전에 destroy() 함수가 수행된다.

 

서블릿 작업 중단

클라이언트의 요청을 처리하는 서블릿의 작업을 더 이상 진행시키지 않고, 중단시키기 위해서는 doPost(), doGet(), service() 등의 함수에서 return 문을 사용해야 한다. 서블릿 작업을 중둔시키기 위해 System.exit()을 호출해서는 안된다. System.exit()을 호출하면 서블릿 컨테이너가 종료된다.

 

 

● doGet() 메소드는 브라우저에서 호출될 경우 작동함.

● doPost() 메소드는 Form 태그 안에서 method = POST 일 때에 호출됨

  1.  <BODY>
      <FORM METHOD=POST ACTION="">
       
      </FORM>
     </BODY>

 

서블릿을 이용한 폼 데이터 처리

  1. contact.html(경로 : <Resin>\doc\contact.html>
  2. 실행 : 웹브라우저 상에서 주소창에 http://localhost:8080/contact.html 호출

  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
     <HEAD>
      <TITLE> New Document </TITLE>
      <META NAME="Generator" CONTENT="EditPlus">
      <META NAME="Author" CONTENT="">
      <META NAME="Keywords" CONTENT="">
      <META NAME="Description" CONTENT="">
     </HEAD>

     <BODY>
      <FORM METHOD=POST ACTION=/servlet/Contact>
      <!-- 서블릿 에서는 doPost() 메소드를 사용해줘야 한다.-->
        로그인<br><hr>
        번호 : <INPUT TYPE="text" NAME="number"><br>
        이름 : <INPUT TYPE="text" NAME="name"><br>
        주소 : <INPUT TYPE="text" NAME="address"><br><hr>
        <INPUT type="submit">
        <!-- Form 태그에 ACTION 안에 입력된 곳으로 이동 -->
      </FORM>
     </BODY>
    </HTML>

 

  1. Contact.java (클래스 파일 위치는 <Resin>\doc\WEB-INF\classes\Contact.class)

  2. import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;

    public class Contact extends HttpServlet {

        public void doPost(HttpServletRequest req, HttpServletResponse res){
            try {
                res.setContentType("text/html; charset=KSC5601");
                PrintWriter out  = res.getWriter();
                req.setCharacterEncoding("KSC5601");
                String number = req.getParameter("number"); // html 에서 name ="number"인 입력상자의 파라메터 받아와서 number에 넣음
                String name = req.getParameter("name"); //name="name"인 파라메터 받아와서 name에 넣음
                String address = req.getParameter("address"); //name="address"인 파라메터 받아와서 address에 넣음
                out.println("<html>");
                out.println("<head><title>Contact 서블릿 실행하기</title></head>");
                out.println("<body><h3> " +number + " 번 당신!!<h3><br>");
                out.println("이름은 " + name + " 이고!!!");
                out.println("사는 곳은 " + address + " 가 맞지!?");
                out.println("조사하면 다나와~~ ㅡㅅ-)ㅋ");
                out.println("</body>");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

contact.html 실행화면(브라우저에서 실행해야 한다 ㅡㅅ-)b

HTMLRequestPost.JPG

contact.html 내에서 Form 의 action 에 의해 Contact 서블릿이 호출되는 상황

ServletPostResponse.JPG

 

● 폼 데이터 처리

HTML의 폼에서 태그에 사용된 이름이 유일한 경우에는 getParameter9)로 값을 알아볼 수 있었다. 하지만, 동일한 이름이 여러 번 사용된 경우에는 어떻게 될까? 이러한 경우에는 전달되는 값도 여러 개이다. 따라서 값을 얻을 때 여러 개의 값을 저장할 수 있는 배열 형태를 사용해야 한다. HttpServletRequest는 이러한 용도로 getParameterValues() 메소드를 제공한다. 이 메소드는 다음 예와 같은 방법으로 사용할 수 있다. 이 메소드를 사용할 때 주의할 점은 해당 이름으로 값이 전달되지 않는 경우에 리턴 값이 "null"이 올 수도 있기 때문에 "null"인지 여부를 반드시 확인하여야 한다.

 

예 : 값이 여러 개 전달되는 경우

  1. String values[] = res.getParameterValues("name");
    if ( values != null) {
       ...
    }

※ 전달되는 값

HTML의 폼(Form)에서 Input 타입이 text인 경우에는 사용자가 입력한 문자열이 서블릿에 전달된다. 그런데 입력 타입이 checkbox나 radio인 경우에는 어떤 값들이 전달될까? HML 폼에서 체크박스를 사용하면 선택된 체크 박스의 value 속성으로 기술된 값만 서블릿에 전달된다. 만약 HTML 폼의 체크 박스에 value 속성을 기술하지 않으면 'on' 값이 서블릿에 전달되기 때문에 주의해야 한다.

 

예 : 파라미터 이름을 모를 경우

  1. import java.util.Enumeration; //필요

    Enumeration e = req.getParameterNames();
    while( e.hasMoreElements() ) {
       String name = (String) e.nextElement();
       String value = req.getParameter(name);
       if (values != null){
          for(int i = 0; i < values.length; i++ ) {
             out.println("<li>" + name + " : " + values[i]);
          }
       }
    }

 

이 글은 스프링노트에서 작성되었습니다.

서블릿 관련한 내용을 설명하는 API DOCs를 구했다.

<< Download JSR-000151 J2EE(TM) 1.4 Platform API Documentation >>

ㅡㅅ-)> 아쉽게도... 현재까지 한글화 된 녀석은 찾지 못했다.

자료출처 : http://pllab.kw.ac.kr/j2seAPIs/tooldocs/windows/java.html

java - Java 어플리케이션 기동 툴

형식

    java [ options ] class [ argument ... ]
java [ options ] -jar file.jar [ argument ... ]
javaw [ options ] class [ argument ... ]
javaw [ options ] -jar file.jar [ argument ... ]
options
커멘드행 옵션
class
불려 가는 클래스의 이름
file.jar
불려 가는 JAR 파일의 이름. 반드시 -jar 와 함께 사용한다
argument
main 함수에게 건네지는 인수

설명

java 툴은, Java 어플리케이션을 기동합니다. java 툴은, Java Runtime Environment 를 기동한 뒤, 지정된 클래스를 로드해, 그 클래스의 main 메소드를 호출하는 것으로, Java 어플리케이션을 기동합니다.

이 메소드는, public 및 static 로서 선언할 필요가 있습니다. 또, 값을 돌려주어 되지 않습니다. 게다가String 배열을 파라미터로서 지정할 수 없으면 안됩니다. 메소드의 선언은, 다음과 같이 되지 않으면 안됩니다.

    public static void main(String args[])
디폴트에서는, 커멘드행 옵션 이외의 최초의 인수가, 불려 가는 클래스의 이름이 됩니다. 이 이름에는, 완전 지정의 클래스명을 사용할 필요가 있습니다. -jar 옵션을 지정했을 경우, 커멘드행 옵션 이외의 최초의 인수가, 어플리케이션의 클래스 파일과 resource file를 포함한 JAR 어카이브(archive)의 이름이 됩니다. 이 경우, 마니페스트의 Main-Class 헤더로 지정된 클래스가 기동 클래스가 됩니다.

Java Runtime 는, bootstrap 클래스 패스, 인스톨형 확장 기능, 및 유저 클래스 패스의 3 개소로부터 기동 클래스와 다른 사용되고 있는 클래스를 검색합니다.

클래스명 또는 JAR 파일명의 후에 있는, 커멘드행 옵션 이외의 인수는,main 함수에게 건네집니다.

javaw 커멘드는, 콘솔 윈도우가 없는 이외는,java 커멘드와 같습니다. javaw 는, 커멘드 prompt 윈도우를 표시할 필요가 없을 때에 사용합니다. 다만,javaw 기동 툴에서는, 어떠한 이유로써 기동에 실패하면(자), 에러 정보를 나타내는 다이알로그 박스가 표시됩니다.

옵션

기동 툴에는, 현재의 실행 환경 및 장래의 릴리스로 서포트되는표준 옵션이 있습니다. 또, 디폴트의 Java HotSpot VM 에서는,비표준 옵션세트도 제공됩니다. 이것은, 장래의 릴리스로 변경될 가능성이 있습니다.

표준 옵션

-client
Java HotSpot Client VM 를 선택합니다.

상세한 것에 대하여는,「서버 - 클래스 머신의 검출」을 참조해 주세요.

-server
Java HotSpot Server VM 를 선택합니다.

상세한 것에 대하여는,「서버 - 클래스 머신의 검출」을 참조해 주세요.

-agentlib:libname[=options]
네이티브 에이전트 라이브러리 libname 를 로드합니다. 예를 들어 다음과 같이 지정합니다.

-agentlib:hprof

-agentlib:jdwp=help

-agentlib:hprof=help

상세한 것에 대하여는,「JVMTI 에이전트의 커멘드행 옵션」을 참조해 주세요.

-agentpath:pathname[=options]
풀 패스명을 사용해, 네이티브 에이전트 라이브러리를 로드합니다. 상세한 것에 대하여는,「JVMTI 에이전트의 커멘드행 옵션」을 참조해 주세요.

-classpath classpath
-cp classpath
클래스 파일을 검색하는 디렉토리, JAR 어카이브(archive), 및 ZIP 어카이브(archive)의 리스트를 지정합니다. 클래스 패스의 각 엔트리는, 세미콜론 (;)으로 단락짓습니다. -classpath 또는 -cp 를 지정하면(자), 이 옵션의 값에 의해 CLASSPATH 환경 변수의 설정이 오버라이드(override) 됩니다.

-classpath-cp 도 사용되지 않고,CLASSPATH 도 설정되어 있지 않은 경우, 유저 클래스 패스는 현재의 디렉토리 (. )(이)가 됩니다.

클래스 패스의 자세한 것은,「클래스 패스의 설정」을 참조해 주세요.

-Dproperty=value
시스템 프로퍼티의 값을 설정합니다. value 가, 스페이스를 포함한 캐릭터 라인인 경우는, 캐릭터 라인을 다음과 같이 이중 인용부호로 둘러쌀 필요가 있습니다.
        java -Dfoo="some string" SomeClass
-enableassertions[:<package name>"..."| :<class name> ]
-ea[:<package name>"..."| :<class name> ]
assertion를 유효하게 합니다. assertion는, 디폴트에서는 무효가 되어 있습니다.

인수 없음의 enableassertions 또는 -ea 를 지정하면(자), assertion가 유효하게 됩니다. 「...」(으)로 끝나는 인수를 1 개 지정하면(자), 지정한 패키지와 그 서브 패키지내에서 assertion가 유효하게 됩니다. 인수로서 「...」만을 지정하면(자), 현재의 작업 디렉토리에 있는 이름이 없는 패키지내에서 assertion가 유효하게 됩니다. 「...」(으)로 끝나지 않는 인수를 1 개 지정하면(자), 지정한 클래스내에서 assertion가 유효하게 됩니다.

단일 커멘드행에 이러한 스윗치의 인스턴스를 복수 지정했을 경우는, 지정한 스윗치가 차례로 처리되고 나서 클래스가 로드 됩니다. 따라서, 예를 들어, 패키지 com.wombat.fruitbat (서브 패키지를 포함한다) 내에서만 assertion를 유효하게 해 프로그램을 실행하려면 , 다음과 같은 커멘드를 사용합니다.

java -ea:com.wombat.fruitbat...<Main Class>

-enableassertions-ea 스윗치는, 모든 클래스 로더 및 시스템 클래스에 적용됩니다. 시스템 클래스에는 클래스 로더는 없습니다. 다만, 이 규칙에는 예외가 1 개 있습니다. 그것은, 인수없이 이 스윗치를 지정하면(자), 그 지정은 시스템 클래스에는 적용되지 않는, 이라고 하는 것입니다. 이 예외를 이용하면, 시스템 클래스를 제외한 모든 클래스에서 assertion를 간단하게 유효하게 할 수가 있습니다. 모든 시스템 클래스에서 assertion를 유효하게 하기 위해서, 다른 스윗치가 준비되어 있습니다. 이후에의 -enablesystemassertions 를 참조해 주세요.

-disableassertions[:<package name>"..."| :<class ; ]
-da[:<package name>"..."| :<class name> ]
assertion를 무효로 합니다. 이것은 디폴트의 설정입니다.

인수 없음의 disableassertions 또는 -da 를 지정하면(자), assertion가 무효가 됩니다. 「...」(으)로 끝나는 인수를 1 개 지정하면(자), 지정한 패키지와 그 서브 패키지내에서 assertion가 무효가 됩니다. 인수로서 「...」만을 지정하면(자), 현재의 작업 디렉토리에 있는 이름이 없는 패키지내에서 assertion가 무효가 됩니다. 「...」(으)로 끝나지 않는 인수를 1 개 지정하면(자), 지정한 클래스내에서 assertion가 무효가 됩니다.

패키지 com.wombat.fruitbat 내에서는 assertion를 유효하게 해, 클래스 com.wombat.fruitbat.Brickbat 내에서는 assertion를 무효로 한 데다가, 프로그램을 실행하려면 , 다음과 같은 커멘드를 사용합니다.

java -ea:com.wombat.fruitbat...-da:com.wombat.fruitbat.Brickbat <Main Class>

-disableassertions-da 스윗치는, 모든 클래스 로더 및 시스템 클래스에 적용됩니다. 시스템 클래스에는 클래스 로더는 없습니다. 다만, 이 규칙에는 예외가 1 개 있습니다. 그것은, 인수없이 이 스윗치를 지정하면(자), 그 지정은 시스템 클래스에는 적용되지 않는, 이라고 하는 것입니다. 이 예외를 이용하면, 시스템 클래스를 제외한 모든 클래스에서 assertion를 간단하게 유효하게 할 수가 있습니다. 모든 시스템 클래스에서 assertion를 무효로 하기 위해서(때문에), 다른 스윗치가 준비되어 있습니다. 이후에의 -disablesystemassertions 를 참조해 주세요.

-enablesystemassertions
-esa
모든 시스템 클래스내에서 assertion를 유효하게 합니다. 즉, 시스템 클래스에 도착해 assertion의 디폴트 스테이터스를 true 로 설정합니다.

-disablesystemassertions
-dsa
모든 시스템 클래스내에서 assertion를 무효로 합니다.

-jar
JAR 파일에 캡슐화된 프로그램을 실행합니다. 최초의 인수는, 기동 클래스의 이름은 아니고, JAR 파일의 이름으로 합니다. 이 옵션이 기능하려면 , JAR 파일의 마니페스트에「Main-Class:classname라고 하는 형식의 행을 지정할 필요가 있습니다. 다만,classname 에는, 어플리케이션의 개시 위치로서 기능하는 public static void main(String[] args) 메소드를 포함한 클래스를 지정합니다. JAR 파일과 그 마니페스트에 대해서는,jar 툴의 레퍼런스 페이지Java 튜토리얼의 「Trail: Jar Files」를 참조해 주세요.

이 옵션을 사용하면(자), 지정한 JAR 파일이 모든 유저 클래스의 소스가 되어, 유저 클래스 패스외의 설정은 무시됩니다.

-javaagent:jarpath[=options]
Java 프로그램 언어 에이전트를 로드합니다. java.lang.instrument 를 참조해 주세요.

-verbose
-verbose:class
클래스가 로드 될 때마다 클래스에 관한 정보를 표시합니다.

-verbose:gc
가베지 콜렉션 이벤트가 발생할 때마다 보고합니다.

-verbose:jni
네이티브 메소드의 사용 및 그 외의 Java Native Interface (JNI) 액티버티에 관한 정보를 보고합니다.

-version
버젼 정보를 표시해 종료합니다.

-showversion
버젼 정보를 표시해 속행합니다.

-?
-help
사용법을 표시해 종료합니다.

-X
비표준 옵션에 관한 정보를 표시해 종료합니다.

비표준 옵션

-Xint
interpreter 전용 모드로 동작합니다. native code에의 컴파일은 무효가 되어, 모든 바이트 코드가 interpreter에 의해 실행됩니다. Java HotSpot Client VM 대응의 컴파일러가 제공하는 퍼포먼스상의 이점은, 이 모드에서는 실현되지 않습니다.

-Xbatch
백그라운드 컴파일을 무효로 합니다. 통상, VM 에서는, 백그라운드 컴파일이 종료할 때까지, 메소드를 백그라운드 태스크로서 컴파일 해, interpreter 모드로 메소드를 실행합니다. -Xbatch 플래그를 지정하면(자), 백그라운드 컴파일이 무효가 되어, 모든 메소드의 컴파일이 완료할 때까지 foreground 태스크로서 처리됩니다.

-Xdebug
JVMDI 의 서포트를 유효하게 해 개시합니다. JVMDI 는 추천 되고 있지 않습니다. 또, J2SE 5.0 에서의 디버그에는 사용되지 않습니다. 따라서, J2SE 5.0 에서의 디버그에는, 이 옵션은 필요 없습니다.
-Xbootclasspath:bootclasspath
부 트 클래스 파일을 검색하는 디렉토리, JAR 어카이브(archive), 및 ZIP 어카이브(archive)를 세미콜론으로 단락지은 리스트로 지정합니다. 지정한 패스에 존재하는 부트 클래스 파일이, Java 2 SDK 에 포함되는 부트 클래스 파일 대신에 사용됩니다. 주: rt.jar 내의 클래스를 오버라이드(override) 하는 목적으로 이 옵션을 사용하는 어플리케이션은, 시스템에 배치하지 말아 주세요. Java 2 Runtime Environment 바이너리코드 라이센스 위반이 됩니다.
-Xbootclasspath/a:path
디렉토리, JAR 어카이브(archive), 및 ZIP 어카이브(archive)의 패스를 세미콜론으로 단락지어 지정합니다. 패스는 디폴트의 bootstrap 클래스 패스의 뒤로 추가됩니다.
-Xbootclasspath/p:path
디렉토리, JAR 어카이브(archive), 및 ZIP 어카이브(archive)의 패스를 세미콜론으로 단락지어 지정합니다. 패스는 디폴트의 bootstrap 클래스 패스전에 추가됩니다. 주: rt.jar 내의 클래스를 오버라이드(override) 하는 목적으로 이 옵션을 사용하는 어플리케이션은, 시스템에 배치하지 말아 주세요. Java 2 Runtime Environment 바이너리코드 라이센스 위반이 됩니다.

-Xcheck:jni
Java Native Interface (JNI) 기능에 대해서 추가 체크를 실시합니다. 구체적으로는, Java 가상 머신은 JNI 요구를 처리하기 전에, JNI 함수에게 건네지는 파라미터와 실행 환경의 데이터를 검증합니다. 무효인 데이터가 발견되었을 경우는, native code에 문제가 있는 것을 나타내고 있기 (위해)때문에, Java 가상 머신은 치명적 에러를 발생해 종료합니다. 이 옵션을 사용하면(자), 퍼포먼스 저하가 예상됩니다.

-Xfuture
클래스와 파일의 형식을 엄밀하게 체크합니다. 하위 호환성을 유지하기 (위해)때문에, Java 2 SDK 의 가상 머신이 실행하는 디폴트의 형식 체크는, JDK 소프트웨어의 버젼 1.1.x 가 실행하는 체크와 동일한 정도의 엄밀함이 되어 있습니다. -Xfuture 플래그를 지정하면(자), 클래스 파일 형식의 사양에의 준거를 강화하기 위한보다 엄밀한 체크가 유효하게 됩니다. Java 어플리케이션 기동 툴의 장래의 릴리스에서는, 보다 엄밀한 체크가 디폴트가 되기 (위해)때문에, 새로운 코드를 개발할 경우에는 이 플래그를 사용하는 것을 추천합니다.

-Xnoclassgc
클래스의 가베지 콜렉션을 무효로 합니다.

-Xincgc
인크리멘타르가베이지코레크타를 유효하게 합니다. 인크리멘타르가베이지코레크타는, 디폴트에서는 무효가 되어 있습니다. 유효하게 하면(자), 프로그램의 실행중에 가베지 콜렉션에 의한 일시정지가 발생하지 않게 됩니다. 인크리멘타르가베이지코레크타는, 프로그램과 동시에 실행하는 일이 있어, 이 경우, 프로그램의 이용할 수 있는 프로세서 능력이 저하합니다.

-Xloggc:file
-verbose:gc 와 같게 가베지 콜렉션 이벤트가 발생할 때마다 보고합니다만, 그 데이터를 file 에 기록합니다. -verbose:gc 를 지정했을 때에 보고되는 정보 외에, 보고되는 각 이벤트의 선두에, 최초의 가베지 콜렉션 이벤트로부터의 경과시간 (초단위)을 덧붙일 수 있습니다.

네트워크의 응답 시간에 의해 JVM 의 실행 속도가 저하하는 것을 피하기 (위해)때문에, 이 파일의 포함처는, 항상 로컬 파일 시스템으로 해 주세요. 파일 시스템이 만배가 되면(자), 파일은 잘라 버릴 수 있어 그 파일에 데이터가 계속해 기록됩니다. 이 옵션과 -verbose:gc 의 양쪽 모두가 커멘드행으로 지정되고 있는 경우는, 이 옵션이 우선됩니다.

-Xmsn
메모리 할당 풀의 초기 사이즈를 바이트수로 지정합니다. 지정하는 값은, 1M 바이트보다 큰 1024 의 배수로 하지 않으면 안됩니다. 킬로바이트를 지정하려면 , 문자 k 또는 K 를 붙입니다. 메가바이트를 지정하려면 , 문자 m 또는 M 를 붙입니다. 기정치는 2M 바이트입니다. 다음에 예를 나타냅니다.
       -Xms6291456
-Xms6144k
-Xms6m

-Xmxn
메모리 할당 풀의 최대 사이즈를 바이트수로 지정합니다. 지정하는 값은, 2M 바이트보다 큰 1024 의 배수로 하지 않으면 안됩니다. 킬로바이트를 지정하려면 , 문자 k 또는 K 를 붙입니다. 메가바이트를 지정하려면 , 문자 m 또는 M 를 붙입니다. 기정치는 64M 바이트입니다. 다음에 예를 나타냅니다.
       -Xmx83886080
-Xmx81920k
-Xmx80m

-Xprof
실행중의 프로그램의 프로파일을 생성해, 프로 파일링 데이터를 표준 출력에 출력합니다. 이 옵션은, 프로그램 개발용의 유틸리티로서 제공되고 있습니다. 실전 가동 시스템에서의 사용을 목적으로 한 것이 아닙니다.

-Xrunhprof[:help][:<suboption>=<value>,...]
CPU, heap, 또는 모니터의 프로 파일링을 유효하게 합니다. 통상, 이 옵션의 후에는, 콤마로 단락지어진 「<suboption>=<value>」의 페어가 계속됩니다. 서브 옵션과 그 디폴트치의 리스트를 취득하려면 , 커멘드 java -Xrunhprof:help 를 실행합니다.

-Xrs
Java 가상 머신 (JVM)에 의한 operating system 시그널의 사용을 줄입니다. 이 옵션은, J2SE 1.3. 1 이후에 이용 가능하게 되었습니다.

J2SE 1.3. 0 에서는, Java 어플리케이션을 질서 올바르고 슛다운하기 위한 슛다운 훅 기능이 추가되었습니다. 이 기능에 의해, JVM 가 돌연 종료했을 경우에서도, 슛다운시에 유저 클린 업 코드 (데이타베이스 접속의 클로우즈등)를 실행할 수 있게 되었습니다.

JVM 는, 콘솔 제어 이벤트를 감시해 JVM 의 이상종료(ABEND)를 검지하는 것으로써, 슛다운의 훅을 실현합니다. 구체적으로는, JVM 는, 슛다운 훅 처리를 개시하는 콘솔 제어 핸들러를 등록해, CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, 및 CTRL_SHUTDOWN_EVENT 에 대해서 TRUE 를 돌려줍니다.

JVM 는, 디버그의 목적으로 thread 스택을 덤프 한다고 하는, 1.2 보다 전부터 있는 기능을 실현하기 위해서(때문에)도, 같은 기구를 사용합니다. Sun 의 JVM 는, thread 덤프를 실행하기 위해서 CTRL_BREAK_EVENT 를 사용합니다.

JVM 가 서비스 (Web 서버용의 서브 렛 엔진등)로서 실행되고 있는 경우, JVM 는, CTRL_LOGOFF_EVENT 를 받아도 슛다운 처리를 개시해 되지 않습니다. 그 때, operating system는, 실제로는 프로세스를 종료시키지 않기 때문입니다. 이 예의 같은 장해의 가능성을 피하기 (위해)때문에, J2SE 1.3. 1 이후에서는 -Xrs 커멘드행 옵션이 추가되었습니다. Sun 의 JVM 로 -Xrs 옵션을 사용하면(자), JVM 는, 콘솔 제어 핸들러를 인스톨 하지 않습니다. 이 경우, JVM 는, CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, 및 CTRL_SHUTDOWN_EVENT 의 감시와 처리를 실시하지 않습니다.

-Xrs 를 지정했을 경우, 다음의 2 개의 영향이 있습니다.

-Xssn
thread의 스택 사이즈를 설정합니다.

+ Recent posts