programing

JSP 2를 사용하여 JSP 파일의 Java 코드를 회피하려면 어떻게 해야 합니까?

sourcetip 2022. 7. 19. 23:28
반응형

JSP 2를 사용하여 JSP 파일의 Java 코드를 회피하려면 어떻게 해야 합니까?

저는 Java EE를 처음 접하는 사람이고, 다음 세 줄 같은 것은 알고 있습니다.

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

는 구식 코딩 방식입니다.JSP 버전2에서는 JSP 파일 내의 Java 코드를 회피하는 방법이 있습니다.대체 JSP 2 회선은 무엇이며, 이 기술은 무엇입니까?

스크립트릿의 사용(그것들)<% %>태그립(JSTL 등)과 EL(Expression Language)의 탄생 이후 JSP의 things는 매우 권장되지 않습니다.${} 2001년 2001년

스크립트렛의 주요 단점은 다음과 같습니다.

  1. 재사용 가능성: 스크립트렛을 재사용할 수 없습니다.
  2. 대체성: 스크립트렛을 추상화할 수 없습니다.
  3. OO-능력: 상속/구성을 사용할 수 없습니다.
  4. 디버깅 가능성: 스크립트릿이 예외를 중간에서 던지면 공백 페이지만 표시됩니다.
  5. 테스트 가능성: 스크립트렛은 유닛 테스트 불가.
  6. 유지보수성: 혼재/클러터/복제된 코드 로직을 유지하기 위해서는 saldo당 더 많은 시간이 필요합니다.

태양 Oracle 자체도 JSP 코딩 규칙에서 (태그 부착) 클래스에서 동일한 기능을 사용할 수 있는 경우 스크립틀릿을 사용하지 않도록 권장합니다.다음은 관련된 몇 가지 도시입니다.

JSP 1.2 사양에서는 웹 어플리케이션에서 JSP Standard Tag Library(JSTL)를 사용하여 페이지에 JSP 스크립틀릿의 필요성을 줄일 것을 강력히 권장합니다.일반적으로 JSTL을 사용하는 페이지는 읽기 및 유지보수가 용이합니다.

...

가능하면 태그 라이브러리가 동등한 기능을 제공할 때마다 JSP 스크립트는 사용하지 마십시오.이것에 의해, 페이지의 판독과 유지보수가 용이하게 되어, 비즈니스 로직과 프레젠테이션 로직의 분리가 용이하게 됩니다(JSP 2.0 사양에서는 스크립트렛의 사용이 서포트되고 있습니다만, 강조되고 있지 않습니다).

...

비즈니스 로직에서 프레젠테이션 계층 간의 결합을 줄이기 위해 모델 뷰 컨트롤러(MVC) 설계 패턴을 채택하기 위해 비즈니스 로직 작성에 JSP 스크립트를 사용하지 마십시오.JSP 스크립트렛은 클라이언트의 요구를 처리한 후 반환되는 데이터("값 개체"라고도 함)를 적절한 클라이언트 지원 형식으로 변환하기 위해 필요한 경우 사용됩니다.이 경우에도 전면 컨트롤러 서블릿 또는 커스텀태그를 사용하는 것이 좋습니다.


