지금은 별로 사용할일이 없지만 예전부터 궁금하던것

이클립스를 사용안하면 어떻게 클래스를 컴파일 시켜서 적용을 시킬까?

예전엔 그렇게 찾아도 안보이던 것이 .....이리 쉬울줄이야..

 

1.  톰캣사용시 컴파일후 바로 적용

c:\Tomcat\conf\context.xml
<Context> 태그에 reloadable 속성추가
예) <Context reloadable="true">
Restart!

2. 컴파일
C:\WEB\WEB-INF\classes> set classpath=..\classes;
C:\WEB\WEB-INF\classes> javac -d ..\classes DB_Function\DB_Class.java
 
혹시나 몰라서 써둔다. 

아파치 사이트에서 톰캣을 다운로드 받는다(알아서!!)
1. 압축을 푼다
   ex) tar xvzf 파일명

2. 프로파일을 수정 한후 적용한다.
[root /] vi /etc/profile
# /etc/profile

# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc

export JAVA_HOME=/usr/local/etc/jdk1.6.23
export CATALINA_HOME=/usr/local/etc/tomcat

export JAVA_HOME CATALINA_HOME

3. 톰캣을 실행한다.
출처 모든 방문 환영합니다. | 야무지게
원문 http://blog.naver.com/83heejung/50035770918
web.xml 환경설정 - Filter 등록
                
<filter>
	<filter-name>char Encoding</filter-name>
	<filter-class>convert.KorConvert</filter-class>
	<init-param>
		<param-name>encoding</param-name>
		<param-value>UTF-8</param-value>      
	</init-param>
</filter> 


java.servlet.Filter 의 생성 주기

웹 응용프로그램이 처음 실행 될때 개체가 생성되고 init() 을 실행

클라이언트 요청이 있을대마다 doFilter() 실행

웹 응용 프로그램이 종료될때 destory() 실행

src.convert.KorConvert.java 예제 

package convert; 

import java.io.IOException; 

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; 

public class KorConvert implements Filter{
	private String encoding;
	private FilterConfig fg;
	private boolean ignore = true;

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		fg = arg0;
		// 필터가 정의되어지는 XML 문서에서 정보를 가져온다.
		encoding = fg.getInitParameter("encoding");
		String value = fg.getInitParameter("ignore");
		
		if(value == null) {
			ignore = true;
		} else if(value.equalsIgnoreCase("true")) {
			ignore = true;
		} else if(value.equalsIgnoreCase("yes")) {
			ignore = true;
		} else {
			ignore = false;
		}    
	}

	@Override
	public void doFilter(ServletRequest arg0, ServletResponse arg1,
	FilterChain arg2) throws IOException, ServletException {
		if( ignore || arg0.getCharacterEncoding() == null) {
			// ignore 가 true 이거나 setCharacterEncoding으로 설정된 캐릭터셋값이 없을 경우
	
			// 이곳에서 전처리 코드 수행
			if(encoding != null) {
				arg0.setCharacterEncoding(encoding);
			}
			arg2.doFilter(arg0, arg1); 
	
			// 후처리 코드 수행
		}  
	} 

	@Override
	public void destroy() {
	// TODO Auto-generated method stub  
	}
} 


<%@ page language="java" contentType="text/html; charset=EUC-KR"
 pageEncoding="EUC-KR"%>
<%@ page import="java.io.*" %>
<%@ page import="java.net.*" %>
<%@ page import="org.apache.commons.net.ftp.*" %>

<%
	
	FTPClient ftp = null;
	
	try{
	 	String FilePath="";
	 	FilePath=request.getParameter("FilePath");
	
		ftp = new FTPClient();
		ftp.setControlEncoding("UTF-8"); 
		ftp.connect("아이피");
		ftp.login("아이디", "패스워드");
				
		ftp.changeWorkingDirectory("/vms/"); // 디렉토리 변경
		
		File uploadFile = new File(FilePath);
		FileInputStream fis = null;
		
		try{
		  fis = new FileInputStream(uploadFile);
		  boolean isSuccess = ftp.storeFile(uploadFile.getName(), fis);
		  if (isSuccess)
		  {
		      System.out.println("Upload Success");
		  }
		} catch (IOException ex){
		  System.out.println(ex.getMessage());
		} finally{
		  if (fis != null)
		      try{
		          fis.close();
		      } catch (IOException ex) {}
		}
		ftp.logout();
	} catch (SocketException e){
	    System.out.println("Socket:" + e.getMessage());
	} catch (IOException e){
	    System.out.println("IO:" + e.getMessage());
	} finally{
	    if (ftp != null && ftp.isConnected()){
	        try{
	            ftp.disconnect();
	        } catch (IOException e){}
	    }
	} 

