Search

'프로그래밍/Web'에 해당되는 글 89건

  1. 2007.11.27 [펌] Filter 를 이용한 한글 인코딩 적용
  2. 2007.11.27 context-param
  3. 2007.11.27 밑의 에러 페이지 처리에 이어서.
  4. 2007.11.27 에러 페이지 처리
  5. 2007.11.27 열혈강의 6장 실습하기
  6. 2007.11.27 04 JSP 액션
  7. 2007.11.27 03 JSP 시작
  8. 2007.11.27 02 HelloWorld!!!
  9. 2007.11.27 01 시작~
Filter 를 이용한 한글 인코딩 적용 - 심우곤님 at www.jlab.net

1.5.4. Tomcat에서의 한글문제

작성자: 심 우곤 (wgshim@greenbell.co.kr)
본 문서는 JLab (http://www.jlab.net) 홈페이지에서도 보실 수 있습니다.

Tomcat의 악명 높은 한글 문제입니다. HTML의 <FORM>을 통해 한글 정보를 전달하면 이 값이 깨져버리는데, 이 문제는 Tomcat이 넘어오는 데이터를 내부적으로 변환해 버리기 때문이지요. 물론, 한글을 변환하는 빈을 만들어서 처리하는 방법도 있습니다만, 매 페이지마다 빈을 불러서 처리해야 하는 것이 귀찮지요.


여기서 알려드리려 하는 방법은 Tomcat으로 하여금 <FORM>을 통해 전달하는 값을 URL 인코딩을 하지 않고 EUC_KR로 변환하여 넘기도록 합니다. 이는 한글문제에 대해 고민을 하지 않아도 된다는 것이지요.


물론, 매 페이지는 한글을 잘 표현할 수 있도록 다음과 같은 지시문을 둘 거라 생각합니다.
<%@ page language="java" contentType="text/html; encoding=euc_kr"%>
이제 본격적으로 Tomcat의 한글문제를 다루도록 합시다. 사실 여기서 다루려는 해결방안은 Tomcat을 설치하면서 딸려 들어오는 예제코드(4.0.5나 4.1.12 모두에서 찾아볼 수 있습니다)에서 내용을 찾을 수 있었습니다. -_-;; 놀라셨다구요? 저도 놀랐습니다. 정말 등잔 밑이 어둡다고 하더니만, 이렇게 가까운 곳에 해결책이 있을 줄이야!


%CATALINA_HOME%\webapps\examples\WEB-INF에 존재하는 web.xml을 열어보면, 다음과 같은 부분을 찾을 수 있습니다.
이 방법은 Filter를 사용하는 방법으로 사용자의 입력을 서블릿이 처리하기 전에 해당 정보를 Filter가 적절한 방식으로 변환할 수 있도록 합니다.


그림 20. Tomcat 예제의 web.xml

참 이런걸 보면, 2 Bytes 문자체계를 지원하는 솔루션은 일본인들을 위해서 먼저 만들어진다는 것이 안타깝습니다. 하지만 이로 인해서 우리나라도 유사한 방법으로 한글문제를 쉽게 해결할 수 있지만요.. 잠깐 푸념이었습니다.


물론 위에 보이는 <filter>의 encoding 파라미터의 값을 EUC_JP에서 EUC_KR로 변경해야겠죠? 여기서 한글변환을 위해 사용된 SetCharacterEncodingFilter 클래스는 %CATALINA_HOME%\webapps\examples\WEB-INF\classes\filters에서 찾을 수 있습니다
[그림 21].

그럼 정리하겠습니다.


[ Filter를 사용하여 Tomcat에서의 한글문제 해결방안 ]


1. 구축하고자 하는 여러분의 웹 어플리케이션의 WEB-INF\classes 폴더에 filters라는 새로운 폴더를 생성합니다.


2. 이제 WEB-INF\classes\filters에 SetCharacterEncodingFilter.class 파일을 %CATALINA_HOME%\webapps\examples\WEB-INF\classes\filters 폴더에서 복사합니다.


3. 그 후 여러분의 웹 어플리케이션의 WEB-INF\web.xml의 상단에 다음 라인을 추가합니다.
<filter>
  <filter-name>Set Character Encoding</filter-name>
  <filter-class>filters.SetCharacterEncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>EUC_KR</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>Set Character Encoding</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

※ 참고: <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 인지를 확인합니다. 간혹 2.2버전의 파일이 있는데, 이 때는 아래의 <filter> 및 <filter-mapping>인지하지 못합니다.)

매번 SetCharacterEncodingFilter.class 파일을 WEB-INF\classes\filters에 복사하는 것이 귀찮으시다구요?


Tomcat은 여러 웹 어플리케이션들간에 클래스를 공유할 수 있는 공간을 마련해 두었습니다. Tomcat 4.0.5에서는 %CATALINA_HOME%\classes폴더가 Tomcat 4.1.12에서는 %CATALINA_HOME%\common\classes 폴더가 있는데, 이들 폴더가 바로 그 공간입니다. 자 그럼 이곳에 공용 클래스인 SetCharacterEncodingFilter.class를 공유공간에 복사해 봅시다. 절차는 다음과 같습니다:


Tomcat 4.0.5를 사용하시는 분은 %CATALINA_HOME%\classes에, Tomcat 4.1.12를 사용하시는 분은 %CATALINA_HOME%\common\classes에 filters폴더를 만들고SetCharacterEncodingFilter.class 파일을 복사합니다.
혹은, 매번 폴더 만들고 복사하기가 귀찮으시다면 jar로 압축된 파일을 여기( http://ietmserver.greenbell.co.kr/~wgshim/java/TomcatCharacterEncodingFilter.jar )서 받으시기 바랍니다. 그냥 제가 묶어 놓은 것입니다. 여러분도 예제로부터 쉽게 만들어 사용하시면 됩니다. [파일명: TomcatChracterEncodingFilter.jar]

Tomcat 4.1.12를 사용하시는 분은 %CATALINA_HOME%\lib에, Tomcat 4.1.12를 사용하시는 분은 %CATALINA_HOME%\common\lib에 받으신 jar파일을 복사합니다.


이로써 우리는 앞으로 만들게 될 웹 어플리케이션에서 SetCharacterEncodingFilter 클래스를 공유하게 되었습니다. 그 결과, 여러분들은 위에 언급한 세 단계의 절차 중 첫 번째와 두 번째 항목을 매 어플리케이션마다 수행하실 필요가 없어진 것이지요. 단지 web.xml 파일에 내용을 추가하시기만 하면 됩니다.


감격의 순간이지 않습니까? 저는 이런 방법이 있다는 사실을 다수의 국내 개발자들이 모르고 있다는 것이 안타깝습니다. 널리 이 방법을 전파시켜 주시길 바랍니다. 한글 변환 빈을 만들어서 매번 불편하게 사용해 왔다면, 정말 신선한 방법이겠죠? ^_^


작성자: 심 우곤 (wgshim@greenbell.co.kr)
본 문서는 JLab (http://www.jlab.net) 홈페이지에서도 보실 수 있습니다.

Tag
tag는 게시물의 성격을 나타내는 키워드를 입력하는 공간입니다. login 후 사용하실 수 있습니다.
  • 이 필더는 Servlet으로 넘어가는 데이터만 Tomcat 내부에서 한글 처리하는 것입니다. -- 심우곤님 메일중에...
  • kenu
  • 2002-10-29 09:43:33
  • x
  • 이 내용을 다른 게시판에 올려도 되는지요..좋은 내용입니다.한글 해결이 쉬어지겠네요..
  • hyejin
  • 2002-10-29 17:26:43
  • x
  • 심우곤님과 jlab 저작권표시만 제대로 해주세요.
    그럼 될 것입니다.
  • kenu
  • 2002-10-29 20:17:06
  • x
  • 4.X 버전부터 지원이 되었던걸로 알고 있습니다.
    3.3a 버전의 경우는 자동으로 인터셉터를 했었구여...
    참고하시기 바랍니다.
  • ksany
  • 2002-11-05 19:31:53
  • x
  • request.setCharacterEncoding(String encoding)과 같은 것이겠죠?
  • 최재웅
  • 2002-11-19 11:32:25
  • x
  • 예.. 동일한 것입니다.
  • 심우곤
  • 2002-11-27 12:10:51
  • x
  • ㅠㅠ 감사합니다 ㅠㅠ
  • 허접 jsper
  • 2003-07-25 17:45:07

'프로그래밍 > Web' 카테고리의 다른 글

02 실전에서 쓰는 소스  (0) 2007.11.28
01 로그인....  (0) 2007.11.28
context-param  (0) 2007.11.27
밑의 에러 페이지 처리에 이어서.  (0) 2007.11.27
에러 페이지 처리  (0) 2007.11.27

context-param

프로그래밍/Web 2007. 11. 27. 15:17 Posted by galad

ConnectionPool을 새로 만들어봤습니다.

1. MySql용입니다.
2. timeout, db-server reset 등으로 DB 와 연결을 잃었을 때
   좀비가 되는 문제를 해결하였습니다.
3. ConnectionPool클래스를 web.xml에 Listener로 등록하고 getConnection()메소드를
   static 으로 만들어 어디서든지 풀에 접근가능하도록 하였습니다.
4. Connection반환은 필수입니다. 저는 ConnectionPool에 접근하는 중간계층의 클래스
   를 만들어 사용하기 때문에 풀자체에서 반환여부를 체크하지 않습니다.


5. web.xml 설정예제 : context-param 을 이용해 풀에 필요한 정보를 전달합니다.
  context-param 과 listener 의 위치에 주의하십시요.
 
 
<web-app>
  <display-name></display-name>
  <description></description>

   <context-param>
      <param-name>database</param-name>
      <param-value>#dbname#</param-value>
   </context-param>
   <context-param>
      <param-name>database_user</param-name>
      <param-value>#user-name#</param-value>
   </context-param>
   <context-param>
      <param-name>database_password</param-name>
      <param-value>#password#</param-value>
   </context-param>
   <context-param>
      <param-name>database_min</param-name>
      <param-value>3</param-value>
   </context-param>
   <context-param>
        <param-name>database_max</param-name>
        <param-value>10</param-value>
    </context-param>
 

    <!--  
    <filter>..</filter>
    <filter-mapping>..</filter-mapping>
    -->
   
   
    <listener><listener-class>kr.co.korm.sql.ConnectionPool</listener-class></listener>
   
    <!--기타 태그들 -->

</web-app>


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


/*
   Copyright (C) www.korm.co.kr 박정규
   
   본 프로그램은 공개소프트입니다. 여러분은 이 프로그램을 마음껏 수정하시고
   배포하실수 있읍니다. 여러분에게 도움이 되는 프로그램이기를 바랍니다.
      
   최종수정일 2003년 6월 29일
*/

package kr.co.korm.sql;
import java.util.Vector;
import java.sql.*;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContext;


public class ConnectionPool  implements ServletContextListener {

     static Vector connections = new Vector();
     static String url="jdbc:mysql://localhost:3306/#database#?autoReconnect=true&useUnicode=true&characterEncoding=euc-kr";
     static String user = null;
     static String passwd = null;
     static int max = 1;
     static int min = 1;
     
     
     private ServletContext context = null;
     
    /**
     *  Context 가 시작되었을 때 호출된다.
     */
    public void contextInitialized(ServletContextEvent event) 
      {
      	context = event.getServletContext();
     	  String database = context.getInitParameter("database");
     	  url = url.replaceAll("#database#", database);
        user = context.getInitParameter("database_user");
        passwd = context.getInitParameter("database_password");
       
       try { min = Integer.parseInt(context.getInitParameter("database_min")); } catch(Exception e){}
       try { max = Integer.parseInt(context.getInitParameter("database_max")); } catch(Exception e) {}
 
       try {
             Class.forName("org.gjt.mm.mysql.Driver");   
     
            // 최소수만큼의 연결을 생성해놓는다.
            for(int i=0;i<min;i++)
              {
     	          connections.add( DriverManager.getConnection(url, user, passwd) );
     	        }
     	     }
 	     catch(Exception e)  { 	 context.log(e.getMessage());   }
 	   }  


    /**
     *  Context 가 종료될때 호출된다.
     */
    public void contextDestroyed(ServletContextEvent event) 
      {
    	  for(int i=0;i<connections.size();i++)
   	  	  {
            Connection con = (Connection)connections.elementAt(i);
            try { con.close(); } catch(Exception e){}
     	    }
       	connections.clear();
      }

    /**
     *  풀로부터 Connection 객체를 얻는 함수
     */     
    public static Connection getConnection() throws Exception
      {     
       	Connection con = null;
    	  int try_count=0;
     	  
     	   while(true)
     	      {
     	  	     try { return (Connection)connections.remove(0); } 
     	  	     catch(Exception e){}  // 모든 Connection이 사용중이면 Excetion이 발생한다.
                	  
               try { return DriverManager.getConnection(url, user, passwd); }
               catch(Exception e){}  // 더 이상 데이타베이스서버로부터 Connection을 가져올 수 없으면 Exception발생
                    
               if(try_count++>3) throw new ConnectionException("일시적으로 사용자가 너무 많아 데이타베이스에 연결할 수 없습니다.");
                
               try { Thread.sleep(50); } catch(Exception e){} //0.05초 후에 재시도한다.
            }      	
     }	


    /**
     *   풀에 Connection 객체를 반납한다. 
     */
    public static void free(Connection con)
      {
      	try {
            	if(connections.size() < max) connections.add(con);
            	else con.close();
            }
        catch(Exception e){}	
      }	
}

'프로그래밍 > Web' 카테고리의 다른 글

01 로그인....  (0) 2007.11.28
[펌] Filter 를 이용한 한글 인코딩 적용  (0) 2007.11.27
밑의 에러 페이지 처리에 이어서.  (0) 2007.11.27
에러 페이지 처리  (0) 2007.11.27
열혈강의 6장 실습하기  (0) 2007.11.27

밑의 방식으로는 이전 페이지가 넘어오지 않는다 ㅡ.ㅡ;;

포워딩 해서 그런지


null
/Wonderland/common/addressForward.jsp
http://localhost:8080/Wonderland/common/addressForward.jsp
/common/addressForward.jsp
null
/blog/blogMain.jsp?blog_address=Wonderland/common/addressForward.jsp
/Wonderland/common/addressForward.jsp


이런 식으로 포워드 된 페이지만 나온다..


따라서


<%

    Enumeration em = request.getAttributeNames();
    while( em.hasMoreElements() ) {
        String name = (String)em.nextElement();
        System.out.println(name + " , " + request.getAttribute(name));       
    }

%>


를 이용한다. 단, 톰캣 5.0 / 5.5 이상. 즉, 서블릿 / jsp 버젼에 관계있다.


javax.servlet.forward.request_uri , /Wonderland/tb/lonelycat
javax.servlet.forward.context_path , /Wonderland
javax.servlet.forward.servlet_path , /tb/lonelycat
javax.servlet.forward.path_info , /common/addressForward.jsp
javax.servlet.error.servlet_name , default
javax.servlet.error.message , /Wonderland/tb/lonelycat
javax.servlet.error.request_uri , /Wonderland/tb/lonelycat
javax.servlet.error.status_code , 404


결과는 이런 식.


즉, requets.getAttribute("javax.servlet.forward.servlet_path");


를 하면 컨텍스트 패스를 제외한 뒷부분 /tb/lonelycat 이 나온다.


이걸 이용해서 싸이월드 형식의 주소 포워딩이 가능할 듯.

'프로그래밍 > Web' 카테고리의 다른 글

[펌] Filter 를 이용한 한글 인코딩 적용  (0) 2007.11.27
context-param  (0) 2007.11.27
에러 페이지 처리  (0) 2007.11.27
열혈강의 6장 실습하기  (0) 2007.11.27
04 JSP 액션  (0) 2007.11.27

에러 페이지 처리

프로그래밍/Web 2007. 11. 27. 15:15 Posted by galad
<%--
/******************************************************************************
*   파일      : error.jsp
*   용도      :
*   작성자   : 성홍제
*   Version : 0.1 / 2007. 01. 23 -
******************************************************************************/
--%>

<%@ page
    language="java"
    contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
%>
<%
    // 종종 web.xml의 에러 페이지가 안 먹힐 때 - 에러 페이지로 왔다가 로컬의 에러 페이지로 가는 경우가 있다.
    // 아래처럼 에러 설정을 해주면? 제대로 동작한다
    response.setStatus(200);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
</head>
<body>

<!--
 이 페이지를 호출한 이전 페이지의 주소를 얻어낸다. 링크 등의 경우 및 직접 주소창에 넣어도 된다
 -->
<%=request.getHeader("referer")%>
<br>

<!--
현재 주소창에서 URI값을 얻어온다.
예를 들어 http://www.naver.com/news
도메인을 제외한 /new가 나온다
 -->
<%=request.getRequestURI()%>
<br>

<!--
request의 쿼리문을 얻어낸다
예를 들어 http://www.naver.com/news?type=sports
type=sports가 나온다
 -->
<%=request.getQueryString()%>
<br>

<a href="<%=request.getContextPath()%>/lonelycat">TEST</a>

</body>
</html>

'프로그래밍 > Web' 카테고리의 다른 글

context-param  (0) 2007.11.27
밑의 에러 페이지 처리에 이어서.  (0) 2007.11.27
열혈강의 6장 실습하기  (0) 2007.11.27
04 JSP 액션  (0) 2007.11.27
03 JSP 시작  (0) 2007.11.27

열혈강의 6장 실습하기

프로그래밍/Web 2007. 11. 27. 15:14 Posted by galad

★ 친구들 연락처를 관리하기 위한 웹 서비스??


★ server.xml 수정


<Context path="/FriendsList" reloadable="true" docBase="D:\www\Tomcat 5.5\webapps\FriendsList">

  <Resource name="jdbc/FriendsDB"
     auth="Container"
     type="javax.sql.DataSource"
        driverClassName="oracle.jdbc.OracleDriver"
     url="jdbc:oracle:thin:@61.109.232.128:1521:ora92"
     username="lonelycat"
     password="itea"
     maxActive="20"
     maxIdle="10"
     maxWait="-1"/>

</Context>


★ <host> ~ </host> 사이에 추가


★ context를 압축해서 올림...

'프로그래밍 > Web' 카테고리의 다른 글

밑의 에러 페이지 처리에 이어서.  (0) 2007.11.27
에러 페이지 처리  (0) 2007.11.27
04 JSP 액션  (0) 2007.11.27
03 JSP 시작  (0) 2007.11.27
02 HelloWorld!!!  (0) 2007.11.27

04 JSP 액션

프로그래밍/Web 2007. 11. 27. 15:13 Posted by galad

★ jsp:useBean... 등에 관하여



<!--
/******************************************************************************
*   파일      : contact2.html
*   용도      : jsp:bean 사용 예제 html
*   작성자   : 성홍제
*   작성일   : 2006. 08. 31
*   Version : 1.0
******************************************************************************/
 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
    <title>Insert title here</title>
</head>
<body>
<h3>연락처</h3>
<form method=post action=contact2.jsp>
  이름<input type=text name=name><br>  <!-- name 속성의 값이 contact2.java의 메소드 -->
  메일<input type=text name=mail><br><!--input 태그를 닫아버리면 null 값이 전송된다.-->
    <p>
    <input type=submit value="전송">
    <input type=reset value="취소">
</form>
</body>
</html>


이 html에서 contact2.jsp에 정보를 넘겨서, contact2.jsp에서 contact2 클래스를 사용하여

개체를 생성, 정보를 저장, 불러오는 예제.


<%--
/******************************************************************************
*   파일      : contact2.jsp
*   용도      : contact2 클래스를 사용해 jsp:bean으로 활용해보는 page
*   작성자   : 성홍제
*   작성일   : 2006. 08. 31
*   Version : 1.0
******************************************************************************/
--%>

<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<% request.setCharacterEncoding("euc-kr"); %>
   
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
    <title>Insert title here</title>
</head>
<body>
<%
    String name = request.getParameter("name");
    String mail = request.getParameter("mail");
%>
<%-- 선언, 생성 Contact2 contact = new Contact2() 와 같다. --%>
<jsp:useBean id="contact" class="contact.contact2" scope="page"/>


<jsp:setProperty name="contact" property="*"/>

<%-- contact 개체에 값을 넣어준다. - 위의 "*" 대신 이렇게 써도 된다.
<jsp:setProperty name="contact" property="name"/>
<jsp:setProperty name="contact" property="mail"/>
 --%>
<%-- 출력해본다. --%>
이름은 : <%= contact.getName() %>
<br>
메일주소는 : <%= contact.getMail() %>

</body>
</html>




/******************************************************************************
*   파일      : contact2.java
*   용도      : contact2.html 에서 넘겨주는 정보를 위한 클래스
*   작성자   : 성홍제
*   작성일   : 2006. 08. 31
*   Version : 1.0
******************************************************************************/

package contact;

public class contact2
{
    // Fields
    private String name;
    private String mail;
   
    // Constructor
    public contact2()
    {}
   
    // Methods
    public void setName(String name)    // contact2.html 의 폼 내의 <input>의 이름과 같아야함
    {                                                  // 밑의 메소드들도 모두 마찬가지. get, set 뒤에 붙는
        this.name = name;                      // 이름이 같아야한다. 첫글자는 html에서는 소문자.
    }
   
    public String getName()
    {
        return this.name;
    }
   
    public void setMail(String mail)
    {
        this.mail = mail;
    }
   
    public String getMail()
    {
        return this.mail;
    }
   
    // Main
}


★ html에서 체크박스이 데이터를 jsp:bean으로 받을 경우

html.....


<input type=checkbox name=sw value="jdk1.5">JDK1.5 <br>
<input type=checkbox name=sw value="JBuilder">JBuilder <br>
<input type=checkbox name=sw value="Eclipse">Eclipse<br>
<input type=checkbox name=sw value="Visual age">Visual age <br>
<input type=checkbox name=sw value="NetBean">NetBean<br><br>


jsp.....


<jsp:setProperty name="data" property="sw"/>  // 받을 때


<%  // 사용하는 경우 - 스트링 배열로 사용한다.
    String[] sw = data.getSw();

    if(sw != null)
    {
        for(int i = 0; i < sw.length; i++)
        {
            out.print(sw[i] + " ");
        }
    }
    else
    {
        out.println("선택한 것이 없습니다.");
    }
%>


데이터를 저장하는 class....


private String[] sw = null;


public void setSw(String[] sw)
{
    this.sw = sw;
}
   
public String[] getSw()
{
    return sw;
}


// sw는 바로 html에서의 체크박스의 이름

'프로그래밍 > Web' 카테고리의 다른 글

에러 페이지 처리  (0) 2007.11.27
열혈강의 6장 실습하기  (0) 2007.11.27
03 JSP 시작  (0) 2007.11.27
02 HelloWorld!!!  (0) 2007.11.27
01 시작~  (0) 2007.11.27

03 JSP 시작

프로그래밍/Web 2007. 11. 27. 15:12 Posted by galad

★ 프리젠테이션 로직에 들어간다.


★ 디폴트 객체의 스코프

1. page : 한 JSP페이지에서만 사용가능

  : response, out, config, page, exception


2. request : 다른 페이지로 전달(이동, forward) 되는 경우에 이동된 페이지에서도 사용 가능

   setAttribute() 메소드를 이용해서 어떤 정보를 저장해 놓으면 다른 페이지에서도 사용 가능

  : request


3. session : 객체 세션이 사용되는 한, 여러 페이지에서 사용할 수 있다.

   1번 페이지에서 필요한 정보들을 session 개체에 저장하면, 다른 페이지들에서도 활용 가능

   로그인 정보 등..

  : session


4. application : 웹 응용 프로그램에 소속된 모든 페이지들이 사용할 수 있다.

  : application


★ 변수 선언

스크립트렛(<% ~ %>) 에서 정의한 변수는 나중에 _japService() 메소드의 지역 변수로

선언(<%! ~ %>) 에서 정의한 변수는 나중에 서블릿 클래스의 멤버 필드로 바뀐다.


즉, 하나의 jsp 문서에서 여러 개의 <% ~ %> 안에 있는 변수는 _japService() 메소드 안에 있는

것이므로 위의 스크립트렛에서 정의한 변수를 아래의 스크립트렛에서 사용할 수 있다.


변수를 선언해서 사용하는 경우는 멤버 메소드에서 그 변수를 사용하는 경우를 빼고는 별로 없다.


★ 폼에서 한글 데이터를 전송 받아서 사용할 때 한글이 깨지는 경우

jsp문서에서 한글 데이터를 처리하기 전 - 가능하면 최상위에 - 에 다음과 같이 추가


request.setCharacterEncoding("euc-kr");


들어오는 정보를 한글 처리해 달라는 것.


예제)))))


<!--
/******************************************************************************
*   파일      : select-items.html
*   용도      : 폼에서 jsp로의 데이터 전송 테스트
*   작성자   : 성홍제
*   작성일   : 2006. 08. 29
*   Version : 1.0
******************************************************************************/
-->

<html>
<head>
    <title>JSP POST TEST</title>
</head>

<body>
<center>
    <h2>JSP POST 테스트</h2>
</center>

<form method=POST action=select-items.jsp>
    이름 <input type=input name=name><br>
    주소 <input type=input name=addr> <br><br>
 
    다음 사항을 선택해주세요.<br>
    사용중인 운영 체제는 ? <br>
    <select name=os size=3 multiple>
        <option value="win32">윈도우즈
        <option value="linux">리눅스
        <option value="solaris">솔라리스
        <option value="misc">기타
    </select>

    <br><br>사용중인 컴퓨터 하드웨어는 ? <br>
    <select name=hw>
        <option value="pentium">펜티엄
        <option value="misc">기타
    </select>

    <br><br>사용중인 통신회사는 ? <br>
    <select name="통신회사"  multiple>
        <option> 하이텔
        <option> 천리안
        <option>기타
    </select>

    <br>
    <input type=submit value=전송>
    <input type=reset value=취소>
</form>
</body>
</html>


