java - 프론트앤드 - 프론트 엔드 기술 스택




JSP 파일에서 Java 코드를 피하는 방법은 무엇입니까? (20)

Google 툴킷이 모든 클라이언트와 공유 코드를 JS로 변환하기 때문에 이론적으로 모든 JS 및 HTML 요소를 피할 수있는 GWT를 제안합니다. 문제는 없습니다. 당신은 다른 언어로 코딩하지 않고 webservice 있습니다. 확장 기능 (smartGWT 또는 Vaadin)에 의해 주어진대로 어딘가에서 기본 CSS를 사용할 수도 있습니다. 수십 개의 주석을 배울 필요가 없습니다.

물론 원한다면 코드의 깊이를 해킹하고 JS를 삽입하고 HTML 페이지를 풍부하게 만들 수 있지만 원하는 경우 실제로 피할 수 있으며 다른 프레임 워크에서 작성한대로 결과가 좋을 것입니다. 나는 가치가 있다고 말하며 기본 GWT는 잘 문서화되어있다.

그리고 물론 많은 동료 프로그래머들이 몇 가지 다른 솔루션을 설명하거나 권장했습니다. GWT는 웹 파트를 다루거나 최소화하려는 사람들을위한 것입니다.

저는 Java EE에 익숙하지 않고 다음 세 줄과 같은 것을 알고 있습니다.

<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>

는 오래된 학교 코딩 방법이며 JSP 버전 2에서는 JSP 파일에서 Java 코드를 피하는 방법이 있습니다. 누군가 줄 수있는 대체 JSP로 2 라인, 그리고이 기법이라고 뭐야?


JSP 2.0에는 "태그 파일" 이라는 기능이 있습니다. 외부 java 코드 및 tld 없이 태그를 쓸 수 있습니다. .tag 파일을 만들어 WEB-INF\tags 에 넣어야합니다. 태그를 패키지하기 위해 디렉토리 구조를 만들 수도 있습니다.

예 :

/WEB-INF/tags/html/label.tag

<%@tag description="Rensders a label with required css class" pageEncoding="UTF-8"%>
<%@attribute name="name" required="true" description="The label"%>

<label class="control-label control-default"  id="${name}Label">${name}</label>

그것 같이 사용하십시오

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/html"%>
<h:label  name="customer name" />

또한 태그 몸체를 easly 읽을 수 있습니다.

/WEB-INF/tags/html/bold.tag
<%@tag description="Bold tag" pageEncoding="UTF-8"%>
<b>
  <jsp:doBody/>
</b>

그걸 써

<%@ taglib prefix="h" tagdir="/WEB-INF/tags/bold"%>
<h:bold>Make me bold</h:bold>

샘플은 매우 간단하지만 여기서 많은 복잡한 작업을 수행 할 수 있습니다. 다른 태그 (예 : SQL 태그 와 JSTL같은 if/forEcah/chosen텍스트 조작과 같은 제어 태그가있는 format/contains/uppercase태그 select/update)를 Hashmap사용할 수도 session있고 request, 태그 파일의 모든 종류 매개 변수 (예 : 액세스 , ... )를 전달할 수도 있습니다.

Tag File 은 jsp 파일과 같이 서버를 변경할 때 서버를 다시 시작할 필요가 없으므로 쉽게 개발할 수 있습니다. 이렇게하면 개발이 쉬워집니다.

struts 2와 같은 프레임 워크를 사용하더라도 좋은 태그가 많이 있지만, 자신의 태그를 사용하면 코드가 많이 줄어들 수 있습니다. 태그 매개 변수를 스트럿에 전달하면이 방법으로 프레임 워크 태그를 사용자 정의 할 수 있습니다.

태그를 사용하여 Java를 피할 수있을뿐만 아니라 HTML 코드를 최소화 할 수 있습니다. 나는 코드 복제본이 내 페이지에서 시작되는 것을 보자 마자 HTML 코드를 검토하고 태그를 많이 만들려고 노력합니다.

(비록 당신이 jsp 코드로 자바를 사용하게된다면, 나는 그 코드를 태그로 캡슐화 할 수있다)


JSP로 JSTL Tag libraries 를 사용하면 완벽하게 작동합니다.


