目录
2. 配置Spring 的消息转换器 -- 结合 fastjson 转换
为什么使用注解?
Spring注解方式减少了配置文件内容,更加方便管理
Spring的一个核心功能是Ioc,就是将Bean初始化加载到容器中,Bean是如何加载到容器的呢?可以使用Spring注解方式或者Spring XML配置方式。
使用XML 配置方式的话,哪些 Bean 文件需要Ioc 来接管,需要在XML配置文件中 写 <bean>标签,来指定加载哪个 Bean 文件
但是如果有很多 Bean文件需要加载,那么使用配置文件来指定哪些需要加载就不太方便了
@Component
注解 @component 就比较方便了
但是问题来了,Ioc 容器怎么知道哪些需要加载哪些不加载呢?还需要在配置文件中指定扫描哪些包下的文件
这样指定了扫描 com 包下的所有 加了 @component 注释的Bean 文件
创建一个 SpringIoc 工具类 ,读取配置文件
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class springIocUtil {
private static ClassPathXmlApplicationContext context;
static {
context = new ClassPathXmlApplicationContext("spring.xml");
}
public static Object getBean(String beanName){
return context.getBean(beanName);
}
}
调用SpringIoc工具类的getBean 静态方法获取student对象,传参 student ,默认是Student 类名的首字母小写,也可以指定名字
注解加参数的方式,就可以使用自定义的名字传参
验证
因为没有赋值,所以显示的是默认值
@value()
那怎么赋值呢?
使用 @value() 赋值和直接在属性后面 = 赋值 是一样的,不同的是 @value() 可以设置变量
游览器访问
@Component 总结
1. 类带上 @Component 注解
2. 修改配置文件
3. 使用
@Autowired
如果 Student 类里有引用其他类怎么办呢?
使用 引用类型的注入 @Autowired 自动注入
注意:Role 类也需要加上 @Component 注解,
因为 Ioc 容器创建对象是通过 空参 创建的,所以需要有空参构造函数,
在 Student 类中重写 ToString 方法,打印才会显示 Role 的信息
验证
优化SpringIoc工具类
如果参数是 class 怎么修改?
重载方法,并使用泛型的方式
泛型参数 <T>:这表示getBean方法现在可以接受任何类型的Class对象,并将返回该类型的一个实例。这里的T代表返回的bean的类型。
类型参数 Class<T>:这确保了clazz参数必须是一个具体的类类型。
返回类型 <T>:这表示方法将返回由clazz参数指定的类型。这样,调用者可以直接获得一个类型安全的对象,无需显式转换。
@Configuration
如果不使用 XML 配置文件扫描包,还有其他的方式吗? 可以使用配置类
配置类
1.类似spring 的配置文件 --设置包扫描路径
2.引入第三方的bean -- 结合 @Bean
创建配置类
扫描 com 包下的所有文件,有 @Component 注解的Bean 加载到 Ioc 容器
修改工具类
这样和使用 XML 配置文件 是一样的
因为第三方的Bean 我们是不能直接加 @component 注解的,
那怎么引入第三方Bean 呢?
创建一个类作为第三方Bean
@Bean
在配置类创建一个方法并结合 @Bean 注解 ,获取第三方 Bean 的实例,然后返回实例
那怎么调用这个方法呢?
使用方法名获取
验证
Servlet 控制层,Service 业务逻辑层和Dao 数据处理层 也是使用 @Component 注解,不过也有更精准的 注解
@Repository 作用于 Dao层
@Service 作用于Service 层
@Controller 作用于Servlet 层
这些注解和 @Component 注解是一样的作用,它们都继承了 @Component
使用这些注解方便阅读,可以更直观的知道这是什么层
优化 Servlet 层
在项目中,每个功能可能就需要写一个 Servlet ,当 Servlet 太多了怎么处理?
能不能只写一个Servlet ?可以的
新建一个包,然后创建 Controller 类,
然后就可以把 Servlet 类删除了,但是有个问题,Servlet 类删除了之后,游览器怎么访问服务器?
因为 Tomcat 是使用 Servlet 来处理和响应数据的,相当于一个桥梁,现在桥梁没了,那怎么办呢?
再新建一个Servlet 就可以了,但是只需要创建一个 Servlet 就可以,而不是像之前创建很多个Servlet
那么问题来了,现在只有一个 Servlet ,映射路径写什么?
映射路径是游览器发送的请求路径,比如 Http://127.0.0.1/pages/Login
/pages/Login 就是映射路径
只需要写一个 / ,表示拦截所有的请求
这个Servlet 怎么创建呢?
Spring 自己写了一个 Servlet 结合Tomcat ,我们设置 拦截所有请求,也就是把请求路径设置为 /
Spring 写的Servlet 是 DispatcherServlet 中央处理器,中央处理器负责分发 客户端请求的数据 由哪个 Controller 处理
先引用一下Spring 生态的 web 依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.30</version>
</dependency>
然后在 Web.xml 配置文件 引入 Spring 写的 Servlet
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化 spring 配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<!-- 启动 Ioc 容器,我们之前是使用工具类读取配置文件,现在可以使用框架来帮我们完成,就不需要在工具类中读取配置文件了-->
<load-on-startup>1</load-on-startup> <!--1 表示true-->
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern> <!-- 拦截所有请求-->
</servlet-mapping>
现在使用框架启动 Ioc 容器,就不用配置类了
修改 Spring 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com"/>
<!--开启注解驱动-->
<mvc:annotation-driven/> <!--使用 schema/mvc 的-->
</beans>
总结
1. 引入 SpringMVC 依赖
有了这个依赖 DispatcherServlet 才能和Tomcat 结合
2. 修改Web.xml 配置文件
引入 DispatcherServlet,启动 Ioc 容器
3. 修改Spring配置文件
开启包扫描路径
开启注解驱动
现在就可以配置 Controller 类了
每个方法相当于一个 Servlet
@RequestMapping()
那么问题来了,怎么区分中央处理器会分发给哪个 controller 呢?和哪个方法呢?使用 @RequestMapping() 注解
@ResponseBody
那怎么区分请求的是静态的资源还是动态资源?
使用 @ResponseBody 注解
动态资源
带有 @ResponseBody 注解的表示这是响应的是动态资源
测试
启动 Tomcat ,在游览器访问 http://localhost:8080/maven_war_exploded/User/Login
这是我的项目路径,你的需要修改为自己的项目路径
控制台输出 登录
静态资源
不带 @ResponseBody 注解的表示响应的是静态资源
那响应的静态资源的路径是什么呢?
比如我们访问 index.jsp 文件,先看一下编译后文件的路径
可以看到 index.jsp 在编译后就在项目根路径下
所以,文件路径只需要写 /index.jsp 就行了
我们在请求动态资源的时候,一般都会有请求参数,所以,方法的形参也需要加上
注意:请求的参数名要和方法的参数名保持一致
前端 请求的参数名和方法的参数名不一样怎么办?假设,前端的参数名已经确定了,不能修改了,这样的话,参数名不一样就赋值不了,怎么办?两种方法
比如,前端请求的参数名是 username 和 p
第一种方法:形参的参数名也修改为 p ,这样的话谁知道 p 是什么意思?有可能是 position ,phone,price,prize,poet 呢,一般在命名的时候,尽量见名知意
@RequestParam()
第二种方法
扩展
RESTful 设计风格
映射地址和参数之间,参数和参数之间 用 / 分割
传过去的参数只写参数的值
@GetMapping()
@PathVariable()
因为使用的GET 方法,所以注解是 @GetMapping,还有 @POSTMapping 等等
@PathVariable 和 @RequestParam 的区别是什么?
都是用来接收参数的,@RequestParam 是传统的风格,@PathVariable 是RESTful 风格
相同点都是接收地址栏的参数
当 POST 请求的参数很多怎么办?
把参数封装为一个对象,再传过去,也就是说,参数是一个对象
一般在传输数据都会封装为 JSON 格式 ,这也是一种规范,JSON 格式方便阅读,也比较容易解析
我们使用 Apipost 模拟发送数据
Apipost-API 文档、设计、调试、自动化测试一体化协作平台
先不发送,先创建接收参数的 VO
VO是Value Object(值对象)的缩写,它是一个普通的JavaBean,通常与DAO(数据访问对象)类配合使用
先创建 VO 包,再创建一个 VO类
@RequestBody
@RequestBody注解用于接收HTTP请求体中的数据,并将其绑定到方法参数上
消息转换器
测试返回成功,但是返回的不是 JSON 怎么办?
把返回数据封装为 JSON 格式 返回
1. 添加第三方依赖
在 pom.xml 文件中的 <dependencies> 标签中添加以下代码
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.49</version>
</dependency>
2. 配置Spring 的消息转换器 -- 结合 fastjson 转换
3. 引用 第三方 bean
引入 第三方 Bean 文件有两种方式
第一种是使用Spring 配置文件
第二种是配置类配合注解使用
这里因为 Spring 的消息转换器需要在配置文件配置,所以引入 Bean 文件也在这里配置
4. 使用
返回对象类型,不用显式调用JSON 转换
因为配置了消息转换器,在返回数据时 Spring 会自动把它转换为 JSON 格式
测试
显示返回的类型未经允许的
配置消息转换器支持哪些媒体类型
<bean id="fastjasonalibaba" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
测试
成功响应 JSON 格式数据
总结
1. 添加第三方依赖 pom.xml
2. 修改配置信息 Spring.xml
2.1 配置spring 消息转换器 -- 结合fastjson
2.2 引入第三方Bean
2.3 添加 Content-Type 的媒体类型
3. 使用
静态资源的处理
当我们想使用新建的 index.html 作为默认界面怎么处理?
直接修改文件名是不行的,这是因为 Tomcat 在最早的时候,他的目标是把 java代码和前端的页面 结合,使用 jsp 文件处理, 所以默认只能返回 jsp 文件
现在前后端分离,用不到 jsp 文件了,一般都是使用 HTML 文件,那怎么返回 HTML 文件?需要配置
在Spring 配置文件里配置
<!--配置视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 设置视图资源的前缀,例如"test"逻辑视图名会被解析为"/WEB-INF/pages/test.html" -->
<property name="prefix" value="/WEB-INF/pages/"/>
<!-- 设置视图资源的后缀,用于确定资源的文件类型 -->
<property name="suffix" value=".html"/>
</bean>
<!-- 配置默认的 Servlet 用于处理静态资源请求 -->
<mvc:default-servlet-handler/>
返回的文件路径只需要写 文件名即可
测试
映射静态资源
那引入 CSS 文件 路径怎么写呢?
之前的路径是这样的,但是这样写访问不到 css 文件,因为文件是放在 WEB-INF 文件夹下,WEB-INF 是安全目录,只有服务器可以访问,游览器发送的请求访问不了
在 Spring 配置文件中添加映射就可以了
在HTML 文件里 修改引用 css 文件的路径
测试
映射本地图片
游览器访问 http://localhost:8080/ecard_back_war_exploded/images/car.jpg
images 就是映射的路径
以上是我的学习笔记,如果有不对的地方希望能够指正,谢谢