SSM框架项目中的bug汇总

1、Ajax请求在后台已执行,但是返回前台404
原因:可能是后台忽略了注解@ResponseBody,这个注解的作用是将函数返回值作为请求返回值。没有这个注解的话,请求的响应应该是一个页面,不需要页面的话应该加上这个注解。(ps:返回ModelAndView对象时,不能加这个注解,因为,它返回的是包含了整个页面的信息) 
解决:在controller方法中添加@ResponseBody

2、后台接收不到前台上传的文件,
原因:缺少文件上传相关包,或者springmvc中未配置关于multipartResolver。 
解决:

<!-- 在springmvc配置文件中添加-->  
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>  

<!-- 在pom.xml中添加依赖 -->  
     <dependency>  
        <groupId>commons-fileupload</groupId>  
        <artifactId>commons-fileupload</artifactId>  
        <version>1.3</version>  
     </dependency>  
     <dependency>  
        <groupId>commons-io</groupId>  
        <artifactId>commons-io</artifactId>  
        <version>2.4</version>  
     </dependency>

3、使用fileinput.js获取其他插件是奇怪的报错(e错误,什么function没有啥的)
原因:首先确保调用正确路径的情况下,有可能是将jquery.js放在了后面。 
解决:正确顺序应该是jquery在前。

4、访问html,页面报404错误,“the requested resource is not available”
原因:这是因为dispatcherServlet会对静态资源进行拦截,导致了静态资源无法访问。 
解决:我一般是在springmvc配置文件中加入: 
(ps:想了解其他方法的可以参考文章http://blog.csdn.net/wdehxiang/article/details/77619621)

5、Parameter ‘email’ not found. Available parameters are [0, 1, param1, param2]
这里我们需要简单了解一下mabatis的参数传值机制。Mybatis现在可以使用的parameterType有基本数据类型和Java复杂类型。 
基本数据类型:包含int,String,Date等。基本数据类型作为传参,只能传入一个。通过#{参数名}获取。 
复杂数据类型:包含Java实体类、Map。通过#{属性名}或#{map的keyName}获取。 
原因:传入多个值时,mybatis会自动将这些值转成类似map形式的值,以0,1,2…的序列为keyName。 
解决:

方案一、在Dao层mapper接口的方法中,为每个参数添加@Param注解
public User login(@Param(value="email") String email, @Param(value="password") String password);
1
<select id="login" resultType="User"  parameterType="String">
      select * from user where email=#{email} and password=#{password}
</select>
1
2
3
方案二:将多个值存入Map中
public User login(HashMap<String,String) map);
1
mapper.xml中就可以通过#{keyName}啦。

<select id="login" resultType="User"  parameterType="Map">
      select * from user where email=#{email} and password=#{password}
</select>
1
2
3
方案三:以传递参数的顺序通过#{0},#{1}获取
public User login(String email, String password);
1
<select id="login" resultType="User"  parameterType="String">
         select * from user where email=#{0} and password=#{1}
</select>
 

SSM框架异常问题

异常信息: 
java.io.FileNotFoundException: class path resource [spring/springmvc.xml] cannot be opened because it does not exist 
at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:158) 
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:329) 
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:303) 
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180) 
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:216) 
at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:187) 
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125) 
at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94) 
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129) 
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:540) 
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:454) 
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:643) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:606) 
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:657) 
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:525) 
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:466) 
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136) 
at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1227) 
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1140) 
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1027) 
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5038) 
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5348) 
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) 
at org.apache.catalina.core.ContainerBaseStartChild.call(ContainerBase.java:1407)atorg.apache.catalina.core.ContainerBaseStartChild.call(ContainerBase.java:1407)atorg.apache.catalina.core.ContainerBaseStartChild.call(ContainerBase.java:1397) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
at java.lang.Thread.run(Thread.java:748)

从图片中可以看到一个resource和一个resources文件夹,两者内容是一样的(为了重现异常将resource文文件夹中的springmvc.xml改变了位置),但resources文件夹是我拷贝进来的(如果创建的是folder出现的位置也是一样的)

再看web.xml中的配置: 

按理说这个文件的路径是没有问题的,但是死活加载不到springmvc.xml的配置文件,在网上找了很多处理方式,但是没什么结果,因为这个路径表面上看来是没有什么问题的,包括在工作空间中的结构: 

resource和resources这两个文件夹的位置都是在根目录上面,貌似classpath是可以加载到这里的文件的,但是实际上没有,但是区别来了,注意上面的图片中有个”.classpath”的文件,打开它: 

