จะหลีกเลี่ยงรหัส Java ในไฟล์ JSP ได้อย่างไร


1673

ฉันใหม่กับ Java EE และฉันรู้ว่ามีบางอย่างเหมือนสามบรรทัดต่อไปนี้

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

เป็นวิธีการเข้ารหัสโรงเรียนเก่าและใน JSP เวอร์ชัน 2 มีวิธีการหลีกเลี่ยงรหัส Java ในไฟล์ JSP มีใครช่วยบอกฉันเกี่ยวกับทางเลือก JSP 2 บรรทัดและเทคนิคนี้เรียกว่าอะไร?


22
@Koray Tugay ตราบใดที่ตัวแปรตัวนับถูกประกาศไว้ที่ไหนสักแห่งก่อนการใช้งานมันจะใช้ได้แน่นอนที่สุด ...
Sheldon R.

@SheldonR สิ่งนี้ใช้ได้: <% = counter ++%> หรือนี่คือ: <%! int counter = 0; int x = ตัวนับ ++; %> แต่ไม่ใช่: <%! int counter = 0; เคาน์เตอร์ ++; %>
Koray Tugay

@KorayTugay สิ่งที่ฉันหมายถึงคือถ้าตัวนับตัวแปรถูกประกาศในบล็อกสคริปต์ก่อนหน้านี้ควรจะถูกต้องในบล็อกในภายหลัง แต่ท้ายที่สุดโปรแกรมเมอร์ของ J2EE ในปัจจุบันควรใช้ตัวแปร EL แทน scriptlets ต่อไป ...
Sheldon R.

คำตอบ:


1971

การใช้scriptlets (ที่<% %>สิ่ง) ในJSPแน่นอนกำลังใจอย่างสูงมาตั้งแต่เกิดของtaglibs (เช่นJSTL ) และEL ( Expression ภาษาเหล่านั้น${}สิ่ง ) ย้อนกลับไปในปี 2544

ข้อเสียที่สำคัญของscriptletsคือ:

  1. การนำมาใช้ใหม่:คุณไม่สามารถใช้สคริปต์เล็ตซ้ำได้
  2. การแทนที่:คุณไม่สามารถทำให้ scriptlets เป็นนามธรรมได้
  3. ความสามารถของ OO:คุณไม่สามารถใช้การสืบทอด / การแต่งเพลงได้
  4. Debuggability:ถ้า scriptlet มีข้อผิดพลาดครึ่งทางสิ่งที่คุณได้รับคือหน้าเปล่า
  5. Testability: scriptlets ไม่สามารถทดสอบได้
  6. การบำรุงรักษา:ต่อเวลา saldo เป็นสิ่งจำเป็นมากขึ้นในการรักษาตรรกะรหัสผสม / รก / ซ้ำซ้อน

Sun Oracle เองแนะนำให้ใช้ในการเข้ารหัส JSPเพื่อหลีกเลี่ยงการใช้scriptletทุกครั้งที่มีการใช้งาน (tag) คลาสเดียวกัน นี่คือการอ้างอิงที่เกี่ยวข้องหลายประการ:

จากข้อกำหนด JSP 1.2 ขอแนะนำให้ใช้ไลบรารีแท็กมาตรฐาน JSP (JSTL) ในเว็บแอปพลิเคชันของคุณเพื่อช่วยลดความต้องการสคริปต์ JSPในหน้าเว็บของคุณ โดยทั่วไปหน้าเว็บที่ใช้ JSTL นั้นง่ายต่อการอ่านและบำรุงรักษา

...

หากเป็นไปได้หลีกเลี่ยงสคริปต์ JSPเมื่อใดก็ตามที่แท็กไลบรารี่มีฟังก์ชันการทำงานที่เทียบเท่า สิ่งนี้ทำให้การอ่านและบำรุงรักษาหน้าง่ายขึ้นช่วยในการแยกตรรกะทางธุรกิจออกจากตรรกะการนำเสนอและจะทำให้หน้าของคุณง่ายขึ้นในการพัฒนาไปสู่หน้าสไตล์ JSP 2.0 (รองรับข้อกำหนด JSP 2.0 แต่เน้นการใช้สคริปต์เล็ก)

...

ด้วยจิตวิญญาณของการใช้รูปแบบการออกแบบ model-view-controller (MVC) เพื่อลดการเชื่อมต่อระหว่างเทียร์การนำเสนอจากตรรกะทางธุรกิจสคริปต์ JSP ไม่ควรใช้สำหรับการเขียนตรรกะทางธุรกิจ แต่สคริปต์ JSP จะถูกใช้หากจำเป็นในการแปลงข้อมูล (หรือที่เรียกว่า "value object") ที่ส่งคืนจากการประมวลผลคำขอของลูกค้าในรูปแบบที่พร้อมสำหรับลูกค้า แม้ว่าจะทำได้ดีกว่าด้วยส่วนควบคุมด้านหน้าหรือแท็กที่กำหนดเอง