스크립트릿을 교환하는 방법은 전적으로 코드/로직의 목적에 따라 달라집니다.대부분의 경우 이 코드는 풀가치가 있는 Java 클래스에 배치됩니다.

  • 모든 요청에 대해 동일한 Java 코드를 호출하고 싶은 경우, 예를 들어 사용자가 로그인하고 있는지 여부를 확인하는 등 요청된 페이지에 관계없이 더 적게 또는 더 많이 호출하고 싶은 경우, 필터와 그에 따른 코드를 작성하십시오.예:

      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
          if (((HttpServletRequest) request).getSession().getAttribute("user") == null) {
              ((HttpServletResponse) response).sendRedirect("login"); // Not logged in, redirect to login page.
          } else {
              chain.doFilter(request, response); // Logged in, just continue request.
          }
      }
    

    「」에 있는 .<url-pattern>대상 JSP 페이지를 커버하면 JSP 페이지 전체에 동일한 코드를 복사 붙여넣을 필요가 없습니다.


  • GET 요청을 처리하기 위해 일부 Java 코드를 호출하려면(예를 들어, 일부 쿼리 매개 변수를 기반으로 필요한 경우 데이터베이스에서 일부 목록을 미리 로드하는 경우), 서블릿을 구현하고 그에 따라 코드를 작성합니다.예:

      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          try {
              List<Product> products = productService.list(); // Obtain all products.
              request.setAttribute("products", products); // Store products in request scope.
              request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); // Forward to JSP page to display them in a HTML table.
          } catch (SQLException e) {
              throw new ServletException("Retrieving products failed!", e);
          }
      }
    

    이러한 방법으로 예외를 처리하는 것이 더 쉽습니다.DB는 JSP 렌더링 중에는 액세스되지 않지만 JSP가 표시되기 훨씬 전에 액세스됩니다.DB 액세스가 예외를 발생시킬 때마다 응답을 변경할 수 있습니다.예에서는 에러 이 페이지는, 「」 「500」 「」 「」 「500」 「」 「」 「」 「」 「500」 「」 「」 「」으로 할 수 .<error-page>web.xml.


  • 제출된 HTML 폼에서 데이터를 수집하여 비즈니스 작업(변환, 검증, DB에 저장 등)을 수행하는 등 POST 요청을 처리하기 위해 Java 코드를 호출하려면 서블릿을 구현하고 그에 따라 코드를 작성합니다.예:

      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          String username = request.getParameter("username");
          String password = request.getParameter("password");
          User user = userService.find(username, password);
    
          if (user != null) {
              request.getSession().setAttribute("user", user); // Login user.
              response.sendRedirect("home"); // Redirect to home page.
          } else {
              request.setAttribute("message", "Unknown username/password. Please retry."); // Store error message in request scope.
              request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to JSP page to redisplay login form with error.
          }
      }
    

    , 하게 됩니다할 수 있습니다(이에서는, 「」를 사용해 할 수 ).오류 발생 시 검증 오류가 있는 폼을 재표시할 수 있습니다(이 예에서는 를 사용하여 재표시할 수 있습니다).${message}EL) 또는 성공 시 원하는 대상 페이지로 이동합니다.


  • 실행 계획 및/또는 요청 및 응답 대상을 제어하기 위해 일부 Java 코드를 호출하려면 MVC의 전면 컨트롤러 패턴에 따라 서블릿을 구현하십시오.예:

      protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          try {
              Action action = ActionFactory.getAction(request);
              String view = action.execute(request, response);
    
              if (view.equals(request.getPathInfo().substring(1)) {
                  request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response);
              } else {
                  response.sendRedirect(view);
              }
          } catch (Exception e) {
              throw new ServletException("Executing action failed.", e);
          }
      }
    

    또는 JSF, Spring MVC, Wicket 의 MVC 프레임워크를 채택하면 커스텀 서블릿 없이 JSP/Facellet 페이지와 JavaBean 클래스만 사용할 수 있습니다.


  • Java 코드를 호출하여 JSP 페이지 내의 플로우를 제어하려면 JSTL 코어와 같은 (기존의) 흐름 제어 태그립을 취득해야 합니다.예: 표시List<Product>★★★★★★★★★★★★★★★★★★:

      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
      ...
      <table>
          <c:forEach items="${products}" var="product">
              <tr>
                  <td>${product.name}</td>
                  <td>${product.description}</td>
                  <td>${product.price}</td>
              </tr>
          </c:forEach>
      </table>
    

    HTML에 적합한 XML 스타일 태그를 사용하면 다양한 개폐괄호("이 닫힘 괄호는 도대체 어디에 속합니까?")가 있는 여러 스크립틀릿보다 코드가 읽기 쉽고 유지보수가 용이합니다.스크립틀릿을 사용할 마다 예외를 발생시키도록 웹 애플리케이션을 설정하는 것이 간단합니다.다음 조각을 추가함으로써web.xml:

      <jsp-config>
          <jsp-property-group>
              <url-pattern>*.jsp</url-pattern>
              <scripting-invalid>true</scripting-invalid>
          </jsp-property-group>
      </jsp-config>
    

    Java EE가 제공하는 MVC 프레임워크 JSF의 일부인 JSP의 후속 버전인 Facellets에서는 이미 스크립트렛을 사용할 수 없습니다.이렇게 하면 자동으로 "올바른 방법"으로 작업을 수행해야 합니다.


  • 일부 Java 코드를 호출하여 JSP 페이지 내의 "백엔드" 데이터에 액세스하여 표시하려면 EL(Expression Language)을 사용해야 합니다.${}입력값 :: 제제입시시시시시시시시시시:

      <input type="text" name="foo" value="${param.foo}" />
    

    ${param.foo}, 의 .request.getParameter("foo").


  • 일부 유틸리티 Java 코드를 JSP 페이지에서 직접 호출하는 경우(일반적으로public staticMethods)를 EL 함수로 정의해야 합니다.JSTL에는 표준 함수 taglib가 있지만, 직접 함수를 쉽게 만들 수도 있습니다.다음으로 JSTL의 예를 제시하겠습니다.fn:escapeXml 는 XSS 공격을 방지하는 데 도움이 됩니다.

      <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
      ...
      <input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
    

    XSS의 감도는 Java/JSP/JSTL/EL과 특별히 관련된 것은 아닙니다.개발하는 모든 웹 어플리케이션에서 이 문제를 고려해야 합니다.스크립트렛의 문제는 적어도 표준 Java API를 사용하지 않는 경우 내장 방지 방법을 제공하지 않는다는 것입니다.JSP의 후속 Facellet은 이미 암시적인 HTML 이스케이프 기능을 가지고 있기 때문에 Facellet의 XSS 홀에 대해 걱정할 필요가 없습니다.

