2009-04-27 45 views
30

Tôi có một trang JSP chạy trên Tomcat 5.5. Tôi có đoạn mã sau:JSP: Biểu thức EL không được đánh giá

<c:forEach var="i" begin="1" end="10" step="1"> 
    <c:out value="${i}" /> 
    <br /> 
</c:forEach> 

Kết quả tôi nhận được là:

${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 
${i} 

tôi không thể tìm ra lý do tại sao các vòng lặp foreach đang làm việc nhưng đầu ra không hoạt động. Bất kỳ sự giúp đỡ nào mà bất kỳ ai có thể cho sẽ là tuyệt vời.

Trả lời

62

Tôi biết nó phải được bật theo mặc định, nhưng tôi chạy qua các trang bây giờ và một lần nữa (hoặc thậm chí cùng một trang thay đổi hành vi), nơi xử lý EL không xảy ra. Thêm dòng sau vào đầu bất kỳ trang như vậy nên giải quyết vấn đề:

<%@ page isELIgnored="false" %> 

tôi thêm nó vào mỗi trang vì nó không bị tổn thương, và tôi vẫn không biết nguyên nhân gốc rễ mà thỉnh thoảng gây ra một trang để ngừng diễn giải các biểu thức EL.

+2

On Tomcat 5.5, có hai lý do có thể (chỉ?): Giản đồ không hợp lệ trong web.xml, hoặc el- bỏ qua tùy chọn cấu hình. –

+1

Tôi (và những người khác) đã có một trang làm việc tốt và, sau khi thay đổi một cái gì đó trên trang (ví dụ, thêm một số html), nó chỉ dừng lại đánh giá các biểu thức EL. Lời giải thích duy nhất tôi có thể đưa ra là một lỗi trong Tomcat ở đâu đó, nhưng nó không đáng để đào sâu vào quá trình kể từ khi cho phép nó theo cách thủ công (thông qua đoạn mã trên) giải quyết được vấn đề. – RHSeeger

+4

Nếu bạn đã tạo webapp của mình với nguyên mẫu maven, câu trả lời chính xác là: http://stackoverflow.com/a/25372735/20654 – OscarRyz

0

Xem câu trả lời của tôi tại Javascript String.replace(/\$/,str) works weirdly in jsp file vì các lý do có thể xảy ra.

Câu trả lời dài hơn: $ {i} là biểu thức trong cái gọi là 'Ngôn ngữ biểu hiện'. Đôi khi, Ngôn ngữ biểu thức có thể bị tắt. Xem câu trả lời ở trên vì những lý do tiềm năng và cách kích hoạt nó.

0

Sử dụng tomcat6. Nó không yêu cầu bất kỳ cấu hình nào cho EL trong web.xml.

+2

Tomcat 5.5 cũng không yêu cầu bất kỳ cấu hình nào cho EL trong web.xml. Tomcat 5.0 cũng không. Nếu bạn đã có một vấn đề với nó, nó nằm ở một nơi khác. – BalusC

38

Tôi vừa gặp vấn đề tương tự này và đã dành mãi mãi cố gắng tìm ra điều gì sai.

Tôi đã phát triển rất nhiều ứng dụng web từ đầu. Tại sao đột nhiên là người này không hợp tác?

Một khác biệt là lần này tôi đã sử dụng nguyên mẫu webapp của maven để tạo cấu trúc dự án. Nó đã tạo một tệp web.xml trông giống như sau:

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
    <display-name>Archetype Created Web Application</display-name> 
</web-app> 

Khi tôi nhận ra đó là vấn đề của mình, tôi chắc chắn tôi đã có câu trả lời. Vì vậy, tôi đã sao chép một trong số 2.5 tiêu đề web.xml của tôi, được xây dựng lại và triển khai lại. Không có điếu xì gà. Không thể tin rằng đó không phải là vấn đề. Làm sạch dự án, khởi động lại tomcat. Không.

Câu trả lời của RHSeeger đã dẫn tôi thử đặt trong trang <% @ isELIgnored = "false"%>. Điều đó đã giải quyết được vấn đề. Nhưng tôi vẫn muốn biết tại sao el bắt đầu bị bỏ qua để bắt đầu.

Tôi đã tìm ra el bị bỏ qua vì có lỗi gì đó với web.xml của tôi, vì vậy tôi đã kiểm tra chặt chẽ nó so với web.xml của webapp mà tôi biết đã làm việc tốt. Không có sự khác biệt đáng chú ý.

Sau đó, tôi đã xóa trang <% @ khỏi JSP của mình và triển khai lại, giả sử el sẽ không được đánh giá lại, nhưng nhiều điều khiến tôi ngạc nhiên, el đã được đánh giá tốt!

Sau đó, việc xác định đó phải là một số vấn đề về bộ nhớ đệm, tôi hủy các thay đổi của mình đối với web.xml để tạo lại sự cố. Tôi đã triển khai lại, nhưng vẫn el được đánh giá đúng, ngay cả với web.xml xấu. Sau đó, tôi làm sạch toàn bộ dự án của tôi (tôi đang sử dụng một triển khai phát nổ), thổi bay thư mục đã phát nổ và tạo lại nó. Sau đó tôi khởi động lại tomcat. Tuy nhiên, el xuất hiện để được đánh giá một cách chính xác mặc dù web.xml xấu.

Cuối cùng điều đó nảy sinh với tôi.Tôi chỉ đơn giản là thêm một không gian cho một số nơi trong JSP, đóng gói lại nó, và làm mới trang. Chơi lô tô! Bây giờ el đã không được đánh giá.

Vì vậy, sự cố với tệp web.xml. Nó sẽ phức tạp hơn nữa bởi thực tế là các JSP không được biên dịch lại trừ khi chúng đã thay đổi. Không chắc chắn nếu tomcat sử dụng một khoản MD5 để quyết định xem các JSP cần được biên dịch lại hay không. Một khả năng khác là tôi đang sử dụng gạch, mà tôi biết có một cơ chế bộ nhớ đệm, nhưng tôi sẽ không mong đợi rằng để tồn tại một khởi động lại tomcat.

Dù sao, trừ khi bạn sửa đổi JSP của mình SAU KHI sửa chữa tệp web.xml, tất cả các phiên cược sẽ tắt là liệu EL có bắt đầu hoạt động trở lại hay không. Hy vọng điều này sẽ giúp người khác đau đầu. Tôi cũng quan tâm nếu có ai có thể cho tôi biết liệu đó là tomcat không biên dịch lại các JSP hoặc lát bộ nhớ đệm trong đầu ra của JSP. Tôi khá chắc chắn đó là biên dịch lại, bởi vì tại thời gian biên dịch là khi JSP cần phải tìm ra những gì để làm với các biểu thức el $ {}, phải không? Gạch không thể thực sự lưu trữ những gì được thay thế thành các biểu thức el, nếu không tất cả các loại vấn đề sẽ phát sinh.

+0

Cảm ơn rất nhiều, đây chính xác là những gì tôi đã trải qua - được tạo từ nguyên mẫu, và EL và JSTL đều không hoạt động, mặc dù tệp JSP đang sử dụng chính xác mã giống như một số ứng dụng trước đó đang hoạt động trước đó. Sửa các không gian tên web.xml, khởi động lại, vẫn không hoạt động; cuối cùng đã sửa đổi JSP và sắp xếp! –

+0

Tomcat không biên dịch lại các JSP. Nó theo dõi lần sửa đổi cuối cùng của tệp JSP - các phiên bản mới hơn cũng theo dõi lần sửa đổi cuối cùng của các phụ thuộc. Chúng được kiểm tra ở tần số cấu hình (thường là 5 giây nếu bộ nhớ phục vụ) và biên dịch lại được kích hoạt nếu phát hiện thay đổi. Tệp .java có thể được đặt trong thư mục công việc của Tomcat và sẽ vẫn tồn tại trong các lần khởi động lại. –

+0

@kevinmrohr Cảm ơn bạn rất nhiều về thử nghiệm và câu trả lời chi tiết của bạn. – smwikipedia

1

có vấn đề tương tự với Kevin, tôi đã sử dụng maven để bắt đầu với webapp nhưng không có niềm vui với đánh giá biểu thức trong jsp - tôi đã phải loại bỏ tiêu đề DOCTYPE - tất cả là tốt bây giờ mà không chơi với isELIgnored bit - maven tạo web.xml các liên kết đến 2.3 như Peter đã cho biết đã tắt EL theo mặc định

9

Đảm bảo bao gồm các không gian tên có liên quan trong tệp web.xml. Chỉ cần cố gắng để thay thế

<web-app> 

với một cái gì đó giống như

<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0" 
    metadata-complete="true"> 

Nó cố định nó cho tôi. Bạn có thể tìm thấy các không gian tên chính xác cho cá thể Tomcat của bạn trong các ứng dụng mẫu đi kèm với một cài đặt Tomcat.

+0

Hoạt động và đã lưu lại ngày của tôi! : D – Philipp

0

Từ Bộ điều khiển:

@RequestMapping(value = "createcustomer",method = RequestMethod.GET) 
    public String customer(Model model) 
    { 
     Customer cus=new Customer(); 
     cus.setCustomerNumber("Test"); 
     model.addAttribute("customer",cus); 
     return "createcustomer"; 
    } 

Trong Xem:

<%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %> 
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> 

<div class="cl">  
    <form:form commandName="customer" method="POST"> 

     <p>Name: <c:out value="${customer.CustomerNumber}"></c:out></p> 

    </form:form> 
<div> 

Output:

Name: Test 
15

Đó là tiêu đề trong web.xml gây ra vấn đề

Dưới maven điểm dừng đầu đã tạo EL bị đánh giá.

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 
<web-app> 

Sử dụng dưới tiêu đề đánh giá EL.

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="2.5" 
xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
+0

đó là tiết kiệm trong ngày của tôi! cảm ơn! – Maigret

+0

gr8 ...... thanks –

+0

Giải pháp này đang hoạt động. –

2

Đối với những người quan tâm, cú pháp XML tương đương cho JSP 2.0 là:

<jsp:directive.page isELIgnored="false"/> 
Các vấn đề liên quan