SpringMVC 填坑记录
记录菜鸟的我,在使用springMVC开发过程中所遇到的问题。
【1 ModelAndView对象setViewName()无法得到渲染页面】
描述:代码执能够执行,而且也不报错,但是访问就是渲染不出来setViewName()所指定的jsp页面。页面报HTTP Status 404 -
错误。
@RequestMapping(value="/index.jsp")
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
System.out.println("handlerequest 被调用");
ModelAndView mv=new ModelAndView();
mv.addObject("message", "hello world!");
mv.setViewName("/WEB-INF/pages/index.jsp");
return mv;
}
原因:使用日志记录log4j,将运行状态从控制台输出(做开发,日志输出是一件利器,让程序运行过程变得“可见”)。可以看到如下信息
17:34:40,786 WARN PageNotFound:1172
- No mapping found for HTTP request with URI [/Suhe/WEB-INF/pages/index.jsp]
- in DispatcherServlet with name 'springmvc'
大体意思是/Suhe/WEB-INF/pages/index.jsp
这个url请求,DispatcherServlet(前端请求控制分发器)
找不到相应的mapping
,其实就是说,服务器将这个mv.setViewName("/WEB-INF/pages/index.jsp")
操作当成了成为了一个http请求,给了DispatcherServlet
进行处理。而web.xml中对servlet-mapping
进行了匹配规则的设置,如下,对.jsp
结尾了HTTP请求会匹配成功,进行拦截后交给DispatcherServlet
分发处理。
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.jsp</url-pattern>
</servlet-mapping>
解决办法:更改url-pattern
匹配拦截设置为其他形式,如*.do或则.html 等等
,对应的@RequestMapping()也做相应修改即可
【2 解决eclipse中自动生成参数为arg0,arg1问题 】
见 解决eclipse自动生成参数为arg0,arg1
【3 Eclipse for javaee中开发web项目,jar包必须放到/WEB-INF/lib文件夹下】
- tomcat应用服务器,它有其自己的类加载器,根据J2EE的规范去%web-project%/WEB-INF/lib的路径去找相应的lib下的jar文件
- 使用eclipse javaee IDE时,会将WEB-INF/lib中所有的lib自动加入到library中
- eclipse工程下的library是用来编译里面的src中java文件的,实际发布到tomcat时,仅仅只复制了WEB-INF/lib里面的jar包,所以出现eclipse可以正常编译但tomcat运行是找不到类
- 你现在用TOMCAT做服务器,那么需要依赖的JAR包就应该考到WEB-INF/lib中,TOMCAT会自动把它编译然后放入WEB-INF/classes目录(当然你src的代码编译以后也会放到这里),就应该这么做,这是规定。
当然, 在Eclipse下,把jar包部署到其他文件夹,而不是放在WEB-INF/lib的文件夹下,这样,部署到服务器上,可以把这些包关联上传到服务器上,具体要配置项目下的.classpath,在这个文件下加上需要关联的jar的路径就好了
如(我把jar放在根目录下的lib文件***意,不是WEB-INF/lib的文件夹):
<classpathentry kind="lib" path="lib/acegi-security-1.0.6.jar"/>
<classpathentry kind="lib" path="lib/activation-1.1.jar"/>
<classpathentry kind="lib" path="lib/antlr-2.7.6.jar"/>
<classpathentry kind="lib" path="lib/aopalliance-1.0.jar"/>
<classpathentry kind="lib" path="lib/asm-1.5.3.jar"/>