วิธีการแทนที่scriptletsทั้งหมดขึ้นอยู่กับจุดประสงค์เดียวของรหัส / ตรรกะ บ่อยครั้งที่โค้ดนี้ถูกวางในคลาส 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 คุณไม่จำเป็นต้องคัดลอกชิ้นส่วนของหน้า JSP โดยรวมของรหัสเดียวกัน


  • หากคุณต้องการเรียกใช้โค้ด Java บางตัวเพื่อประมวลผลคำขอล่วงหน้าเช่นการโหลดล่วงหน้าบางรายการจากฐานข้อมูลเพื่อแสดงในบางตารางหากจำเป็นขึ้นอยู่กับพารามิเตอร์เคียวรีบางอย่างจากนั้นให้ใช้servletและเขียนโค้ดตาม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 คุณยังคงมีความเป็นไปได้ที่จะเปลี่ยนการตอบสนองเมื่อใดก็ตามที่การเข้าถึงฐานข้อมูลเกิดข้อยกเว้น ในตัวอย่างข้างต้นเริ่มต้นข้อผิดพลาด 500 หน้าจะมีการแสดงที่คุณสามารถปรับแต่งอยู่แล้วโดยใน<error-page>web.xml


  • หากคุณต้องการเรียกใช้โค้ด Java เพื่อประมวลผลคำขอเช่นประมวลผลการส่งแบบฟอร์มให้ใช้servletและเขียนโค้ดตาม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.
        }
    }

    วิธีนี้จะจัดการกับปลายทางของหน้าผลลัพธ์ที่ต่างกันได้ง่ายขึ้น: การแสดงฟอร์มซ้ำพร้อมข้อผิดพลาดในการตรวจสอบความถูกต้องในกรณีที่เกิดข้อผิดพลาด (ในตัวอย่างนี้คุณสามารถแสดงซ้ำโดยใช้${message}ในEL ) หรือนำไปยังหน้าเป้าหมายที่ต้องการในกรณีที่ประสบความสำเร็จ


  • ถ้าคุณต้องการที่จะก่อให้เกิดบางรหัส Java เพื่อควบคุมแผนปฏิบัติการและ / หรือปลายทางของการร้องขอและการตอบสนองจากนั้นใช้servletตามรูปแบบ 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);
        }
    }

    หรือเพียงนำเฟรมเวิร์ก MVC เช่นJSF , Spring MVC , Wicketเป็นต้นมาลงเอยด้วยหน้า JSP / Facelets และคลาส JavaBean โดยไม่จำเป็นต้องใช้เซิร์ฟเล็ตแบบกำหนดเอง


  • หากคุณต้องการเรียกใช้โค้ด Java บางตัวเพื่อควบคุมโฟลว์ภายใน JSP หน้าแล้วคุณจะต้องคว้า (ที่มีอยู่) taglib การควบคุมการไหลเช่นหลัก 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>

    ด้วยแท็ก XML แบบที่เหมาะสมเป็นอย่างดีในทุกที่ HTML รหัสจะดีกว่าอ่าน (และทำให้ดีขึ้นการบำรุงรักษา) มากกว่าพวงของ scriptlets ต่างๆด้วยการเปิดและปิดวงเล็บ ( "ที่ไหนห่าไม่รั้งปิดนี้เป็นของใคร?" ) ความช่วยเหลือที่ง่ายคือการกำหนดค่าเว็บแอปพลิเคชันของคุณให้มีข้อยกเว้นทุกครั้งสคริปต์ยังคงถูกใช้งานโดยการเพิ่มชิ้นส่วนต่อไปนี้ลงในweb.xml:

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

    ในFaceletsสืบต่อจาก JSP ซึ่งเป็นส่วนหนึ่งของ Java EE มีให้ MVC กรอบJSFมันมีอยู่แล้วไม่ได้ที่จะใช้scriptlets วิธีนี้คุณถูกบังคับให้ทำสิ่งต่าง ๆ โดยอัตโนมัติ "ทางที่ถูกต้อง"


  • หากคุณต้องการเรียกใช้โค้ด Java เพื่อเข้าถึงและแสดงข้อมูล "แบ็กเอนด์" ในหน้า JSP คุณต้องใช้ EL (Expression Language) ใน${}สิ่งเหล่านั้น เช่นการแสดงค่าอินพุตที่ส่งซ้ำ:

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

    แสดงผลของ${param.foo}request.getParameter("foo")


  • หากคุณต้องการเรียกใช้โค้ด Java ของยูทิลิตี้โดยตรงในหน้า JSP (โดยทั่วไปคือpublic staticเมธอด) คุณต้องกำหนดเป็นฟังก์ชัน EL มีมาตรฐานเป็นฟังก์ชั่น taglibใน JSTL แต่คุณยังสามารถสร้างฟังก์ชั่นด้วยตัวคุณเอง นี่คือตัวอย่างว่า 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 โดยเฉพาะสิ่งใดก็ตามปัญหานี้ต้องนำมาพิจารณาในทุก ๆเว็บแอปพลิเคชันที่คุณพัฒนา ปัญหาของscriptletsคือมันไม่มีวิธีการป้องกันในตัวอย่างน้อยก็ไม่ได้ใช้ Java API มาตรฐาน Facelets ตัวต่อของ JSP ได้หนี HTML ไปโดยปริยายดังนั้นคุณไม่ต้องกังวลกับช่อง XSS ใน Facelets

