1.springMVC中如何解决post请求的乱码问题?
通过在web.xml文件中添加characterEncodingFilter过滤器的相关配置:
<filter>
<filter-name>characterEncodingFilter</filter-name>
<!--配置转码,将编码都转为UTF-8-->
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern><!-- 拦截路径-->
</filter-mapping>
其中encoding和forceEncoding为 characterEncodingFilter的两个参数:
①encoding:字符集,即将过滤到的request的字符集设置为encoding指定的值。
②forceEncoding:强制字符集,该参数的值是指定response的字符集是否也设置成encoding所指定的字符集,默认为false。当设为true时响应字符集使用所指定的值。
2.浅谈以下springMVC的工作流程?
①客户端向中央控制器DispatcherServlet发送请求;
②DispatcherServlet调用处理器映射器HandlerMapping查找处理器,并返回HandlerExecutionhCain(包含处理器对象和处理器拦截器);
③HandlerExecutionhCain通过处理器适配器HandlerAdapter调用具体的处理器Handler(即Controller),并返回ModelAndView;
④视图解析器ViewResolver通过对视图进行解析,并返回view实例;
⑤view经过render()方法渲染后响应用户。
3.Java事务传播的七种类型?
spring中配置事务,需要在类、类方法、接口或接口方法(一般不在接口或接口方法上添加)上添加@Transactional(propagation=Propagation.类型)注解。
①REQUIRED(默认值):如果当前有事务在运行,则当前方法就在该事务中运行;否则,启动一个新的事务并在新启动的事务中运行。
②REQUIRED_NEW:当前方法必须启动一个新的事务,并在新启动的事务中运行;如果有事务正在运行,则将其挂起。
③SUPPORTS:如果有事务在运行,则当前方法在该事务中运行;否则,可以不运行在事务中。
④NOT_SUPPORTS:当前方法不应该运行在事务中,如果当前有运行的事务,则将其挂起。
⑤MANDATORY:当前方法必须运行在事务中,如果没有正在运行的事务,则抛出异常。
⑥NEVER:当前方法不应该运行在事务中,如果有运行的事务,则抛出异常。
⑦NESTED:如果有运行的事务,则当前方法应该在这个事务的嵌套事务内运行:否则,启动一个新的事务,并在新启动的事务中运行。
Java事务的四大特性:
①原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。
②一致性:表示当事务执行失败时,所有被该事务影响的数据都应该恢复到事务执行前的状态。
③隔离性:表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。
④持久性:表示已提交的数据在事务执行失败时,数据的状态都应该正确。
在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式。
1、编程式事务管理: 编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
2、声明式事务管理: 建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
注意:虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
4.MyBatis中实体类中的属性名和表中的字段名不一致有几种解决方法?
①sql语句中对字段名起别名,使其与属性名一致;
<select id="接口方法的方法名" resultType="方法返回值的全类名">
select 字节名 别名(同属性名) from 表名
</select>
②在MyBatis配置文件中开启全局配置中的驼峰命名规则;
<settings>
<!--开启驼峰命名规则:user_name可以映射为userName-->
<setting name="mapUnderScoreToCamelCase" value="true"/>
</settings>
③自定义resultMap映射规则;
<select id="接口方法的方法名" resultMap="resultMap的id">
select 字节名 别名(同属性名) from 表名
</select>
<resultMap type="方法返回值的全类名" id="自己定义">
<!--映射主键-->
<id column="字段id名" property="属性id名">
<!--映射其他列-->
<result column="字段名" property="属性名"/>
</resultMap>