%>

<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<%@ page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@ page import="java.util.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>▒▒</title>
</head>
<body>
<% 

	String savePath="c:\download"; // 저장할 디렉토리 (절대경로)
	String formName="";
	String fileName="";
	String fullPath="";
	
	int sizeLimit = 10 * 1024 * 1024 ; // 10메가까지 제한 넘어서면 예외발생
	
	try{
		MultipartRequest multi=new MultipartRequest(request, savePath, sizeLimit, new DefaultFileRenamePolicy());
		Enumeration formNames=multi.getFileNames();  // 폼의 이름 반환
		formName=(String)formNames.nextElement(); // 자료가 많을 경우엔 while 문을 사용
		fileName=multi.getFilesystemName(formName); // 파일의 이름 얻기
		fullPath=savePath+"/"+fileName;
	
		if(fileName == null) {   // 파일이 업로드 되지 않았을때
			out.println("<script>alert(\"\\n파일 에러!. \\n\\n파일을 확인해주세요.! \");</script>");
		} else {  // 파일이 업로드 되었을때
			out.println("<script>alert(\"업로드 완료! \");</script>");
		}
	}catch(Exception e){
		System.out.println(e);
	}
%>

</body>
</html>

JSP 템플릿 프레임워크인 tiles 사용법 까먹기전에 적어 두어야 겠다.

1. Struts 설치

JSP 프레임워크 struts를 설치하면 tiles 가 포함 되어있다. struts 설치는 알아서 검색 하면됨.
본인은 셋팅의 귀차니즘으로 struts-blank~~.war 를 간단히 import 하였다..ㅡㅡ;

2. struts-tiles.tld 사용

struts를 설치하고나면 WEB-INF/lib 폴더에  struts-tiles-1.3.xx.jar 란 놈이 있는데 
압축을 풀게되면   META-INF/TLD 폴더에서 struts-tiles.tld 란 놈을 찾을수 있다.
요놈이 tiles를 사용할수있게 해주는 태그라이브러리이며 요놈을 html 또는 jsp 페이지에서 사용하기 위해선
각 페이지에 tld 선언을 해주어야 한다.
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%>
요런식으로 말이다.
위와 같이 선언 하게되면 <tiles:~~~로 시작하는 태그를 사용할수 있다.
일단 사용법은 이러하고....사용하기전에 WEB-INF/tld 라는 폴더를 만들어서 거기에 복사하자.

3. web.xml 설정

 환경설정 파일인 web.xml 에서 tiles 를 사용하겠다는 설정을 하여야하는데
 위 2번에서 설치한 struts-tails.tld 를 아래와 같이 명시 해주어야 한다.
<taglib>
     <taglib-uri>/WEB-INF/tld/struts-tiles.tld</taglib-uri>
     <taglib-location>/WEB-INF/tld/struts-tiles.tld</taglib-location>
</taglib>
4. struts-config.xml 설정

action 태그에서 맵핑을 해주어야 한다.
<action path="/main1" forward=".main1" />
<action path="/menu1" forward=".submenu1" />
<action path="/menu2" forward=".submenu2" />
* 본인은 struts URL 설정에서 *.do로 해두었다.

위 설정은 URL 에서 main.do 로 요청이 들어왔을때 tiles-defs.xml 에서
definition 태그의 name속성이 .main1 이라는 것을 참조해 페이지를 구성하라는 뜻이다.
struts-config.xml 과 tiles-defs.xml 을 연결 시켜준다고 보면 되겠다.

5. tiles-defs.xml 생성 및 설정

tiles-defs.xml 파일은 따로 있는건지 만들어야 하는건지 파일 압축 풀면 나오는건지 확실히는 모르겠다
본인은 그냥 만들었다..ㅡ;;;

tiles-defs.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN"
       "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">

