https://www.oracle.com/technetwork/articles/javase/code-convention-138726.html

파일 이름 및 위치

파일 이름 지정을 통해 도구 공급 업체 및 웹 컨테이너는 파일 형식을 결정하고 그에 따라 해석 할 수 있습니다. 다음 표에는 권장되는 파일 접미사 및 위치가 나와 있습니다.

파일 형식파일 접미사권장 위치
JSP 기술.jsp<context root> / <subsystem path> /
JSP 단편.jsp<context root> / <subsystem path> /
.jspf<context root> /WEB-INF/jspf/<subsystem path> /
계단식 스타일 시트.css<context root> /css/
JavaScript 기술.js<context root> /js/
HTML 페이지.html<context root> / <subsystem path> /
웹 리소스.gif, .jpg<context root> /images/
태그 라이브러리 디스크립터.tld<context root> /WEB-INF/tld/

위의 표를 읽을 때 유의해야 할 몇 가지 사항이 있습니다. 첫째, <context root>는 웹 응용 프로그램의 컨텍스트 루트입니다 ( .war파일 내부의 루트 디렉토리 ). 둘째, <subsystem path>는 동적 및 정적 웹 페이지 컨텐츠의 세련된 논리적 그룹화를 제공하는 데 사용됩니다. 작은 웹 응용 프로그램의 경우 빈 문자열 일 수 있습니다.

셋째, 다른 JSP 페이지에 포함될 수있는 JSP 페이지를 나타 내기 위해 JSP 단편 이라는 용어를 사용합니다 JSP 2.0 스펙에서는 "JSP 조각"이라는 용어가 오버로드되어 있으므로 "JSP 세그먼트"라는 용어가 대신 사용됩니다. JSP 단편은 접미사 중 하나 .jsp또는 .jspf접미사를 사용할 수 /WEB-INF/jspf있으며 나머지 정적 컨텐트에 각각 배치해야합니다 완전한 페이지가 아닌 JSP 조각은 항상 .jspf접미사를 사용해야하며 항상 배치되어야합니다 /WEB-INF/jspf넷째, JSP 사양이 권장하지만 모두 .jspf와 .jspJSP 조각을위한 가능한 확장으로서, 우리 는 JavaServer Faces 스펙 에서 사용되는 .jspf것과 같이 추천 한다 ..jsf

마지막으로, 태그 라이브러리 디스크립터 파일과 다른 비공개 컨텐츠를 그 아래 WEB-INF/또는 서브 디렉토리 아래 에 배치하는 것이 일반적으로 바람직 합니다. 이러한 방식으로, 웹 컨테이너는 밑에있는 어떤 파일도 제공하지 않으므로 컨텐츠는 클라이언트에 접근 할 수없고 보이지 않게됩니다 WEB-INF/.

