이거 저것 패키지를 손대다가 NAS를 리부팅할 일이 생겼습니다.

부팅 후 로그인을 하려 했으나......


로그인이 안됩니다....... 헉!


구글링 해보니 이유에 대해 몇 가지 나오더군요.

http://blog.naver.com/PostView.nhn?blogId=jollynii1&logNo=110187001123&beginTime=0&jumpingVid=&from=section&redirect=Log&widgetTypeCall=true

http://synologynas1.rssing.com/browser.php?indx=4305254&item=8586

http://www.synology.com/ko-kr/company/news/article/437


그러다 어떤 글 중에 ssh로 접속해서 몇 가지 명령어를 실행시켰더니 로그인이 되었다는 글을 보았지요.


ssh로 접속한 다음 다음과 같이 입력을 하면 Boot done 이라고 출력된다.


이후 다시 접속해보니....

정상적으로 로그인 되네요.





Posted by 후니아부지
:

자바 애플릿 테스트 시 웹 브라우저에서 아래와 같은 오류가 나타나는 경우가 있다.


자바 제어판을 다음과 같은 방법으로 불러낸다.

                    or                      


보안 탭에서 보안 레벨을 중간으로 바꾸고 적용한다.


웹 브라우저를 재시작하여 다시 테스트 해본다. 그러면 아래와 같은 메시지를 볼 수 있다.

실행 버튼을 클릭하면 자바 애플릿이 실행되는 것을 볼 수 있다.

 

Posted by 후니아부지
:

JSP Action - plugin

자바로 만든 애플릿이나 빈을 현재 페이지에 추가하는 용도로 사용한다.

 속성

 값

 설명

 type

 applet 또는 bean 

 추가할 컴포넌트의 형식

 필수

 codebase

 url

 파일 경로 지정 

 code

 filename

 applet 이나 bean으로 지정할 파일 이름.확장자

 width

 pixel

 화면에 표시할 컴포넌트의 폭 

 필요 

 height

 pixel

 화면에 표시할 컴포넌트의 높이

 name

 unique name

 동일 페이지에서 구분할 이름

 기타

 align

 left, right, top, middle, bottom

 화면에 표시할 컴포넌트의 상대 위치 

 archive

 archive filename

 리소스(클래스, 이미지 등)을 압축한 파일. 확장자는 JAR

 hspace

 pixel

 컴포넌트의 가로 방향(왼쪽, 오른쪽) 공백을 지정

 vspace

 pixel

 컴포넌트의 세로 방향(위, 아래) 공백을 지정

 ieplugin

 url

 인터넷 익스플로러에서 실행할 때 해당 플러그인을 받는 위치 지정

 nsplugin

 url

 넷스케이프에서 실행할 때 해당 플러그인을 받는 위치 지정

 jreversion

 version

 이 컴포넌트를 실행할 JRE 버전을 지정


JSP Action - params, param

plugin, include, forward 액션과 함께 다른 컴포넌트나 다른 페이지와 연계하여 매개 변수를 전달하는 용도로 사용한다.

다음과 같은 형태로 사용한다.

        <jsp:params>
          <jsp:param name="값" value="값" ... />
          <jsp:param name="값" value="값" ... />
        </jsp:params> 


name은 매개 변수의 이름을 지정하고,

value는 매개 변수의 값을 지정한다.

하나의 속성마다 <jsp:param> 을 사용한다.

여러 개의 <param> 태그를 묶어야 할 때 <jsp:params> 태그를 사용한다.

※ 그러나 <params> 태그는 plugin 액션에서만 사용해야 한다.

    include, forward 액션에서는 2개 이상을 <param> 태그를 사용하더라도 <params> 태그로 묶어서는 안된다.


예제) 애플릿을 포함하는 페이지를 만들어보자. 애플릿은 매개 변수 2개를 받도록 생성한다.

MyApplet.java


viewApplet.jsp


확인~


※ '보안 설정으로 차단된 응용 프로그램' 이라는 오류가 발생할 수 있다. [해결방법]

Posted by 후니아부지
:

[JSP] 자바빈 (JavaBeans)

앎/web 2014. 3. 18. 15:38 |

자바빈(JavaBeans)이란 데이터를 표현하는 것을 목적으로 하는 자바 클래스를 말한다.