<%--
/******************************************************************************
*   파일      : select-items.jsp
*   용도      : select-items.html에서 넘겨받은 데이터를 보여준다.
*   작성자   : 성홍제
*   작성일   : 2006. 08. 29
*   Version : 1.0
******************************************************************************/
--%>
<%@ page contentType="text/html;charset=KSC5601" %>

<html>
<head>
    <title>Select Items</title>
</head>

<body>
<center>
    <h2>Select Items 테스트</h2>
</center>

HTML에서 선택한 내용은 다음과 같습니다. <hr>

<%
    request.setCharacterEncoding("euc-kr");

    java.util.Enumeration en = request.getParameterNames();

    while(en.hasMoreElements())
    {
        String name = (String)en.nextElement();
        String values[] = request.getParameterValues(name);

        for(int i=0; i < values.length; i++)
        {
            out.print("<li>");
            out.print(name);
            out.print(":");
            out.println(values[i]);
        }
    }
%>

</body>
</html>



결과가 순서대로 나오지는 않지만, Enumeration이 원래 그렇단다....

'프로그래밍 > Web' 카테고리의 다른 글

에러 페이지 처리  (0) 2007.11.27
열혈강의 6장 실습하기  (0) 2007.11.27
04 JSP 액션  (0) 2007.11.27
02 HelloWorld!!!  (0) 2007.11.27
01 시작~  (0) 2007.11.27