welcome-file배포 설명자 ( web.xml의 요소에 선언 된 선택 환영 파일의 이름 은 index.jsp동적 내용이 생성되거나 index.html시작 페이지가 정적 인 경우에 지정해야합니다.

JSP 파일을 국제화 할 때 로케일별로 JSP 페이지를 디렉토리로 그룹화하는 것이 좋습니다. 예를 들어 미국 영어 버전은 index.jsp아래에 표시 /en_US/index.jsp되지만, 동일한 파일의 일본어 버전은 아래에 표시됩니다 /ja_JP/index.jsp자바 튜토리얼은 일반적으로 자바 코드의 국제화에 대한 추가 정보를 제공하고,이 책 은 J2EE 플랫폼으로 설계 엔터프라이즈 응용 프로그램은 웹 응용 프로그램의 국제화에 대한 정보를 제공합니다.

파일 구성

잘 구조화 된 소스 코드 파일은 읽기가 쉬울뿐만 아니라 파일 내에서 정보를 찾는 데 더 빠릅니다. 이 섹션에서는 JSP 및 태그 라이브러리 설명자 파일의 구조를 소개합니다.

JSP 파일 / JSP 단편 파일

JSP 파일은 나열된 순서대로 다음 섹션으로 구성됩니다.

  1. 코멘트 열기
  2. JSP 페이지 지시문
  3. 선택적 태그 라이브러리 지시문
  4. 선택적 JSP 선언
  5. HTML 및 JSP 코드

오프닝 코멘트

JSP 파일 또는 조각 파일은 서버 측 스타일 주석으로 시작합니다.

<% - 
  - 작성자 : 
  - 날짜 : 
  - 저작권 공지 : 
  - @ (#) 
  - 설명 : 
  - %>


이 주석은 JSP 페이지 변환 중에 제거되므로 서버 측에서만 볼 수 있습니다. 이 주석에는 웹 개발자를위한 JSP 페이지에 대한 개정판의 저자, ​​날짜 및 저작권 고지, 식별자 및 설명이 있습니다. 문자 " @(#)의 조합은 특정 프로그램에서 식별자의 시작을 나타내는 것으로 인식됩니다. 이러한 프로그램은 거의 사용되지 않지만이 문자열을 사용하면 아무런 해가 없습니다. 또한 이러한 조합은 때때로 $Id$일부 버전 제어 프로그램에 의해 식별 정보가 JSP 페이지에 자동으로 삽입되도록 추가됩니다이 Description부분은 JSP 페이지의 목적에 대한 간략한 정보를 제공합니다. 하나 이상의 단락에 걸쳐 있지 않습니다.

일부 상황에서는 개시 주석을 번역 중에 유지해야하며 진정성 및 법적 목적을 위해 클라이언트 측 (브라우저에서 볼 수 있음)으로 전파해야합니다. 주석 블록을 두 부분으로 나누면됩니다. 첫째, 클라이언트 측 스타일 주석 :

<! - 
  - 저자 : 
  - 날짜 : 
  - 저작권 고지 : 
  ->


그리고 짧은 서버 측 스타일 주석 :

<% - 
  - @ (#) 
  - 설명 : 
  - %>

JSP 페이지 지시문

JSP 페이지 지시문은 변환 할 때 JSP 페이지와 연관된 속성을 정의합니다. JSP 스펙은 동일한 페이지에서 정의 할 수있는 JSP 페이지 지정 문 수에 대한 제한 조건을 부과하지 않습니다. 따라서 다음 두 코드 샘플은 동일합니다 (첫 번째 예제에서는 결과에 두 개의 빈 줄이 추가됨).

코드 샘플 1 :

<% @ page session = "false"%> 
<% @ page import = "java.util. *"%> 
<% @ page errorPage = "/ common / errorPage.jsp"%>

페이지 지시문과 같은 지시문의 길이가 JSP 페이지의 일반적인 너비 (80 자)를 초과하면 지시문은 여러 줄로 분리됩니다.

코드 샘플 2 :

<% @ page session = "false" 
            import = "java.util. *" 
            errorPage = "/ common / errorPage.jsp" 
%>

일반적으로 코드 샘플 2는 코드 샘플 1에 대한 페이지 지시문을 정의하기 위해 선호되는 선택입니다. 여러 Java 패키지를 JSP 페이지로 가져 와야하는 예외가 발생하여 매우 긴 import속성이 생깁니다 .

<% @ page session = "false" 
            import = "java.util. *, java.text. *, 
                    com.mycorp.myapp.taglib. *, 
                    com.mycorp.myapp.sql. *, ..." 
.. . 
%>


이 시나리오에서 다음과 같은이 페이지 지시문을 분리하는 것이 좋습니다.

<% - 수입을 제외한 모든 속성 - %> 
<% @ 페이지 
... 
%> 
<% - 수입 속성이 여기에서 시작 - %> 
<% @ 페이지 수입 = ". java.util의 *"%> 
< % @ page import = "java.text. *"%> 
...


일반적으로 import명령문은 Java 기술에 대한 지역 코드 규칙을 따릅니다. 예를 들어, 동일한 패키지의 최대 3 개 클래스가 사용되는 import경우 해당 패키지가 아닌 특정 개별 클래스를 선언해야한다는 사실을 일반적으로 인정할 수 있습니다 세 가지 클래스를 넘어, 웹 개발자가 개별적으로 클래스를 나열할지 아니면 ". *"표기법을 사용할지를 결정해야합니다. 전자의 경우 외부 클래스를 쉽게 식별 할 수 있습니다. 특히 버그가있는 클래스를 찾거나 JSP 페이지가 Java 코드와 상호 작용하는 방식을 이해하려고 할 때 더욱 그렇습니다. 예를 들어 아래에 표시된대로 가져온 Java 패키지에 대한 지식이 없으면 웹 개발자는 Customer클래스 를 찾기 위해 이러한 모든 패키지를 검색해야합니다 .

<% @ page import = "com.mycorp.bank.savings. *"%> 
<% @ page import = "com.thirdpartycorp.cashmanagement. *"%> 
<% @ page import = "com.mycorp.bank.foreignexchange . * "%> 
...

후자의 경우, 작성된 JSP 페이지는 깔끔하지만 클래스를 찾는 것이 더 어렵습니다. 일반적으로 JSP 페이지에 import 지시문이 너무 많으면 너무 많은 Java 코드가 포함될 가능성이 있습니다. 더 나은 선택은 더 많은 JSP 태그를 사용하는 것입니다 (이 기사 뒷부분에서 설명).

선택적 태그 라이브러리 지시문

태그 라이브러리 지시문은 JSP 페이지에서 사용하는 사용자 정의 태그 라이브러리를 선언합니다. 짧은 지시문은 한 줄로 선언됩니다. 여러 태그 라이브러리 지시문은 JSP 페이지 본문의 동일한 위치에 함께 쌓입니다.

<% @ taglib uri = "URI1"prefix = "tagPrefix1"%> 
<% @ taglib uri = "URI2"prefix = "tagPrefix2"%> 
...

page 지시문과 마찬가지로 태그 라이브러리 지시문의 길이가 JSP 페이지의 일반적인 너비 (80 자)를 초과하면 지시문은 여러 줄로 분리됩니다.

<% @ taglib 
    uri = "URI2" 
    prefix = "tagPrefix2" 
%>

페이지에서 사용중인 태그 라이브러리 만 가져와야합니다.

JSP 1.2 사양 에서 웹 응용 프로그램에 JSP 표준 태그 라이브러리 (JSTL)를 사용하여 페이지에서 JSP 스크립틀릿의 필요성을 줄이는 것이 좋습니다 JSTL을 사용하는 페이지는 일반적으로 읽고 유지하기가 더 쉽습니다.

선택적 JSP 선언

JSP 선언은 JSP 페이지가 소유하는 메소드와 변수를 선언합니다. 이러한 메소드와 변수는 Java 프로그래밍 언어의 선언과 다르지 않으므로 관련 코드 규칙을 따라야합니다. 선언은 %! ... %JSP 페이지 본문의 한 영역 내에 선언을 중앙 집중화하기 위해 단일 < > JSP 선언 블록에 포함되는 것이 좋습니다 다음은 그 예입니다.

서로 다른 선언 블록선호 선언 블록
    <%! 개인 int hitCount; %> 
    <%! 개인 날짜 오늘; %> 
    ... 
    <%! 공공 int getHitCount () { 
            반환 hitCount; 
        } 
    %>

    <%! 
        개인 int hitCount; 
        개인 날짜 오늘; 
    
        공공 int getHitCount () { 
            반환 hitCount; 
        } 
    %>

HTML 및 JSP 코드

JSP 페이지의이 섹션에는 JSP 페이지의 HTML 본문과 JSP 코드, 예를 들어 JSP 식, 스크립틀릿 및 JavaBeans 지침이 들어 있습니다.

태그 라이브러리 디스크립터

TLD (tag library descriptor) 파일은 적절한 XML 선언 및 올바른 DTD 문으로 시작해야합니다. 예를 들어, JSP 1.2 TLD 파일은 다음으로 시작해야합니다.

<! xml version = "1.0"encoding = "ISO-8859-1">> 
<! DOCTYPE taglib 
    PUBLIC "- // Sun Microsystems, Inc.//DTD JSP 태그 라이브러리 1.2 // EN" 
    "http : // bit .ly / 10lWUaT ">

바로 뒤에 저자, 날짜, 저작권, 식별 정보 및 라이브러리에 대한 간단한 설명을 나열하는 서버 측 스타일 주석이옵니다.

<! - 
  - 작성자 : 
  - 날짜 : 
  - 저작권 공지 : 
  - @ (#) 
  - 설명 : 
  ->


이러한 요소의 사용에 관한 규칙 및 지침은 JSP 파일 / 조각 파일에 대해 정의 된 규칙 및 지침과 동일합니다.

파일의 나머지 부분은 아래에 나타난 순서대로 다음과 같이 구성됩니다.

  • 하나의 태그 라이브러리 유효성 검사기에 대한 선택적 선언
  • 이벤트 리스너의 선택적 선언
  • 하나 이상의 사용 가능한 태그 선언

TLD 파일의 요소에 대해 항상 다음과 같은 선택적 하위 요소를 추가하는 것이 좋습니다. 이 하위 요소는 태그 디자이너가 TLD 파일의 동작 및 추가 정보를 문서화하고 웹 구성 요소 개발자에게 공개 할 수있는 자리 표시자를 제공합니다.

TLD 요소JSP 1.2 권장 
하위 요소
JSP 1.1 권장 
하위 요소
속성 (JSP 1.2)기술 
init-param (JSP 1.2)기술 
꼬리표표시 이름, 설명, 예이름, 정보
tagliburi, 표시 이름, 설명uri, info
유효성 검사기 (JSP 1.2)기술 
변수 (JSP 1.2)기술 

톱니 모양

들여 쓰기는 공백 문자로 채워야합니다. 탭 문자는 다른 편집기에서 문자의 간격을 다르게 해석하므로 JSP 페이지의 들여 쓰기에 사용하면 안됩니다. 특정 통합 개발 환경 (IDE) 도구로 제한되지 않는 한 들여 쓰기 단위는 4 개의 공백 문자에 해당합니다. 다음은 그 예입니다.

<myTagLib : forEach var = "client"items = "$ {clients}"> 
    <myTagLib : mail 값 = "$ {client}"/> 
</ myTagLib : forEach>

연속 들여 쓰기는 블록의 다음 줄을 이전 줄의 적절한 지점에 맞 춥니 다. 연속 들여 쓰기는 일반적인 들여 쓰기의 여러 단위로 이루어집니다 (4 개의 공백 문자를 여러 로트).

<% @ 페이지 attribute1 = "value1" 
            attribute2 = "value2" 
            ... 
            attributeN = "valueN" 
%>


스크립팅 요소의 들여 쓰기

JSP 스크립팅 요소 (예 : 선언, 스크립틀릿, 표현식)가 한 줄에 들어 가지 않으면 스크립팅 언어의 채택 된 들여 쓰기 규칙이 요소 본문에 적용됩니다. 본문은 요소의 시작 기호와 동일한 줄에서 시작 기호의<%=새 줄부터 시작 <%=됩니다. 그 다음 본문은 %>별도의 행 에서 요소의 둘러싸는 기호 ( 로 종료됩니다 예 :

<% = (Calendar.getInstance (). get (Calendar.DAY_OF_WEEK)      = Calendar.SUNDAY)? "잠들다": "일하러 가자" 
%>
  
                     
  
                     
  
                     
                


본문을 JSP 페이지의 나머지 부분과 구별되게 식별 할 수 있도록 본문 내의 여는 부분과 둘러싸는 기호가없는 줄은 일반 들여 쓰기 ( 앞의 예제 와 같이) 한 단위로 시작됩니다 .  

JSP, HTML 및 Java로 복합 들여 쓰기

JSP 스크립팅 코드와 템플리트 텍스트 (HTML)가 혼합 된 JSP 요소의 복합 들여 쓰기는 JSP 소스 파일을 이해하려는 노력을 줄이기 위해 필요합니다. 이는 기존의 일반적인 들여 쓰기로 인해 JSP 소스 파일을보기가 어려울 수 있기 때문입니다. 일반적으로 다른 요소에 삽입 된 모든 요소에 일반 들여 쓰기 단위를 추가로 적용합니다. 이렇게하면 클라이언트 쪽에서 생성 된 최종 출력의 들여 쓰기가 표시되도록 렌더링됩니다. 그러나 추가 들여 쓰기는 일반적으로 (브라우저에서) 무시되며 브라우저에서 렌더링 된 결과에는 영향을 미치지 않습니다. 예를 들어 <TABLE>태그 앞에 공백 문자를 추가 해도 테이블의 위치는 변경되지 않습니다. 들여 쓰기에이 규칙을 적용하면 멋지게 보입니다.

    <table> 
        <% if (tableHeaderRequired) {%> 
            <tr> 
                <성> 
                <th> 이름 </ th> 
            </ tr> 
        <%} %> 
        <c : forEach var = "고객 "항목 ="$ {고객} "> 
            <TR> 
                <TD> <C : 제한 값 ="$ {customer.lastName} "/> </ TD> 
                <TD> <C : 제한 값 ="$ {고객. firstName} "/> </ td> 
            </ tr> 
        </ c : forEach> 
    </ table>


이것보다:

    <table> 
        <% if (tableHeaderRequired) {%> 
        <tr> 
            <성> 
            <th> 이름 </ th> 
        </ tr> 
        <%} %> 
        <c : forEach var = "고객 "항목 ="$ {고객} "> 
        <TR> 
            <TD> <C : 제한 값 ="$ {customer.lastName} "/> </ TD> 
            <TD> <C : 제한 값 ="$ {고객. firstName} "/> </ td> 
        </ tr> 
        </ c : forEach> 
    </ table>


코멘트

주석은 주변 정보의 추가 정보 또는 목적을 설명하기 위해 드물게 사용됩니다. 여기 JSP 파일과 클라이언트 측 주석의 두 가지 유형이 있습니다.

JSP 주석

JSP 주석 (서버 측 주석이라고도 함)은 서버 측에서만 볼 수 있습니다 (즉, 클라이언트 측에 전달되지 않음). 순수 JSP 주석은 스크립팅 언어 주석이있는 JSP 주석보다 우선적입니다. 전자는 JSP 스크립 트 언어에 덜 의존하고 JSP 2.0 스타일 페이지로 쉽게 진화 할 것이기 때문입니다. 다음 표는이를 설명합니다.

스크립팅 언어 주석이있는 JSP 스크립틀릿순수한 JSP 주석
단일
    <% / ** ... * / %> 
    <% / * ... * / %> 
    <% // ... %>    
    <% - ... - %>
배수
    <% 
    / * 
     * 
    ... 
     * 
     * / 
    %>

    <% - 
      - 
     ... 
      - 
      - %>

    <% 
    // 
    // 
    ... 
    // 
    %>

고객 측 의견

클라이언트 쪽 주석 ( <!-- ... -->)은 클라이언트에 보낸 응답에 응답에 대한 추가 정보를 주석으로 추가하는 데 사용할 수 있습니다. 응답을 생성하는 코드 또는 서버 응용 프로그램의 동작 및 내부 구조에 대한 정보를 포함하지 않아야합니다.

클라이언트 / 사용자는 수신 된 응답을 해석하기 위해 이러한 종류의 주석을 직접 필요로하거나 읽지 않으므로 일반적으로 클라이언트 측 주석을 사용하지 않는 것이 좋습니다. 위에서 설명한 식별 및 저작권 정보와 같은 진위성 및 적법성을위한 예외는 예외입니다. 또 다른 예외는 HTML 작성자가 HTML 문서 구조의 지침을 구현하기 위해 소량의 HTML 주석을 사용하는 것입니다. 예 :

<! - 도구 모음 섹션 -> 
    ... ... 
<! - 왼쪽 탐색 모음 -> 
    ... 
<! - 본체 -> 
    ... 
<! - footer -> 
    .. .


여러 줄 주석 블록

JSP 나 클라이언트 측의 여러 줄 주석 블록은 대시 문자 "-"로 장식되어 있습니다. XML 사양에서 이중 대시 문자열 "-"은 XML 주석 블록 내에서 허용되지 않습니다. 따라서이 사양과의 호환성 및 일관성을 위해 다중 줄 주석 블록 내에서 주석 줄을 장식하는 데 이중 대시 문자열을 사용하지 않습니다. 다음 표는 클라이언트 쪽 주석 블록을 사용하여이 기본 설정을 보여줍니다.

선호하는비 XML 호환
    <! - 
      - line 1 
      - line 2 
    ... 
      ->

    <! - 
      - line 1 
      - line 2 
    ... 
      ->

JSP 선언

Java 코드 규칙에 따라 동일한 유형의 변수 선언은 별도의 행에 있어야합니다.

권장하지 않음추천
    <%! 개인 int x, y; %>
    <%! 개인 int x; %> 
    <%! 개인 int y; %>

JSP 선언을 사용하여 JavaBeans 구성 요소를 선언하고 인스턴스화하면 안되지만 대신 <jsp:useBean>액션 태그를 사용해야합니다 .

일반적으로 변수에 대한 JSP 선언은 스크립팅 언어를 사용하여 프레젠테이션 목적으로 설계된 JSP 페이지에 비즈니스 로직 및 Java 코드를 직조하고 변수의 범위를 관리하는 오버 헤드 때문에 사용하지 않는 것이 좋습니다.

JSP 스크립틀릿

가능한 경우 태그 라이브러리가 동등한 기능을 제공 할 때마다 JSP 스크립틀릿을 사용하지 마십시오. 이를 통해 페이지를 읽기 및 유지 보수가 쉬우 며, 비즈니스 로직과 프리젠 테이션 로직을 분리 할 수 ​​있으며 페이지를 JSP 2.0 스타일 페이지로 쉽게 전개 할 수 있습니다 (JSP 2.0 사양은 지원하지만 스크립틀릿 사용은 중요하지 않습니다). 다음 예제에서 고객의 각 데이터 유형 표현에 대해 다른 스크립틀릿을 작성해야합니다.

customers 고객의 배열로서

    <table> 
        <% for (int i = 0; i <customers.length; i ++) {%> 
            <tr> 
                <td> <% = customers [i] .getLastName () %> </ td> 
                <td> % = customers [i] .getFirstName () %> </ td> 
            </ tr> 
        <%} %> 
    </ table>


고객을 Enumeration

    <표> 
        <% for (Enumeration e = customers.elements (); 
                e.hasMoreElements ();) { 
                고객 고객 = (고객) e.nextElement (); 
        %> 
            <TR> 
                <TD> <% = customer.getLastName () %> </ TD> 
                <TD> <% = customer.getFirstName () %> </ TD> 
            </ TR> 
        <%} %> 
    </ 테이블>


그러나 공통 태그 라이브러리를 사용하면 다양한 유형의 고객을 사용할 때 유연성이 높아집니다. 예를 들어 JSP 표준 태그 라이브러리에서 JSP 코드의 다음 세그먼트 Enumeration는 고객의 배열과 표현을 모두 지원합니다 .

    <table> 
        <c : forEach var = "customer"items = "$ {customers}"> 
            <tr> 
                <td> <c : out value = "$ {customer.lastName}"/> </ td> 
                <td> <c : out value = "$ {customer.firstName}"/> </ td> 
            </ tr> 
        </ c : forEach> 
    </ table>


비즈니스 로직에서 표현 계층 간의 결합을 줄이기 위해 MVC (Model-View-Controller) 디자인 패턴을 채택하는 정신에서 JSP 스크립틀릿은 비즈니스 로직을 작성하는 데 사용해서는 안됩니다. 오히려 JSP 스크립틀릿은 필요한 경우 클라이언트 요청을 처리 할 때 반환 된 데이터 ( "값 개체"라고도 함)를 적절한 클라이언트 준비 형식으로 변환하는 데 사용됩니다. 그렇더라도 이것은 프론트 컨트롤러 서블릿이나 커스텀 태그로 더 잘 수행 될 것입니다. 예를 들어 다음 코드는 데이터베이스의 고객 이름을 직접 가져 와서 클라이언트에 표시합니다.

<% 
    // 스크립트로 작성하는 것이 좋습니다! 

    연결 conn = null; 
    try { 
        // 연결 얻기 
        InitialContext ctx = new InitialContext (); 
        DataSource ds = (DataSource) ctx.lookup ( "customerDS"); 
        conn = ds.getConnection (); 

        // 고객 이름 얻기 
        Statement stmt = conn.createStatement (); 
        ResultSet rs = stmt.executeQuery ( "SELECT name FROM customer"); 

        // 표시 이름 
        while (rs.next ()) { 
            out.println (rs.getString ( "name") + "<br>"); 
        } 
    } catch (SQLException e) { 
        out.println ( "
    } finally { 
        if (conn! = null) 
            conn.close (); 
    } 
%>


다음 JSP 코드 세그먼트는 데이터베이스와의 상호 작용을 myTags:dataSource데이터베이스 코드의 구현에서 캡슐화하고 숨기는 사용자 정의 태그로 위임 할 때 더 좋습니다 .

<myTags :은 dataSource 
    이름 = "customerDS" 
    테이블 = "고객" 
    열 = "이름" 
    VAR = "결과"/> 
<C : foreach는 VAR = "행"항목 = "$ {result.rows}"> 
    <C : 밖으로 value = "$ {row.name}"/> 
    <br /> 
</ c : forEach>


result는 myTags:dataSource고객 데이터베이스에서 고객의 이름을 검색 한 결과를 저장하기 위해 사용자 정의 태그 에 의해 도입 된 스크립트 변수 입니다. 백엔드 코드 ( dataSource태그)에 영향을주지 않으면 서 동적으로 클라이언트 요구를 기반으로 다양한 종류의 출력 (HTML, XML, WML)을 생성하도록 JSP 코드를 향상시킬 수도 있습니다 더 나은 옵션은 이것을 데이터 검색을 수행하고 요청 범위 속성을 통해 JSP 페이지에 결과를 제공하는 프론트 컨트롤러 서블릿에 위임하는 것입니다. 예를 보려면 Java BluePrints의 엔터프라이즈 섹션을 참조하십시오.

요약하자면:

  • JSP 스크립틀릿은 JSP 페이지에 존재하지 않아야 JSP 페이지가 스크립팅 언어와 독립적이며 JSP 페이지 내의 비즈니스 로직 구현을 피할 수 있습니다.
  • 가능하지 않은 경우 서버 측에서 정보를 전달하는 데 값 객체 (JavaBeans 구성 요소)를 사용하고 JSP 객체를 클라이언트 출력으로 변환하는 데 JSP 스크립틀릿을 사용하십시오.
  • 서버 측에서 정보를 처리 할 때마다 사용자 정의 태그 (태그 핸들러)를 사용할 수 있습니다.

JSP 표현식

JSP 표현식은 JSP Scriptlet처럼 조심스럽게 사용해야합니다. 이것을 설명하기 위해, 다음과 같은 세 가지 예제를 통해 동일한 작업을 수행해 보겠습니다.

예제 1 (명시 적 Java 코드 사용) :

    <% = myBean.getName () %>

예제 2 (JSP 태그 포함) :

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

예제 3 (JSTL 태그 사용) :

    <c : out value = "$ {myBean.name}"/>

예제 1은 호출 된 스크립팅 변수 myBean가 선언 된 것으로 가정합니다 다른 두 예제는이를 myBean사용하여 찾을 수있는 범위 속성 이라고 가정합니다 PageContext.findAttribute()두 번째 예제는 또한 myBean이를 사용하여 페이지에 도입 되었다고 가정합니다 <jsp:useBean>.

세 가지 예제 중 JSTL 태그 예제가 선호됩니다. JSP 표현식과 거의 비슷하며 읽기 쉽고 유지 관리가 쉽고 Java 스크립렛 (웹 개발자가 언어와 API 호출에 익숙해야합니다)에 의존하지 않습니다. 또한 페이지를 JSP 2.0 스타일 프로그래밍으로 쉽게 전개 할 수 있습니다. JSP 2.0 스타일 프로그래밍에서는 ${myBean.name}템플리트 텍스트 를 입력하기 만하면됩니다 채택 된 선택 사항은 웹 개발자들 사이에서 합의되어야하며 동일한 프로젝트의 모든 생성 된 JSP 페이지에서 일관되어야합니다. JSTL 예제는 myBean로컬 Java 스크립팅 변수가 아닌 페이지 컨텍스트에서 값을 가져 오는 점에서 실제로는 약간 다릅니다 .

마지막으로, JSP 표현식은 기본 스크립팅 언어의 구문에 의존하는 동등한 JSP 스크립틀릿보다 우선합니다. 예를 들어,

    
    <% = x %> 

이상 선호

    <% out.print (x); %>

여백

공백은 이해력과 유지 보수 노력을 줄이기 위해 JSP 코드를 아름답게함으로써 들여 쓰기를 향상시킵니다. 특히 빈 줄과 공백은 필요한 경우 JSP 파일의 여러 위치에 삽입해야합니다.

빈 라인

블랭크 라인은 출력에 원하지 않는 영향을 미치지 않는다면, JSP 페이지의 <strike> </ strike>의 가독성을 향상시키기 위해 드물게 사용됩니다. 아래 예제에서 HTML <PRE>블록 호출 내에서 두 JSP 표현식 사이에 빈 줄을 삽입 하면 HTML 출력에 삽입 된 여분의 행이 클라이언트 브라우저에 표시됩니다. 그러나 빈 줄이 <PRE>블록 안에 있지 않으면 브라우저의 출력에 효과가 표시되지 않습니다.

JSP 문클라이언트에 HTML 출력
    <pre> 
    <% = customer.getFirstName () %> 
    <% = customer.getLastName () %> 
    </ pre>

    블록
    <pre> 
    <% = customer.getFirstName () %> 

    <% = customer.getLastName () %> 
    </ pre>

    
        
    블록
    <% = customer.getFirstName () %> 

    <% = 고객 .getLastName () %>
    조 블록

공백

공백 문자 (로 표시된 )는 JSP 태그와 그 본문 사이에 삽입되어야합니다. 예를 들어 다음과 같습니다. 

    <% =  
              customer.getName ()  
              %>
          

이상 선호

    <% = customer.getName () %>

또한 JSP 주석 태그와 주석을 구분하는 공백 문자가 있어야합니다.

<% - 
  -   여러 줄의 코멘트는 각 조각으로 분해 
  -   단일 회선을 점유. 
  - %> 
<% -   간단한 설명  
                   - %>
                
                   
                   
                    


이름 지정 규칙

명명 규칙을 적용하면 웹 구성 요소 요소를 프로젝트에서 쉽게 식별, 분류 및 조정할 수 있습니다. 이 섹션에서는 JSP 기술에 고유 한 규칙을 살펴 보겠습니다.

JSP 이름

JSP (파일) 이름은 항상 소문자로 시작해야합니다. 이름은 여러 단어로 구성 될 수 있습니다.이 경우 단어는 바로 옆에 배치되고 각 단어는 대문자로 시작됩니다. JSP 이름은 단순 명사 또는 짧은 문장 일 수 있습니다. 동사 전용 JSP 이름은 개발자에게 충분한 정보를 전달하지 않으므로 피해야합니다. 예 :

    perform.jsp

만큼 명확하지 않다.

    performLogin.jsp

동사가 JSP 이름의 일부인 경우, 백엔드 처리를 통한 조치가 내포되기 때문에 현재 시제 양식을 사용해야합니다.

    showAccountDetails.jsp

이상 선호

    showingAccountDetails.jsp

태그 이름

태그 핸들러 및 관련 클래스의 이름 지정 규칙은 다음과 같습니다.

기술클래스 이름
XXX 태그 추가 정보 (에서 확장 javax.servlet.jsp.tagext.TagExtraInfo)XXXTEI
XXX 태그 라이브러리 유효성 검사기 (에서 확장javax.servlet.jsp.tagext.TagLibraryValidator)XXXTLV
XXX 태그 처리기 인터페이스 (에서 확장javax.servlet.jsp.tagext.Tag/IterationTag/BodyTag)XXXTag
XXX 태그 핸들러 구현XXXTag

또한 태그 이름은 Java 기술 관련 코드 규칙에 지정된대로 클래스 및 인터페이스의 이름 지정 규칙을 위반해서는 안됩니다.

태그 관련 클래스를 다른 클래스와 더 구별하기 위해 패키지 접미어, 태그 또는 taglib를 클래스의 패키지 이름에 적용 할 수 있습니다. 예 :

    com.mycorp.myapp.tags.XXXTag

태그 접두사 이름

태그 접두사는 제목의 경우에는 짧지 만 의미있는 명사 여야하며 소문자의 경우 첫 번째 문자 여야합니다. 태그 접두어에는 알파벳이 아닌 문자가 포함되어서는 안됩니다. 여기 예시들이 있습니다 :

승인?
mytaglib아니
myTagLib
MyTagLib아니
MyTagLib1아니
My_Tag_Lib아니
My$Tag$Lib아니

XML 구문의 JSP 페이지

JSP는 JSP 페이지 작성을위한 "표준 구문"과 JSP 문서를 XML 문서로 작성하는 "XML 구문"의 두 가지 구문을 제공합니다. 표준 구문을 사용하여 작성된 JSP 페이지를 "JSP 페이지"라고합니다. XML 구문을 사용하여 작성된 JSP 페이지를 "JSP 문서"라고합니다. 이 기사는 주로 JSP 페이지를 다루지 만, 많은 개념을 JSP 문서에도 적용 할 수 있습니다. JSP 문서의 사용은 XML이 보급됨에 따라 증가 할 것으로 예상되며,이를 해결하기 위해 JSP 2.0 사양은 훨씬 친숙한 XML 구문을 도입 할 것입니다.

JSP 페이지를 작성하는 데 사용되는 XML 구문 은 JSP 페이지의 XML  와 구별되며 종종 XML 페이지 와 혼동됩니다 페이지 작성자는 표준 또는 XML 구문 을 사용하여 JSP 페이지를 작성합니다. 그런 다음 컨테이너는 JSP 페이지를 XML 보기 로 변환합니다.이 보기 는 태그 라이브러리 유효성 검사기에 노출됩니다.

JSP 문서 구조

JSP 문서의 기본 구조는 다음과 같습니다.

    <? ? XML 버전 = "1.0"> 
    <! - 
      - 저자 (들) : 
      - 날짜 : 
      - 저작권 공지 사항 : 
      - @ (#) 
      - 설명 : 
      -> 
    <JSP : 루트 XMLNS : JSP = "#" 
                XMLNS : prefix1 = "URI를 위해 taglib1" 
                의 xmlns : prefix2 = "URI를 위해 taglib2" 
                버전 = "1.2"> 
        JSP 문헌 ... 
    </ JSP : 루트>


첫 번째 줄은 페이지를 XML 문서로 정의하는 선택적 XML 프롤로그입니다. 선택적 프롤로그 다음에 문서에 대한 주석이옵니다. 요소 <jsp:root>는 이것을 JSP 문서로 정의하고 루트 요소로 나타나야합니다. jsp이름 공간은 반드시 가져와야되고, 모든 태그 라이브러리는이 루트 요소를 사용하여 가져올 수 있어야합니다. version 속성은 필수이며 사용되는 JSP 스펙 버전을 지정합니다. JSP. 서의 실제 내용은 요소의 하위 요소로 나타납니다 <jsp:root>표준 XML 들여 쓰기 규칙은 하나의 들여 쓰기 단위로 4 개의 공백을 사용하여 문서 전체에서 일관되게 적용되어야합니다.

JSP 문서는 올바른 형식의 XML 문서 <% %>여야 하므로 일부 요소 (예 :와 같은 XML 등가로 대체되어야 함) 가 있어야합니다 <jsp:scriptlet />자세한 내용은 JSP 스펙을 참조하십시오.

XML 주석

JSP 사양은 XML 스타일 주석이 출력에서 ​​제거되는지 여부에 대해 명확하지 않으므로 주석이 클라이언트에 도달하려는 경우 안전하도록 <jsp:text>다음과 같이 노드 에 포함되어야 합니다.

    ... 
    <jsp : text> <! [CDATA [ 
        <! - 
          - 여러 줄 주석 
          - 클라이언트에 전송됩니다. 
          -> 
    ]]]> </ jsp : text> 
    ...


JSP 문서의 Java 코드

선언, 스크립틀릿 및 표현식에 Java 코드를 작성할 때 CDATA 요소는 코드가 문서 구조를 손상시키지 않도록 필요한 경우에만 사용해야합니다.

    ... 
    <jsp : scriptlet> 
        for (int level = 0; level <3; level ++) { 
    </ jsp : scriptlet> 
    <tr> 
        <td> 
            <jsp : expression> <! [CDATA [ 
                "<h"+ 레벨 + "> 문자 </ H"레벨 + + ""> 
            ]]> </ JSP : 식> 
        </ TD> 
    </ TR> 
    <JSP : 스크립틀릿> 
        } 
    </ JSP : 스크립틀릿> 
    ...


표준 구문의 경우와 달리 요소의 내용에 관계없이 XML 들여 쓰기 규칙을 따라야합니다.

프로그래밍 실습

일반적으로 다음과 같은 이유로 JSP 페이지에 Java 코드 (선언, 스크립틀릿 및 표현식)를 작성하지 마십시오.

  • JSP 페이지의 Java 코드 구문 오류는 페이지가 배포 될 때까지 감지되지 않습니다. 반면 태그 라이브러리 및 서블릿의 구문 오류는 배포 전에 검색됩니다.
  • JSP 페이지의 Java 코드는 디버그하기가 더 어렵습니다.
  • JSP 페이지의 Java 코드는 특히 Java 전문가가 아닌 페이지 작성자에게 유지 관리하기가 더 어렵습니다.
  • 복잡한 비즈니스 로직과 프리젠 테이션 로직을 섞지 않는 것이 일반적으로 받아 들여지고 있습니다. JSP 페이지는 주로 프리젠 테이션 논리를위한 것입니다.
  • Java 코드, HTML 및 기타 스크립팅 지침이 포함 된 코드는 읽기가 어려울 수 있습니다.
  • JSP 2.0 스펙은 훨씬 단순한 표현 언어를 선호하는 스크립틀릿을 강조하고 있습니다. JSP 페이지에서 Java 코드가 사용되지 않으면 JSP 2.0 스타일 프로그래밍으로 JSP 페이지를 쉽게 전개 할 수 있습니다.

자세한 지침 및 자세한 내용은 Java BluePrints의 엔터프라이즈 섹션을 참조하십시오.

JavaBeans 구성 요소 초기화

JSP 기술은 PropertyDescriptorJavaBeans 구성 요소의 모든 식별 된 속성 을 초기화하는 편리한 요소를 제공합니다 예를 들면 :

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

그러나 이것은주의해서 사용해야합니다. 첫째, bean이 프로퍼티를 가지고 있고 amount, 현재 ServletRequest오브젝트 에 매개 변수 (amount)가 없거나 매개 변수 값이 ""인 경우 아무 것도 수행되지 않습니다. JSP 페이지는 null다음과 같은 특정 프로퍼티를 설정하는 데 사용하지 않습니다. 콩. 따라서 bean amount에 이미 할당 된 값 bankClient은 영향을받지 않습니다. 둘째, PropertyEditors정의 되지 않은 비 기본 속성 은 문자열의 String 값에서 암시 적으로 초기화되지 않을 수 있습니다. ServletRequest객체와 명시적인 변환이 필요할 수 있습니다. 셋째, 악의적 인 사용자가 응용 프로그램을 신중하게 설계하지 않은 경우 추가 매개 변수를 추가하고 Bean의 의도하지 않은 속성을 설정할 수 있습니다.

더 깔끔한 코드를 생성 할 목적으로 태그 property="*"에서 사용하는 것을 선호하는 경우 Bean을 초기화하기 위해 ServletRequest 객체에있을 것으로 예상되는 매개 변수에 jsp:setProperty대한 jsp:setProperty태그 앞에 주석을 추가하는 것이 좋습니다 그래서, 다음 예에서, 주석에서 우리는 모두 알고 firstName및 lastName초기화하는 데 필요한 bankClient콩을 :

<% - 
  - ServletRequest의 firstName과 lastName이 필요합니다 
  - %> 
<jsp : setProperty name = "bankClient"property = "*"/>

JSP 암시 적 객체

API 호출이 아닌 이러한 객체에 대한 참조를 얻기 위해 JSP 암시 적 객체를 직접 사용하는 것이 좋습니다. 그래서, 대신에

    getServletConfig (). getServletContext (). getInitParameter ( "param")

ServletContext인스턴스가 제공하는 초기화 매개 변수에 액세스하려면 쉽게 사용할 수있는 암시 적 객체를 사용할 수 있습니다.

    application.getInitParameter ( "param")

초기화 매개 변수의 값만 출력되는 경우 JSTL 태그를 사용하여 초기화 매개 변수에 액세스하는 것이 더 좋습니다.

    <c : out value = "$ {initParam [ 'param']}"/>

인용

획일적 인 견적 사용이 채택됩니다. 견적은 두 개의 아포스트로피 문자 대신 두 개의 큰 따옴표 문자로 묶어야합니다.

비표준 인용선호하는 인용문
<%@ page import= 'javabeans.* '%> 
<%@ page import="java.util.*" %> 
<%@ page import="javabeans.*" %> 
<%@ page import="java.util.*" %> 

예외는 어포 스트로피가 필요한 경우입니다 (예 : 스크립트 언어에서 큰 따옴표가 필요한 경우).

    <jsp : include page = '<% = getFoodMenuBar ( "Monday") %>'/>

사용자 정의 태그 사용

사용자 정의 태그에 본문 내용이 없으면 태그 라이브러리 설명자에서 다음과 같이 내용을 빈 ( "JSP"라는 단어를 기본값으로 사용하지 않고)으로 명시 적으로 선언해야합니다.

< 
    body-content> 빈 </ body-content> 
    ... 
</ tag> <tag> 
    <name> hello </ name> 
    <tag-class> com.mycorp.util.taglib.HelloTagSupport </ tag-class >


이것은 파싱 될 JSP 구문을 포함하기보다는 본문 내용이 비어 있어야한다는 것을 JSP 컨테이너에 알려줍니다. 그 효과는 비어있는 본문 내용을 파싱 할 때 자원을 불필요하게 할당하지 않아도되는 것입니다.

빈 태그는 가독성을 높이기 위해 여는 닫는 XML 요소 쌍을 사용하는 대신 짧은 XML 요소에 있어야합니다. 그래서,

    <myTag : hello />

이상 선호

    <myTag : hello> </ myTag : hello>

TagExtraInfo 및 TagLibraryValidator의 사용

태그 라이브러리를 사용하는 유효한 방법은 TLD만으로는 표현할 수없는 경우가 있습니다. 그런 다음TLD에 TagExtraInfo클래스 또는 TagLibraryValidator클래스를 작성하고 등록하여 변환시 태그 라이브러리의 오류를 포착 할 수 있어야합니다.

JavaScript 기술 사용

JavaScript 기술은 스크립트가 제대로 실행 되려면 브라우저 유형의 특정 기능과 독립적이어야합니다.

이해가된다면 자바 스크립트 코드를 개별 파일에 JSP 본문과 분리하여 보관하고 다음과 같은 문을 사용하여 JavaScript 코드를 JSP 본문으로 가져 오는 것이 좋습니다.

    <script language = javascript src = "/ js / main.js">

이렇게하면 JavaScript 코드가 재사용 될 기회가 향상되고 여러 JSP 페이지에서 JavaScript 코드의 일관된 동작이 유지되며 JSP 페이지의 복잡성이 줄어 듭니다.

계단식 스타일 시트

계단식 스타일 시트를 사용하여 표제, 표 등의 일반적인 특성을 중앙에서 제어하십시오. 이렇게하면 사용자에게 일관성있게 표현되고 JSP 페이지의 유지 관리 노력과 코드 크기가 줄어 듭니다. 따라서 아래처럼 HTML 태그에 스타일 정보를 삽입하는 대신 :

<H1> <FONT 컬러 = "블루"> 제 1 </ FONT> </ H1> 
... 
<H1> <FONT 컬러 = "블루"> 제 2 </ FONT> </ H1> 
...

다음 myJspStyle.css을 포함 하는 단일 스타일 시트에 스타일 정보를 정의하십시오 .

H1 {color : blue}
            

          

JSP 페이지에 스타일 시트를 적용합니다.


... 
<H1> 1 장 </ H1> 
... 
<H1> 2 장 </ H1> 
.. <link rel = "stylesheet"href = "css / myJspStyle.css"type = "text / .


복합 뷰 패턴의 사용

JSP 페이지가 다른 JSP 페이지에서도 반복 될 수있는 특정 구조와 복잡한 구조를 필요로 할 때이를 처리하는 한 가지 방법은 복합보기 패턴 (Java Blueprint의 패턴 섹션)을 사용하여 조각으로 나누는 것입니다. 예를 들어, JSP 페이지는 때로는 프리젠 테이션 구조에서 다음과 같은 논리적 레이아웃을가집니다.

머리글
메뉴 바본체
각주
보행인

이런 식으로,이 복합 JSP 페이지는 서로 다른 모듈로 나뉘어 질 수 있으며 각각은 별도의 JSP 프래그먼트로 구현됩니다. 그런 다음 구성 JSP 조각을 변환 시간 또는 요청시 포함 JSP 태그를 사용하여 복합 JSP 페이지의 적절한 위치에 배치 할 수 있습니다. 일반적으로 정적 include 지시문을 사용하여 자체적으로 요청하지 않는 페이지를 포함하는 경우 .jspf확장 을 사용 /WEB-INF/jspf/하여 웹 응용 프로그램 아카이브 (war) 의 디렉토리에 파일을 저장해야합니다. 예 :

<% @ include file = "/ WEB-INF / jspf / header.jspf"%> 
... 
<% @ include file = "/ WEB-INF / jspf / menuBar.jspf"%> 
... 
<jsp : include 페이지 = "<% = currentBody %>가"/> 
... 
<% @ 포함 파일 = "/ WEB-INF / JSPF / footnote.jspf"%> 
... 
<% @ 포함 파일 = "/ WEB-INF / jspf / footer.jspf "%> 
...


기타 권장 사항

이 기사에서는보다 정비 가능하고 일관성있는 JSP 코드 및 웹 컴포넌트 아티팩트를 생성하기 위해 권장되는 코드 규칙을 제시했다. 이 주제를 더 추구하기로 선택하면 다른 많은 우수 사례가 있습니다. 예를 들어, JSP 1.2 사양에는 다음에 대한 권장 사항이 있습니다.

  • 새 암시 적 객체 정의
  • 공급 업체별 정보 액세스
  • 태그 라이브러리 사용자 정의

또한 Java BluePrints는 Model-View-Controller 패턴 (패턴 섹션 참조) 사용과 같은 더 광범위한 표준을 제공합니다.

우리는이 기사에서 제시 한 규칙에 대한 귀하의 의견에 관심이 있으며 JSP 코딩 규칙에 대한 다른 권고 사항을 알려 드리고자합니다. 의견을 jsp-codeconv-comments@sun.com으로 보내주십시오 .

아래에서는 위에 제시된 코드 규칙을 보여주는 전체 웹 응용 프로그램에 소스 코드를 제시합니다. 이 응용 프로그램의 WAR 파일을 여기에서 다운로드 할 수 있습니다 .

코드 예제

이 문서에 설명 된 규칙을 설명하기 위해 예제 웹 응용 프로그램이 여기에 제시됩니다. .war 파일에 번들로 제공되는 다음 소스 코드 파일 및 디렉토리 구조로 구성됩니다.

/index.jsp 
/WEB-INF/classes/codeconv/GetResultsTag.class 
/WEB-INF/jspf/footer.jspf 
/WEB-INF/lib/jstl.jar 
/WEB-INF/lib/standard.jar 
/ WEB-INF /tld/lotterylib.tld 
/WEB-INF/web.xml


index.jsp 페이지는 (에 의해 식별 된 lotterylib.tld사용자 정의 태그 라이브러리를 사용 하여 현재 날짜를 포함하여 현재 날짜까지의 가짜 추첨 결과를 조회합니다. 그런 다음 JSTL을 사용하여 텍스트 형식을 지정하고 반복하여 결과를 HTML로 생성합니다.

이 예제에는 JSP 1.2 및 JSTL 1.0 기술이 필요합니다.

+ Recent posts