Loại bỏ khoảng trắng khỏi đầu ra jsp


110

Làm cách nào để loại bỏ khoảng trắng thừa từ đầu ra của các trang jsp? Có công tắc nào tôi có thể lật trên web.xml của mình không? Có cài đặt cụ thể cho Tomcat không?

Câu trả lời:


172

Có một chỉ thị trimWhiteSpaces sẽ thực hiện điều này,

Trong JSP của bạn:

<%@ page trimDirectiveWhitespaces="true" %>

Hoặc trong phần jsp-config web.xml của bạn (Lưu ý rằng điều này hoạt động bắt đầu từ đặc tả servlet 2.5.):

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

Thật không may nếu bạn có một không gian cần thiết, nó cũng có thể cần dải đó, vì vậy bạn có thể cần một không gian không bị phá vỡ ở một số vị trí.


2
Có sự khác biệt về hiệu suất giữa hai tùy chọn này không?
jlb

TrimDirectiveWhitespaces chỉ được hỗ trợ bởi các thùng chứa servlet hỗ trợ JSP 2.1 trở lên, hoặc trong trường hợp hoặc Tomcat, Tomcat 6 (và một số phiên bản như Tomcat 6.0.10 không triển khai đúng cách - không biết về những phiên bản khác), có thêm thông tin về trimDirectiveWhitespaces tại đây: java.sun.com/developer/technicalArticles/J2EE/jsp_21 và tại đây raibledesigns.com/rd/entry/trim_spaces_in_your_jsp1
wavetree

3
Và trong các tệp .tag tùy chỉnh của JSP, hãy sử dụng <% @ 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

Tôi đang chạy Tomcat 8 và điều này dường như không hoạt động. Nó có hiệu quả với ai không?
glez

27

Nếu servletcontainer của bạn không hỗ trợ thuộc tính JSP 2.1 trimDirectiveWhitespaces, thì bạn cần tham khảo JspServlettài liệu của nó để biết bất kỳ thông số khởi tạo nào. Trong ví dụ Tomcat , bạn cũng có thể định cấu hình nó bằng cách đặt trimSpacesinit-param thành truein cho JspServlettrong Tomcat's /conf/web.xml:

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

Một sự thay thế hoàn toàn khác là JTidyFilter . Nó không chỉ cắt bỏ khoảng trắng mà còn định dạng HTML theo cách thụt lề chính xác.


Tôi đã định cấu hình bằng cách đặt trimSpaces init-param thành true trong /conf/web.xml nhưng không gian trong html được tạo không được cắt bớt. Tôi đang sử dụng Tomcat 6.0. Có ý kiến ​​gì không?
ria

7
@ria: Lưu ý rằng bạn cần hiểu rằng điều này chỉ cắt bỏ khoảng trắng do taglibs như JSTL và scriptlets để lại. Nếu bạn muốn loại bỏ TẤT CẢ khoảng trắng khỏi HTML, thì hãy tìm một giải pháp khác. Bạn có thể tìm thấy một ví dụ lọc tại đây: balusc.blogspot.com/2007/12/whitespacefilter.html
BalusC

Tôi vừa nhận thấy một vài lỗi với mã từ bài báo b / c mọi thứ trên trang web của tôi bắt đầu hiển thị sai. Tôi đã sao chép nguồn html và dán nó vào trình xác thực w3 để phát hiện ra rằng bộ lọc khoảng trắng đôi khi đang nối các thuộc tính. Ví dụ: <div onclick = "correct ()" class = "correct"> sẽ biến thành <div onclick = "false" class = "sai">. Hoặc <a class="correct"> thành <aclass = "sai"> này. Vì vậy, bằng cách mất khoảng trắng, thẻ đóng cho phần tử trở nên không hợp lệ. Bất kỳ lời khuyên về điều này?
gmustudent

4

TrimDirectiveWhitespaces chỉ được hỗ trợ bởi các thùng chứa servlet hỗ trợ JSP 2.1 trở lên, hoặc trong trường hợp hoặc Tomcat, Tomcat 6 (và một số phiên bản như Tomcat 6.0.10 không triển khai đúng cách - không biết về những phiên bản khác). Có thêm thông tin về trimDirectiveWhitespaces tại đây:

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

và đây

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


3

Không trực tiếp những gì bạn đang yêu cầu, nhưng điều giúp tôi là đặt các thẻ nhận xét HTML một cách thông minh xung quanh các thẻ jsp của tôi và cũng đặt khoảng trắng bên trong thẻ 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

Nếu bạn đang sử dụng thẻ, bạn cũng có thể áp dụng ở đó:

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

Và trên jsp của bạn:

<%@ page trimDirectiveWhitespaces="true" %>

1

Bạn có thể tiến thêm một bước nữa và cũng có thể loại bỏ các dòng mới (ký tự xuống dòng) giữa các thẻ html tại thời điểm xây dựng.

VD thay đổi:

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

thành:

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

Làm điều đó, sử dụng maven-replacer-pluginvà thiết lập nó trong 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>

Điều này sẽ chỉ sửa đổi các JSP trong thư mục xây dựng và không chạm vào các JSP trong nguồn của bạn.

Bạn có thể cần điều chỉnh đường dẫn ( <filesToInclude>) nơi chứa các JSP của bạn.




0

Chỉ hơi khác câu hỏi thực tế, Nếu bạn muốn loại bỏ các dòng trống do bất kỳ điều gì bạn đã làm trước khi xuất, bạn có thể sử dụng

out.clearBuffer();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.