etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2022. 1. 4. 06:04
반응형

질문자 :chmoelders


저는 Java EE를 처음 접했고 다음 세 줄과 같은 것을 알고 있습니다.

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

는 구식 코딩 방식이며 JSP 버전 2에는 JSP 파일에서 Java 코드를 방지하는 방법이 있습니다. 대체 JSP 2 라인은 무엇이며 이 기술을 무엇이라고 합니까?



JSP 에서 스크립틀릿 (예: <% %> 항목)을 사용하는 것은 2001년 에 taglib (예: JSTL ) 및 EL ( Expression Language ${} 항목)이 탄생한 이후로 매우 권장되지 않습니다.

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

  1. 재사용성: 스크립틀릿을 재사용할 수 없습니다.
  2. 대체 가능성: 스크립틀릿을 추상화할 수 없습니다.
  3. OO-능력: 상속/구성을 사용할 수 없습니다.
  4. 디버깅 가능성: 스크립틀릿이 중간에 예외를 throw하면 빈 페이지만 표시됩니다.
  5. 테스트 가능성: 스크립틀릿은 단위 테스트가 불가능합니다.
  6. 유지 관리 가능성: 혼합/복제/복제 코드 논리를 유지 관리하는 데 더 많은 시간이 필요합니다.

Sun Oracle은 또한 (태그) 클래스에서 동일한 기능이 가능할 때마다 스크립틀릿을 사용하지 않도록 JSP 코딩 규칙에서 권장합니다. 다음은 관련성이 있는 몇 가지 인용문입니다.

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

...

가능하면 태그 라이브러리가 동등한 기능을 제공할 때마다 JSP 스크립틀릿을 사용하지 마십시오. 이렇게 하면 페이지를 더 쉽게 읽고 유지 관리할 수 있고 비즈니스 논리와 프레젠테이션 논리를 분리할 수 있으며 페이지를 JSP 2.0 스타일 페이지로 쉽게 발전시킬 수 있습니다(JSP 2.0 사양은 스크립틀릿 사용을 지원하지만 강조하지 않음).

...

비즈니스 로직에서 프리젠테이션 계층 간의 결합을 줄이기 위해 MVC(모델-뷰-컨트롤러) 디자인 패턴을 채택한다는 점에서 JSP 스크립틀릿을 비즈니스 로직 작성에 사용해서는 안 됩니다. 오히려 JSP 스크립틀릿은 클라이언트 요청 처리에서 반환된 데이터("값 개체"라고도 함)를 적절한 클라이언트 준비 형식으로 변환하는 데 필요한 경우 사용됩니다. 그런 경우에도 프론트 컨트롤러 서블릿이나 사용자 정의 태그로 이 작업을 수행하는 것이 더 나을 것입니다.


스크립틀릿을 완전히 교체하는 방법은 코드/로직의 유일한 목적에 달려 있습니다. 종종 이 코드는 완전한 Java 클래스에 배치됩니다.

  • 모든 요청에 대해 동일한 Java 코드를 호출하려는 경우(예: 사용자가 로그인했는지 확인하는 등) 요청된 페이지에 관계없이 적거나 더 많이 호출한 다음 필터 doFilter() 메소드에 코드를 작성하십시오. 예:

     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 페이지에서 동일한 코드 조각을 복사하여 붙여넣을 필요가 없습니다.


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

     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 액세스가 예외를 throw할 때마다 응답을 변경할 가능성이 여전히 있습니다. 위의 예에서 기본 오류 500 페이지가 표시되며 web.xml <error-page> 로 사용자 정의할 수 있습니다.


  • 제출된 HTML 양식에서 데이터를 수집하고 일부 비즈니스 작업(변환, 유효성 검사, DB에 저장 등)을 수행하는 것과 같이 POST 요청 을 처리하기 위해 일부 Java 코드를 호출하려면 서블릿 을 구현하고 그에 따라 코드를 작성하십시오. doPost() 메서드에서. 예:

     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. } }

    이 방법은 다른 결과 페이지 대상을 처리하는 것이 더 쉽습니다. 오류가 발생한 경우 유효성 검사 오류가 있는 양식을 다시 표시하거나(이 특정 예에서는 EL ${message} 를 사용하여 다시 표시할 수 있음) 경우에 따라 원하는 대상 페이지로 이동합니다. 성공의.


  • 실행 계획 및/또는 요청 및 응답의 대상 을 제어 하기 위해 일부 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/Facelets 페이지와 JavaBean 클래스만 있으면 됩니다.


  • JSP 페이지 내부의 흐름 을 제어하기 위해 일부 Java 코드를 호출 하려면 JSTL core 와 같은 (기존) 흐름 제어 taglib를 가져와야 합니다. 예: 테이블에 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의 후속 제품인 Facelets 에서는 이미 스크립틀릿 을 사용할 수 없습니다 . 이렇게 하면 자동으로 "올바른 방법"으로 작업을 수행할 수 있습니다.


  • 일부 Java 코드를 호출하여 JSP 페이지 내부의 "백엔드" 데이터 에 액세스하고 표시 ${} 항목을 사용해야 합니다. 예: 제출된 입력 값 다시 표시:

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

    ${param.foo} request.getParameter("foo") 의 결과를 표시합니다.


  • JSP 페이지에서 직접 일부 유틸리티 Java 코드(일반적으로 public static 메소드)를 호출하려면 이를 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의 후속 Facelets는 이미 암시적 HTML 이스케이프를 가지고 있으므로 Facelets의 XSS 구멍에 대해 걱정할 필요가 없습니다.

