2009-10-07 24 views
8

Tôi có vấn đề cần giải quyết, nhưng tôi không có may mắn.JSP không hiển thị đối tượng từ mô hình trong Spring

Trong file servlet-servlet.xml của tôi, tôi có đậu sau (ngoài những người khác):

<bean id="viewResolver" 
    class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> 
    <property name="prefix" value="/WEB-INF/jsp/" /> 
    <property name="suffix" value=".jsp" /> 
</bean> 

<context:component-scan base-package="com.servlet.web" /> 

điều khiển thử nghiệm của tôi trông như thế này:

package com.servlet.web; 

import java.util.Map; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.ModelMap; 
import org.springframework.web.bind.annotation.RequestMapping; 

@Controller 
public class TestController 
{ 
    protected final Log log = LogFactory.getLog(getClass()); 

    @RequestMapping("/test") 
    public String methodName(Map<String, Object> map) { 
     map.put("someMessage", "some string here"); 
     return "test"; 
    } 

} 

My xem jsp vẻ như thế này:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
<title>servlet.com</title> 
</head> 
<body> 
${someMessage} 
</body> 
</html> 

Vì vậy, khi tôi xem jsp, tôi mong đợi giá trị của someMessage (một số chuỗi ở đây), nhưng tôi chỉ nhận được như sau:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> 
<title>servlet.com</title> 
</head> 
<body> 
${someMessage} 

</body> 
</html> 

Khi tôi khuấy động khai thác gỗ, tôi thấy rằng đối tượng someMessage của tôi đang được diễn ra trong mô hình:

22:21:17,425 DEBUG DispatcherServlet:852 - DispatcherServlet with name 'servlet' determining Last-Modified value for [/servlet/access/test] 
22:21:17,426 DEBUG DefaultAnnotationHandlerMapping:183 - Mapping [/test] to handler '[email protected]' 
22:21:17,426 DEBUG DispatcherServlet:868 - Last-Modified value for [/servlet/access/test] is: -1 
22:21:17,426 DEBUG DispatcherServlet:700 - DispatcherServlet with name 'servlet' processing GET request for [/servlet/access/test] 
22:21:17,427 DEBUG HandlerMethodInvoker:158 - Invoking request handler method: public java.lang.String com.servlet.web.TestController.methodName(java.util.Map) 
22:21:17,427 DEBUG DispatcherServlet:1070 - Rendering view [org.springframework.web.servlet.view.JstlView: name 'test'; URL [/WEB-INF/jsp/test.jsp]] in DispatcherServlet with name 'servlet' 
22:21:17,427 DEBUG JstlView:328 - Added model object 'someMessage' of type [java.lang.String] to request in view with name 'test' 
22:21:17,428 DEBUG JstlView:237 - Forwarding to resource [/WEB-INF/jsp/test.jsp] in InternalResourceView 'test' 
22:21:17,429 DEBUG DispatcherServlet:666 - Successfully completed request 

Rõ ràng, quan điểm của tôi là ánh xạ một cách chính xác, nhưng tôi có thể' t dường như truy cập các đối tượng mô hình được thêm vào yêu cầu trong giao diện. Tôi đã thực hiện loại điều này với Spring MVC nhiều lần trong quá khứ, nhưng tôi phải thiếu một cái gì đó hiển nhiên ở đây. Bất kỳ ý tưởng? Cảm ơn.

+0

Bạn có thể cung cấp tệp web.xml của mình không? và toàn bộ servlet-servlet.xml của bạn ?? Tôi đã kiểm tra bộ điều khiển của bạn với cùng một chế độ xem ở bên cạnh tôi và nó được hiển thị đúng cách. – rochb

Trả lời

13

Bạn có chắc chắn rằng việc đánh giá EL được bật trong JSP của bạn không? Đôi khi tôi có vấn đề, rằng nó đã được chuyển bằng cách nào đó. Thử đánh giá một biểu thức đơn giản như ${'test'} và xem liệu 'kiểm tra' có xuất hiện không.

Bạn cũng có thể thử bật tính năng này bằng chỉ thị trang hoặc mục khác nếu EL bị tắt.

<%@ page isScriptingEnabled="true" isELIgnored="false" %> //of course it has to be FALSE 

(Xin lỗi, tôi không thể nhớ nếu điều này đúng 100%. Nó có thể là 'isELEnabled')

+2

Đẹp! Thêm <% @ page isELIgnored = "false"%> vào đầu jsp của tôi đã khắc phục được sự cố của tôi. Tôi không chắc chắn những gì đang xảy ra để vô hiệu hóa EL. Ồ, bao gồm thuộc tính isScriptingEnabled dường như phá vỡ jsp, vì vậy tôi vừa xóa nó. Dường như thuộc tính isScriptingEnabled hợp lệ trước JSP 2.0? Vì vậy, tóm lại, việc thêm <% @ page isELIgnored = "false"%> vào jsp của tôi đã khắc phục được sự cố. Cảm ơn, Moxn – labratmatt

+1

Bạn được chào đón. Tôi khá chắc chắn rằng có một số cách để cấu hình điều này trong web.xml. Theo [this] [1], bạn có thể thêm cấu hình vào tệp web.xml để bật EL cho tất cả các JSP của bạn. [1] http://www.theserverside.com/discussions/thread.tss?thread_id=44097 – moxn

1

Tôi chưa sử dụng khá nhiều cấu hình chú thích như bạn có với Spring MVC, vì vậy tôi không chắc chắn về tất cả những thứ đang được thực hiện tự động với thiết lập của bạn. Suy nghĩ duy nhất của tôi là: nên tham số phương pháp là một đối tượng ModelMap? Các ví dụ mà tôi đã thấy trước đây đều đã sử dụng ModelMap làm kiểu tham số. Mục 13.11.3 của trang này là một trong số chúng: http://static.springsource.org/spring/docs/2.5.6/reference/mvc.html. Như tôi đã nói, tôi chưa từng sử dụng kiểu cấu hình tự động này trước đây - tôi làm điều đó một cách thủ công hơn một chút, và mở rộng các bộ điều khiển của tôi từ một thứ như AbstractController hoặc SimpleFormController.

+0

Cảm ơn bạn đã dành thời gian. Tôi đã thử sử dụng Bản đồ mô hình và có cùng kết quả. – labratmatt

4

Tôi chạy vào cùng một vấn đề, và sau khi so sánh 2 ứng dụng tương tự (một với EL làm việc tốt và khác không), nhận thấy rằng vấn đề trên tomcat 7 của tôi phụ thuộc vào phiên bản webapp được chỉ định trong web.xml của ứng dụng.

Cùng một jsp sử dụng Ứng dụng web 2.3 hiển thị $ {someMessage}. (BTW, đây là những gì bạn nhận được bằng cách sử dụng nguyên mẫu maven: tạo với archetypeArtifactId = maven-archetype-webapp).

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

Cùng jsp sử dụng Web App 2.4 hiển thị mô hình đối tượng đúng cách:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app id="webapp-id" version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
... 

Hy vọng rằng nó sẽ giúp!

Các vấn đề liên quan