자바빈 규약을 따르는 클래스를 자바빈이라 부르며, MVC 구조에서 모델(Model)에 해당된다.


자바빈 규약

  • 클래스는 반드시 파라미터가 없는 기본 생성자를 가진다.
  • 클래스는 직열화(Serializable)되어야 한다.
  • 프로퍼티는 get, set 메서드를 통해 읽고 쓸 수 있어야 한다.
  • 프로터티 마다 Getter, Setter가 있어야 한다.
  • Getter는 파라미터가 없어야 한다.
  • Setter는 하나 이상의 파라미터를 가진다.
  • 프로퍼티가 Boolean 일 경우 get 대신 is를 사용한다.
  • 프로퍼티의 접근 제어자는 Private, Getter/Setter은 public, 클래스는 public로 정의해야 한다.

자바빈 규약을 만족하는 클래스를 작성해보자.

PersonBean.java 


TestPersonBean.java


다음과 같이 확인할 수 있을 것이다.


※ 참고: http://en.wikipedia.org/wiki/JavaBeans

Posted by 후니아부지
:

JSP 규약은 JSP 페이지에서 빈번히 사용되는 자바빈 객체를 위한 액션 태그를 제공한다.

이 액션 태그를 사용하여 자바빈 객체을 생성하거나, 자바빈의 프로퍼티를 출력하거나 값을 변경할 수 있다.

 

JSP가 기본적으로 제공하는 표준 태그사용자 태그로 나뉜다.

형식은 다음과 같다.

<접두어:태그이름 속성="값" 속성="값" .... />


표준 태그jsp라는 접두어를 사용한다.

<jsp:태그이름 속성="값" 속성="값" .... />


JSP Action : useBean

자바 클래스의 객체를 생성해서 JSP 내의 원하는 데이터 저장 영역에 배치되게 해주는 액션이다.

    <jsp:useBean id="..." class="..." scope="...">
    ....
    </jsp:useBean>

 속성 

 설명 

 id

 생성하려는 객체의 이름

 class

 자바 클래스 (패키지명을 포함)

 scope

 객체의 유효 범위. (page, request, session, application). 기본 값은 page.

이는 자바에서 객체를 생성하는 방법과 동일하다.

클래스 인스턴스명 = new 클래스();

 

JSP Action : setProperty / getProperty

객체에 property 를 Get 또는 Set 하기 위해 사용한다. (Getter / Setter 라고 보면 된다.)

<jsp:setProperty name="..." property="..." value="..." />

 속성

 설명

 name

 객체 이름

 property

 property 이름

 value

 property에 저장할 값


<jsp:setProperty name="..." property="..." param="..." />

 속성

 설명

 param

 넘어오는 객체의 parameter 이름


<jsp:setProperty name="..." property="..." />

※ 저장할 property와 가져올 param이 같다면 property 만 쓴다.

 

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

property의 값을 * 로 설정하면 폼에서 넘어오는 모든 parameter를 각각 property로 저장한다.
이는 넘어오는 parameter의 이름과 개수가 해당 객체의 property의 이름과 개수가 같아야한다.

 

<jsp:getProperty name="..." property="..." />

name 객체의 property 값을 가져온다.


예제) 입력 폼에서 넘어온 데이터를 DTO 객체에 담아 뷰 페이지로 전달한다. 일반적인 방법과 액션을 사용한 방법 모두 확인 해본다.

 

inputPage.htm

입력한 데이터를 처리하는 jsp 파일을 두 가지 방법으로 테스트 해본다.


 

 

DataDTO.java

String 타입의 데이터를 3개 관리할 수 있는 DTO 클래스를 생성한다.


 

 

inputProcess.jsp

넘어온 데이터를 DTO 객체에 담아 세션에 넣고 뷰 페이지로 이동한다.


 

 

viewPage.jsp

 

 

위 파일 중 JSP 파일을 JSP 액션을 사용하도록 수정해보자.

inputProcess_useBean.jsp



 

viewPage_useBean.jsp

 

 

동일한 기능을 하면서도 더 간략해진 코드를 볼 수 있다.

inputProcess 비교

 

viewPage 비교

 

Posted by 후니아부지
:

웹에서 이벤트가 사용되는 경우는 다음과 같다.

  • 세션의 생성, 소멸
  • 속성 변경
  • 컨텍스트 초기화


