1.关于Maven项目的问题:
Error: java: 错误: 不支持发行版本 5
我的JDK版本是11,只需在conf\settings.xml中加入以下内容即可解决此问题。
<profile>
<id>jdk-11</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>11</jdk>
</activation>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>
</properties>
</profile>
另外,关于Maven默认路径的问题,由于IDEA是自带Maven的,如果你希望使用自己安装的Maven版本,可以先关闭当前项目然后在设置中指定Maven路径以及对应配置文件和Maven仓库的路径。然后每次创建新Maven项目时,最好先关闭当前项目并回到主界面,然后再去创建新项目。
2.BeanCreationException:
这个单词显而易见,是对象创建异常。可能是由于给类添加了有参构造方法,却忘记添加无参构造方法导致的,我就是这样遇到的,所以一定养成创建无参构造方法的习惯。如果创建了无参构造方法却仍然出现此异常,那么也可能是由于自动注入选择的方法错误,关于自动注入相关的内容,可能我现在提起大家都不知道是啥了,稍后会讲。
3.NullPointerException:
顾名思义,空指针异常,这个异常就太常见了,我这里主要讲一下在框架学习过程中出现此异常的情况。第一个还是自动注入的问题,第二个是使用了注解却没有开启对注解的支持。
4.spring自动注入:
那我们来看一下自动注入,spring自动注入就是由程序自动给属性赋值,通过使用autowire来实现,autowire的值为no时代表不自动装配,也是默认值;autowire的值为byName的时候要保证属性名=id名,会调取set方法来赋值,如果没有找到的话就会报空指针异常;autowire的值为byType的时候要保证属性的类型和id对象的类型相同,也会调取set方法来赋值,但是注意不能有多个相同类型的对象,否则无法自动注入;autowire的值为constructor的时候要保证构造方法的参数类型和id对象的类型相同,会调取构造方法赋值,如果没有找到的话也会报空指针异常。
5.注解配置IOC:
IOC主要作用是控制反转或者说依赖注入,将所有对象交与spring容器统一管理统一分配。在使用注解配置IOC前,一定不要忘记在spring配置文件中添加扫描注解包,配置注解扫描时,要用到context命名空间,在扫描时一般扫描父包就可以,程序会自动对子包进行扫描,例如:<context:component-scan base-package=“com.xzk”/>。可以使用@Autowired实现自动注入,@Autowired默认使用byType实现自动注入,如果想使用byName可以添加辅助注解@Qualifier(“对象名称”),这样可以避免由于有多个相同类型的对象而导致无法自动注入的问题,也可以直接使用@Resource(name=“对象名称”),这个注解等价于@Autowired+@Qualifier(“对象名称”)。
6.使用配置文件声明事务:
第一步是创建事务管理器对象,以jdbc为例:
<bean id="mytx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ds"></property>
</bean>
第二步是指定哪些方法需要进行事务管理,需要用到tx命名空间:
<tx:advice id="myad" transaction-manager="mytx">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
但是,指定的insert/update/delete方法不仅存在于service层,还存在于dao/controller层,为了解决这个问题,需要使用面向切面的思想指定哪层需要事务管理,需要用到aop命名空间,一般把事务添加在service层最合理:
<aop:config>
<aop:pointcut id="mypc" expression="execution(* com.xzk.service.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="myad" pointcut-ref="mypc"></aop:advisor>
</aop:config>
当然,使用配置文件声明事务的方式理解就好,使用注解的方式来添加事务更方便更快捷一些。
7.springmvc日期处理:
跟日期相关的常见错误为HTTP Status 400 - Bad Requset,这是由于给定的数据无法由框架转换成目标类型。springmvc框架默认支持转换的日期格式为:yyyy/MM/dd,如果需要使用其它格式,可以使用工具类来对日期进行处理,首先要引入joda-time包,然后在spring的配置文件中加入<mvc:annotation-driven/>,这样一来就可以使用@DateTimeFormat(pattern = “yyyy-MM-dd”)注解来指定所接收的日期格式了。
public String test1(@DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday) {}
在这里补充一点,在接收数据的时候如果是基本数据类型,最好使用它的包装类来接收,因为包装类有默认值,即使接收的值有问题也不会出现太大的BUG。
8.springmvc静态资源访问:
在springmvc项目中,如果想进行静态资源的访问,例如图片,如果不进行处理是无法找到资源的。这是因为定义DispatcherServlet前端控制器的时候请求地址匹配的是一个斜杠,斜杠虽然不拦截jsp资源但是会拦截静态资源,例如 html、js、css、image等,因此在使用jsp内部添加静态资源就无法成功,所以需要单独对静态资源进行处理。在spring的配置文件中添加<mvc:default-servlet-handler/>即可,需要用到mvc命名空间。