在所有的classpathentry标签中可以看到在.classpath文件中并没有存在resources这个文件夹的引用,而存在的resource文件夹是用eclipse中的Source Folder创建出来的资源文件夹(但此时resource文件夹里面人为的去掉了springmvc.xml配置文件),所以如果没有这样创建的话也没有<classpathentry kind="src" path="resource"/>这行代码,那么classpath就会默认去src下寻找配置中路径,因此造成该异常的原因应该是:复制进来的文件夹和Folder创建的文件夹效果是一样的,在进行编译的时候不会将这种类型的文件夹作为资源文件夹路径引入到.classpath中去,因此在通过classpath:spring/springmvc.xml加载时,在.classpath中找不到这个引用所以就会报错 
如有错误,敬请指正
 

ssm框架搭建常见的bug

1.当在windows环境下配置spring的jdbc数据源时,如果使用的是properties文件的方式来配置的话,名称绝对不能是username



原因:username在windows下默认取值为电脑的账号,一般为了避免和Windows基本配置冲突,

解决办法:数据库连接名常常写的较长如 {jdbc.username}这样就可以唯一识别用户名而不会和Windows冲突。

SSM框架项目中的bug汇总

1、xxx-validator.xml配置文件验证不起作用

出现报错:java.io.FileNotFoundException: http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd

解决思路:

我是找到xwork-validator-1.0.2.dtd文件后发现xxx-validator.xml配置文件的格式不正确 ,改过之后就能验证了


很多博客说明了自己查找的方式,最后都指明了是因为配置文件格式不正确的原因。出现这种问题的时候,应该从下面4个部分考虑: 
1:文件名是否是 LogInAction-validation.xml 第一部分的名字必须与action类名对应一致。 
2:struts.xml中同一个action下面,要配置input类型的返回结果,如同:

3:然后是检查 LogInAction-validation.xml 中指定的属性名字,是否与JSP页面中的属性名字一致。 
4:然后是 LogInAction-validation.xml 文件格式是否正确,主要是指如下这一部分:

二 问题的根源 
有一定的开发经验的童鞋,不管步骤是如何,都会整体的检查下来,因为这种校验文件只要与action类放在同一个包下,是自动加载的,无须关心是否还要在哪里配置。 
但是我想说的是造成这种问题的根源,一般情况下,大家都是搜索某篇文章,然后跟着做例子,可是有时候使用的struts的版本不一致,贸然的使用了不同版本的配置,很可能会导致这种问题。 
所以,参考别人做的东西时候,主要是看思路,具体到自己去实现的时候,要去自己下载的源码包下面,找到对应的文件:struts-2.3.16.3/src/xwork-core/src/main/resources/xwork-validator-1.0.3.dtd 
打开看一下,里面说的:

所以不管直接使用还是修改为了 1.0.3,都会导致校验文件不起作用。

三 开发建议 
从这个问题可以看出,再使用开源的框架时候,一定要使用软件本身自带的例子配置文件说明,而不是直接去网络上拷贝。这应该是一个早就形成的习惯。

最后,以struts为例子,相关DTD文件,一般在下面的包里: 
struts-2.3.16.3/src/ 
如果是validator:struts-2.3.16.3/src/xwork-core/src/main/resources/xwork-validator-1.0.3.dtd 
如果是标签库:/Users/zhaoxin/Dev/struts-2.3.16.3/src/core/src/main/resources/struts-2.3.dtd 
如果上面方法都用了还是没有验证效果,请考虑下面方法:

其次验证下载的Struts版本与Xwork是否一致。如果不一致也会导致验证失败。(其次考虑)
关于为什么要版本一致在我的之前博客有介绍。欢迎浏览: Struts2与XWork 
如果不一致,请下载版本一致,例如我的Struts2 版本是struts2-core-2.0.11.1 
那我的Xwork版本需要是xwork-2.0.1。下载下来xwork之后使用解压软件打开文件。里面会有个xwork-validator-1.0.2.dtd文件即是我们要使用来写XML的模板文件。使用编辑打开这个文件,找到下面代码:

先在浏览器上使用IE打开http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd打开这个地址,如果不存在说明该文件已经不是dtd约束文件了,不能使用这个作为Validation.xml的描述文件了,怎么办呢? 
打开网址,发现opensymphony的网址已经迁移走了,因为xwork的东西已经并入struts2中,成为apache的一部分.所有的dtd已经移交到http://struts.apache.org/dtds/ 这个地方.打开这个网址下载你需要的dtd文件。struts2的校验器的规范要改成:

猜你喜欢

转载自blog.csdn.net/weixin_42175570/article/details/83830023