ดูสิ่งนี้ด้วย:


117
+1 คำตอบที่ดี แต่อย่าไปดื้อรั้นบางครั้งการใช้ scriptlets ก็โอเค แต่นั่นควรเป็นข้อยกเว้นที่พิสูจน์กฎ
svachon

26
@svachon: Scriptlets มีประโยชน์สำหรับการสร้างต้นแบบ / ทดสอบอย่างรวดเร็ว เท่าที่ฉันรู้มีเพียงการใช้งานสคริปต์ "ที่ถูกต้อง" เพียงอย่างเดียวคือ<% response.getWriter().flush(); %>ระหว่าง</head>และ<body>เพื่อปรับปรุงประสิทธิภาพการแยกวิเคราะห์หน้าเว็บในเว็บเบราว์เซอร์ แต่การใช้งานนี้กลับไม่มีความสำคัญอย่างสมบูรณ์เมื่อขนาดบัฟเฟอร์เอาต์พุตที่ฝั่งเซิร์ฟเวอร์อยู่ในระดับต่ำ (1 ~ 2KB) ดูยังบทความนี้
BalusC

5
@BalusC ไม่กี่ครั้งที่ฉันติดอยู่กับคลาสจาวาที่ไม่เป็นไปตามรูปแบบของ getter / setter IMHO ที่เป็นกรณีที่ scripltet ทำงาน
svachon

41
@svachon: ฉันจะปิดคลาสเหล่านั้นด้วยคลาส javabean และใช้แทน
BalusC

31
มันเป็นคำตอบที่ดี แต่ส่วน doGet และ doPost นั้นทำให้เข้าใจผิด วิธีการเหล่านั้นใช้สำหรับจัดการคำขอเฉพาะ (HEAD, GET และ POST) และไม่ใช่สำหรับการร้องขอ "preprocessing" หรือ "postprocessing"!
MetroidFan2002

225

ในฐานะผู้พิทักษ์: ปิดการใช้งาน Scriptlets ให้ดี

เนื่องจากคำถามอื่นกำลังคุยกันคุณสามารถและควรปิดการใช้งาน scriptlets ในตัวให้web.xmlคำอธิบายแอปพลิเคชันเว็บของคุณ

ฉันจะทำเช่นนั้นเสมอเพื่อป้องกันไม่ให้นักพัฒนาเพิ่ม scriptlets โดยเฉพาะใน บริษัท ใหญ่ที่คุณจะสูญเสียภาพรวมไม่ช้าก็เร็ว การweb.xmlตั้งค่ามีลักษณะดังนี้:

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

4
<%-- comment that i don't want in the final HTML --%>ไม่นี้ความเห็นคริปตยังปิดการใช้งาน ?: ฉันพบว่ามีประโยชน์ในการใช้สิ่งเหล่านี้มากกว่าความคิดเห็น HTML
David Lavender

16
@MrSpoon ติดตามคำตอบสำหรับคุณ เป็นต่อคำตอบนี้ + ความคิดเห็นผลัดออกนี้ scriptlets <% %>สำนวนคริปตและคริปตประกาศ<%! %> <%= %>นั่นหมายถึงคำสั่ง<%@ %>และความคิดเห็น<%-- --%>ยังคงเปิดใช้งานและใช้งานได้ดังนั้นคุณยังสามารถแสดงความคิดเห็นและรวมถึง
Martin Carney

3
การปิดการใช้งานคำสั่งสคริปต์เล็ตนั้นน่ากลัวมาก - ช่องว่างที่ถูกทำให้มีค่านั้นมีค่ายิ่งสำหรับการโต้ตอบกับระบบดั้งเดิมที่ประหลาดกับช่องว่างพิเศษ
corsiKa

108

JSTLเสนอแท็กสำหรับ conditionals, loops, sets, get, ฯลฯ ตัวอย่างเช่น:

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

JSTL ทำงานร่วมกับแอ็ตทริบิวต์คำร้องขอ - ซึ่งส่วนใหญ่มักถูกตั้งค่าในการร้องขอโดย Servlet ซึ่งส่งต่อไปยัง JSP