02 HelloWorld!!!

프로그래밍/Web 2007. 11. 27. 15:10 Posted by galad


/******************************************************************************
*   파일      : HelloServlet.java
*   용도      : 초간단 서블릿 프로그램
*   작성자   : 성홍제
*   작성일   : 2006. 08. 24
*   Version : 1.0
******************************************************************************/

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

public class HelloServlet extends HttpServlet
{
    // 서버가 입력받은 정보는 req에 - 클라이언트가 request했으므로, 서버가 보낼 정보는 res에 - 서버가 response하므로.
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
    {
        // 현재 클라이언트에 보낼 문서는 text/html이고 euc-kr로 인코딩되어있다고 알림
        res.setContentType("text/html;charset=euc-kr");
       
        PrintWriter out = res.getWriter();  // 출력 스트림을 얻는다.
       
        // html body 작성
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello, World</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("Hello, World!!!");
        out.println("</body>");
        out.println("</html>");
       
        out.close();
    }
}


익스플로러에서 실행 시

1. http://localhost:8080/ITEA/servlet/HelloServlet 

  localhost:8080 으로 들어갔으므로, 아파치를 통하지 않고 바로 톰캣으로 들어간다.

  /ITEA/ 는 톰캣에 deploy한 context를 말한다.

  /servlet/ 은 class 파일이 있는 위치를 말한다.

  HelloServlet 은 만들어서 D:\www\Tomcat 5.5\webapps\ITEA\WEB-INF\classes