다음 항목도 참조하십시오.

세이프가드로서:스크립틀릿을 완전히 무효로 하다

또 다른 질문에서 설명하듯이 스크립트는 항상 비활성화 시킬 수 있습니다.web.xml웹 응용 프로그램 기술자.

개발자가 스크립트렛을 추가하는 것을 막기 위해 항상 그렇게 하고 있습니다.특히 대기업에서는 조만간 개요를 잃을 것입니다.web.xml을 사용하다

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
     <scripting-invalid>true</scripting-invalid>
  </jsp-property-group>
</jsp-config>

JSTL은 조건, 루프, 세트, 취득 등의 태그를 제공합니다.예를 들어 다음과 같습니다.

<c:if test="${someAttribute == 'something'}">
   ...
</c:if>

JSTL은 요구 속성과 함께 동작합니다.이러한 속성은 대부분의 경우 JSP로 전송되는 Servlet에 의해 요구로 설정됩니다.

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>

또한 Wicket과 같은 컴포넌트 기반 프레임워크가 있어 많은 HTML을 생성할 수 있습니다.

HTML로 끝나는 태그는 매우 기본적이며 논리적으로 혼재되지 않습니다.그 결과 일반적인 HTML 요소가 포함된 거의 빈 HTML 페이지가 됩니다.단점은 Wicket API에는 배워야 할 많은 컴포넌트가 있으며 이러한 제약 조건 하에서 달성하기 어려울 수 있다는 것입니다.

MVC 아키텍처 패턴에서 JSP는 뷰 레이어를 나타냅니다.Java 코드를 JSP에 삽입하는 것은 나쁜 관행으로 간주됩니다.

JSTL, freeMarker velocity를 JSP와 함께 "템플릿 엔진"으로 사용할 수 있습니다.

