Spring学习总结

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"})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值