에 넣어놓은 class파일명.

  여기서 제대로 보이지 않으면 톰캣 설정에서 문제


D:\www\Tomcat 5.5\webapps\ITEA\WEB-INF\web.xml 파일을 찾아보자


<servlet>
   <servlet-name>invoker</servlet-name>
   <servlet-class>org.apache.catalina.servlets.InvokerServlet</servlet-class>
</servlet>


<servlet-mapping>
   <servlet-name>invoker</servlet-name>
   <url-pattern>/servlet/*</url-pattern>
</servlet-mapping>


  오타는 없는가?


2. http://localhost/ITEA/servlet/HelloServlet

  localhost 로 들어갔으므로 아파치를 통해 톰캣으로 연동된 것.

  위의 경우에는 제대로 되는데, 2번의 경우 되지 않는다면 연동에서 실패한 것.

  관련 문서들을 찾아보자.


D:\www\Apache2\conf\httpd.conf 파일을 제대로 설정했는가

특히 이 부분

JkMount /*servlet/* ajp13
JkMount /*.jsp  ajp13
JkMount /*.do  ajp13
JkMount /Mail  ajp13


/*servlet/*  을 확인해 볼 것. 요청한 주소에 servlet/ 이 있다면 톰캣에서 처리하게 하겠다는 의미

'프로그래밍 > Web' 카테고리의 다른 글

에러 페이지 처리  (0) 2007.11.27
열혈강의 6장 실습하기  (0) 2007.11.27
04 JSP 액션  (0) 2007.11.27
03 JSP 시작  (0) 2007.11.27
01 시작~  (0) 2007.11.27

01 시작~

프로그래밍/Web 2007. 11. 27. 15:09 Posted by galad

1. Apache 설치하기

- Network Domain : IP

- Server Name : IP

- E-main : any


2. Tomcat 설치하기

- 딱히 없다.

- 디렉토리만 설정



★ 아파치, 톰캣 연동하기

1. 아파치 사이트에서 아파치와 톰캣 버젼에 맞는 자카르타를 받는다.


2. 받은 자카르타 파일명을 mod_jk.so 로 바꾸어서 D:\www\Apache2\modules 에 넣는다.

 당연히 디렉토리는 자신이 설치한 곳에


3. 아파치 설정 파일 httpd.conf 변경


파일 중간에 LoadModule 하는 곳에 추가

LoadModule    jk_module     modules/mod_jk.so


마지막에 추가

#For Jakarta
JkWorkersFile     "D:/www/Tomcat 5.5/conf/workers.properties"
JkLogFile      "D:/www/Tomcat 5.5/logs/mod_jk.log"
#JkLogLevel    debug

JkMount /*servlet/* ajp13
JkMount /*.jsp  ajp13
JkMount /*.do  ajp13
JkMount /Mail  ajp13


4. workers.properties 파일을 위에서 설정한 디렉토리에 생성해준다.

위의 디렉토리는 꼭 톰캣일 필요는 없고 아파치에 넣어도 상관없다.

worker.list=ajp13
worker.testWorker.port=8009
worker.testWorker.host=localhost
worker.testWorker.type=ajp13


5. 톰캣의 설정파일 server.xml 을 변경

굵은 글씨를 위치를 잘 찾아서 추가할 것

.

.

<Server port="8005" shutdown="SHUTDOWN">

  <!-- Comment these entries out to disable JMX MBeans support used for the
       administration web application -->
  <Listener className="org.apache.jk.config.ApacheConfig" modJk="D:/www/Apache2/modules/mod_jk.so"/>
  <Listener className="org.apache.catalina.core.AprLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.storeconfig.StoreConfigLifecycleListener"/>

.

.

<Host name="localhost" appBase="webapps"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">

    <Listener className="org.apache.jk.config.ApacheConfig" append="true" forwardAll="false" modJk="D:/www/Apache2/modules/mod_jk.so"/>

.

.



6. 톰캣과 아파치를 멈춘 후, 톰캣 - 아파치의 순서로 실행시킨다.



★ 연동 후, 디렉토리 문제.

연동 후, 루트는 기본적으로 아파치에서 설정한 디렉토리가 된다 - htdocs. 따라서 위에서

설정한 jsp, do, servlet 등이 아닌 css나 img 등은 모두 기본적으로 아파치 쪽에서 찾게 되므로

path에 주의할 것.

주로 css, img 등은 아파치 디렉토리에 놓고 쓰던가, 아니면 아파치와 톰캣의 디렉토리를

일치시키기도 한다. 아니면 css나 img를 문서에서 사용할 때 절대경로를 설정하던가..


★ 톰캣의 D:\www\Tomcat 5.5\webapps 에 원하는 디렉토리 - 예를 들어 ITEA - 를 만들고

그 밑에 WEB-INF와 WEB-INF\classes, WEB-INF\lib, WEB-INF\web.xml 파일을 만들어주면

웹브라우져에서 접속가능.

하나의 또다른 서버처럼 작동. http://localhost:8080/ITEA/ 이런 식으로 접속 가능하다.

ROOT에 있는거 복사해다가 수정해서 사용하면 된다.


★ 톰캣 매니져에서 deploy 해주기

Context Path (optional):
XML Configuration file URL:
WAR or Directory URL:


★ 개인용 컴퓨터의 경우 8080 포트가 방화벽에 막혀있어서 접속이 불가능하기도 하므로

예외에 추가해줄 것


★ 톰캣에서 컴파일된 서블릿을 자동 로드하게 만들기

context.xml 파일을 변경

<Context> -> <Context reloadable="true">

'프로그래밍 > Web' 카테고리의 다른 글

에러 페이지 처리  (0) 2007.11.27
열혈강의 6장 실습하기  (0) 2007.11.27
04 JSP 액션  (0) 2007.11.27
03 JSP 시작  (0) 2007.11.27
02 HelloWorld!!!  (0) 2007.11.27