이러한 태그에 대한 데이터 공급자는 취급하는 프레임워크에 따라 달라집니다.MVC 패턴의 구현으로서 Struts 2 및 WebWork는 OGNL을 사용하여 "빈 속성을 JSP에 노출하는 매우 흥미로운 기술"을 사용합니다.

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

가능한 경우, 필요한 작업에 특수 기술을 사용하는 것을 고려해 보십시오. 2.0이.JSF 2.0은 Java EE 6을 콩을 JSF 등 다양한 합니다.#{bean.method(argument)}★★★★★★ 。

단순히 JSP에서 Java 코딩의 단점을 피하고 싶다면 스크립트가 있더라도 그렇게 할 수 있습니다.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 forwarding, 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은 EviL(실행 시간 예외 및 리팩터링)입니다.

Wicket은 나쁜 면도 있습니다(소규모 애플리케이션이나 심플한 뷰 계층에서는 퍼포먼스와 번거로움).

java2의 예

이것은 웹 어플리케이션의 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은 Java와 HTML을 완전히 분리하는 대안이기도 합니다.따라서 디자이너와 프로그래머는 서로에 대한 이해가 거의 없는 상태에서 서로 다른 코드 세트를 함께 작업할 수 있습니다.

위켓을 보세요.

당신은 좋은 질문을 했고, 좋은 답변을 얻었지만, 저는 JSP를 없애는 것을 제안합니다.그것은 결국 죽게 될 구식 기술이다.템플릿 엔진과 같은 최신 방식을 사용합니다.비즈니스 레이어와 프레젠테이션 레이어를 명확하게 분리할 수 있습니다.템플릿에는 Java 코드가 포함되어 있지 않기 때문에 대부분의 경우 WYSIWYG를 사용하여 웹 프레젠테이션 편집 소프트웨어에서 직접 템플릿을 생성할 수 있습니다.

또한 필터 및 사전 및 사후 처리에서 멀리하십시오. 그렇지 않으면 변수가 값을 어디서 얻는지 항상 모르기 때문에 지원/디버깅에 어려움을 겪을 수 있습니다.

아무리 피하려고 해도 다른 개발자와 함께 작업할 때 스크립트렛을 선호하고 프로젝트에 사악한 코드를 삽입하는 사람도 있습니다.따라서 스크립트 코드를 줄이려면 첫 번째 사인에서 프로젝트를 설정하는 것이 매우 중요합니다.이를 극복하기 위한 몇 가지 기술이 있습니다(다른 기술에서 언급한 몇 가지 프레임워크 포함).다만, 순수 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>

이 매터 페이지에서는 "title"이라는 fragment를 작성했기 때문에, 자 페이지에서는 마스터 페이지의 이 부분에 코드를 더 삽입할 수 있었습니다. 「」는,<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 프레임워크에서도 잘 동작합니다.

JSP 파일에서 Java 코드를 피하기 위해 Java는 JSTL과 같은 태그 라이브러리를 제공합니다.

또한 Java는 모든 프로그래밍 구조를 태그 형태로 쓸 수 있는 JSF를 고안했습니다.

JSP에서 JSTL 태그 라이브러리를 사용합니다.그것은 완벽하게 작동한다.

JSTL 태그와 EL 식을 사용합니다.

이상의 언어로 프로그래밍하는 것을 반대하는 사람이 있다면 GWT를 추천합니다.Google Toolkit은 모든 클라이언트와 공유 코드를 JavaScript로 변환하므로 이론적으로 모든 JavaScript 및 HTML 요소를 피할 수 있습니다.문제가 없기 때문에 다른 언어로 코딩하지 않고 웹 서비스를 이용할 수 있습니다.디폴트 CSS는 내선번호(스마트)로 지정되어 있기 때문에 다른 곳에서 사용할 수도 있습니다.GWT 또는 Vaadin).수십 개의 주석을 배울 필요가 없습니다.

물론 원한다면 코드 깊숙이 해킹하여 JavaScript를 삽입하고 HTML 페이지를 풍부하게 만들 수 있지만, 원한다면 피할 수 있고, 다른 프레임워크에 쓰여져 있는 것처럼 그 결과는 좋을 것입니다.시도해 볼 가치가 있다고 말하고 기본적인 GWT는 잘 문서화되어 있습니다.

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

Python World의 좋은 아이디어는 Template 속성 언어입니다. TAL은 Zope에 의해 도입되었으며 PHP, XSLT, Java 및 Python/Zope 및 PHParn에 구현된 표준입니다.이 템플릿 언어 클래스에서는 위의 예 중 하나가 다음과 같습니다.

<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 네임스페이스의 몇 가지 특수 속성처럼 보입니다. 브라우저에서 볼 수 있고 설계자가 안전하게 조정할 수 있습니다.

매크로, 국제화현지화에도 대응하고 있습니다.

<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에서 스크립틀릿을 사용하는 것은 좋은 방법이 아닙니다.

대신 다음을 사용할 수 있습니다.

  1. JSTL 태그
  2. EL식
  3. 사용자 지정 태그 - 사용할 자체 태그를 정의할 수 있습니다.

다음을 참조해 주세요.

  1. http://docs.oracle.com/javaee/1.4/tutorial/doc/JSTL3.html
  2. EL

,, 교, 교로 바꿉니다.<%! counter++; %>비즈니스 계층이 카운터의 증분의 필요성을 통지받는 이벤트 생산자-패키지 아키텍처에 의해, 그에 따라 대응해, 발표자에게 통지해 뷰를 갱신합니다.앞으로 카운터의 새로운 값과 오래된 값, 누가 카운터를 증가시켰는지, 어떤 목적을 염두에 두고 있는지 알아야 하기 때문에 많은 데이터베이스 트랜잭션이 관련되어 있습니다.계층이 완전히 분리되기 때문에 직렬화가 수반되는 것은 분명합니다.RMI, IIOP, SOAP.HTML을 사용합니다.그것은 일상적인 일이기 때문에 구현하지 않습니다.새로운 목표는 새로운 광택이 나는E7, 64GB RAM 서버 상에서 초당 250증분을 달성하는 것입니다.

저는 프로그래밍에 20년 이상 종사해 왔습니다.대부분의 프로젝트는, 「재이용성 교환성 OO-기능 디버깅성 테스트성」이 필요하게 되기 전에 실패합니다.기능에만 관심이 있는 사람들이 운영하는 다른 프로젝트들은 매우 성공적이었다.또한 프로젝트 초기에 구현된 견고한 객체 구조는 코드를 사양의 급격한 변경(애자일이라고도 함)에 맞출 수 없게 만듭니다.

따라서 프로젝트 초기 또는 특별히 필요하지 않은 경우 "레이어" 또는 중복 데이터 구조를 정의하는 작업을 지연시키는 것으로 간주합니다.  

엄밀히 말하면 JSP는 런타임 중에 모두 Servlet으로 변환됩니다.

JSP는 처음에 MVC 패턴에 따라 비즈니스 로직과 설계 로직을 분리하기 위해 만들어졌습니다.JSP는 엄밀히 말하면 실행 시 모두 Java 코드입니다.

그러나 질문에 답하기 위해 태그 라이브러리는 보통 JSP 페이지에 로직(Java 코드 삭제)을 적용하기 위해 사용됩니다.

Java Web 어플리케이션에서 다음과 같은 것을 사용하면 JSP 파일의 선두에서 Java 코드가 삭제될 수 있습니다.

  1. 웹 응용 프로그램에 MVC 아키텍처 사용

  2. JSP 태그 사용

a. 표준 태그

b. 커스텀 태그

  1. 표현 언어

JSP 파일의 Java 코드를 회피하려면 어떻게 해야 합니까?