2
ทำไมคุณถึงบอกว่า JSTL ทำงานร่วมกับคุณสมบัติการร้องขอได้? พวกเขาสามารถทำงานกับคุณลักษณะในขอบเขตใดก็ได้ใช่ไหม
Koray Tugay

60

ฉันไม่แน่ใจว่าฉันได้รับถูกต้องหรือไม่

คุณควรอ่านอะไรเกี่ยวกับ MVC Spring MVC & Struts 2เป็นโซลูชันที่พบบ่อยที่สุดสองรายการ


29
MVC สามารถนำไปใช้กับ servlets / jsp โดยใช้เทคนิคด้านบนมากมายโดยไม่มี Spring หรือ Struts
stepanian

18
มันตอบคำถามได้อย่างไร
xyz

54

คุณสามารถใช้แท็ก JSTL ร่วมกับการแสดงออกของ EL เพื่อหลีกเลี่ยง intermixing Java และ HTML code:

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

34

นอกจากนี้ยังมีเฟรมเวิร์กส่วนประกอบเช่นWicketที่สร้าง HTML จำนวนมากสำหรับคุณ แท็กที่ลงท้ายด้วย HTML นั้นพื้นฐานมากและไม่มีตรรกะใดที่จะผสมกันผลที่ได้คือหน้า HTML ที่เกือบจะว่างเปล่าเหมือนกับองค์ประกอบ HTML ทั่วไป ข้อเสียคือมีส่วนประกอบมากมายในWicket API ที่จะเรียนรู้และบางสิ่งอาจทำได้ยากภายใต้ข้อ จำกัด เหล่านั้น


33

ในรูปแบบสถาปัตยกรรม MVC, JSP แสดงถึงเลเยอร์มุมมอง การฝังโค้ดจาวาใน JSP ถือว่าเป็นแนวปฏิบัติที่ไม่ดี คุณสามารถใช้JSTL , freeMarker , velocityด้วย JSP เป็น "เครื่องมือสร้างเทมเพลต" ผู้ให้บริการข้อมูลของแท็กเหล่านั้นขึ้นอยู่กับเฟรมเวิร์กที่คุณติดต่อด้วย Struts 2และwebworkเป็นการนำไปใช้สำหรับรูปแบบ MVC ใช้OGNL "เทคนิคที่น่าสนใจมากในการแสดงคุณสมบัติของถั่วกับ JSP"


27

ประสบการณ์ได้แสดงให้เห็นว่า JSP มีข้อบกพร่องบางอย่างหนึ่งในนั้นยากที่จะหลีกเลี่ยงการผสมมาร์กอัปกับรหัสจริง

หากคุณสามารถทำได้ให้ลองใช้เทคโนโลยีเฉพาะสำหรับสิ่งที่คุณต้องทำ ใน Java EE 6 มี JSF 2.0 ซึ่งมีคุณสมบัติที่ดีมากมายรวมถึงการติด Java beans ร่วมกับหน้า JSF ผ่าน#{bean.method(argument)}แนวทาง


3
คำตอบเก่า แต่ฉันไม่สามารถต่อต้านที่จะบอกว่า JSF เป็นหนึ่งในสิ่งประดิษฐ์ที่น่ากลัวที่สุดในพื้นที่จาวา พยายามสร้างลิงก์ (เช่น HTTP GET) เดียวและคุณจะเข้าใจว่าทำไม
อเล็กซ์

@ เล็ก แต่ยังดีกว่า อย่าลังเลที่จะแนะนำสิ่งที่ดียิ่งขึ้น
Thorbjørn Ravn Andersen

26

หากคุณเพียงต้องการหลีกเลี่ยงข้อเสียของการเข้ารหัส Java ใน JSP คุณสามารถทำได้แม้กระทั่งกับ scriplets เพียงทำตามวินัยบางอย่างเพื่อให้มี Java น้อยที่สุดใน JSP และแทบจะไม่มีการคำนวณและตรรกะในหน้า 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>

26

เรียนรู้วิธีปรับแต่งและเขียนแท็กของคุณเองโดยใช้ JSTL

โปรดทราบว่า EL คือEviL (ข้อยกเว้นรันไทม์, การเปลี่ยนโครงสร้าง)
ประตูอาจมีความชั่วร้ายเช่นกัน (ประสิทธิภาพ, toilsome สำหรับแอปขนาดเล็กหรือระดับมุมมองแบบง่าย)

ตัวอย่างจากjava2s ,

ต้องเพิ่มสิ่งนี้ใน web.xml ของเว็บแอปพลิเคชัน

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

สร้างไฟล์: java2s.tld ใน / WEB-INF /

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

25

ประตูเป็นอีกทางเลือกหนึ่งที่แยกจาวาออกจาก html อย่างสมบูรณ์ดังนั้นผู้ออกแบบและโปรแกรมเมอร์สามารถทำงานร่วมกันและในชุดรหัสที่แตกต่างกันโดยมีความเข้าใจกันน้อยมาก

