2015-04-07 3 views
0

Я начинаю с Spring MVC, но что-то не так, потому что я получаю ошибку 404 с сообщением «Запрошенный ресурс недоступен». Поиск нескольких часов и попытки разных вещей не помогли, поэтому я решил обратиться за помощью к вам, ребята.Весна MVC и JSP. Основные шаги

У меня есть index.jsp, где я хочу иметь ссылку, которая вызовет метод в моем контроллере и вернет hello.jsp.

index.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %> 
<html> 
<head> 
    <title></title> 
</head> 
<body> 
    <a href="${"test"}">Click to press hello</a> 
</body> 
</html> 

При нажатии на эту ссылку я предполагаю, что я должен прийти к моему MessageController:

package main.java.service; 

//imports... 

@Controller 
@RequestMapping(value = "/test") 
public class MessageController { 

    @RequestMapping(method = RequestMethod.GET) 
    public String getThis(Map<String, String> map) { 
     map.put("message", "Hello World!"); 
     return "hello"; 
    } 
} 

Согласно моему пониманию это должно произойти, потому что ознаменовало пакет мой контроллер включает в servlet-config.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:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xsi:schemaLocation="http://www.springframework.org/schema/mvc    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
     http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 

    <mvc:annotation-driven /> 
    <context:component-scan base-package="main.java.service"/> 

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

И наконец, ре является web.xml

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

    <display-name>SpringWebConfiguration</display-name> 

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

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/servlet-config.xml</param-value> 
    </context-param> 
</web-app> 

Так, согласно тому, что я должен получить hello.jsp файл с сообщением Hello World! но вместо этого я получаю ошибку 404 с сообщением «Запрошенный ресурс недоступен». Было бы неплохо, если бы кто-нибудь мог найти здесь проблему.

Вот мой hello.jsp

<%@ page language="java" contentType="text/html; charset=US-ASCII" pageEncoding="US-ASCII"%> 
<!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=US-ASCII"> 
    <title>Title</title> 
</head> 
<body>Here there is a message: ${message}</body> 
</html> 

Это рабочий репо: https://github.com/vladt89/fsboard

+0

Параметр 'сервлет-config.xml' должен быть загружен' DispatcherSerlet'. В настоящее время он не загружается ни одним компонентом. Вместо этого 'context-param' должен быть' init-param' 'servlet'. –

+0

Это может быть правильным, однако, к сожалению, я не могу заставить его работать. Я добавил ' contextConfigLocation WEB-INF/сервлет-config.xml ' на мой сервлет, но все еще получаю ошибку _The ресурса не available_, когда я иду в [HTTP : // локальный: 8080/тест]. – Rufi

+0

попробуйте с/projectname/test – SpringLearner

ответ

1

изменить ваши web.xml в

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

<display-name>SpringWebConfiguration</display-name> 

<servlet> 
    <servlet-name>spring-dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/servlet-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>spring-dispatcher</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

или вы можете просто игнорировать <init-param> по:

переименовании ваш servlet-config.xml к spring-dispatcher-servlet.xml
когда <init-param> нет Name of the Spring configuration file должна быть такой же, как servlet-name, который используется в web.xml с хвостохранилища -servlet.

И, безусловно, вам нужно поместить папку hello.jsp внутри WEB-INF как вы определили в вид распознаватель, как

<property name="prefix" value="/WEB-INF/"/> 

поэтому он будет искать jsp файлы внутри WEB-INF папки


Обновление: У меня есть вилка вашего кода и протестирована в моей среде.

Код, вызывающий эту проблему, у вас нет сообщения в вашем вопросе .... слишком плохо.
Добавить @Component в обоих в вашем MessageService и MessageServiceImpl

@Component 
public interface MessageService { 

    void createMessage(String message); 

    Collection<String> fetchAllMessages(); 
} 

и

@Component 
public class MessageServiceImpl implements MessageService { 
    private Collection<String> messageLibrary = new LinkedList<>(); 

    @Override 
    public void createMessage(String message) { 
     messageLibrary.add(message); 
    } 

    @Override 
    public Collection<String> fetchAllMessages() { 
     return messageLibrary; 
    } 
} 
+1

этот ответ одинаково прав. – Bharath

+0

Звучит неплохо, но все равно не повезло. Возможно, вы можете проверить репо, где я вносил изменения (https://github.com/vladt89/fsboard). Я просто думаю, есть ли какой-нибудь метод для его отладки, потому что не очень удобно что-то менять, а затем перезапустить сервер, а главное плохо, что сообщение всегда одно и то же. Может ли это быть что-то другое, влияющее на это? Я начинаю думать, если я запускаю сервер неправильно, но, по крайней мере, файл index.jsp, который я вижу. – Rufi

+0

Я протестировал обновленное исправление в своей среде и его работоспособности. Дайте мне знать и, пожалуйста, сообщите мне, что проблема решена. @VladimirTikhomirov – Saif

1

Проверьте ваш адрес в HREF достигает контроллера и Is hello.jsp доступны в папке WEB-INF?

+0

В этом проблема не доходит до контроллера. Структура заключается в том, что в _web/WEB-INF_ у меня есть _servlet-config.xml_ и _web.xml_, и эти два _jsp_-файла у меня есть только в папке _web_. – Rufi

0

в index.jsp ваша ссылка, кажется, плохая. Вы можете изменить якорный тег:

<a href="test">Click to press hello</a> 
+0

Я думаю, что ссылка правильная. Во всяком случае, я пытаюсь перейти к [http: // localhost: 8080/test], и там я получаю сообщение об ошибке 404 с сообщением _ Ресурс недоступен_, поэтому кажется, что мой _servlet-config.xml_, где я включаю свой _MessageController_ _context: компонент-scan_ не загружен. – Rufi

+0

где hello.jsp присутствует в вашем webapp? – Bharath

+0

Он размещается в папке _web_. – Rufi

0

Я добавляю предложения от Annamalai Thangaraj и Sotirios Delimanolis.

  1. Нужно инициализировать контекст в web.xml.
  2. Вам необходимо разместить hello.jsp в папке WEB-INF.Это происходит потому, что вид распознаватель Настроив ищет hello.jsp в WEB-INF

+0

1. Он находится в. 2. Это может быть правдой, но все равно это не помогает.Если я это сделаю, у меня также нет возможности перейти на hello.jsp. И когда я пытаюсь использовать WEB-INF/hello.jsp, я также получаю сообщение о недоступности ресурса для этой страницы. – Rufi

+0

Плюс, если я изменю свой путь на _/_, это все та же ситуация. Проверьте репо: https://github.com/vladt89/fsboard Возможно, оттуда будет легче. – Rufi

+0

в MessageController сохраняет оператор возврата как: return «hello»; и hello.jsp необходимо перенести в WEB-INF/hello.jsp. Именно там будет искать его. вы не сможете выполнить http: // localhost: 8080/WEB-INF/hello.jsp. Единственный способ загрузить этот jsp будет http: // localhost: 8080/test. – Bharath

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