또한보십시오:


BalusC

보호 수단: Scriptlet을 영원히 비활성화

또 다른 질문 web.xml 웹 응용 프로그램 설명자에서 스크립틀릿을 비활성화할 수 있고 항상 비활성화해야 합니다.

개발자가 스크립틀릿을 추가하는 것을 방지하기 위해 항상 그렇게 할 것입니다. 특히 조만간 개요를 잃게 될 대기업에서는 더욱 그렇습니다. web.xml 설정은 다음과 같습니다.

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

Stefan Schubert-Peters

JSTL 은 조건부, 루프, 세트, 가져오기 등에 대한 태그를 제공합니다. 예를 들면 다음과 같습니다.

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

JSTL은 요청 속성과 함께 작동합니다. 가장 자주 JSP로 전달되는 서블릿에 의해 요청에 설정됩니다.


Bozho

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>

Behrang

또한 많은 HTML을 생성하는 Wicket 과 같은 구성 요소 기반 프레임워크도 있습니다.

HTML로 끝나는 태그는 매우 기본적이며 실제로 혼합되는 논리가 없습니다. 결과는 일반적인 HTML 요소가 있는 거의 비어 있는 HTML 페이지입니다. 단점은 Wicket API에 학습할 구성 요소가 많고 이러한 제약 조건에서 달성하기 어려울 수 있는 부분이 있다는 것입니다.


tsand

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

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

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


Sami Jmii

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

가능하면 수행해야 하는 작업에 대해 전문 기술을 사용하는 것을 고려하십시오. #{bean.method(argument)} 접근 방식을 통해 Java bean을 JSF 페이지와 함께 접착하는 것을 포함하여 많은 멋진 기능을 제공하는 JSF 2.0이 있습니다.


Thorbjørn Ravn Andersen

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>

dipu

JSTL을 사용하여 자신의 태그를 사용자 정의하고 작성하는 방법 배우기

EL은 EviL (런타임 예외 및 리팩토링)입니다.

Wicket도 악의적일 수 있습니다(작은 응용 프로그램 또는 간단한 보기 계층의 경우 성능과 번거로움).

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>

tomasb

Wicket 은 Java와 HTML을 완전히 분리하는 대안이기도 합니다. 따라서 디자이너와 프로그래머는 서로에 대한 이해가 거의 없이 서로 다른 코드 세트에서 함께 작업할 수 있습니다.

위켓을 보세요.


msj121

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

그리고 필터와 사전 및 사후 처리를 멀리하십시오. 그렇지 않으면 변수가 값을 얻는 위치를 항상 알지 못하기 때문에 지원/디버깅에 어려움을 겪을 수 있습니다.


Dmitriy R

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

다음 내용으로 WEB-INF/tags 아래에 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>

이 마스터 페이지에서 "제목"이라는 조각을 만들어 자식 페이지에서 마스터 페이지의 이 위치에 더 많은 코드를 삽입할 수 있도록 했습니다. 또한 <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 프레임워크와도 잘 작동합니다.


Thai Tran

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

또한 Java는 모든 프로그래밍 구조를 태그 형태로 작성할 수 있는 JSF를 제공합니다.


mahesh

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


Chandra Sekhar

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


tanglei

누군가가 하나 이상의 언어로 프로그래밍하는 것을 정말로 반대한다면 GWT를 제안합니다. 이론적으로 Google Toolkit은 모든 클라이언트 및 공유 코드를 JavaScript로 변환하므로 모든 JavaScript 및 HTML 요소를 피할 수 있습니다. 그것들에 문제가 없을 것이므로 다른 언어로 코딩하지 않고도 웹 서비스를 사용할 수 있습니다. 확장(smartGWT 또는 Vaadin )에서 제공하는 기본 CSS를 어딘가에서 사용할 수도 있습니다. 수십 개의 주석을 배울 필요가 없습니다.