ดูที่ประตู


23

คุณตั้งคำถามที่ดีและถึงแม้ว่าคุณจะได้คำตอบที่ดีฉันขอแนะนำให้คุณกำจัด JSP เป็นเทคโนโลยีที่ล้าสมัยซึ่งในที่สุดจะตาย ใช้วิธีการที่ทันสมัยเช่นเครื่องมือเทมเพลต คุณจะมีการแยกชั้นธุรกิจและเลเยอร์การนำเสนออย่างชัดเจนและไม่มีรหัส Java ในเทมเพลตดังนั้นคุณสามารถสร้างเทมเพลตได้โดยตรงจากซอฟต์แวร์แก้ไขงานนำเสนอเว็บในกรณีส่วนใหญ่ใช้ประโยชน์จาก WYSIWYG

และอยู่ห่างจากตัวกรองและการประมวลผลก่อนและหลังมิฉะนั้นคุณอาจจัดการกับปัญหาการสนับสนุน / การดีบักเนื่องจากคุณไม่ทราบว่าตัวแปรได้รับค่าใดเสมอ


9
JSP เป็น
เอ็นจิ้น

1
-1 - มีเหตุผลที่ถูกต้องมากมายในการใช้ตัวกรองตัวประมวลผลล่วงหน้าและตัวประมวลผลภายหลัง ใช่คุณสามารถจบลงด้วยค่าที่ดูลึกลับ แต่ไม่ใช่ถ้าคุณเข้าใจสถาปัตยกรรมของคุณ
RustyTheBoyRobot

21

เพื่อหลีกเลี่ยงรหัส java ในไฟล์ JSP ขณะนี้ java มีไลบรารีแท็กเช่น JSTL และ java ได้เกิดขึ้นกับ JSF ซึ่งคุณสามารถเขียนโครงสร้างการเขียนโปรแกรมทั้งหมดในรูปแบบของแท็ก


21

ไม่ว่าคุณจะพยายามหลีกเลี่ยงมากแค่ไหนเมื่อคุณทำงานกับนักพัฒนาคนอื่น ๆ พวกเขาบางคนยังคงชอบ scriptlet แล้วใส่รหัสความชั่วร้ายเข้าไปในโครงการ ดังนั้นการตั้งค่าโครงการที่เครื่องหมายแรกจึงเป็นสิ่งสำคัญหากคุณต้องการลดรหัสสคริปต์ มีหลายเทคนิคในการเอาชนะสิ่งนี้ (รวมถึงกรอบต่าง ๆ ที่กล่าวถึงอื่น ๆ ) อย่างไรก็ตามหากคุณต้องการใช้วิธี JSP แท้ๆให้ใช้ไฟล์แท็ก JSTL สิ่งที่ดีเกี่ยวกับเรื่องนี้คือคุณสามารถตั้งค่าเพจต้นแบบสำหรับโครงการของคุณเพื่อให้เพจอื่นสามารถสืบทอดเพจต้นแบบได้

สร้างเพจต้นแบบชื่อ base.tag ภายใต้ WEB-INF / tags ของคุณด้วยเนื้อหาต่อไปนี้

<%@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/>จะถูกแทนที่ด้วยเนื้อหาของหน้าย่อย

สร้างหน้าย่อย (child.jsp) ในโฟลเดอร์ WebContent ของคุณ:

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


"ไม่ว่าคุณจะพยายามหลีกเลี่ยงมากแค่ไหนเมื่อคุณทำงานกับนักพัฒนาซอฟต์แวร์อื่น ๆ พวกเขาบางคนยังคงชอบ scriptlet แล้วใส่รหัสความชั่วร้ายในโครงการ" ดูที่คำตอบ "ในฐานะที่เป็นปกป้อง: ปิดการใช้งาน Scriptlets สำหรับดี"
Lluis Martinez



17

หากใครบางคนขัดกับการเขียนโปรแกรมในภาษามากกว่าหนึ่งฉันแนะนำ GWT ในทางทฤษฎีคุณสามารถหลีกเลี่ยงองค์ประกอบ JS และ HTML ทั้งหมดได้เนื่องจาก Google Toolkit แปลงลูกค้าทั้งหมดและรหัสที่ใช้ร่วมกันเป็น JS คุณจะไม่มีปัญหากับพวกเขาดังนั้น คุณมีเว็บเซอร์โดยไม่ต้องเขียนโค้ดในภาษาอื่น แม้คุณสามารถใช้ CSS เริ่มต้นจากที่ใดก็ได้ตามที่ได้รับจากส่วนขยาย (smartGWT หรือ Vaadin) คุณไม่จำเป็นต้องเรียนรู้คำอธิบายประกอบมากมาย

