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配置,具体如下:
<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>
其中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包,则容器直接无法成功启动了。