물론 원한다면 코드의 깊이를 해킹하고 JavaScript를 주입하고 HTML 페이지를 강화할 수 있지만 실제로 원하는 경우 이를 피할 수 있으며 결과는 다른 프레임워크에서 작성된 것처럼 좋을 것입니다. . 시도해 볼 가치가 있으며 기본 GWT는 문서화되어 있습니다.

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


CsBalazsHungary

Python 세계의 깔끔한 아이디어는 Template 속성 언어입니다 . TAL은 Zope(따라서 "Zope 페이지 템플릿", ZPT라고도 함)에 의해 소개되었으며 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 네임스페이스의 일부 특수 속성을 더한 것처럼 보입니다. 브라우저로 볼 수 있으며 디자이너가 안전하게 조정할 수 있습니다.

매크로와 국제화 및 현지화에 대한 지원도 있습니다.

 <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 구현 에 대해서는 잘 모릅니다.


Tobias

JSP에서 스크립틀릿을 사용하는 것은 좋은 방법이 아닙니다.

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

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

다음을 참조하십시오.

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

kapil das

물론, <%! counter++; %> 이벤트 생산자-소비자 아키텍처에 의해 비즈니스 계층이 카운터를 증가시켜야 할 필요성에 대해 알림을 받으면 그에 따라 반응하고 발표자가 보기를 업데이트하도록 알립니다. 많은 데이터베이스 트랜잭션이 관련되어 있습니다. 미래에는 카운터의 새 값과 이전 값, 누가 값을 증가시켰는지, 어떤 목적을 염두에 두고 있는지 알아야 하기 때문입니다. 레이어가 완전히 분리되어 있기 때문에 분명히 직렬화가 포함됩니다. RMI, IIOP, SOAP에 대해 카운터를 증가시킬 수 있습니다. 그러나 HTML만 필요하며 구현하지 않는 것은 일상적인 경우이기 때문입니다. 새로운 목표는 반짝이는 새 E7, 64GB RAM 서버에서 초당 250 증분에 도달하는 것입니다.

저는 프로그래밍 분야에서 20년 이상을 보냈고 대부분의 프로젝트는 섹스텟 이전에 실패합니다. 기능에만 관심이 있는 사람들이 운영하는 다른 프로젝트는 매우 성공적이었습니다. 또한 프로젝트 초기에 구현된 뻣뻣한 객체 구조로 인해 코드가 사양의 급격한 변화(애자일이라고도 함)에 적응할 수 없습니다.

그래서 저는 프로젝트 초기나 특별히 필요하지 않을 때 "계층" 또는 중복 데이터 구조를 정의하는 활동을 미루는 것으로 간주합니다.


Razvan

기술적으로 JSP는 모두 런타임 중에 서블릿으로 변환됩니다 .

JSP는 처음에 MVC 패턴에 따라 비즈니스 로직과 디자인 로직을 분리할 목적으로 만들어졌습니다. 따라서 JSP는 기술적으로 런타임 동안의 모든 Java 코드입니다.

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


mel3kings

Java 웹 응용 프로그램에서 다음을 사용하면 JSP 파일의 전경에서 Java 코드를 제거할 수 있습니다.

  1. 웹 애플리케이션에 MVC 아키텍처 사용

  2. JSP 태그 사용

NS. 표준 태그

NS. 사용자 정의 태그

  1. 표현 언어

Ajay Takur

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

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

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

여기에 이미지 설명 입력

원천


Yster

Scriptlet을 사용하는 것은 매우 오래된 방법이며 권장하지 않습니다. JSP 페이지에서 직접 출력하려면 JSTL 과 함께 EL(Expression Language) 을 사용하십시오.

Velocity, Freemarker, Thymeleaf 등과 같은 템플릿 엔진을 사용하는 것과 같은 다른 옵션도 있습니다. 그러나 EL 및 JSTL과 함께 일반 JSP를 사용하는 것이 대부분의 경우 제 목적에 부합하며 초보자에게는 가장 간단해 보입니다.

또한 뷰 계층에서 비즈니스 로직을 수행하는 것은 모범 사례가 아니라는 점에 유의하십시오. 서비스 계층에서 비즈니스 로직을 수행 하고 컨트롤러를 통해 출력 결과를 뷰로 전달해야 합니다.


adn.911

UI 디자인을 위해 Backbone.js 또는 AngularJS와 유사한 JavaScript 프레임워크를 사용하고 REST API를 사용하여 데이터를 가져옵니다. 이렇게 하면 UI에서 Java 종속성이 완전히 제거됩니다.


Sumesh TG

그 어떤 것도 더 이상 사용되지 않습니다, 친구. 내 조언은 서버에서 보기(CSS, HTML, JavaScript 등)를 분리하는 것입니다.

제 경우에는 Angular로 보기를 처리하는 시스템을 수행하고 필요한 모든 데이터는 REST 서비스를 사용하여 서버에서 가져옵니다.

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


Eduardo