แน่นอนถ้าคุณต้องการคุณสามารถแฮ็คตัวเองในส่วนลึกของรหัสและฉีด JS และเพิ่มหน้า HTML ของคุณ แต่จริงๆแล้วคุณสามารถหลีกเลี่ยงได้ถ้าคุณต้องการและผลลัพธ์จะดีเหมือนที่เขียนในกรอบอื่น ๆ ฉันบอกว่าคุ้มค่าที่จะลองและ GWT พื้นฐานมีเอกสารที่ดี

และแน่นอนโปรแกรมเมอร์เพื่อนหลายคนขออธิบายหรือแนะนำวิธีแก้ปัญหาอื่น ๆ อีกมากมาย GWT สำหรับคนที่ไม่ต้องการจัดการกับส่วนของเว็บหรือทำให้มันเล็กที่สุด


1
ไม่ตอบคำถามของ OP จริงๆ
Evan Donovan

1
@EvanDonovan ดีจริงมันไม่ได้ให้คำตอบ คุณไม่จำเป็นต้องยุ่งกับโค้ด Java ที่ปะปนกับภาษาอื่น ฉันยอมรับว่ามันใช้ภาษาจาวาในการเขียนโค้ด แต่มันจะถูกแปลเป็น JS โดยไม่ต้องใช้สาย Java แต่ขอบเขตของคำถามคือจะหลีกเลี่ยงความสับสนวุ่นวายของ JSP แบบดั้งเดิมได้อย่างไร และเทคโนโลยี GWT แก้ปัญหานั้น ฉันเพิ่มคำตอบนี้เนื่องจากไม่มีใครพูดถึง แต่มีความเกี่ยวข้องเนื่องจากเป็นทางเลือกสำหรับ JSP ฉันไม่ต้องการตอบคำถามทั้งหมด แต่เพื่อเพิ่มข้อมูลที่มีค่าสำหรับผู้ที่กำลังหาทางเลือก
CsBalazsHungary

16

