springmvc前台访问404,不能进⼊controller,后台不报错问
题解决⽅案⼼得
这是我第⼀次写博客,⽬的很明确,为了帮助像我⼀样的springmvc初学者解决⼀些问题,还有就时对⾃⼰返的错误的⼀个总结。
从⽂章标题不难看出,是使⽤springmvc时出现了404错误,这⾥对具体的环境做⼀个描述。
环境:
1、项⽬开发环境为linux,开发⼯具eclipse。
2、项⽬使⽤maven构建的web⼯程,框架搭建为spring+springmvc+mybatis。
问题具体描述:
从标题不难看出,框架搭建号后,编译部署并启动项⽬⼀切正常,并没有报任何的错误,但是从页⾯访问controller时缺报404[Not Found]的错误。
解决⽅案:
1、在这需要说明的是,由于后台从始⾄终没有报任何的错误,故我的⽂章⾥不会有出错的贴图,有⼈就会说了,为什么不把⾃⼰的配置⽂件贴给⼤家看呢,我认为没有必要,  因为接下来我会给⼤家讲解排错⽅法,并且贴上已经访问成功的完整代码贴图。其实刚开始⼀遇见这样的错误,⾃⼰也排查了⼀边没有任何的发现,于是就⽹上百度各种搜索,其中也搜到⼀些结果,按照提⽰操作⼀通都没有成功。这⾥我总结⼀下⽹上各种帖⼦的解决⽅案:
1、⼤量⽂章都是千篇⼀律的说处理器映射器和处理器适配器以及视图解析器没有配置好,于是教你怎么去配置处理器映射器,这⾥我总结⼀个处理器映射器和适配器以及视图解析器的配置
1.1、⾮注解的处理器映射器和适配器配置,注意:在这⾥处理器映射器的配置必须和处理器适配器的配置是成对的,还有必须在配置⽂件⾥声明注⼊你的controller,并且这个controller必须实现Controller接⼝。⾮注解的配置访问是根据声明注⼊的bean name来进⾏映射处理的,必须有name,⽽且name的值必须有根符号(“/”)。
1.2、注解的处理器映射器和适配器配置。注解的controller类必须使⽤@Controller进⾏注解,类中的
⽅法使⽤
@RequestMapping("")进⾏注解。注解的配置⽅式还有⼀种,即<mvc:annotation-driven/>注解驱动配置,这样更⽅便,实际项⽬也是这样使⽤的。
1.3、视图解析器的配置。
⾄此,springmvc的controller需要的处理器映射器和处理器适配器以及视图解析器的配置已经完成,当然实际要运⾏的时候还必须要有Controller包扫描,不然你的程序在实例化完sqlSessionFactory后会⼀直卡在那⾥,不做任何操作,页⾯也不会有任何的反映。
2、这⽹上的第⼆种解决⽅法说的最多的就是我上⾯说的Controller的包扫描没有加或者包扫描的配置是错误的,这如果说其他配置都OK的话,如果没有加包扫描,那么他不回报任何的错误,但是会输出⽇志,创建SqlSessionFactory的⽇志是有的,不会什么信息都没有。有的⼈将Controller的包扫描加成这样
<context:component-scan base-package="com.ller.*"/>也是什么都没有的。正确的包扫描是这样的:
3、当然也有说jar包没有,这也有可能是有的,没有jar包报404很正常的。这⾥要说的是如果出现404,你的判断是jar包没有,那你就得去你的项⽬发布路径下的WEB-INF下的lib⽂件夹去jar包,⽽不是你的eclipse⾥看有没有。更需要注意的是,有⼈在tomcat运⾏设置过发布路径,那就必须在你设置的发布路径下,我的设置为tomcat的安装⽬录下的webapps下了。
4、其实忘了⼀个最多的说法,那就是说你的请求地址是错误的,这个只能说⾃⼰认真排查,⼀般⼈在出现404的时候第⼀反应就是请求地址的核对,所以这个我也不说了。但是在这⾥我强调⼀个现象,就是你的请求地址是正确的,但是你的⽬录⾥没有Controller⾥的⽅法返回的页⾯,这样也会出现404,但是这个404和之前的404是不⼀样的。⽐如我在我的testController的items映射的⽅法⾥返回的itemsLists,实际我的jsp下的JSP⽂件没有⼀个itemsLists.jsp,那么页⾯的错误就会是这样的:
5、还有⼀种解决办法说l配置DispatcherServlet的时候servlet的映射关系<url-pattern>配置不正确,应该将<url-pattern>/* </url-pattern>改为<url-pattern>/*</url-pattern>,去掉根号后⾯的星号,当然如果确实这样写了,那这也是⼀种解决办法。
以上就是⽹上所说的解决这⼀问题的办法,其实也是我遇到这样的问题,在⽹上⼀通乱搜,挨个试了个遍。那么⽹上这么多的解决⽅法,我们到底应该去按哪个⽅法执⾏,像我⼀样挨个试⼀遍?就跟我⼀样,全部试完也不见得能解决你的问题,因为每个⼈的问题发⽣的原因都不⼀样,但是结果都⼀样,访问Controller失败,返回404。这也就是我写这篇⽂章的真正原因,我在这⾥不会贴出我解决该问题的代码,没有⽤对你,也许你的问题按照我的⽅法解决不了。那么我在这⾥将这个问题的解决思路抽取出来,这样⼤家就不⽤在⽹上搜各种解决⽅案还不⼀定适合你,只要按着这个思路问题的根源,就不会有多⼤的问题。
解决⽅案思路:
1、分析问题原因
我们既然知道是404,那就肯定是路径的问题,⾄少在现有的开发环境中⼤多数404都是各种路径的问题,不管是没有对应的⽂件还是路径写错了。既然404是路径问题,那么我们再细化这个路径问题,把这个路径可以分为前台访问路径和后台映射路径。
1.1、前台访问路径:前台访问路径不⽤说就是我们在地址栏输⼊的路径,即http请求路径。
1.2、后台映射路径:那么后台映射路径就多了,分析这个问题其实也很简单,既然是映射路径,那么他是怎么映射的,从哪⾥映射的,映射到哪⾥去,完成这三个问题也就解决了这个问题了。
1.2.1、在哪⾥映射、映射到哪⾥去:其中从哪⾥映射和映射到那⾥去,这个问题很好回答,既然是springmvc,那么这个问题肯定在Controller⾥了,当然这⾥的映射到那⾥去也要根据你⾃⼰配置视图解析器的规则去写。
1.2.2、怎么映射:然后我们分析这个路径是怎么映射的,这⾥就有⼈说了,⼀个刚学的就去研究spring源码吗?其实我们⼀般情况下没必要去翻源码查看他的实现原理,但是你如果有能⼒看他的源码,会加深你对springmvc的理解,对你也是有益⽆害的。虽然说我们没有必要翻源码但是必须知道他的映射关系是怎么配置的,弄清楚这些,我相信你的问题也就解决了。
2、解决问题步骤
我们已经把这个问题细化了,那么就⼀步步来解决就⾏了,在这⾥我会穿插的将我的完整代码贴出来,⼤家可以参考,初学者直接拿去也是可以运⾏的。在这⾥我先把我的⼯程⽬录给⼤家放在这⾥。
2.1、前台访问路径:这个没有什么,只能是仔细的⽐对的你的请求路径是否正确,从项⽬⼯程名到到映射的⽅法名,再到返回的jsp名称。
2.2、从哪⾥映射,映射到哪⾥去:这个问题我们就考虑Controller类中映射是不是不正确,查看@RequestMapping("/映射地址")中的映射地址是否与访问地址对应。
返回路径是否正确,例如返回consigner,在视图解析器配置的路径规则下能不能到consigner.jsp⽂件。
2.3、这⾥是重点,看他是怎么映射的。我们知道springmvc是有前端控制器来调配映射器和适配器去⼯作的,那么我们⾸先要确保前端控制器配置正确。前端控制器配置好了,还需要处理器映射器和适配器以及视图解析器都配置好才可以。那么我们就得⼀个⼀个得排查这些所谓的各种器都配置好了吗?我把我的配置贴出来给⼤家参考。
映射器、适配器和视图解析器:l
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:p="/schema/p"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:context="/schema/context"
xmlns:mvc="/schema/mvc"
xsi:schemaLocation="
/schema/beans
/schema/beans/spring-beans-3.2.xsd
/schema/context
/schema/context/spring-context-3.2.xsd
/schema/mvc
/schema/mvc/spring-mvc-3.2.xsd">
<mvc:annotation-driven/>
<!-- 扫描controller(controller层注⼊) -->
<context:component-scan base-package="com.ller"/>
<!-- ⾮注解的bean声明注⼊ -->
<!--    <bean name="/testController" class="com.ller.TestController"/>  -->
<!-- ⾮注解处理器映射器 -->
<!-- <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> -->
<!-- ⾮注解处理器适配器 -->
<!-- <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> -->
<!-- 注解映射器 -->
<!-- <bean class="org.springframework.web.hod.annotation.RequestMappingHandlerMapping"/>  -->
<!-- 注解适配器  -->
<!-- <bean class="org.springframework.web.hod.annotation.RequestMappingHandlerAdapter"/> -->
<!-- 避免IE在ajax请求时,返回json出现下载 -->
<bean id="jacksonMessageConverter" class="org.verter.json.MappingJacksonHttpMessageConverter">                <property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- 对模型视图添加前后缀 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/" p:suffix=".jsp"/>
</beans>
前端控制器配置:l
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="/xml/ns/javaee"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/javaee
/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">
<context-param>
<param-name>ssm-logistics</param-name>
<param-value&</param-value>
</context-param>
<!-- 配置 Spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:l;classpath:l</param-value>
</context-param>
<!-- ⽇志记录 -->
<context-param>
<!-- ⽇志配置⽂件路径 -->
<param-name>log4jConfigLocation</param-name>
jsp用什么前端框架
<param-value>classpath:conf/log4j.properties</param-value>
</context-param>
<context-param>
<!-- ⽇志页⾯的刷新间隔 -->
<param-name>log4jRefreshInterval</param-name>
<param-value>6000</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<listener>
<listener-class>org.t.ContextLoaderListener</listener-class>      </listener>
<!-- 防⽌Spring内存溢出 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>      </listener>
<!-- springMVC核⼼配置 -->
<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:l</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 错误跳转页⾯ -->
<error-page>
<!-- 路径不正确 -->
<error-code>404</error-code>
<location>/WEB-INF/errorpage/404.jsp</location>
</error-page>
<error-page>
<!-- 没有访问权限,访问被禁⽌ -->
<error-code>405</error-code>
<location>/WEB-INF/errorpage/405.jsp</location>
</error-page>
<error-page>
<!-- 内部错误 -->
<error-code>500</error-code>
<location>/WEB-INF/errorpage/500.jsp</location>
</error-page>
<!-- 字符集过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。