<tiles-definitions>
      <definition name=".main1" path="/Layout.jsp">
      <put name="title" value="안냐세요" />
      <put name="header" value="/header.jsp" />
      <put name="menu" value="/menu.jsp" />
      <put name="footer" value="/footer.jsp" />
      <put name="body" value="/body.jsp" />
    </definition>
    <definition name=".submenu1" extends=".main1">
                  <put name="body" value="menu1.jsp" />
    </definition>
    <definition name=".submenu2" extends=".main1">
                  <put name="body" value="menu2.jsp" />
    </definition>
</tiles-definitions>

 
 
위 4번의 struts-config.xml 에서 설정한 action 태그의 forward 속성과 맵핑 되는것을 찾아 페이지를 구성
하게 된다. put 태그의 value 속성 문자열은 request 로 받을수있는 속성이 되며 url은 페이지로 사용할수가 있다.

정리를 하면 main.do 라는 요청이 왔을때 struts-config.xml 에서 main에 해당하는 action을 찾게 되며
main의 forward 속성을 참조해 tiles-defs.xml 파일 definition 태그의 name 속성과 맵핑되는것을 찾아서
path 속성의 url로 이동하게된다.

위 예제를 예로 들면 .main1 을 요청하게되는데 path 속성인 /Layout.jsp 로 이동하게되며
Layout.jsp 페이지에서 위의 서브 파라미터인 put 태그의 속성들을 참조할수있게 해주는것이다.


6. Layout 페이지 생성
5번까지 설정부분이었다. 이제 테스트를 해보아야 하는데
본인은 위 예제에적힌 Layout.jsp 파일을 생성 하여 작성하였다.

<%@ page language="java" contentType="text/html; charset=EUC-KR"  pageEncoding="EUC-KR"%>
<%@ taglib uri="/WEB-INF/tld/struts-tiles.tld" prefix="tiles"%>


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>
      <h1><tiles:getAsString name="title" /></h1>
      <table border="1" width="100%">
         <tr>
            <td colspan="2"><tiles:insert attribute="header" /></td>
       </tr>
       <tr>
           <td width="140"><tiles:insert attribute="menu" /></td>
           <td><tiles:insert attribute="body" /></td>
       </tr>
        <tr>
           <td colspan="2"><tiles:insert attribute="footer" /></td>
       </tr>
       </table>
</body>
</html>


눈여겨 볼것은 <%@ taglib uri="/WEB-INF/tld/struts-tiles.tld" prefix="tiles"%> 요놈인데
요놈이 tiles를 사용할수있게 해주는 태그이다 2번에서 설명했다.

중간 중간에 보면 <tiles:~~~ 로 시작하는 태그가 있다.
소스를 보면 알겠지만 attribute 속성에 적힌 문자열이 tiles-defs.xml 파일의 put태그 속성이름에 해당하게 되며
put 태그 value값의  페이지를 include 한다고 보면 된다.



# 마무리로 위예제를 테스트 해볼려면 tiles-defs.xml  에 설정된 파일이름들을 생성해서
각 페이지 마다 페이지의 내용을 알아볼수있게 입력한후 http://localhost:xxxx/xxx/main.do 를 실행해 보면
페이지를 확인할수가 있다.

 

스트러츠의 모든 클래스는 org.apache.struts.action.ActionServlet 클래스를
상속받아 작성이된다.(그렇게 알고있다..ㅡㅡ;)

web.xml 에서 설정한  ActionServlet 클래스가 로더되기전에 모듈설정 초기화를 할수있는 클래스를 아래와 작성하여
reload.do 라는 URI 가 들어왔을때 모든 모듈 설정 클래스들을 초기화할수있게 하면
struts-config.xml 의 action을 추가할때마다 restart 하지않아도 바로 적용이된다.

struts1 13.10 버전에서 테스트 하였다.
아래의 클래스는 위의 제목의 주소에서 퍼왔다..(죄송해요...카페가입이 안되어있으면 글남기기가안되서 무단으로.;;)

* web.xml을 아래와 같이 변경해준다.

<servlet-class>my.MyActionServlet</servlet-class> 


예제)
package my; 

import java.io.*; 
import java.util.*;

import javax.servlet.*; 
import javax.servlet.http.*; 

import org.apache.struts.*; 
import org.apache.struts.action.*; 
import org.apache.struts.config.*; 
import org.apache.struts.util.*; 