JSP로 Java 코딩의 단점을 피하고 싶다면 scritplets로도 그렇게 할 수 있습니다. JSP에서 최소한의 Java를 사용하고 JSP 페이지에서 계산 및 로직을 거의 사용하지 않기 위해 일부 분야를 따르십시오.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%//instantiate a JSP controller
MyController clr = new MyController(request, response);

//process action if any
clr.process(request);

//process page forwaring if necessary

//do all variable assignment here
String showMe = clr.getShowMe();%>

<html>
    <head>
    </head>
    <body>
        <form name="frm1">
            <p><%= showMe %>
            <p><% for(String str : clr.listOfStrings()) { %>
            <p><%= str %><% } %>

            // and so on   
        </form>
    </body>
</html>

JSTL 태그를 EL 표현식과 함께 사용하여 Java 및 HTML 코드가 혼합되지 않도록 할 수 있습니다.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
    <head>
    </head>
    <body>

        <c:out value="${x + 1}" />
        <c:out value="${param.name}" />
        // and so on

    </body>
</html>

JSTL 태그와 EL 표현식을 사용하면됩니다.


Scriptlets 사용은 매우 오래된 방법이므로 권장하지 않습니다. JSP 페이지에 직접 뭔가를 출력하려면 JSTL 과 함께 EL (Expression Language) 을 사용하면됩니다.

Velocity, Freemarker, Thymeleaf 등과 같은 템플릿 엔진을 사용하는 것과 같은 다른 옵션도 있습니다. 그러나 EL과 JSTL을 사용하는 일반 JSP를 사용하면 대부분의 시간 동안 내 목적을 달성 할 수 있으며 초보자에게는 가장 단순한 것으로 보입니다.

또한 뷰 계층에서 비즈니스 로직을 수행하는 것은 좋지 않지만 서비스 계층에서 비즈니스 로직을 수행하고 출력 결과를 컨트롤러를 통해 뷰에 전달해야합니다.


UI 디자인을위한 자바 스크립트 프레임 워크와 같은 백본을 사용하고 나머지 API를 사용하여 데이터를 가져옵니다. 그러면 UI에서 java 종속성이 완전히 제거됩니다.


경험에 따르면 JSP에는 몇 가지 단점이 있으며, 그 중 하나는 실제 코드와 마크 업을 혼합하는 것을 피하기 어렵습니다.

가능한 경우 전문 기술을 사용하여 수행해야 할 작업을 고려하십시오. Java EE 6에는 #{bean.method(argument)} 접근 방식을 통해 JSF 페이지와 함께 Java bean을 붙이기를 포함하여 많은 좋은 기능을 제공하는 JSF 2.0이 있습니다.


그 중 아무것도 더 이상 내 친구가 사용하는, 내 충고는 서버 (CSS, HTML, 자바 스크립트 등)보기를 decouple 것입니다.

제 경우 저는 각도로 뷰를 처리하는 시스템을 수행하고 필요한 모든 데이터는 휴식 서비스를 사용하여 서버에서 가져 왔습니다.

저를 믿으십시오, 이것은 당신이 디자인하는 방법을 바꿀 것입니다


아무리 노력해도 다른 개발자와 함께 작업 할 때 일부 개발자는 여전히 스크립틀을 선호하고 프로젝트에 악의적 인 코드를 삽입합니다. 따라서 스크립틀릿 코드를 줄이려면 프로젝트를 첫 번째 기호에 설정하는 것이 매우 중요합니다. 이것을 극복하는 몇 가지 기술이 있습니다 (다른 언급 된 여러 프레임 워크 포함). 그러나 순수한 JSP 방식을 선호하는 경우 JSTL 태그 파일을 사용하십시오. 이것에 대한 좋은 점은 프로젝트의 마스터 페이지를 설정하여 다른 페이지가 마스터 페이지를 상속받을 수 있다는 것입니다

다음 내용을 포함하는 WEB-INF / 태그 아래에 base.tag라는 마스터 페이지를 만듭니다.

<%@tag description="Overall Page template" pageEncoding="UTF-8"%>

<%@attribute name="title" fragment="true" %>

<html>
  <head>
    <title>  
       <jsp:invoke fragment="title"></jsp:invoke>
    </title>

  </head>
  <body>
    <div id="page-header">
       ....
    </div>
    <div id="page-body">
      <jsp:doBody/>
    </div>
    <div id="page-footer">
      .....
    </div>
  </body>
</html>

이 mater 페이지에서 "title"이라는 단편을 작성 했으므로 하위 페이지에서 마스터 페이지의이 위치에 더 많은 코드를 삽입 할 수 있습니다. 또한 <jsp:doBody/> 태그는 하위 페이지의 내용으로 대체됩니다.

WebContent 폴더에 하위 페이지 (child.jsp)를 작성하십시오.

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>

<t:base>
    <jsp:attribute name="title"> 
        <bean:message key="hello.world" />
    </jsp:attribute>

    <jsp:body>
    [Put your content of the child here]
    </jsp:body>   
</t:base>

<t:base> 는 사용할 마스터 페이지를 지정하는 데 사용됩니다 (현재 base.tag 임). 여기서 <jsp:body> 태그 안의 모든 내용은 마스터 페이지의 <jsp:doBody/> 를 대체합니다. 자녀 페이지에는 임의의 태그 lib도 포함될 수 있으며 일반적으로 다른 태그와 마찬가지로 사용할 수 있습니다. 그러나 여기에서 임의의 스크립틀릿 코드 ( <%= request.getParameter("name") %> ...)를 사용하고이 페이지를 실행하려고하면 JasperException because Scripting elements ( &lt;%!, &lt;jsp:declaration, &lt;%=, &lt;jsp:expression, &lt;%, &lt;jsp:scriptlet ) are disallowed here . 따라서 다른 사람들이 jsp 파일에 악의 코드를 포함 할 수있는 방법이 없습니다.

컨트롤러에서이 페이지 호출 :

컨트롤러에서 child.jsp 파일을 쉽게 호출 할 수 있습니다. 이것은 또한 struts 프레임 워크와 잘 작동합니다.


이 말이 맞는지 확실하지 않습니다.

MVC에 대해 읽어야합니다. Spring MVCStruts 2 는 가장 보편적 인 두 가지 솔루션입니다.


좋은 질문을 던졌고 좋은 대답을 얻었지만 JSP를 없애는 것이 좋습니다. 그것은 결국 죽을 것이다 구식 기술입니다. 템플릿 엔진과 같은 현대적인 접근 방식을 사용하십시오. 비즈니스 및 프리젠 테이션 레이어를 명확하게 구분할 수 있으며 템플릿에 Java 코드가 없으므로 대부분의 경우 WYSIWYG를 활용하여 웹 프레젠테이션 편집 소프트웨어에서 직접 템플릿을 생성 할 수 있습니다.

그리고 필터를 제거하고 사전 처리 및 사후 처리를 수행하십시오. 그렇지 않으면 변수가 어디에서 가치를 얻는 지 항상 알지 못하기 때문에 지원 / 디버깅 문제를 처리 할 수 ​​있습니다.


파이썬 세계에서 나온 깔끔한 아이디어는 템플릿 속성 언어입니다 . TAL은 Zope (Zope)에 의해 소개되었으며 PHP, XSLT 및 Java (Python / Zope 및 PHP 화신)를 사용하여 표준으로 구현되었습니다. 이 클래스의 템플릿 언어에서 위의 예는 다음과 같습니다.

<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name">Example product</td>
        <td tal:content="product/description">A nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

이 코드는 일반적인 HTML (또는 XHTML)과 XML 네임 스페이스의 일부 특수 속성을 닮았습니다. 브라우저로 볼 수 있으며 디자이너가 안전하게 조정할 수 있습니다. 매크로와 i18n에 대한 지원은 다음과 같습니다.

<h1 i18n:translate="">Our special offers</h1>
<table>
    <tr tal:repeat="product products">
        <td tal:content="product/name"
            i18n:translate="">Example product</td>
        <td tal:content="product/description"
            i18n:translate="">A nice description</td>
        <td tal:content="product/price">1.23</td>
    </tr>
</table>

컨텐트의 번역이 사용 가능하면 사용됩니다.

Java 구현 에 대해서는 잘 모릅니다.


JSP 파일에서 Java 코드를 피하는 방법은 무엇입니까?

EL (Expression Language) 외에도 JSTL 과 같은 탭 라이브러리 태그를 사용할 수 있습니다. 그러나 EL은 JSP에서 잘 작동하지 않습니다. 따라서 JSP를 완전히 삭제하고 Facelets를 사용하는 것이 좋습니다.

