1. 关于IOC中的注入问题
在上图中,我们在注入控制层的属性时,在使用xml文件注入时,bean标签有一个autowire属性,默认值是default,还有个两个值:byType和byName。
byType:设置为此值时,spring容器会查找bean容器中有没有要注入的属性的类型的bean,找到唯一一个bean就将该bean注入给该属性,没找到或者找到多个bean,就会报错;
byName:当我们设置为此值时,下面的property就可以省略不写,但是此时,spring容器会将要注入的属性作为bean的id去容器中查找有没有对应的id,如果找到了注入给该属性,找不到就报错。
其实上述这种注入方法不常用,因为不小心会出错。所以最好不要用,但是见到了也要知道是怎么回事。
结果:上图中是按照byName的策略注入userService的,但是bean容器中没有id叫userServiece的bean,所以会报错的。
2. 注解方式注入方式
在使用注解方式注入bean时,属性可以不用写set方法。
3. 注解方式实现aop时,使用哪种方式获取bean的问题
接口:
实现类(目标类):
测试类:
上述中使用错误的方式获取bean,会出现如下错误:
对3的补充:
1.使用以下代码也可以获得bean
MathI math = ac.getBean(MathI.class);
2.在使用xml配置文件的方式实现aop的功能时,也遵循以上原则。
4. aop中环绕通知的配置
若环绕通知没有返回值,则会报如下错误:错误的原因就是目标对象中的方法有返回值,但是proceedingJoinPoint.proceed()若没有返回值,就和目标对象中方法不一致了,人家目标对象的方法有返回值,为啥我代理对象的方法没有返回值?
5. 使用JdbcTemplate模板时要注意的问题
我们在使用Spring提供的JdbcTemplate模板进行数据库的增删改查操作时,要注意一些容易采坑的问题:
//删除指定id的数据
String eids = "6,7,8,9";
//String sql = "delete from emp where eid in ("+eids+")";
String sql = "delete from emp where id in (?)";
jdbcTemplate.update(sql,eids);
上述方法会报错,如下:
主要的原因就是JdbcTemplate的底层还是封装的java官方提供的jdbc的一套逻辑,底层调用PreparedStatement.set(String)方法给参数赋值,可是大家要注意。在赋值时,PreparedStatement在将参数赋值给sql语句时,对于String类型的数据,会默认加上单引号''
,此时最终的sql就变成了如下模样:
DELETE FROM emp WHERE id IN ('6,7,8,9');
上述sql在执行后也会报同样的错误:
这里跟上述情况一样的还有使用模糊查询如like时,也不能给通配符直接赋值!!!
解决办法:使用拼接的sql或者使用mysql关键字concat拼接
//使用拼接的sql
String ids = "6,7,8,9";
String sql = "delete from emp where id in (" + ids +")";
jdbcTemplate.update(sql);
//使用concat关键字拼接
String param= "a";
//String sqls = "select * from emp where ename like '%?%'";//错误!!!不能使用
String sqlss = "select * from emp where ename like concat('%', ? ,'%')";//可以使用
jdbcTemplate.update(sql, param);
6. 记一次SpringMVC中发送get请求,后台接收到中文乱码问题
问题描述:我刚开始学习springMVC时,在jsp页面发送了一个简单的带有参数的请求,jsp页面如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>springMVC_day01</title>
</head>
<body>
<a href="hello?username=小强&password=admin">点击跳转</a>
</body>
</html>
从上面可以清楚地看到我的jsp页面设置的编码格式是UTF-8
,也就是说jsp页面的参数username=小强
发送的时候使用的编码格式也是UTF-8
格式。但是在后台接收的时候,我在网上查找资料说是springMVC请求对请求参数默认使用iso8859-1
的编码格式对参数进行解码操作。
解码方面什么都不写,直接获取参数:
package com.atguigu.test;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*
* @author WL20180723
* @date 2021年3月10日上午8:59:43
*
*/
@Controller
public class TestController {
@RequestMapping(value = "hello")
public String hello(String username, String password) {
System.out.println("请求已收到!username=" + username + "\npassword=" + password);
return "success";
}
}
结果如下:
这里的得到的username已经乱码了!!!
总结后,自己梳理了一下整个请求的过程:
所以在获取到请求参数后,我们要对其进行逆向的解码过程:
由于我的jsp页面设置的是UTF-8
的编码方式,因此获取到参数之后,我的解码过程如下代码:
package com.atguigu.test;
import java.io.UnsupportedEncodingException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
*
* @author WL20180723
* @date 2021年3月10日上午8:59:43
*
*/
@Controller
public class TestController {
@RequestMapping(value = "hello")
public String hello(String username, String password) {
String user = null;
try {
//对username先使用iso8859-1编码,再使用UTF-8解码
user = new String((username).getBytes("iso8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println("请求已收到!username=" + username + "\npassword=" + password);
System.out.println("user=" + user);
return "success";
}
}
将乱码的username和解码之后的结果打印出来,结果如下:
方法2我们直接在web.xml中配置一个过滤器用来指定请求的编码格式
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>springMVC_day02</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 配置spingMVC编码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
7. 关于SpringMVC中@RequestMapping的参数配置
在SpringMVC中,使用@RequestMapping注解来匹配请求和处理请求的方法时,有时还要添加其它参数用于对请求进行过滤,要注意以下方面:
1.在配置headers属性时,比如配置如下:
@RequestMapping(value = "test",headers = {"Accept-Language: zh-CN,zh;q=0.9"})
这个配置意思是匹配test的路径如本地测试http://localhost:8080/springMVC_day02/mvc/test
但是还有一个后面的关于headers的限制:Accept-Language
的值为zh-CN,zh;q=0.9
才能正确匹配请求。但是上面的匹配表达式有2处错误:
正确的写法如下:
@RequestMapping(value = "test",headers = {"Accept-Language=zh-CN,zh;q=0.9"})