JSP 2.0에는 "태그 파일" 이라는 기능이 있으며 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" />

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

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

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

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

좋은 태그가 많은 Struts 2와 같은 프레임워크를 사용하더라도 자체 태그를 사용하면 코드를 많이 줄일 수 있다는 것을 알 수 있습니다. 태그 매개변수를 스트럿에 전달할 수 있으며 이러한 방식으로 프레임워크 태그를 사용자 정의할 수 있습니다.

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

(내가 원하지 않는 JSP 코드에서 Java를 사용하게 되더라도 해당 코드를 태그에 캡슐화할 수 있습니다.)


Alireza Fattahi

  1. 서블릿 클래스 내에서 값과 매개변수 만들기
  2. JSTL/Taglib를 사용하여 JSP 내에서 해당 값과 매개변수를 가져옵니다.

이 접근 방식의 좋은 점은 코드가 HTML과 같은 코드라는 것입니다!


Mehdi

많은 답변에서 알 수 있듯이 JSTL을 사용하거나 사용자 정의 태그를 만드십시오.다음 은 사용자 정의 태그 생성에 대한 좋은 설명입니다.


Vikas Yadav

여기에 있는 많은 답변은 "프레임워크 사용" 경로로 이동합니다. 아무 문제가 없습니다. 그러나 프레임워크가 JSP를 사용할 수도 있고 사용하지 않을 수도 있고 JSP에서 Java 사용을 주요 목표로 제거하는 방식으로 설계되지 않았기 때문에 이것이 귀하의 질문에 실제로 답이 되지 않는다고 생각합니다.

"JSP에서 Java 사용을 피하는 방법"이라는 질문에 대한 유일한 좋은 대답은 할 수 없다는 것입니다.

그것이 바로 JSP의 목적입니다. Java를 사용하여 동적 데이터/로직으로 HTML을 렌더링합니다. 후속 질문은 JSP에서 얼마나 많은 Java를 사용해야 하는지입니다.
이 질문에 답하기 전에 "Java를 사용하여 웹 콘텐츠를 빌드하기 위해 JSP를 사용해야 합니까?"에 대해서도 생각해야 합니다. 마지막 질문에 대한 대답은 아니오입니다. Java를 사용하여 웹 페이싱 애플리케이션을 개발하기 위한 JSP에 대한 많은 대안이 있습니다. 예를 들어 Struts는 JSP를 사용하도록 강요하지 않습니다. 오해하지 마십시오. 사용할 수 있으며 많은 구현에서 사용하지만 절대적으로 사용할 필요는 없습니다. Struts는 HTML을 사용하도록 강요하지도 않습니다. JSP도 그렇지 않습니다. 하지만 솔직히 말해서 HTML을 생성하지 않는 JSP는 좀 이상합니다. 유명하게도 서블릿을 사용하면 HTTP를 통해 원하는 모든 종류의 콘텐츠를 동적으로 제공할 수 있습니다. 그것들은 자바 웹의 거의 모든 것 뒤에 있는 기본 기술입니다. JSP는 실제로 서블릿을 위한 HTML 템플릿입니다.
따라서 JSP에 얼마나 많은 Java를 넣어야 하는지에 대한 대답은 "가능한 한 적게"입니다. 물론 JSP에 Java가 있지만 태그 라이브러리 정의, 세션 및 클라이언트 변수, 서버측 개체를 캡슐화하는 빈으로만 구성됩니다. 내 HTML의 <%%> 태그는 거의 독점적으로 속성 호출 또는 변수 표현식입니다. 드문 예외에는 단일 페이지와 관련된 매우 구체적인 계산이 포함되며 재사용할 가능성이 거의 없습니다. 한 페이지에만 적용되는 페이지 관련 문제로 인한 버그 수정; 단일 페이지로 범위가 제한된 비정상적인 요구 사항으로 인한 막판 연결 및 산술; 및 기타 유사한 경우. 150만 줄의 코드 세트, 3000개의 JSP 및 5000개의 클래스에 이러한 고유한 조각의 인스턴스가 100개 정도 있을 수 있습니다. 클래스 또는 태그 라이브러리 정의에서 이러한 변경을 수행하는 것은 상당히 가능했지만 각 경우의 특수성으로 인해 지나치게 복잡하고 작성 및 디버그하는 데 더 오래 걸리고 결과적으로 내 정보에 도달하는 데 더 많은 시간이 걸렸습니다. 사용자. 판결문입니다. 그러나 실수하지 마십시오. "자바 없음"으로 어떤 의미의 JSP를 작성할 수도 없고 원할 수도 없습니다. 능력이 있는 데에는 이유가 있습니다.


Philippe Damerval

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" %>

bhanwar rathore

출처 : http:www.stackoverflow.com/questions/3177733/how-can-i-avoid-java-code-in-jsp-files-using-jsp-2

반응형