Spring MVC页面到页面导航无法正常工作

时间:2014-04-15 23:51:57

标签: java spring jsp spring-mvc

我有两个页面:home.jsp和stylechoosertable.jsp。 home.jsp有一个简单的链接到stylechoosertable.jsp。两者都在src - main - webapp - views中。启动应用程序运行正常,加载home.jsp很好。但是,当我单击该链接时,它将转到404 Not Found页面。

这是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";
    }
}

这是CSSTableController.java

@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();
    }

}

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>

我注意到的一些事情:

  1. 只有本地:8080 / myspringmvc /调出主页。 local:8080 / myspringmvc / home.jsp会出现同样的404错误,我不知道。

  2. 一开始,我可以看到它正确执行请求/处理程序映射:

  3. INFO:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped&#34; {[/ stylechoosertable.jsp],methods = [GET],params = [],headers = [],消耗= [],产生= [],定制= []}&#34;到public java.util.List com.css.genapp.CSSTableController.get()

    INFO:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping - Mapped&#34; {[/],methods = [GET],params = [],headers = [],consume = [ ],产生= [],定制= []}&#34;到公共java.lang.String com.css.genapp.HomeController.home(org.springframework.ui.Model)

    1. 当我转到home.jsp或stylechoosertable.jsp时,它不会抛出任何org.springframework.web.servlet.PageNotFound错误,所以我知道映射就在那里。
    2. 我无法弄清楚为什么它没有&#34;击中&#34;我的stylechoosertable.jsp。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

大多数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称为扩展名映射。 Servlet容器知道此Servlet以及您已注册的内容。容器对您的@Controller bean一无所知。这只与Spring相关。

当Servlet容器收到请求时,它会查看Servlet specification中指定的订单,以便根据其映射匹配特定的Servlet。基本上,它首先检查完全匹配,然后它尝试进行路径匹配(类似/something/*的模式),然后它执行扩展映射,最后,如果没有找到匹配,则使用默认的servlet,一个映射到/的servlet。在这种情况下,您的DispatcherServlet(运行Spring MVC堆栈)被映射到/,因此它是默认的servlet。

当您将请求发送到

local:8080/myspringmvc/home.jsp

路径满足*.jsp的扩展映射,因此容器使用JspServlet来处理请求。这个JspServlet试图找到合适的资源,但不是。请记住,WEB-INF中的JSP无法公开/外部访问。因此它返回404。

当您将请求发送到

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#forward(..)。该请求将再次与Servlet容器匹配,但这次是JspServlet。因为这是一个内部调用(并且路径是正确的),所以请求将完成。

同样,对于/stylechoosertable.jspJspServlet是在DispatcherServlet可以对此做任何事情之前选择的。{/ p>

  

它不会抛出任何org.springframework.web.servlet.PageNotFound   当我去home.jsp或stylechoosertable.jsp时出错,所以我知道了   映射就在那里。

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

答案 1 :(得分:1)

嗯,我不认为我能够正确地得到你的问题,如果你想从home.jsp获得简单的导航功能,即点击链接,它应该去stylechoosertable.jsp,然后确定解决方案只是有一个像

这样的链接
<a href="stylechoosertable">SomeName</a>

现在只需将其映射到控制器

即可
@RequestMapping(value = "/stylechoosertable")
public String goToSCT() {
    return "stylechoosertable";
}

如果在/ WEB-INF / views /中有任何stylechoosertable.jsp,它就会被调用。

第二个问题local:8080/myspringmvc/工作背后的原因,local:8080/myspringmvc/home.jsp基本上缺少RequestMapping /home.jsp,其中根网址为/HomeController

中有一个映射