Facelets 은 JSP와 비교하여 JSF 개발자에게 더 간단하고 강력한 프로그래밍 모델을 제공하는 JSF (Java Server Faces) 용으로 설계된 비 JSP 페이지 선언 언어입니다. 웹 애플리케이션 개발을 위해 JSP에서 발생하는 여러 가지 문제를 해결합니다.


JSTL을 사용하여 사용자 정의 태그 작성 및 작성 방법 배우기

EL은 EviL (런타임 예외, 리팩터링)
개찰구가 너무 위험 할 수도 있습니다 (작은 응용 프로그램 또는 간단한보기 계층의 경우 성능이 좋지 않음).

java2s ,

이것은 웹 애플리케이션의 web.xml에 추가되어야합니다.

<taglib>
    <taglib-uri>/java2s</taglib-uri>
    <taglib-location>/WEB-INF/java2s.tld</taglib-location>
</taglib>

파일 만들기 : / WEB-INF /에 java2s.tld

<!DOCTYPE taglib
  PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<!-- a tab library descriptor -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>Java2s Simple Tags</short-name>

    <!-- this tag manipulates its body content by converting it to upper case
    -->
    <tag>
        <name>bodyContentTag</name>
        <tag-class>com.java2s.BodyContentTag</tag-class>
        <body-content>JSP</body-content>
        <attribute>
          <name>howMany</name>
        </attribute>
    </tag>
</taglib>

WEB-INF \ classes \ com \ java2s에 다음 코드를 컴파일하십시오.

package com.java2s;

import java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyContent;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class BodyContentTag extends BodyTagSupport{
    private int iterations, howMany;

    public void setHowMany(int i){
        this.howMany = i;
    }

    public void setBodyContent(BodyContent bc){
        super.setBodyContent(bc);
        System.out.println("BodyContent = '" + bc.getString() + "'");
    }

    public int doAfterBody(){
        try{    
            BodyContent bodyContent = super.getBodyContent();
            String bodyString  = bodyContent.getString();
            JspWriter out = bodyContent.getEnclosingWriter();

            if ( iterations % 2 == 0 ) 
                out.print(bodyString.toLowerCase());
            else
                out.print(bodyString.toUpperCase());

            iterations++;
            bodyContent.clear(); // empty buffer for next evaluation
        }
        catch (IOException e) {
            System.out.println("Error in BodyContentTag.doAfterBody()" + e.getMessage());
            e.printStackTrace();
        } // end of catch

        int retValue = SKIP_BODY;

        if ( iterations < howMany ) 
            retValue = EVAL_BODY_AGAIN;

        return retValue;
    }
}

서버를 시작하고 브라우저에서 bodyContent.jsp를로드하십시오.

<%@ taglib uri="/java2s" prefix="java2s" %>
<html>
    <head>
        <title>A custom tag: body content</title>
    </head>
    <body>
        This page uses a custom tag manipulates its body content.Here is its output:
        <ol>
            <java2s:bodyContentTag howMany="3">
            <li>java2s.com</li>
            </java2s:bodyContentTag>
        </ol>
    </body>
</html>

Wicket 과 같은 많은 컴포넌트 기반 프레임 워크가 HTML을 많이 생성합니다. HTML로 끝나는 태그는 극히 기본적이며 혼합되지 않는 로직이 거의 없습니다. 결과는 일반적인 HTML 요소가있는 HTML 페이지와 같이 거의 비어 있습니다. 단점은 Wicket API에 많은 구성 요소가 있다는 것을 배우는 것입니다. 이러한 제약 조건 하에서 달성하기 힘든 것들도 있습니다.


기술적으로 JSP는 모두 런타임 중에 서블릿으로 변환됩니다 . JSP는 처음에는 MVC 패턴에 따라 비즈니스 로직과 디자인 로직을 분리하기 위해 만들어졌습니다. 그래서 JSP는 런타임 동안 기술적으로 모든 자바 코드입니다. 그러나 질문에 대답하기 위해 태그 라이브러리는 일반적으로 JSP 페이지에 로직 (Java 코드 제거)을 적용하는 데 사용됩니다.


EL 표현식과 함께 JSTL 태그를 사용하면이를 피할 수 있습니다. JSP 페이지에 다음 내용을 입력하십시오.

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

많은 답변에서 말하듯이 JSTL을 사용하거나 나만의 맞춤 태그를 만드십시오. Here 사용자 정의 태그를 만드는 방법에 대한 좋은 설명이다







scriptlet