/**
 * <pre>
 * struts-config.xml과 메시지 리소스 파일의 수정사항을
 * 서버의 재시작 없이 사용하도록 하는 ActionServlet이다.
 *
 * [사용방법]
 * web.xml 파일을 다음과 같이 수정한다.
 * <servlet-class>my.MyActionServlet</servlet-class>
 *
 * reload.do 를 호출한다.
 * </pre>
 */

public class MyActionServlet extends ActionServlet {
    protected void process( HttpServletRequest request, HttpServletResponse response )

        throws IOException, ServletException {


        String uri = request.getRequestURI();
        if( uri.indexOf( "reload.do" ) != -1 ) {
            removeAttribute();
            init();
            ModuleUtils.getInstance().selectModule( request, getServletContext() );
            ModuleConfig config = getModuleConfig( request );
            getRequestProcessor( config ).init( this, config );
            System.out.println( "reload ok..." );
        } else {
            super.process( request, response );
        }
    }


    private void removeAttribute() {
        ServletContext context = getServletContext();
        Enumeration applications = context.getAttributeNames();

        List contextAttributes = new ArrayList();

 

        //-스트러츠프레임워크에서 설정한 모든 모듈 설정 클래스들의 이름을 얻는다.
        while ( applications.hasMoreElements() ) {
            String attributeName = (String) applications.nextElement();
            if ( attributeName.startsWith( "org.apache.struts." ) ) {
                contextAttributes.add( attributeName );
            }
        }

 

        //- 에플리케이션 속성(영역)에 바인딩되어 있는 클래스들을 메모리에서 해제 한다.
        for (int i = 0; i < contextAttributes.size(); i++) {
            context.removeAttribute( (String) contextAttributes.get( i ) );
        }
    }

}

솔직하게 말해서 스트럿츠 이렇게 하는게 맞는지는 잘 모르겠다-_-; 틀린점 있으면 지적해주세요!

초간단 방명록인데 그냥 쓰기랑 쓴 글을 보여주는 기능 밖에 없는 방명록을 만들어보자!-_-;

가장 먼저 준비물은 이클립스WTP, 톰캣, 스트럿츠, JDK5.0 이다.

이클립스 WTP2.0 (올인원으로 받자)
http://europa-mirror1.eclipse.org/webtools/downloads/

톰캣5.5 (아마도 6.0에서 해도 상관없을 것이다.)
http://tomcat.apache.org/download-55.cgi

스트럿츠1.3.8
http://struts.apache.org/download.cgi#struts138

JDK5.0 (아마 6에서 해도 상관없을 것이다-_-;)
http://java.sun.com/javase/downloads/index_jdk5.jsp

설치는 이클립스는 그냥 압축풀고, 톰캣도 그냥 압축풀고, 스트럿츠는 나중에 프로젝트 만들고나서 설정하겠다. JDK5.0 다음신공으로 설치하면 끝이다.

다 설치를 했으면 이클립스를 구동하자.

우선 서버를 추가하자. File->New->Other선택 후 Server에서 Server선택해서 자신의 톰캣버전을 선택하자.

그다음 프로젝트를 만들자. File->New->Project 선택 후 dy라고 쳐서 Dynamic Web Project선택.
Project Name은 SimpleGuestBook이라고하고 모든 옵션을 디폴트로하고 Finish를 하자.

여러 폴더가 보일 것이다.
Java Resources: src -> 자바소스를 넣는 곳.
build -> 자바소스가 빌드되어서 이곳에 클래스로 저장이 된다.
WebContent -> WEB-INF폴더와 jsp, web.xml, struts-config.xml등의 설정파일을 저장할 곳.


대충 이런 구조로 되어있다. 우선 가장 먼저 "Hello 방명록"을 출력하는 것을 만들어보자.

※스트럿츠설치는 WebContent/WEB-INF/lib 폴더에 struts를 받아서 풀면 있는 lib폴더에 있는 lib파일을 다 가져다가 넣는다. 그리고 태그라이브러리라는 것을 써야 하는데 struts-taglib-1.3.8.jar파일을 풀면 META-INF/TLD폴더에 TLD파일들이 있는데 이 파일을 WEB-INF/TLD폴더를 생성해서 넣어 놓도록 하자.
 
