2013-04-05 3 views
1

Я делаю курс весной, и моя программа Spring MVC печатает стандартное сообщение «Hello World» на странице jsp. Я использую eclipse 3.6 и GlassFish 3.1 для запуска приложения из среды IDE. Ниже перечислены файлы обеспокоены:Доступ к фасоли весны из jsp

controller.HelloWorldController.java

package controller; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.servlet.ModelAndView; 


@Controller 
public class HelloWorldController { 

     @RequestMapping("/helloworld") 
     protected ModelAndView HelloWorld() throws Exception { 
     String hello = "Hello World! My First Web App Using Spring MVC."; 
     return new ModelAndView("helloworld","hello",hello); 

     } 

} 

грузоотправителя файл сервлет конфигурация: диспетчер-servlet.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan 
     base-package="controller" />   

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

</beans> 

Точка входа для приложения: индекс .jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
         "http://www.w3.org/TR/html4/loose.dtd"> 

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>My First Web Application Using Spring MVC</title> 
    </head> 
    <body> 
    <h3><a href="helloworld.htm">Greet the World!</a></h3> 
    </body> 
</html> 

helloworld.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>My First Web Application Using Spring MVC</title> 
</head> 
<body> 
    ${hello} 
</body> 
</html> 

web.xml

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

    <context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> 
    </context-param> 
    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <display-name>FirstWebAppUsingSpringMVC</display-name> 
    <welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

    <servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
     <url-pattern>*.htm</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
</web-app> 

и дает успешный выход на http://localhost:8080/FirstWebAppUsingSpringMVC/helloworld.htm.

мне было интересно, если пружинные бобы можно получить из СПЯ (googled и сделал некоторые исследования в Интернете в этом отношении) и w так как удивлены тем, что они действительно могут быть выполнены (как это было предложено конструкторами Spring в форме exposedContextBeanNames и exposeContextBeansAsAttributes свойствами InternalResourceViewResolver).

[sidebar] Я знаю, что на этом сайте уже много вопросов по этой теме. Я прошел через несколько, которые, как я думал, помогут мне решить мою проблему, но нет. Поэтому, пожалуйста, извините меня за то, что вы прояснили это!
[/ боковой панели]

Таким образом, чтобы реализовать exposedContextBeanNames собственность, я изменил

controller.HelloWorldController.java

package controller; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import org.springframework.web.servlet.ModelAndView; 
import org.springframework.web.servlet.mvc.AbstractController; 
import service.HelloWorldService; 

    public class HelloWorldController extends AbstractController { 
      //property helloWorldService that references Service bean HelloWorldService 
     private HelloWorldService helloWorldService; 

      //defined handleRequestInternal method of the AbstractController class 
      //that returns a new ModelAndView object 
      //Instance of ModelAndView adds logical viewName and model data as arguments 
     @Override 
     protected ModelAndView handleRequestInternal(HttpServletRequest request, 
     HttpServletResponse response) throws Exception { 
     // TODO Auto-generated method stub 
     //view passed as string to new ModelAndView object 
     ModelAndView mv = new ModelAndView("helloworld"); 
      //instance of Service class accessing its object dispMessage() 
      mv.addObject("helloworld", helloWorldService.dispMessage()); 
      return mv; 
     } 

      //generate setter and getter for the property 
      //implicitly injecting business component within Controller 
     public void setHelloWorldService(HelloWorldService helloWorldService) { 
      this.helloWorldService = helloWorldService; 
     } 

     /** 
     * @return the helloWorldService 
     */ 
     public HelloWorldService getHelloWorldService() { 
      return helloWorldService; 
     }   
    } 

грузоотправитель сервлет конфигурационный файл: диспетчер-сервлет. xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

<!-- defined handler to map url pattern to Controller bean on the basis of controller class --> 
<bean id="controllerclasshandlermapping" 
    class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"> 
</bean> 

<!-- defined view resolver to resolve Controller class HelloWorldController to helloworld.jsp --> 
    <bean id="viewResolver" 
      class="org.springframework.web.servlet.view.InternalResourceViewResolver" 
      p:prefix="/WEB-INF/jsp/" 
      p:suffix=".jsp"> 
<!-- exposing Controller bean helloWorldController to the view --> 
      <property name="exposedContextBeanNames"> 
      <list> 
      <value>helloWorldController</value> 
      </list> 
      </property>  
    </bean> 

<!-- Explicit mapping to Controller bean helloWorldController which references Service bean thru its property 
     from the applicationContext.xml --> 
    <bean id= "helloWorldController" 
     class="controller.HelloWorldController" p:helloWorldService-ref="helloWorldService"/> 
</beans> 

helloworld.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" 
    pageEncoding="ISO-8859-1"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
<title>My First Web Application Using Spring MVC</title> 
</head> 
<body> 
    <!--${beanName.beanProperty}--> 
    ${helloWorldController.helloWorldService} 
</body> 
</html> 

web.xml

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    //changed path to applicationContext.xml to reference Service class 
    <param-value>/WEB-INF/applicationContext.xml</param-value> 
    </context-param> 

и ввел

service.HelloWorldService.Java (Service боб)

package service; 

public class HelloWorldService { 

    public String dispMessage() { 
     String msg = "Hello World! My First Web App Using Spring MVC."; 
     return msg; 
    } 
} 

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema 
     /aop/spring-aop-3.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema 
     /tx/spring-tx-3.0.xsd"> 

    <!--Service bean defined--> 
    <bean name="helloWorldService" class="service.HelloWorldService"/> 
</beans> 

Однако на запуск проекта, выход на http://localhost:8080/FirstWebAppUsingSpringMVC/helloworld.htm является

[email protected] 

Почему «Hello World 'сообщение не отображается? Где я ошибся? ....... пытались обойти это, но не смогли найти решение.

Очень ценно, если участники форума могут помочь в решении этого вопроса.

Благодаря user1586954

+0

Похоже, ToString() вызывается на ваш helloWorldService, так что вы просто получаете представление объекта, поскольку вы не реализовали toString. Но вы на самом деле получаете доступ к бобу. Хорошая идея - это другое дело ... –

ответ

1

Слишком поздно, чтобы изменить свой комментарий так вот ответ рода.

Похоже, toString() вызывается на вашем helloWorldService, поэтому вы просто получаете представление объекта, поскольку вы не реализовали toString. Но вы на самом деле получаете доступ к бобу.

Хорошая идея - это другое дело.

Это может быть лучше всего использовать модель для возврата данных в представлении (которые вы уже делаете), так это должно быть достаточно в вашем JSP: $ {HelloWorld}

+0

Спасибо за ваш ответ! Где я могу использовать toString? Использование $ {helloworld} работает для меня. Я знаю, что раскрытие бизнес-компонента для представления является спорным, но попытка реализовать его только для учебных целей. спасибо – user1586954

+0

Достаточно честный. Все, что я говорю, это то, что $ {helloWorldController.helloWorldService} собирается называть HelloWorldService.toString(); Если вы хотите напрямую вызвать метод на HelloWorldService, у вас есть несколько вариантов в зависимости от того, какие версии Spring, JEE и веб-сервера вы используете. Посмотрите на jspx или Spring el (или просто не делайте этого!) :-) –

Смежные вопросы