web.xml 에 <listener>에 등록해주면 웹 서버가 자동으로 이벤트를 감지하여 지정한 클래스 메서드를 실행시켜 준다.

<listener> 태그는 최상위에 넣는다.

  <listener>
    <display-name>이벤트 리스너 명</display-name>
    <listener-class>리스너클래스</listener-class>
  </listener>
  
  <filter>
    ....
  </filter>
  
  <filter-mapping>
    ....
  </filter-mapping>
  
  <servlet>
    ....
  </servlet>
  
  <servlet-mapping>
    ....
  </servlet-mapping>


설정할 수 있는 이벤트는 다음과 같다.

 이벤트

 ServletContextListener 

 발생시점 

 ServletContext 객체의 초기화 또는 소멸 시 발생

 메서드

 contextInitialized() 

 contextDestroyed()

 이벤트

 ServletContextAttributeListener

 발생시점

 ServletContext 객체에 속성이 추가, 삭제, 수정될 때 발생

 메서드

 attributeAdded()

 attributeRemoved()

 attributeReplaced()

 이벤트

 HttpSessionListener

 발생시점

 HttpSession 객체가 생성되거나 소멸될 때 발생

 메서드

 sessionCreated()

 sessionDestroyed()

 이벤트

 HttpSessionAttributeListener

 발생시점

 HttpSession 객체에 속성이 추가, 삭제, 수정될 때 발생

 메서드

 attributeAdded()

 attributeRemoved()

 attributeReplaced()

 이벤트

 ServletRequestListener

 발생시점

 ServletRequest 객체의 초기화 또는 소멸 시 발생 

 메서드

 requestInitialized()

 requestDestroyed()

 이벤트

 ServletRequestAttributeListener

 발생시점

 ServletRequest 객체에 속성이 추가, 삭제, 수정될 때 발생

 메서드

 attributeAdded()

 attributeRemoved()

 attributeReplaced()


앞서 작성한 서블릿 필터의 예제 소스에 추가해서 테스트한다.

예제) 세션에 속성 추가 시 이벤트 발생을 확인한다.

web.xml

<servlet> 태그보다 앞에 추가한다.

  ....
  <listener>
    <display-name>SessionListener</display-name>
    <listener-class>com.study.SessionListener</listener-class>
  </listener>
  ....


SessionListener.java

리스너 클래스를 생성한다.

package com.study;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

public class SessionListener implements HttpSessionAttributeListener {
  public void attributeAdded(HttpSessionBindingEvent _evt) {
    System.out.println("Event (attributeAdded)");
    System.out.println("  => Name: " + _evt.getName());
    System.out.println("  => Value: " + _evt.getValue());
  }
  
  public void attributeRemoved(HttpSessionBindingEvent _evt) {
  }

  public void attributeReplaced(HttpSessionBindingEvent _evt) {
  }
}


확인~


Posted by 후니아부지
:

이클립스에는 Override/Implement 메서드를 자동을 생성해주는 기능이 있다.

몇 가지 방법이 있는데 예를 들어 알아 보자.


서블릿 필터를 생성하면 몇 가지 메서드를 재정의 해줘야 한다.

아직 재정의를 하지 않아 에러 표시가 나타난다.


재정의해야할 메서드를 자동으로 생성하는데는 몇 가지 방법이 있다.


[방법 1] 

메뉴 Source -> Override/Implement Methods 를 클릭하면 다음과 같은 창이 나타난다.

오버라이드 하려는 메서드를 체크하고 OK를 누르면 생성된다.


[방법 2] 

[Ctrl + 3] 를 눌러 Quick Access 를 띄우고 override 로 조회하면 해당 메뉴가 나온다. 

이를 클릭하면 방법1의 창이 나타난다. 


[방법 3]

다음과 같이 오류 아이콘을 클릭해서 Add unimplemented methods 를 클릭하면 자동 생성된다.



방법1,2,3 모두 다음과 같이 자동 생성되는 것을 볼 수 있을 것이다.


Posted by 후니아부지
:

서블릿 필터

웹 상에서 사용자 요청 페이지가 실행하기 전이나 후에 동작이나 데이터를 가로채서 어떠한 작업을 해주고 해당 페이지로 넘어갈 수 있도록, 혹은 넘어갈 수 없도록 막는 등의 작업을 할 때 사용한다.

