Spring MVC @RequestMapping для уровня класса и уровня метода не работает - PullRequest
5 голосов
/ 27 октября 2019

Я пытаюсь отобразить 2 запроса, так как хочу указать на дом / дом, так как позже у меня будет другой контроллер с таким же именем, который находится около / home. Но я не уверен, почему это не работает. Если есть только дом, он работает, но дом / дом или около / дом не работает. Уровень класса не работает.

Это контроллер

package com.controller;

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

import com.constant.server.HelperConstant;

@Controller
@RequestMapping("/home")
public class HomeController 
{
    @RequestMapping("/home")
    public String doDisplayPage()
    {
        return HelperConstant.VIEW_HOME;
    }

}

Это JSP

<html>
<body>
    <form action="home/home">
        <input type="text" name="t1"><br>
        <input type="text" name = "t2"><br>
        <input type ="submit">
    </form>
</body>
</html>

Я нажимаю HTTP Status 404 -

Отредактировано

Прикрепленные файлы конфигурации

package com.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        // TODO Auto-generated method stub
        return new Class[] {SpringConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        // TODO Auto-generated method stub
        return new String[] {"/"};
    }

}

Это еще один файл конфигурации

package com.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration
@ComponentScan({"com.controller"})
public class SpringConfig 
{
    @Bean
    public InternalResourceViewResolver viewResolver()
    {
        InternalResourceViewResolver vr = new InternalResourceViewResolver();

        //vr.setPrefix("/WEB-INF/");
        vr.setSuffix(".jsp");

        return vr;
    }

}

Прикрепленное изображение структуры папок enter image description here

есть и дополнительные выводы, в которых я пытаюсь найти jsp на home / home.jsp. Могу ли я знать, почему такое поведение? по праву стоит просто посмотреть на home.jsp. Если remvoe аннотации на уровне класса, то он работает нормально, или я создаю папку в webapp home, он работает нормально, но после повторного нажатия кнопки «Отправить» он ищет home / home / home.jsp

Я добавил метод = "POST"

теперь проблема после перезапуска tomact

enter image description here

после нажатия на кнопку отправить вот так

enter image description here

при повторном нажатии показать ошибку 404

enter image description here

это мой web.xml, ноя уже удалил его, так как уже использую Java или configurtion

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

   <welcome-file-list>
        <welcome-file>home.html</welcome-file>
        <welcome-file>home.htm</welcome-file>
        <welcome-file>home.jsp</welcome-file>
    </welcome-file-list>

</web-app>

Ответы [ 7 ]

1 голос
/ 04 ноября 2019

В URL есть одна проблема. Вы наблюдали фактический URL? Он отображает / home / home / home после контекста, но URL указывает на / home / home. Решением может быть удаление одного / home из URL действия в теге формы

<html>
<body>
    <form **action="home"**>
        <input type="text" name="t1"><br>
        <input type="text" name = "t2"><br>
        <input type ="submit">
    </form>
</body>
</html>

или

<html>
<body>
    <form action="/home/home">
        <input type="text" name="t1"><br>
        <input type="text" name = "t2"><br>
        <input type ="submit">
    </form>
</body>
</html>
1 голос
/ 01 ноября 2019

Проблема заключается в вашем пути действия <form action="home/home"> Это относительный путь, означающий, что он будет выполнять следующие действия.

http://example.com/web_main/home - form action - > 
http://example.com/web_main/home/home (200) - form action -> 
http://example.com/web_main/home/home/home (404)

Другие предлагают /home/home, но это не учитывает контекст вашего приложения. дорожка. Результат будет следующим:

http://example.com/web_main/home - form action - > http://example.com/home/home

Обратите внимание, что web_main пропал.

Чтобы решить вашу проблему, вам нужно использовать JSTL, добавьте это в JSP.

<%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %>

<c:url value="/home/home" var="homeUrl" />`
<form action="${homeUrl}">

Добавьте импорт в начало JSP.

0 голосов
/ 05 ноября 2019

Если вы только пытаетесь заставить ваш текущий код работать, то простое решение - добавить Context Root к вашему действию формы, как показано ниже.

<html>
<head>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="ctx" value="${pageContext.request.contextPath}" />
</head>
<body>
    <form action="${ctx}/home/home">
        <input type="text" name="t1"><br> <input type="text"
            name="t2"><br> <input type="submit">
    </form>
</body>
</html>
0 голосов
/ 05 ноября 2019

на вкладке 404 есть 3 дома, а не 2, как вы хотите в URL, так что он показывает 404. Вместо относительного пути дом / дом в форме отправки укажите абсолютный / дом / дом

0 голосов
/ 04 ноября 2019

Это работает

@Controller
@RequestMapping("/home")
public class HomeController {

    @RequestMapping(value = "/home")
    public String doDisplayPage() {
        return "../home";
    }
}
@Controller
@RequestMapping("/about")
public class AboutController {

    @RequestMapping(value = "/home")
    public String doDisplayPage() {
        return "../home";
    }
}
<html>
<body>
    <form action="/home/home">
        <input type="text" name="t1"><br>
        <input type="text" name = "t2"><br>
        <input type ="submit">
    </form>
</body>
</html>

enter image description here

Также вам не нужен файл web.xml, так как вы описали развертываниедескриптор в вашем WebConfig и SpringConfig

0 голосов
/ 31 октября 2019

При использовании RequestMapping отображение запроса по умолчанию method значение - GET метод. HTML-форма отправки по умолчанию использует метод POST. Поэтому вам нужно добавить метод post к этому URL. Вы можете указать несколько значений метода для одного и того же отображения запроса.

0 голосов
/ 30 октября 2019

Как выглядит класс вашего приложения Spring? Если у вас его нет, вы должны его создать. Вместо того, чтобы @ComponentScan ниже тега @Configuration, сделайте что-то вроде ниже, и это должно быть легче подобрать, также, возможно, измените свой корневой тег на / для более легкого чтения:

@SpringBootApplication
@ComponentScan(basePackages = {"com.*"})
class MyClass {
   public static void main(String[] args) {
      SpringApplication.run(MyClass.class)
   }
}

@Controller
@RequestMapping("/")
public class HomeController 
{
    @RequestMapping("/home")
    public String doDisplayPage()
    {
        return HelperConstant.VIEW_HOME;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...