ความคิดที่เรียบร้อยจากโลกหลามเป็นแม่แบบภาษาแอตทริบิวต์ ; TAL ได้รับการแนะนำโดย Zope (หรือที่รู้จักกันว่า "Zope Page Templates", 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 เนมสเปซ สามารถดูได้ด้วยเบราว์เซอร์และออกแบบโดยนักออกแบบอย่างปลอดภัย มีการรองรับมาโครและ 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>

หากมีการแปลเนื้อหาจะมีการใช้งาน

แต่ฉันไม่รู้เกี่ยวกับการใช้งานจาวามากนัก


1
JSP นับตั้งแต่เดือนธันวาคม 2552 ประสบความสำเร็จโดย Facelets ซึ่งสนับสนุนสิ่งนี้ Facelets ยังใช้ XML ดูยังอยู่ในหมู่คนอื่น ๆบท Facelets ใน Java EE 6 กวดวิชาและui:xxxแท็กใน Facelts VDL
BalusC

ฉันไม่รู้จัก Facelets ดีนัก แต่ IIRC มันเกี่ยวกับการเขียนคลาสที่ใช้อิลิเมนต์ XML ที่กำหนดเอง วิธี TAL / ZPT คือการมีเทมเพลตที่มีจริง (X) HTML พร้อมคุณสมบัติพิเศษที่เติมหรือแทนที่องค์ประกอบดั้งเดิม ดังนั้นคุณสามารถดูแม่แบบการทำงานและดูต้นแบบที่มีเนื้อหาจำลองที่ดี ฉันไม่แน่ใจว่า Facelets อนุญาตให้ปรับแต่งองค์ประกอบ HTML ดั้งเดิม (โดยไม่มีเนมสเปซเพิ่มเติม) โดยใช้แอตทริบิวต์ที่กำหนดเอง
โทเบียส

ฉันเพิ่งดูสิ่งนี้กับ Facelets อีกครั้ง มันมีสิ่งอำนวยความสะดวกการตรวจสอบทุกประเภทและอื่น ๆ ดังนั้นจึงเป็นไปตามปรัชญาที่แตกต่างอย่างสิ้นเชิงกว่า TAL วิธีการของ TAL คือ "กำจัดตรรกะออกจากเทมเพลตอย่างสะอาดที่สุดเท่าที่จะเป็นไปได้ให้ทุกสิ่งที่ซับซ้อนทำโดยตัวควบคุมที่ดึงมันออกมา" คุณจะไม่ให้เทมเพลต Facelets กับนักออกแบบเพื่อให้เขา / เธอปรับแต่งมัน มันเป็นไปไม่ได้ เกี่ยวกับเนื้อหาที่สร้างขึ้น - มันเหมือนกับการใช้tal:replace="structure (expression)"คุณลักษณะตลอดเวลา
Tobias


14

แน่นอนว่าแทนที่<%! counter++; %>ด้วยสถาปัตยกรรมผู้ผลิต - ผู้บริโภคเหตุการณ์ซึ่งชั้นธุรกิจได้รับแจ้งเกี่ยวกับความจำเป็นที่จะต้องเพิ่มเคาน์เตอร์มันตอบสนองตามนั้นและแจ้งผู้นำเสนอเพื่อให้พวกเขาอัพเดทมุมมอง มีธุรกรรมฐานข้อมูลจำนวนหนึ่งที่เกี่ยวข้องเนื่องจากในอนาคตเราจะต้องรู้คุณค่าใหม่และเก่าของตัวนับที่เพิ่มขึ้นและมีจุดประสงค์ในใจ การซีเรียลไลซ์เซชันเกี่ยวข้องกันอย่างชัดเจนเนื่องจากเลเยอร์แยกออกจากกันอย่างสิ้นเชิง คุณจะสามารถเพิ่มตัวนับของคุณผ่าน RMI, IIOP, SOAP แต่จำเป็นต้องใช้ HTML เท่านั้นซึ่งคุณไม่ได้นำมาใช้เนื่องจากเป็นกรณีทั่วไป เป้าหมายใหม่ของคุณคือเพิ่มขึ้น 250 ครั้งต่อวินาทีบนเซิร์ฟเวอร์ E7 64GB RAM อันใหม่ของคุณ

ฉันมีมากกว่า 20 ปีในการเขียนโปรแกรมโครงการส่วนใหญ่ล้มเหลวก่อน sextet: Reusability Replaceability OO-debuggability Testability ความสามารถในการบำรุงรักษา โครงการอื่น ๆ ที่ดำเนินการโดยผู้ที่ให้ความสำคัญกับฟังก์ชั่นการใช้งานนั้นประสบความสำเร็จอย่างมาก ยิ่งไปกว่านั้นโครงสร้างของวัตถุที่มีความแข็งซึ่งนำมาใช้เร็วเกินไปในโครงการทำให้โค้ดไม่สามารถปรับให้เข้ากับการเปลี่ยนแปลงที่รุนแรงของข้อกำหนด (อาคาเปรียว)

ดังนั้นฉันจึงพิจารณาว่าการผัดวันประกันพรุ่งกิจกรรมของการกำหนด "เลเยอร์" หรือโครงสร้างข้อมูลซ้ำซ้อนทั้งในช่วงต้นของโครงการหรือเมื่อไม่จำเป็นต้องใช้โดยเฉพาะ  


11

ในทางเทคนิค JSP ทั้งหมดจะถูกแปลงเป็น Servlets ในระหว่างการใช้งานจริง JSP ถูกสร้างขึ้นครั้งแรกเพื่อจุดประสงค์ในการแยกตรรกะทางธุรกิจและตรรกะการออกแบบตามรูปแบบ MVC ดังนั้น JSP จึงเป็นเทคนิครหัส Java ทั้งหมดในระหว่างการใช้งานจริง แต่เพื่อตอบคำถามแท็กไลบรารี่มักจะใช้สำหรับการใช้ลอจิก (ลบรหัส Java) ไปยังหน้า JSP


8

หากเราใช้สิ่งต่าง ๆ ต่อไปนี้ในเว็บแอปพลิเคชัน Java โค้ด Java สามารถถูกตัดออกจากเบื้องหน้าของ JSP

  1. ใช้สถาปัตยกรรม MVC สำหรับเว็บแอปพลิเคชัน

  2. ใช้แท็ก JSP

    แท็กมาตรฐาน

    ข แท็กที่กำหนดเอง

  3. ภาษานิพจน์


8

จะหลีกเลี่ยงรหัส Java ในไฟล์ JSP ได้อย่างไร

คุณสามารถใช้แท็กไลบรารีแท็บเช่นJSTLนอกเหนือจาก Expression Language ( EL ) แต่ EL ทำงานได้ไม่ดีกับ JSP ดังนั้นจึงน่าจะดีกว่าที่จะวาง JSP สมบูรณ์และใช้Facelets

Faceletsเป็นภาษาประกาศหน้าไม่ใช่ JSP แรกที่ออกแบบมาสำหรับJSF (Java Server Faces)ซึ่งให้รูปแบบการเขียนโปรแกรมที่ง่ายและมีประสิทธิภาพมากขึ้นสำหรับนักพัฒนา JSF เมื่อเทียบกับ JSP จะช่วยแก้ไขปัญหาต่าง ๆ ที่เกิดขึ้นใน JSP สำหรับการพัฒนาเว็บแอปพลิเคชัน

ป้อนคำอธิบายรูปภาพที่นี่

แหล่ง


ฉันสองคำตอบนี้แน่นอน JSF ที่มีหรือไม่มี Facelets ฉันคิดว่าการพัฒนาใน JSP หยุดไปนานกว่า 10 ปีแล้ว ฉันเขียน JSP ครั้งล่าสุดในปี 2000!
บริการ

4

การใช้ Scriptlets เป็นวิธีที่เก่ามากและไม่แนะนำ ถ้าคุณต้องการบางสิ่งบางอย่างที่ส่งออกโดยตรงในหน้า JSP ของคุณเพียงแค่ใช้การแสดงออกภาษา (EL) พร้อมกับJSTL

นอกจากนี้ยังมีตัวเลือกอื่น ๆ เช่นการใช้เครื่องมือสร้างเทมเพลตเช่น Velocity, Freemarker, Thymeleaf เป็นต้น แต่การใช้ JSP ธรรมดากับ EL และ JSTL ให้บริการตามวัตถุประสงค์ของฉันเกือบตลอดเวลาและดูเหมือนว่าง่ายที่สุดสำหรับผู้เริ่มต้น

นอกจากนี้โปรดทราบว่าไม่ใช่วิธีปฏิบัติที่ดีที่สุดในการทำตรรกะทางธุรกิจในเลเยอร์มุมมองคุณควรดำเนินการลอจิคัลธุรกิจของคุณในเลเยอร์บริการและส่งผลลัพธ์ผลลัพธ์ไปยังมุมมองของคุณผ่านตัวควบคุม


3

เพื่อนของฉันไม่ได้ใช้สิ่งใดอีกต่อไปคำแนะนำของฉันคือแยกมุมมอง (css, html, javascript และอื่น ๆ ) ออกจากเซิร์ฟเวอร์

ในกรณีของฉันฉันใช้ระบบจัดการมุมมองด้วย Angular และข้อมูลใด ๆ ที่ต้องการนำมาจากเซิร์ฟเวอร์โดยใช้บริการที่เหลือ

เชื่อฉันนี่จะเปลี่ยนวิธีการออกแบบของคุณ


3

ใช้แบ็กโบนมุมฉากเหมือนกรอบจาวาสคริปต์สำหรับการออกแบบ UI และดึงข้อมูลโดยใช้ส่วนที่เหลือ นี่จะเป็นการลบการพึ่งพา java จาก UI อย่างสมบูรณ์


3

JSP 2.0 มีคุณลักษณะที่เรียกว่า"แท็ก Files"คุณสามารถเขียนแท็กโดยไม่ต้องภายนอกรหัสและ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" />

นอกจากนี้คุณสามารถอ่านเนื้อหาของแท็กได้อย่างง่ายดาย

/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 select/update) ผ่านพารามิเตอร์ทุกชนิดเช่นHashmapการเข้าถึงsession, request... ในแฟ้มแท็กของคุณมากเกินไป