예를 들면 이벤트나 공지 등의 팝업을 추가하거나 전달 받은 데이터를 인코딩하는 경우, 세션 데이터를 인증하는 등의 작업에 사용될 수 있다.


Filter 인터페이스를 구현하는 클래스 작성 후

class 클래스명 implements Filter {
    public void init(FilterConfig fc) throws ServletExeption {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
              throws IOEXception, ServletException {
        // 필터 작업
        
        chain.doFilter(request, response); // '가던 길로 가세요~' 라는 의미 :)
    }

    public void destroy() {
    }
}

web.xml에 등록하여 사용한다. (서블릿 보다 위에 작성한다.)

<filter>
  <filter-name>필터명</filter-name>
  <filter-class>필터클래스</filter-class>
  <init-param>
    <param-name>매개변수명</param-name>
    <param-value>값</param-value>
  </init-param> 
</filter>

<filter-mapping>
  <filter-name>필터명</filter-name>
  <url-pattern>필터패턴</url-pattern>
</filter-mapping>


예제) 로그인 페이지에서 로그인 후 메인 페이지로 이동

login.htm


LoginProcessServlet.java

 

web.xml


MainServlet.java


이때 문제가 되는 것이, 로그인 후 메인 페이지의 주소를 복사한 후 서버 재시작 후 복사한 주소를 넣고 이동하면 메인 페이지로 바로 갈 수 있다. 로그인 과정을 거치지도 않았는데도 메인 페이지를 볼 수 있다는 것이다.

이를 방지하기 위해 필터를 사용해본다.

 

Filter 클래스를 생성하고 web.xml에 등록해준다.

 

web.xml

<servlet> 태그 보다 위에 작성해야 한다. '.do'로 서블릿을 호출할 때 LoginFilter 필터가 적용되도록 설정한다. 

 

LoginFilter.java

세션에 ID가 있는지 확인해서 없다면 로그인 화면으로 가도록 한다.

LoginProcessServlet 에서 세션에 ID를 저장하도록 할 것이므로 필터 처리에 예외가 되도록 한다. LoginProcessServlet 를 거치지 않고서는 ID가 세션에 없으므로 무조건 로그인 화면으로 가버리게 되기 때문이다.

 

LoginProcessServlet.java

로그인 처리 서블릿에서는 세션에 ID를 저장하고 Main.do를 호출한다.


 

MainServlet.java



로그인 후 세션이 생성되었을 때의 주소를 복사 후, 서버를 재시작하고 앞에 복사한 주소로 직접 접근해본다.

이제는 Main.do 로 접근 시 필터에 걸려서 (세션에 ID가 없으므로) 로그인 화면으로 이동될 것이다.

 

Posted by 후니아부지
:

MIME은 Multipurpose Internet Mail Extensions 의 약자로 메일을 확장한 인터넷 표준이라 할 수 있다.

웹에서 데이터를 상대방에게 보낼 때 헤더에 MIME을 지정하고, 상대방은 받은 데이터를 화면에 보여줄 때 MIME 형식에 따라 처리한다.

자주 사용하는 MIME 형식 종류는 다음과 같다.

 분류

 종류

 설명

 이미지 관련

 image/bmp

 BMP 파일의 MIME

 image/gif

 GIF 파일의 MIME

 image/jpeg

 JPG, JPEG, JPE 파일의 MIME

 image/png

 PNG 파일의 MIME

 image/x-icon

 ICO 파일의 MIME

 ....

 

 응용 프로그램 관련

 application/msword

 워드 파일의 MIME

 application/vnd.ms-excel

 엑셀 파일의 MIME

 application/vnd.ms-powerpoint

 파워포인트 파일의 MIME

 .... 

 기타

 application/octet-stream

 파일 다운로드 MIME

 .... 


예제) 파일 종류 별로 몇 가지 업로드해서 화면에 보여지도록 해본다.

web.xml


FileUploadServlet.java


fileUploadPage.htm


파일 업로드 후, 이미지 파일의 경우 웹 페이지에 보여질 것이고, 

응용프로그램 관련 파일은 '열기'를 선택하면 해당 응용프로그램이 실행되어 파일을 볼 수 있을 것이다. (웹 페이지에 안 열리고??????)

그러나 응용프로그램 관련 MIME 형식을 설정하지 않아도 '열기'가 된다?!?!?!?!?!?!?

기타 파일의 경우 다운로드 할 수 있다.