언어(EL) 외에 JSTL과 같은 탭 라이브러리 태그를 사용할 수 있습니다.단, EL은 JSP에서는 잘 동작하지 않습니다.따라서 JSP를 완전히 폐기하고 Facellet을 사용하는 것이 더 나을 수 있습니다.

Facellets는 JSF(Java Server Faces)를 위해 설계된 최초의 비 JSP 페이지 선언 언어이며 JSF 개발자들에게 JSP에 비해 더 단순하고 강력한 프로그래밍 모델을 제공합니다.웹 어플리케이션 개발을 위해 JSP에서 발생하는 다양한 문제를 해결합니다.

Enter image description here

원천

Scriptlet 사용은 매우 오래된 방법으로 권장되지 않습니다.JSP 페이지에서 직접 출력하는 경우는, JSTL 와 함께 Expression Language(EL; 표현 언어)를 사용합니다.

또한 Velocity, Freemarker, Thymeleaf 등의 템플릿 엔진을 사용하는 등 다른 옵션도 있습니다.단, EL과 JSTL에서 플레인 JSP를 사용하는 것은 대부분의 경우 목적에 부합하며 초보자도 가장 간단한 것 같습니다.

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

UI 설계에 Backbone.js 또는 AngularJS와 유사한 JavaScript 프레임워크를 사용하고 REST API를 사용하여 데이터를 가져옵니다.그러면 UI에서 Java 종속성이 완전히 제거됩니다.

더 이상 그런 건 안 써, 친구서버에서 뷰(CSS, HTML, JavaScript 등)를 분리하는 것이 좋습니다.

제 경우, Angular를 사용하여 뷰를 처리하는 시스템을 실행하고 필요한 데이터는 REST 서비스를 사용하여 서버에서 가져옵니다.

정말이에요, 디자인 방식이 바뀔 거예요.

JSP 2.0에는 "Tag Files"라는 기능이 있으며 외부 Java 코드 없이 태그를 작성할 수 있습니다.tld을요..tagWEB-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" />

또한 태그 본문을 쉽게 읽을 수 있습니다.

/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>

