我有两个页面: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>
我注意到的一些事情:
只有本地:8080 / myspringmvc /调出主页。 local:8080 / myspringmvc / home.jsp会出现同样的404错误,我不知道。
一开始,我可以看到它正确执行请求/处理程序映射:
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)
我无法弄清楚为什么它没有&#34;击中&#34;我的stylechoosertable.jsp。有什么想法吗?
答案 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.jsp
,JspServlet
是在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