WebContent/WEB-INF/web.xml을 열어서 수정하자. <web-app>안에 이렇게 넣자.

web.xml 파일소스 닫기

<display-name>GuestBook</display-name>

<!-- ActionServlet를 등록한다. -->
<servlet>
	<servlet-name>action</servlet-name>
	
	<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
	
	<init-param>
		<param-name>config</param-name>
		<param-value>/WEB-INF/config/struts-config.xml</param-value>
	</init-param>
	
	<init-param>
		<param-name>debug</param-name>
		<param-value>2</param-value>
	</init-param>
	
	<init-param>
		<param-name>detail</param-name>
		<param-value>2</param-value>
	</init-param>
	
	<!-- ActionServlet은 이 웹 어플리케이션 시작시에 함께 시작되어야 한다. -->
	<load-on-startup>1</load-on-startup>
</servlet>

<!-- “*.do”로 끝나는 모든 URL 패턴은 ActionServlet을 거쳐서 수행되어야 한다. -->
<servlet-mapping>
	<servlet-name>action</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>

<welcome-file-list>
	<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

web.xml 파일소스 닫기


web.xml은 한번 설정해놓으면 건드릴 것이 없다. 우리가 설정해야할 곳은 위에 actionservlet에 등록한 스트럿츠설정파일이다.
WEB-INF/config폴더를 생성해서 struts-config.xml 파일을 생성하자.

struts-config.xml 소스파일 닫기

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>

	<action-mappings>
		<action path="/Welcome" forward="/index.jsp"/>
	</action-mappings>

</struts-config>

struts-config.xml 소스파일 닫기


간단히 action을 지정해줬는데 http://localhost:8080/SimpleGuestBook/Welcome.do 라고 실행하게 되면 index.jsp를 포워딩하는 그런 것이다.

WebContent폴더에 index.jsp를 생성한 뒤

index.jsp 소스파일 닫기

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>스트럿츠로 제작된 방명록입니다.</title>
</head>
<body>
<a href="list.do">환영합니다.</a>
</body>
</html>

index.jsp 소스파일 닫기

이렇게 적어보자. 그런 뒤 SimpleGuestBook(프로젝트이름)에 대고 오른쪽버튼을 누른 뒤
Run As -> Run on Server해서 우리가 추가한 서버로 실행해보자.

그러면 http://localhost:8080/SimpleGuestBook/ 라고 주소창에 뜨고 환영합니다 라는 말이 뜰 것이다. 이것은 index.jsp를 바로 실행한 것이기 때문에
http://localhost:8080/SimpleGuestBook/Welcome.do 라고 쳐보자. 똑같이 나올 것이다.
스트럿츠 설정파일에서 Welcome은 index.jsp를 포워딩하기 때문이다.
만약 실행이 안된다면 프로젝트명에 대고 F5를 눌러서 Refresh를 해보던가 lib파일을 넣지 않았던가 하는 설정 문제 일것이다.

자 오늘은 여기까지-_-;


톰캣을 설치하고 index.jsp 를 불러 들이면 보통 디폴트 페이지인 고양이 그림의 인덱스 화면이 나타난다. 이 파일은 webapps/root/index.jsp 파일인데 이파일을 변경 하는데 꽤 힘들었다

디폴트 페이지라 무슨 서블릿에 저장 되어있어 나타난다는데 그런건 모르겠다...

일단 방법은 /webapps/root/web-inf/web.xml 파일을 연다.

-- WEB.XML --
<servlet>  
   <servlet-name>org.apache.jsp.index_jsp</servlet-name>  
    <servlet-class>org.apache.jsp.index_jsp</servlet-class>  
</servlet>  
<servlet-mapping>  
    <servlet-name>org.apache.jsp.index_jsp</servlet-name>  
    <url-pattern>/index.jsp</url-pattern>  
</servlet-mapping>  


위와 같은 코드가 있을수도 있고 없을수도 있다. 있다면 삭제를 해준다.

다음은 /work/catalina/localhost/_/org/apache/jsp 로 이동을한다.

index에 관련된 클래스와 자바 파일이 있을것이다.
index_jsp.class    index_jsp.java 
위와 같은 파일을 삭제 해준다.

다시 톰캣을 restart 를 해준후 자신이 만든 index.jsp 를 읽어 들이면
바뀐 화면을 볼수 있다.

+ Recent posts