ตัดช่องว่างจากเอาต์พุต jsp


110

ฉันจะตัดช่องว่างพิเศษออกจากเอาต์พุตของหน้า jsp ได้อย่างไร มีสวิตช์ที่ฉันสามารถพลิกบน web.xml ของฉันได้หรือไม่ มีการตั้งค่าเฉพาะของ Tomcat หรือไม่?

คำตอบ:


172

มีคำสั่ง trimWhiteSpaces ที่ควรทำให้สำเร็จ

ใน JSP ของคุณ:

<%@ page trimDirectiveWhitespaces="true" %>

หรือในส่วน jsp-config web.xml ของคุณ (โปรดทราบว่าการทำงานนี้เริ่มต้นจาก servlet specification 2.5):

<jsp-config>
  <jsp-property-group>
    <url-pattern>*.jsp</url-pattern>
    <trim-directive-whitespaces>true</trim-directive-whitespaces>
  </jsp-property-group>
</jsp-config>

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


2
มีความแตกต่างในแง่ของประสิทธิภาพระหว่างสองตัวเลือกนี้หรือไม่?
jlb

trimDirectiveWhitespaces รองรับเฉพาะคอนเทนเนอร์ servlet ที่รองรับ JSP 2.1 และหลังจากนั้นหรือในกรณีหรือ Tomcat, Tomcat 6 (และบางเวอร์ชันเช่น Tomcat 6.0.10 ไม่ได้ใช้งานอย่างถูกต้อง - ไม่รู้เกี่ยวกับเวอร์ชันอื่น) มี ข้อมูลเพิ่มเติมเกี่ยวกับ trimDirectiveWhitespaces ที่นี่: java.sun.com/developer/technicalArticles/J2EE/jsp_21 และที่นี่ raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1
wavetree

3
และในไฟล์. แท็กที่กำหนดเองของ JSP ให้ใช้ <% @ tag body-content = "scriptless" trimDirectiveWhitespaces = "true"%>
Thomas W

Tomcat 7 web.xml: <init-param> <param-name> trimSpaces </param-name> <param-value> true </param-value> </init-param>
Ujjwal Singh

ฉันใช้ Tomcat 8 และดูเหมือนจะไม่ได้ผล มันทำงานให้ใคร?
glez

27

หาก servletcontainer ของคุณไม่รองรับtrimDirectiveWhitespacesคุณสมบัติJSP 2.1 คุณต้องศึกษาJspServletเอกสารประกอบสำหรับพารามิเตอร์การเริ่มต้น ตัวอย่างเช่นTomcatคุณสามารถกำหนดค่าได้เช่นกันโดยการตั้งค่าtrimSpacesinit-param เป็นtruein for JspServletใน Tomcat's /conf/web.xml:

<init-param>
    <param-name>trimSpaces</param-name>
    <param-value>true</param-value>
</init-param>

ทางเลือกที่แตกต่างอย่างสิ้นเชิงเป็นJTidyFilter ไม่เพียง แต่ตัดช่องว่างเท่านั้น แต่ยังจัดรูปแบบ HTML ในการเยื้องที่ถูกต้อง


ฉันได้กำหนดค่าโดยการตั้งค่า trimSpaces init-param เป็น true ใน /conf/web.xml แต่ช่องว่างใน html ที่สร้างขึ้นจะไม่ถูกตัดแต่ง ฉันใช้ Tomcat 6.0 ความคิดใด ๆ ?
ria

7
@ria: โปรดทราบว่าคุณต้องเข้าใจว่านี่เป็นการตัดช่องว่างโดย taglibs เช่น JSTL และ scriptlets เท่านั้น หากคุณต้องการตัดช่องว่างทั้งหมดออกจาก HTML ให้ไปที่โซลูชันอื่น คุณสามารถดูตัวอย่างตัวกรองได้ที่นี่: balusc.blogspot.com/2007/12/whitespacefilter.html
BalusC

