03:Spring之Web
一:Spring整合web环境
1:web的三大组件
-
Servlet:核心组件,负责处理请求和生成响应。
-
Filter:用于请求和响应的预处理和后处理,增强功能。
-
Listener:用于监听 Web 应用中的事件,实现事件驱动的功能。
-
2:Spring整合Web的思路与具体实现
Spring 整合 Web 应用的思路是通过将 Spring 框架与 Java Web 技术(如 Servlet、Filter 等)结合,利用 Spring 的 IoC(控制反转)和 AOP(面向切面编程)等特性,简化 Web 开发的复杂性,并提供更强大的功能支持。
2.1:思路
-
核心思想:
-
将 Spring 容器与 Web 应用的生命周期绑定,确保 Spring 管理的 Bean 可以在 Web 应用中使用。
-
使用 Spring MVC 框架处理 Web 请求,替代传统的 Servlet 开发模式。
-
通过配置或注解的方式,简化 Web 组件的开发和依赖注入。
-
-
关键点:
-
Spring 容器的初始化:在 Web 应用启动时初始化 Spring 容器,并将其存储到 ServletContext 中。
-
DispatcherServlet:作为 Spring MVC 的核心组件,负责接收所有请求并将其分发给对应的控制器(Controller)。
-
依赖注入:通过 Spring 的 IoC 容器管理 Web 层、服务层和数据层的 Bean,实现松耦合。
-
AOP 支持:通过 AOP 实现日志、事务、权限等横切关注点的统一管理。
-
2.2:具体实现步骤
1:引入依赖
在 Maven 或 Gradle 项目中引入 Spring 和 Spring MVC 的相关依赖:
xml
<!-- Spring Web MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.23</version>
</dependency>
<!-- Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
2:配置 Spring 容器
Spring 容器需要在 Web 应用启动时初始化。可以通过以下两种方式实现:
方式 1:基于 web.xml
配置
在 web.xml
中配置 ContextLoaderListener
和 DispatcherServlet
:
<!-- 初始化 Spring 容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 监听器:启动时加载 Spring 容器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 配置 DispatcherServlet -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
方式 2:基于 Java 配置(无 web.xml
)
public class MyWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
// 创建 Spring 根容器
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(AppConfig.class); // 注册 Spring 配置类
servletContext.addListener(new ContextLoaderListener(rootContext));
// 创建 Spring MVC 容器
AnnotationConfigWebApplicationContext mvcContext = new AnnotationConfigWebApplicationContext();
mvcContext.register(WebConfig.class); // 注册 Spring MVC 配置类
// 配置 DispatcherServlet
DispatcherServlet dispatcherServlet = new DispatcherServlet(mvcContext);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
}
}
package com.zgs.web.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import java.util.List;
/**
* @author guisong.zhang
* @date 2025/2/12 23:50
* @description 类描述
*/
@Configuration // 标记为配置类
@EnableWebMvc // 启用 Spring MVC
@ComponentScan(basePackages = "com.zgs.controller") // 扫描控制器所在的包
public class WebConfig implements WebMvcConfigurer {
// 配置视图解析器
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/"); // 视图文件的前缀
resolver.setSuffix(".jsp"); // 视图文件的后缀
registry.viewResolver(resolver);
}
// 配置静态资源处理
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**") // 静态资源的 URL 路径
.addResourceLocations("/static/"); // 静态资源的实际存放位置
}
// 配置消息转换器
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 添加 JSON 消息转换器
converters.add(new MappingJackson2HttpMessageConverter());
}
}
3. 配置 Spring MVC
在 Spring MVC 配置文件中(如 spring-mvc.xml
或 Java 配置类),配置视图解析器、静态资源处理、注解驱动等:
<!-- 启用注解驱动 -->
<mvc:annotation-driven />
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 静态资源处理 -->
<mvc:resources mapping="/static/**" location="/static/" />
或者使用 Java 配置:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.zgs.controller")
public class WebConfig implements WebMvcConfigurer {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}
}
4. 编写 Controller
使用 @Controller
注解定义控制器,处理请求并返回视图或数据
@Controller
public class HomeController {
@RequestMapping("/")
public String home(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "home"; // 返回视图名称
}
@GetMapping("/api/data")
@ResponseBody
public String getData() {
return "This is a JSON response";
}
}
5. 部署和运行
将应用打包为 WAR 文件并部署到 Tomcat 或其他 Servlet 容器中,访问 /
路径即可看到效果。
2.3:Spring 整合 Web 的优势
-
松耦合:通过依赖注入管理 Bean,降低组件之间的耦合度。
-
简化开发:注解驱动和自动配置减少了 XML 配置的复杂性。
-
强大的功能支持:Spring MVC 提供了数据绑定、表单处理、文件上传、国际化等功能。
-
易于测试:Spring 的依赖注入使得单元测试和集成测试更加方便。
-
扩展性强:可以轻松集成其他 Spring 生态组件(如 Spring Security、Spring Data 等)。
通过以上步骤,Spring 可以很好地与 Web 应用整合。
2.4:其他方式创建servlet
可以直接在页面访问这个servlet来执行对应的业务,但是这样有一个弊端就是每个业务都需要对应的servlet,增加代码量且每次都创建容器浪费资源。
@WebServlet(urlPatterns = "/accountServlet")
public class AccountServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
AccountService accountService = applicationContext.getBean(AccountService.class);
accountService.transBalance("zgs", "yh", 500);
}
}