1.如果springMVC放在request中的引用类型对象值在前台取不到值,则考虑给此对象换名字,即另命名变量。

如request.setAttribute("holds", holds);

前台${holds.id},${holds.name}取不到

则改为以下就能取到:前台${h.id},${h.name}

2.can't Map...Controller,极有可能是servlet路径写错或者路径重复。

3.取项目的绝对路径:

方法一:

String basePath = this.getClass().getClassLoader().getResource("/").getPath();
String basePath = this.getClass().getClassLoader().getResource("../../").getPath();//获取目录的上一级的上一级,即父亲的父亲

方法二:

在项目中有时候我们需要记录日志或者上传图片,需要知道项目的具体路径,如果项目中使用了spring,那么获得到项目跟路径很简单,只需要在web.xml中添加listener配置,具体如下:


springmvc文件处理代码 springmvc常见问题_jar包



<context-param>  
        <param-name>webAppRootKey</param-name>   
        <param-value>evan.webapp</param-value>  
    </context-param>  
    <listener>   
        <listener-class>org.springframework.web.util.WebAppRootListener</listener-class>   
    </listener>



springmvc文件处理代码 springmvc常见问题_jar包


 

其中param-value的值可以随便赋值,只要保证同一个tomcat下不同项目的param-value不重复即可。通过以上配置后就可以在普通的java类中得到项目跟路径了。具体代码如下:


System.getProperty("evan.webapp");
//获取的值类似E:\develop_tools\apache-tomcat-7.0.59\webapps\bookMobile



方法三:

关于路径的引申问题:

1. 问题描述

最近使用myeclipse10.7用maven开发一个web项目,就遇到了这样一个问题:

由于项目的servlet类中使用了servlet-api-3.0相应的方法,即HttpServletRequest类的一个getServletContext()方法,

为了使编译通过,可在build path中添加j2ee6 libarary,或者pom.xml中引入servlet-api-3.0.jar,但虽然通过这2种方法引入使编译成功后,

运行时,servlet中仍然报找不到getServletContext()方法的错误。

2. 分析结果

追查问题后,分析可能的原因是,如果使用的是tomcat6服务器,由于tomcat6安装目录下自带的是servlet-api-2.5.jar,不支持servlet-3.0,

由此进行猜测,web应用在tomcat中运行时,运行时与编译时是不一样的。

编译使用的项目build path引入的jar包进行编译,编译完成后,运行时,tomcat应该是使用了其自带的j2ee jar包来运行web应用的,我们项目build path中引入的j2ee 相关jar包,在tomcat容器运行web项目时,已经不起作用了!

3. 待解决的问题

问题来了,有没有一种方法,使得web项目在tomcat容器中运行时,能够优先使用我们指定的jar包呢?正在百度当中。

4. 分析结果纠正

即使把servlet-api-3.0jar包替换掉tomcat6的lib目录下的servlet-api.jar包,也并不能解决问题,说明了并不是web项目运行时优先加载tomcat自带jar这种原因,而是tomcat6不支持servlet-api-3.0,使用tomcat7后,问题解决了,也说明了这个问题。

注意,如果反过来把servlet-api-2.5替换掉tomcat7目录下的servlet-api包,则容器直接无法成功启动了。