ฉันเพิ่งสังเกตเห็นปัญหาสองสามข้อที่มีโค้ดจากบทความ b / c สิ่งต่างๆในไซต์ของฉันเริ่มแสดงผิด ฉันคัดลอกซอร์ส html และวางลงในตัวตรวจสอบความถูกต้องของ w3 เพื่อค้นหาว่าตัวกรองช่องว่างเชื่อมต่อแอตทริบิวต์เป็นครั้งคราว ตัวอย่างเช่นนี้ ... <div onclick = "correct ()" class = "correct"> จะเปลี่ยนเป็น <div onclick = "wrong" class = "wrong"> หรือ <a class="correct"> ลงใน <aclass = "ผิด"> นี้ ดังนั้นการสูญเสียช่องว่างแท็กปิดสำหรับองค์ประกอบจะไม่ถูกต้อง มีเคล็ดลับเกี่ยวกับเรื่องนี้ไหม
gmustudent

4

trimDirectiveWhitespaces รองรับเฉพาะคอนเทนเนอร์ servlet ที่รองรับ JSP 2.1 และหลังหรือในเคสหรือ Tomcat, Tomcat 6 (และบางเวอร์ชันเช่น Tomcat 6.0.10 ใช้ไม่ถูกต้อง - ไม่รู้เกี่ยวกับเวอร์ชันอื่น) มีข้อมูลเพิ่มเติมเกี่ยวกับ trimDirectiveWhitespaces ที่นี่:

http://www.oracle.com/technetwork/articles/javaee/jsp-21-136414.html

และที่นี่

http://raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1


3

ไม่ใช่สิ่งที่คุณต้องการโดยตรง แต่สิ่งที่ช่วยฉันได้คือการใส่แท็กความคิดเห็น HTML อย่างชาญฉลาดรอบ ๆ แท็ก jsp ของฉันและการใส่ช่องว่างในแท็ก servlet (<%%>):

${"<!--"}
<c:if test="${first}">
    <c:set var="extraClass" value="${extraClass} firstRadio"/>
</c:if>
<c:set var="first" value="${false}"/>
${"-->"}<%

%><input type="radio" id="input1" name="dayChooser" value="Tuesday"/><%
%><label for="input1" class="${extraClass}">Tuesday</label>

3

หากคุณใช้แท็กคุณสามารถใช้ที่นั่นได้เช่นกัน:

<%@ tag description="My Tag" trimDirectiveWhitespaces="true" %>

และบน jsp ของคุณ:

<%@ page trimDirectiveWhitespaces="true" %>

1

คุณสามารถก้าวไปอีกขั้นหนึ่งและลบบรรทัดใหม่ (การส่งคืนค่าขนส่ง) ระหว่างแท็ก html ในเวลาสร้าง

เช่นการเปลี่ยนแปลง:

<p>Hello</p>
<p>How are you?</p>

เข้าสู่:

<p>Hello</p><p>How are you?</p>

ทำเช่นนั้นใช้maven-replacer-pluginและตั้งค่าในpom.xml:

<plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.3</version>
    <executions>
        <execution>
            <id>stripNewlines</id>
            <phase>prepare-package</phase>
            <goals>
                <goal>replace</goal>
            </goals>
            <configuration>
                <basedir>${project.build.directory}</basedir>
                <filesToInclude>projectname/WEB-INF/jsp/**/*.jsp</filesToInclude>
                <token>&gt;\s*&lt;</token>
                <value>&gt;&lt;</value>
                <regexFlags>
                    <regexFlag>MULTILINE</regexFlag>
                </regexFlags>
            </configuration>
        </execution>
    </executions>
</plugin>

สิ่งนี้จะแก้ไขเฉพาะ JSP ในไดเร็กทอรี build และไม่แตะ JSP ในแหล่งที่มาของคุณ

คุณอาจต้องปรับเส้นทาง ( <filesToInclude>) ที่ JSP ของคุณตั้งอยู่




0

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

out.clearBuffer();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.