การพัฒนาไฟล์แท็ก นั้นง่ายมากเนื่องจากคุณไม่จำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์เมื่อทำการเปลี่ยนแปลงเช่นไฟล์ JSP ทำให้ง่ายต่อการพัฒนา

แม้ว่าคุณจะใช้เฟรมเวิร์กอย่าง Struts 2 ซึ่งมีแท็กที่ดีจำนวนมากคุณอาจพบว่าการมีแท็กของคุณเองสามารถลดรหัสของคุณลงได้มาก คุณสามารถส่งพารามิเตอร์แท็กของคุณไปยัง struts และด้วยวิธีนี้ปรับแต่งแท็กเฟรมเวิร์กของคุณ

คุณสามารถใช้แท็กไม่เพียง แต่เพื่อหลีกเลี่ยงจาวา แต่ยังลดรหัส HTML ของคุณให้เล็กที่สุด ตัวฉันเองพยายามที่จะตรวจสอบรหัส HTML และสร้างแท็กจำนวนมากทันทีที่เห็นการทำซ้ำรหัสเริ่มต้นในหน้าของฉัน

(แม้ว่าคุณจะลงเอยด้วยการใช้จาวาในโค้ด JSP ของคุณซึ่งฉันหวังว่าไม่ได้คุณสามารถแค็ปซูลโค้ดนั้นในแท็ก)


1

ดังที่คำตอบหลายข้อบอกว่าใช้ JSTL หรือสร้างแท็กที่คุณกำหนดเอง นี่คือคำอธิบายที่ดีเกี่ยวกับการสร้างแท็กที่กำหนดเอง


1
  1. ทำค่าและพารามิเตอร์ของคุณภายในคลาส servlet ของคุณ
  2. ดึงค่าและพารามิเตอร์เหล่านั้นภายใน JSP ของคุณโดยใช้ JSTL / Taglib

สิ่งที่ดีเกี่ยวกับวิธีนี้คือรหัสของคุณเป็น HTML เช่นรหัส!


0

ด้วยการใช้แท็ก JSTL พร้อมกับนิพจน์ EL คุณสามารถหลีกเลี่ยงสิ่งนี้ได้ ใส่สิ่งต่อไปนี้ในหน้า 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" %>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.