JSTL (JavaServer Pages Standard Tag Library)


1. 다운로드

http://tomcat.apache.org/taglibs/standard/

여기에서는 Standard 1.1 을 사용할 것이다. 


바이너리를 클릭


1.1 의 마지막 버전을 다운로드 한다.

jakarta-taglibs-standard-1.1.2.zip



2. 설치

사용하려는 라이브러리는 lib 폴더 내의 jstl.jar 과 standard.jar 이다.

현재 프로젝트에서만 쓰려면 사용하고자 하는 프로젝트의 WebContent\WEB-INF\lib 에 넣어준다.

해당 WAS를 사용하는 모든 프로젝트에서 사용하려면 WAS의 lib 폴더에 넣으면 된다. (여기서는 Tomcat의 lib)


그리고 압축 푼 폴더에 있는 tld 파일을 사용하려는 프로젝트에 넣어줘야 한다.

해당 프로젝트의 WebContent\WEB-INF tld 폴더를 만들고 tld 파일 모두를 복사한다.


3. 사

사용하려는 페이지에 아래와 같이 써준다.

<%@ taglib prefix="태그" uri="Tag Library Descriptor 파일 경로 or URI %>

uri에는  Tag Library Descriptor 파일의 경로(파일 이름 포함)를 쓰거나 해당 tld 파일 내용 중 uri 값을 쓰면 된다.


c.tld 파일의 uri

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 


또는 Tag Library Descriptor 파일의 경로

<%-- @ taglib prefix="c" uri="WEB-INF/tld/c.tld" --%> 


4. 자주 사용하는 태그




Posted by 후니아부지
:

이거 저것 패키지를 손대다가 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 후니아부지
:

차량 구매 후 2년이 넘었지만 거의 손댄 곳 없이 순정 상태를 유지하고 있습니다.

꾸미고도 싶으나 애 아부지가 무슨 여윳돈이 있겠습니까???  ㅠ_ㅠ 


크루즈 국민 DIY 라고 불리우는 알페온용 기어 노브 교체를 언젠가는 해야지....하고 있던 어느 날~


드디어 마눌님께 허락을 득 할 수 있는 일이 생겼습니다!!!


우리 아드님께서 앞쪽 좌석에서 놀기를 좋아라 합니다.  물론 주차한 상태에서지요 :)

이것 저것 만지고 놀다가 동전을 뿌리기 시작했는데 동전 하나가 닭다리 밑 틈새로 들어갔나 봅니다.


그것도 모르고 있다가 D로 바꾸는데 동전 떨어지는 소리가 들리더군요 -,.-


짤랑~~ 헉!!!!!!   훗~~      :)


마눌님께 바로 말씀드렸습니다.

'이건 운행에 문제가 될 수 있으니 저길 덮어야 한다!!!'

'가죽으로 덮여있는 기어 노브로 바꾸면 된다~~'


그러고는 쉐보레 부품 전문 쇼핑몰(c-mall)에서 주문을 했지요~


도착한 "알페온 기어노브 피아노블랙' 입니다. 품번은 i20982223 입니다. 

(품번이라니깐.....ㅋ  우리가 좋아라하는 교육용 자료 품번이 아닙니다.)


이제부터 교체 작업 시작합니다.


먼저 체인지 커버를 빼야 합니다. 헤라나 카드로 아래에 표시해 놓은 부분을 찔러 넣고 지렛대로 사용하면 빠져 나옵니다. 

처음에는 부서질까봐 살살하니 잘 안되더군요. 힘껏하세요~ 안부서집니다~ ㅋ


가죽 정리를 위해 정체를 알 수 없는 (주로 동전을 넣어 놓는) 작은 수납함을 분리해야 합니다.

7mm 복스로 분리하면 됩니다. 

※ 아... 그리고 체인지 커버에 주황색 네모로 표시한 부분 반대편에 SESC 버튼과 체인지 레버 인디게이터가 연결되어 있습니다.

분리 안해도 작업에 지장 없으므로 연결한 상태에서 진행했습니다.


동네 철물점에 7mm가 안팔더군요... 다른 동네가서 사왔습니다. ㅠ_ㅠ


이제 크루즈의 튼실한 닭다리를 뽑을 차례입니다. 중립인 상태에서 진행합니다.

워낙 빡빡해서 이런 자세가 아니고서는 못뽑겠더군요. 

버튼을 누르고 좌우로 힘주어 돌려가며(안돌아 갑니다. 그냥 돌리듯이 힘만 줍니다.) 땡기니 쑥~하고 뽑히네요.

너무 힘있게 땡기다가 룸미러 박살낼뻔 했습니다. ㅋ

아... 다른 분들은 턱 조심하라더군요. 조심~


분리된 닭다리입니다. 크네요~


뽑은 자리에 끼우기 위해 아래처럼 뒤집습니다. 

그런데 가죽 끝에 있는 플라스틱은 필요 없습니다. 본드로 붙어 있는데 그냥 떼버리면 됩니다.


잘 떨어지나 안 찢어지게 조심히~


뗀 플라스틱입니다. 그냥 버리면 됩니다~


자... 이제 '알페온 기어 노브 작업' 에서 가장 난이도 높은!!!!!!!!!!!!!!!

가죽 정리 작업입니다. -,.-

사실 어려운 건 없는데, 이리해도 맘에 안들고 저리해도 맘에 안들고.........

그냥 적당히 타협합시다.


이제 조립하면 되는데 '조립은 분해의 역순!!!!' 

수납합을 넣고 커버를 덮으면 됩니다.

이때, 가죽이 커버에 눌려지는 부분을 잘 보고 눌러 줍니다. 가죽이 접혀서 모양이 이상해질 수 있거든요.

맘에 안들면 또 뜯어야 하니깐~~


가죽 주위를 다시 꾹! 꾹! 눌러줍니다. 가죽 때문에 약간 들리거든요.

작업 끝~


교체하니 닭다리가 달린 때보다 고급스럽군요....ㅎ


사실 편하기는 닭다리가 더 편했지요...  크고 높아서 운전중에 손올려 놓기 좋았거든요. ㅎ

그래도 이게 더 모양새 나니 만족합니다.


이제 차를 뜯기 시작했으니 슬~슬~ 차를 꾸미기 시작해야 겠는네요.

다음에 무슨 핑곗거리로 뭘 바꾸나~ ㅋ




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 후니아부지
: