前言:最近从网上找课程学ssm整合实战,感觉跟着敲肯定会多少对SSM框架有更深的认识,然而。。照着敲都出现了BUG,花费了我四天是时间才勉强解决了,尤其是当你没有小伙伴询问的条件下,想必一定是痛苦万分(跟我一样),避免跟我遇到相同问题的小伙伴们可以少走一些弯路,所以特意写了这篇博客,希望对你有所帮助。本篇博客尾部会附上视频连接。
问题:这是文件目录图,我最开始的目的很简单,就是从webapp下的index.jsp通过<jsp:forward>标签跳转到WEB-INF下的jsp。
解决:通过网上的大量参考资源,大概有以下几种查错方法:
①是不是webapp下的跳转写错了?
<jsp:forward page="${APP_PATH }/index.do"></jsp:forward>
*这个${APP_PATH }是什么呢?
public class StartSystemListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
String contextPath = servletContext.getContextPath();
servletContext.setAttribute("APP_PATH", contextPath);
System.out.println(contextPath);
System.out.println("0.0.");
}
public void contextDestroyed(ServletContextEvent sce) {
}
}
如图,其实就是项目的根路径名:所以应该输出为:/Atcrowdfunding-main
所以到目前为止没有错,这是完全按照那位老师的代码敲得。
②你是不是视图解析器没配置啊?
打开我的springmvc-context.xml,找到视图解析那里
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
跟网上正确的代码相对照,也没有什么毛病。???
③是不是controller没配置对啊?
@Controller
@RequestMapping("/")
public class DispatcherController {
@RequestMapping("/index")
public String index() {
return "index";
}
}
????
④肯定是没捕捉到.do文件,检查一下你的web.xml
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.htm</url-pattern>
<url-pattern>*.do</url-pattern>
<!-- 默认匹配 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
wtf!!!》》》》》》》》????????也配置了呀?再看下一步
⑤是不是注解没扫描到?
<!-- 启用注解功能 -->
<context:annotation-config />
我在springmvc-context配置如上,在spring-context的配置如下
<context:component-scan base-package="com.bean.atcrowdfunding.*">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
也没毛病呀?????????
所以我回到了起点,替换掉了这个让人不熟悉的标签,而改成了熟悉的
<%
response.sendRedirect("index.do");
%>
终于可以跳转正常了,可是404。
后来,突然看到一句话,你是不是没配置<mvc:annotation-driven/>,这仿佛开启了我的新世界,什么玩意这是?后来一查才发现这是@Controller的前提配置,如果没有它,controller不会被解析,所有的请求都会被<mvc:default-servlet-handler />捕捉到.
那么为什么静态资源访问不到呢?因为所有请求都被拦截了,包括静态资源,换句话说,就是只要用了@Controller,最好在springmvc-context.xml把<mvc:annotation-driven/>和<mvc:default-servlet-handler />都配置好,否则不是404,就是静态资源加载不到。关于这两个标签详细内容可参考 点我 和 点我。
全部改完之后
瞬间明朗了许多,我发现只要这两个标签加上了,<url-pattern>写成/或者*.do都能加载出页面
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/springmvc-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 默认匹配 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
但是Spring3.0推了Rest风格,所以建议改成/,而且写成*.do会有一些302的错误,虽然问题不大,但是毕竟是隐患。
所以视频学习的小伙伴们不要总感觉视频中老师的代码一定是最佳答案,遇到错误了不用完全根据视频中的写法改,否则就有可能永远也解决不了,这次Bug事件可以说是受益匪浅,(#^.^#),大家一起加油!