Spring 全家桶之 Spring Framework 5.3(八)- Spring 整合 Java Web(下)

简介: Spring 全家桶之 Spring Framework 5.3(八)- Spring 整合 Java Web

在test包下新增一个测试类PorscheDaoTest,对selectAll方法进行测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:application.xml")
public class PorscheDaoTest {
    @Resource
    private PorscheDao porscheDao;
    @Test
    public void selectAll() {
        List<Porsche> porscheList = porscheDao.selectAll();
        for (Porsche porsche : porscheList) {
            System.out.println(porsche);
        }
    }
}
复制代码

执行测试

image.png

输出porsche表中所有的数据,与预期目标一致。

新增service包,增加PorsheService

@Service
public class PorscheService {
    @Autowired
    private PorscheDao porscheDao;
    public List<Porsche> getPorscheList(){
        return porscheDao.selectAll();
    }
}
复制代码

新增controller包,增加PorscheController,该类调用PorscheService的getPorscheList方法,获取全部数据,并在页面上展示

public class PorscheController extends HttpServlet {
}
复制代码

对于Web项目来说当启动成功后第一次访问时Tomcat容器会创建PorscheController对象,IOC容器创建的对象和Tomcat创建的对象两者无任何关联,Controller对象要交给Tomact来创建,不能增加在类上@Controller注解

PorscheController对象想要获取PorscheService对象就不能通过@Autowired方式来获取,可以通过IOC容器工具来获取,新增util包,实现IOC容器工具ContextUtil

public class ContextUtil {
    public static Object getBean(String beanName){
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
        Object bean = context.getBean(beanName);
        return bean;
    }
}
复制代码

测试这个工具类

public class ContextUtilTest {
    @Test
    public void getBean() {
        Object porscheService = ContextUtil.getBean("porscheService");
        System.out.println(porscheService);
    }
}
复制代码

执行测试

image.png

通过工具类可以获取到PorscheService,从而也就可以调用getPorscheList获得所有数据

public class PorscheController extends HttpServlet {
    private PorscheService porscheService = (PorscheService) ContextUtil.getBean("porscheService");
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 查询所有数据
        List<Porsche> porscheList = porscheService.getPorscheList();
        request.setAttribute("porscheList",porscheList);
        request.getRequestDispatcher("index.jsp").forward(request,response);
        for (Porsche porsche : porscheList) {
            System.out.println(porsche);
        }
        System.out.println("doGet被调用");
    }
}
复制代码

在index.jsp中获取并展示数据

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>Index</title>
  </head>
  <body>
    ${requestScope.porscheList}
  </body>
</html>
复制代码

在web.xml中配置PorscheController的访问路径

<servlet>
    <description></description>
    <display-name>PorscheController</display-name>
    <servlet-name>PorscheController</servlet-name>
    <servlet-class>com.citi.controller.PorscheController</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>PorscheController</servlet-name>
    <url-pattern>/porsches</url-pattern>
</servlet-mapping>
复制代码

打开Project Structure,选中Artifacts,将右侧的jar包全部导入左侧WEB-INF目录下的新建的lib文件夹

image.png

配置Tomcat

image.png

启动Tomcat,浏览器输入 http://localhost:8080/porsches

image.png

Spring整合Java Web成功

1.4 监听器的作用

在ProscheController中通过IoC容器工具ContextUtil来获取PorscheService,而ContextUtil中是通过下面这行代码来获取一个新的IoC容器。

ApplicationContext context = new ClassPathXmlApplicationContext("classpath:application.xml");
复制代码

但是这里只有创建容器的代码没有销毁容器的代码,会造成内存被占满的情况。因此希望这个IoC容器能够在合适的时机来创建和销毁,即项目启动时IoC容器创建完成,项目销毁时IoC容器也随之销毁。

Spring Web中的ContextLoaderListener可以监听Tomcat容器,并提供了创建和销毁IoC容器的方法,查看org.springframework.web.context.ContextLoaderListener的源码

image.png

该类提供了容器初始化和销毁的方法

1.4.1 使用监听器

首先需要在pom.xml中增加Spring Web的依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring-version}</version>
</dependency>
复制代码

web.xml中增监听器的配置,同时也需要配置Spring配置文件的路径,监听器通过Spring配置文件中的配置来创建Spring容器

<!--监听器依赖的配置-->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:application.xml</param-value>
</context-param>
<!--监听器-->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
复制代码

ContextUtil中就不需要通过new ClassPathXmlApplicationContext("classpath:application.xml")的方式来获取IoC容器了。可以通过ContextLoader.getCurrentWebApplicationContext()来获取;修改ContextUtil的getBean方法的代码

public static Object getBean(String beanName){
    WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();
    Object bean = context.getBean(beanName);
    return bean;
}
复制代码

重新启动Tomcat,浏览器再次输入 http://localhost:8080/porsches

image.png

成功输出所有数据

Spring 与 Java Web的集成正式完成,并且得到成功的验证!


相关文章
|
10月前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
1115 3
|
10月前
|
安全 Java API
Java Web 在线商城项目最新技术实操指南帮助开发者高效完成商城项目开发
本项目基于Spring Boot 3.2与Vue 3构建现代化在线商城,涵盖技术选型、核心功能实现、安全控制与容器化部署,助开发者掌握最新Java Web全栈开发实践。
819 1
|
10月前
|
存储 前端开发 Java
【JAVA】Java 项目实战之 Java Web 在线商城项目开发实战指南
本文介绍基于Java Web的在线商城技术方案与实现,涵盖三层架构设计、MySQL数据库建模及核心功能开发。通过Spring MVC + MyBatis + Thymeleaf实现商品展示、购物车等模块,提供完整代码示例,助力掌握Java Web项目实战技能。(238字)
1233 0
|
10月前
|
监控 Java 数据库
从零学 Dropwizard:手把手搭轻量 Java 微服务,告别 Spring 臃肿
Dropwizard 整合 Jetty、Jersey 等成熟组件,开箱即用,无需复杂配置。轻量高效,启动快,资源占用少,内置监控、健康检查与安全防护,搭配 Docker 部署便捷,是构建生产级 Java 微服务的极简利器。
1013 117
|
9月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
10月前
|
人工智能 Java API
构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用
当大模型需要处理私有、实时的数据时,检索增强生成(RAG)技术成为了核心解决方案。本文深入探讨如何在Java生态中构建具备RAG能力的AI智能体。我们将介绍新兴的Spring AI项目与成熟的LangChain4j框架,详细演示如何从零开始构建一个能够查询私有知识库的智能问答系统。内容涵盖文档加载与分块、向量数据库集成、语义检索以及与大模型的最终合成,并提供完整的代码实现,为Java开发者开启构建复杂AI智能体的大门。
5515 58
|
9月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
9月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
789 8
|
9月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
634 4
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!