23

さまざまな URI に複数の RequestMappings を持つ Spring Controller があります。私のサーブレットは「ui」です。サーブレットのベース URI は、末尾のスラッシュでのみ機能します。ユーザーが末尾のスラッシュを入力する必要がないようにしたいと思います。

この URI は機能します。

http://localhost/myapp/ui/

これはしません:

http://localhost/myapp/ui

HTTP ステータス 404 メッセージが表示されます。

私の web.xml からのサーブレットとマッピングは次のとおりです。

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

<servlet-mapping>
    <servlet-name>ui</servlet-name>
    <url-pattern>/ui/*</url-pattern>
</servlet-mapping>    

私のコントローラー:

@Controller
public class UiRootController {

    @RequestMapping(value={"","/"})
    public ModelAndView mainPage() { 
        DataModel model = initModel();
        model.setView("intro");     
        return new ModelAndView("main", "model", model);
    }

    @RequestMapping(value={"/other"})
    public ModelAndView otherPage() { 
        DataModel model = initModel();
        model.setView("otherPage");     
        return new ModelAndView("other", "model", model);
    }

}
4

6 に答える 6

18

Springboot を使用すると、@RequestMapping の「値」オプションを空の文字列に設定することで、アプリは末尾のスラッシュの有無にかかわらず応答できます。

@RestController
@RequestMapping("/some")
public class SomeController {
//                  value = "/" (default) ,
//                  would limit valid url to that with trailing slash.
    @RequestMapping(value = "", method = RequestMethod.GET)
    public Collection<Student> getAllStudents() {
        String msg = "getting all Students";
        out.println(msg);
        return StudentService.getAllStudents();
    }
}
于 2016-12-16T20:49:37.097 に答える
14

たとえば、Web アプリケーションが Web サーバーの webapps ディレクトリに存在する場合、デフォルトの Tomcat ポートwebapps/myapp/を想定して、このアプリケーション コンテキストのルートにアクセスできます。http://localhost:8080/myapp/これは、末尾のスラッシュの有無にかかわらず機能するはずです。デフォルトではそう思います-確かにJetty v8.1.5の場合です

ヒット/myappすると、Spring DispatcherServletが引き継ぎ、リクエストを に<servlet-name>構成された にルーティングします。web.xmlこの場合は/ui/*です。

DispatcherServlet は、すべてのリクエストを からhttp://localhost/myapp/ui/にルーティングします@Controller

Controller@RequestMapping(value = "/*")自体では、mainPage()メソッドに使用できます。これにより、 mainPage()http://localhost/myapp/ui/http://localhost/myapp/uiルーティングされます。

注: SPR-7064 のため、Spring >= v3.0.3 も使用する必要があります。

完全を期すために、これをテストしたファイルを次に示します。

src/main/java/controllers/UIRootController.java

package controllers;

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

@Controller
public class UiRootController {
  @RequestMapping(value = "/*")
  public ModelAndView mainPage() {
    return new ModelAndView("index");
  }

  @RequestMapping(value={"/other"})
  public ModelAndView otherPage() {
    return new ModelAndView("other");
  }
}

WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<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="false">
  <servlet>
    <servlet-name>ui</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    <!-- spring automatically discovers /WEB-INF/<servlet-name>-servlet.xml -->
  </servlet>

  <servlet-mapping>
    <servlet-name>ui</servlet-name>
    <url-pattern>/ui/*</url-pattern>
  </servlet-mapping>
</web-app>

WEB-INF/ui-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="controllers" />

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
  p:order="2"
  p:viewClass="org.springframework.web.servlet.view.JstlView"
  p:prefix="/WEB-INF/views/"
  p:suffix=".jsp"/>
</beans>

また、 と に 2 つの JSP ファイルがWEB-INF/views/index.jspありWEB-INF/views/other.jspます。

結果:

  • http://localhost/myapp/-> ディレクトリ一覧
  • http://localhost/myapp/uiそしてhttp://localhost/myapp/ui/-> index.jsp
  • http://localhost/myapp/ui/otherそしてhttp://localhost/myapp/ui/other/-> other.jsp

お役に立てれば!

于 2012-08-22T15:13:58.247 に答える
3

最終的に、/uiリクエストを/ui/にリダイレクトするための新しいRequestMappingを追加しました。また、mainPageのRequestMappingから空の文字列マッピングを削除しました。web.xmlを編集する必要はありません。

私のコントローラーでこのようなものになってしまいました:

    @RequestMapping(value="/ui")
    public ModelAndView redirectToMainPage() {
        return new ModelAndView("redirect:/ui/");
    }

    @RequestMapping(value="/")
    public ModelAndView mainPage() { 
        DataModel model = initModel();
        model.setView("intro");     
        return new ModelAndView("main", "model", model);
    }

    @RequestMapping(value={"/other"})
    public ModelAndView otherPage() { 
        DataModel model = initModel();
        model.setView("otherPage");     
        return new ModelAndView("other", "model", model);
    }

これでURLがhttp://myhost/myapp/uiリダイレクトされhttp://myhost/myapp/ui/、コントローラーに紹介ページが表示されます。

于 2012-08-21T16:24:51.333 に答える
2

私が見つけた別の解決策は、mainPage() のリクエスト マッピングに値を与えないことです。

@RequestMapping
public ModelAndView mainPage() { 
    DataModel model = initModel();
    model.setView("intro");     
    return new ModelAndView("main", "model", model);
}
于 2015-03-24T19:43:01.410 に答える
1

追加してみてください

@RequestMapping(method = RequestMethod.GET) public String list() { return "redirect:/strategy/list"; }

結果:

    @RequestMapping(value = "/strategy")
    public class StrategyController {
    static Logger logger = LoggerFactory.getLogger(StrategyController.class);

    @Autowired
    private StrategyService strategyService;

    @Autowired
    private MessageSource messageSource;

    @RequestMapping(method = RequestMethod.GET)
    public String list() {
        return "redirect:/strategy/list";
    }   

    @RequestMapping(value = {"/", "/list"}, method = RequestMethod.GET)
    public String listOfStrategies(Model model) {
        logger.info("IN: Strategy/list-GET");

        List<Strategy> strategies = strategyService.getStrategies();
        model.addAttribute("strategies", strategies);

        // if there was an error in /add, we do not want to overwrite
        // the existing strategy object containing the errors.
        if (!model.containsAttribute("strategy")) {
            logger.info("Adding Strategy object to model");
            Strategy strategy = new Strategy();
            model.addAttribute("strategy", strategy);
        }
        return "strategy-list";
    }  

** クレジット:

高度な @RequestMapping トリック – コントローラー ルートと URI テンプレート

于 2014-05-14T14:06:53.273 に答える