왜 이러나?????



Posted by 후니아부지
:

웹 프로그램에서는 데이터베이스의 환경 설정과 연결 관리등을 XML 파일이나 속성 파일을 사용하여 관리하고 특정 이름을 사용하여 이 정보를 얻어온다. 

웹에서 불특정 다수의 사용자가 DB연결을 요청한다고 무작정 허용한다면 DBMS는 부하를 감당할 수 없을 것이다.

따라서 연결 개수를 설정하여 현재 연결된 사용자가 더 이상 Connection 객체를 사용하지 않을 경우 해당 Connection 객체를 반환받아서 다른 사용자에게 할당해야 한다. 이런 작업을 Connection Pooling이라 하고 DBCP(Database Connection Pooling)이라 부른다. 


여기서는 톰캣의 DBCP(Database Connection Pool)를 사용하여 DBMS Connection 객체를 생성, 사용하는 방법에 대해 알아본다.


프로젝트의 META-INF 디렉터리 내에 Context.xml을 생성한다.

Context.xml은 해당 Context에서 사용할 리소스를 등록하는 곳이다. 

다음과 같이 작성한다.

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Resource name="jdbc/myconn"
            auth="Container"
            type="javax.sql.DataSource"
            factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
            driverClassName="org.gjt.mm.mysql.Driver"
            url="jdbc:mysql://localhost:3306/데이터베이스명?AutoReconnect=true"
            username="계정"
            password="암호"
            maxActive="100"
            maxIdle="30"
            maxWait="60"
            removeAbandoned="true"
            removeAbandonedTiemout="60"/>
</Context>

속성

설명 

 name

 JNDI로 호출될 이름

 auth

 DBCP를 관리할 관리자. Container or Application 

 type

 해당 리소스의 Return Type. DataSource는 Connection 객체를 반환할 수 있다.

 factory

 DBCP를 관리하는 클래스

 driverClassName

 JDBC를 이용하기 위한 드라이버 클래스

 url

 DB 접속 URL. 해당 속성으로 자동 재접속을 설정했다.

 username

 DB 계정명

 password

 계정 비밀번호

 maxActive

 최대 접속 허용 개수

 maxIdle

 DB Pool에 여분으로 남겨질 최대 Connection 개수

 maxWait

 DB 연결이 반환되는 Timeout 최대 시간

 removeAbandoned

 Connection이 잘못 관리되어 버려진 연결을 찾아 재활용할 것인지 여부 설정

 removeAbandonedTimeout

 버려진 연결로 인식할 기본 시간 설정. 초 단위.


이렇게 설정된 정보 객체를 이름으로 얻으려면 자바의 네이밍 API를 사용해야 한다. 이를 JNDI라고 하는데 

JNDI(Java Naming and Directory Interface)는 이름을 사용하여 데이터 및 객체를 찾을 수 있도록 도와주는 디렉토리 서비스에 대한 Java API이다. 


web.xml에 JNDI로 정의할 이름을 등록한다. <welcome-file-list> 태그 위에 작성한다.

  <resource-ref>
    <description>MySQL Resource</description>
    <res-ref-name>jdbc/myconn</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>


서블릿을 작성하고 web.xml에 매핑해준다.

ConnectionServlet.java

package com.study;

import java.io.IOException;
import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

public class ConnectionServlet extends HttpServlet {
	public void service(HttpServletRequest _request, HttpServletResponse _response) 
			throws IOException, ServletException {
		try {
			Context context = new InitialContext();
			/* JNDI 이름은 java:comp/env에 등록되어 있다. 
			   따라서 예약어로 "java:comp/env"가 오고 그 다음 
			   Context.xml의 name으로 설정한 내용을 쓰면 된다. */
			DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/myconn");
			Connection conn = ds.getConnection();
			
			System.out.println("conn: " + conn);			
		} catch(Exception _ex) {
			System.out.println("Error: " + _ex.getLocalizedMessage());			
		}
	}
}

web.xml

  <servlet>
    <servlet-name>ConnectionServlet</servlet-name>
    <servlet-class>com.study.ConnectionServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>ConnectionServlet</servlet-name>
    <url-pattern>/DBConnect.do</url-pattern>
  </servlet-mapping>  


실행해서 Connection 객체 정보를 확인하자.



Posted by 후니아부지
: