Java Spring MVC页到页导航不工作

Java Spring MVC页到页导航不工作,java,spring,jsp,spring-mvc,Java,Spring,Jsp,Spring Mvc,我有两个页面:home.jsp和stylechoosertable.jsp。home.jsp有一个指向stylechoosertable.jsp的简单链接。两者都在src-main-webapp-view中。启动应用程序运行正常,加载home.jsp也可以。但是,当我单击链接时,它会转到404未找到页面 这是HomeController.java @Controller public class HomeController { private static final Logger

我有两个页面:home.jsp和stylechoosertable.jsp。home.jsp有一个指向stylechoosertable.jsp的简单链接。两者都在src-main-webapp-view中。启动应用程序运行正常,加载home.jsp也可以。但是,当我单击链接时,它会转到404未找到页面

这是HomeController.java

@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Model model) {
        logger.info("Welcome home! The client locale is {}.");      
        return "home";
    }
}
@Controller
public class CSSTableController {

    private static final Logger logger = LoggerFactory.getLogger(CSSTableController.class);
    private final CSSService cssService;

    @Autowired
    public CSSTableController(CSSService cssService) {
        this.cssService = cssService;
    }

    @RequestMapping(value = "/stylechoosertable.jsp", method = RequestMethod.GET)
    public List<StyleChooser> get() {
        return cssService.getAllStyleChoosers();
    }

}
这里是CSSTableController.java

@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

    /**
     * Simply selects the home view to render by returning its name.
     */
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Model model) {
        logger.info("Welcome home! The client locale is {}.");      
        return "home";
    }
}
@Controller
public class CSSTableController {

    private static final Logger logger = LoggerFactory.getLogger(CSSTableController.class);
    private final CSSService cssService;

    @Autowired
    public CSSTableController(CSSService cssService) {
        this.cssService = cssService;
    }

    @RequestMapping(value = "/stylechoosertable.jsp", method = RequestMethod.GET)
    public List<StyleChooser> get() {
        return cssService.getAllStyleChoosers();
    }

}
@控制器
公共类CSSTableController{
私有静态最终记录器Logger=LoggerFactory.getLogger(CSSTableController.class);
私人最终CSSService CSSService;
@自动连线
公共CSSTableController(CSSService CSSService){
this.cssService=cssService;
}
@RequestMapping(value=“/stylechoosertable.jsp”,method=RequestMethod.GET)
公共列表get(){
返回cssService.getAllStyleChoosers();
}
}
servlet-context.xml

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

web.xml

<servlet-mapping>
    <servlet-name>appServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

appServlet
/
我注意到了几件事:

  • 仅本地:8080/myspringmvc/显示主页。local:8080/myspringmvc/home.jsp带来了相同的404错误,我不知道

  • 在启动时,我可以看到它正确地执行请求/处理程序映射:

  • 信息:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping-将“{[/stylechoosertable.jsp],methods=[GET],params=[],headers=[],consumers=[],products=[],custom=[])映射到公共java.util.List com.css.genapp.CSSTableController.GET()上

    信息:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping-将“{[/],methods=[GET],params=[],headers=[],consumes=[],products=[],custom=[]}”映射到公共java.lang.String.com.css.genapp.HomeController.home(org.springframework.ui.Model)上

  • 当我转到home.jsp或stylechoosertable.jsp时,它不会抛出任何org.springframework.web.servlet.PageNotFound错误,因此我知道映射就在那里

  • 我不明白为什么它没有“命中”我的stylechoosertable.jsp。有什么想法吗?

    好吧,我不认为我能够正确地回答您的问题,但是如果您想从home.jsp获得简单的导航功能,即单击链接,它应该转到stylechoosertable.jsp,那么一个明确的解决方案就是有一个如下链接

    <a href="stylechoosertable">SomeName</a>
    
    如果在/WEB-INF/views/中有任何stylechoosertable.jsp可用,则只需调用它即可


    第二个问题
    local:8080/myspringmvc/
    工作,而不是
    local:8080/myspringmvc/home.jsp
    的原因基本上是
    /home.jsp
    缺少
    请求映射,而根URL即
    //code>,映射存在于
    HomeController

    大多数Servlet容器注册一个
    Servlet
    实现来处理JSP。他们看起来像

    <servlet>
        <servlet-name>jspServlet</servlet-name>
        <servlet-class>com.example.JspServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>jspServlet</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>
    
    路径满足
    *.jsp
    的扩展映射,因此容器使用
    JspServlet
    来处理请求。这个
    JspServlet
    试图找到合适的资源,但没有找到。请记住,
    WEB-INF
    中的JSP不能公开/外部访问。因此,它返回404

    当您将请求发送到

    local:8080/myspringmvc/home.jsp
    
    local:8080/myspringmvc/ 
    
    选择默认servlet是因为没有任何其他内容可以匹配该路径。
    DispatcherServlet
    查找其处理程序并找到

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Model model) {
        logger.info("Welcome home! The client locale is {}.");      
        return "home";
    }
    
    通过返回视图名
    home
    ,并且因为您已经注册了相应的
    InternalResourceViewResolver
    ,Spring将向该JSP执行
    RequestDispatcher#转发(…)
    。Servlet容器将再次匹配该请求,但这次匹配到
    JspServlet
    。因为这是一个内部调用(路径正确),所以请求将被完成

    类似地,对于
    /stylechoosertable.jsp
    ,在您的
    DispatcherServlet
    可以做任何事情之前,会选择
    JspServlet

    它不会抛出任何
    org.springframework.web.servlet.PageNotFound
    当我转到home.jsp或stylechoosertable.jsp时出错,因此我知道 地图就在那里


    DispatcherServlet
    从未涉及,因此它没有机会记录任何内容

    请同时发布你的
    servlet context.xml
    。发布了servlet-context.xml和web.xmlHmm,因为我在链接上有“.jsp”和@RequestMapping中的值,所以它不起作用?是的。。但这不是唯一的原因,因为
    RequestMapping
    返回类型也不正确。它应该返回一个
    字符串
    类型,当您返回
    列表