샘플은 매우 간단하지만 여기서는 복잡한 작업을 많이 수행할 수 있습니다.수 있습니다(예: 예예예예 ( ) 。JSTL가 붙어있습니다.if/forEcah/chosen(예: 텍스트 조작)format/contains/uppercase SQL 태그 "SQL " "도 마찬가지입니다.select/update예: ).Hashmap access, session,request ... , ...태그 파일에도 있습니다.

태그 파일은 JSP 파일처럼 서버를 변경할 때 재시작할 필요가 없기 때문에 매우 쉽게 개발할 수 있습니다.이를 통해 개발하기가 쉬워집니다.

Struts 2와 같은 좋은 태그가 많은 프레임워크를 사용하더라도 자체 태그가 있으면 코드를 크게 줄일 수 있습니다.태그 파라미터를 struts에 전달하여 프레임워크태그를 커스터마이즈할 수 있습니다.

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

(JSP 코드에서 Java를 사용하게 되더라도, JSP 코드를 태그로 캡슐화할 수 있습니다.)

  1. 서블릿 클래스 내에서 값 및 매개 변수 만들기
  2. JSTL/Taglib를 사용하여 이러한 값과 파라미터를 JSP 내에서 가져옵니다.

이 접근법의 장점은 당신의 코드도 HTML과 같은 코드라는 것입니다!

많은 답변에서 알 수 있듯이 JSTL을 사용하거나 독자적인 커스텀태그를 만듭니다.다음은 사용자 지정 태그 작성에 대한 좋은 설명입니다.

이 답변의 대부분은 "프레임워크 사용"으로 되어 있습니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★그러나 프레임워크는 JSP를 사용할 수도 있고 사용하지 않을 수도 있기 때문에 JSP에서 Java 사용을 제거하는 것을 주요 목표로 하고 있지 않기 때문에 당신의 질문에 실제로 답변할 수 없다고 생각합니다.

에 대한 은 "수 JSP에서 Java 사용을 피하는 방법"이라는 질문에 대한 적절한 답변은 "사용할 수 없습니다.

JSP를 사용하다Java HTML java로로로로로 / java java java java java java java java java java 。후속 질문은 JSP에서 어느 정도의 Java를 사용해야 하는가 하는 것입니다.
이 질문에 답하기 전에 "JSP를 사용하여 Java를 사용하여 웹 콘텐츠를 빌드해야 합니까?"라는 생각도 해 보아야 합니다.마지막 질문의 답은 "아니오"입니다.Java를 사용하여 웹용 애플리케이션을 개발하기 위해 JSP를 대체할 수 있는 많은 방법이 있습니다.예를 들어 Struts는 JSP를 사용하도록 강요하지 않습니다.오해하지 마세요.사용자는 JSP를 사용할 수 있으며 많은 구현에서 사용할 수 있지만 반드시 사용할 필요는 없습니다.Struts는 HTML을 사용하도록 강요하지도 않습니다.JSP도 마찬가지입니다만, 솔직히 말하면 HTML을 생성하지 않는 JSP는 좀 이상합니다.서블릿을 사용하면 HTTP를 통해 원하는 모든 종류의 콘텐츠를 동적으로 제공할 수 있습니다.이들은 거의 모든 Java Web의 배후에 있는 주요 기술입니다.JSP는 실제로는 서블릿용 HTML 템플릿에 불과합니다.
따라서 JSP에 어느 정도의 Java를 넣어야 하는지에 대한 답은 "가능한 한 적게"입니다.JSP에는 물론 Java가 있지만 태그 라이브러리의 정의, 세션 변수 및 클라이언트 변수, 서버 측 객체를 캡슐화하는 빈으로 구성되어 있습니다.HTML 내의 <%%> 태그는 거의 독점적으로 속성 콜이나 변수 식입니다.드문 예외로는 1페이지에 관한 초특정 계산, 1페이지에만 적용되는 페이지 고유의 문제로 인한 버그 수정, 1페이지에 한정되는 비정상적인 요건에서 발생하는 마지막 연결 및 산술, 기타 유사한 사례가 있습니다.150만 회선, 3000 JSP 및 5000 클래스의 코드 세트에는, 그러한 일의의 스니펫의 인스턴스가 100 개 있는 경우가 있습니다.클래스나 태그 라이브러리의 정의에서 이러한 변경을 실시하는 것은 매우 가능하지만, 각 케이스의 특수성으로 인해 지나치게 복잡해지고, 쓰기 및 디버깅에 시간이 걸리며, 결과적으로 사용자에게 도달하는 데 시간이 더 오래 걸립니다.츠미야「no java」는 JSP로, 「no java」는 「no java」입니다.능력에는 이유가 있습니다.

Java 자체는 매우 좋은 언어이지만, 엔터프라이즈 환경에서 너무 많이 사용되었기 때문에 표준 솔루션이 매우(터무니없이) 어려웠습니다.예: JSTL, JSF, Wicket 등

Java에서 백엔드를 작성하기 위한 초경량 접근방식을 다음에 나타냅니다.

  • JSP(또는 다른 템플릿엔진)를 전혀 사용하지 않는다.
  • 플레인 HTML 템플릿을 사용합니다.
  • JSOUP를 사용하여 HTML 템플릿을 Document 객체로 해석합니다.
  • 매우 직관적인 jQuery와 유사한 방법을 사용하여 문서 객체를 수정합니다.
  • 요청에 대한 응답으로 Document.toString()을 반환합니다.

나는 그것을 내 사이드 프로젝트 중 하나(호스트 Digitalocean $5 dropplet, Nginx, Tomcat)에 사용하고 있으며, 구글봇에 따르면 평균 응답 시간은 약 160ms이다.

언급URL : https://stackoverflow.com/questions/3177733/how-can-i-avoid-java-code-in-jsp-files-using-jsp-2

반응형