JSP 开发之servlet中调用注入spring管理的dao

下面是关于 JSP 开发中在 Servlet 中调用注入 Spring 管理的 DAO 的完整攻略:

1. Maven 依赖

首先,在 pom.xml 文件中添加以下依赖:

<!-- Spring Framework -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>${spring.version}</version>
</dependency>

<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${mybatis.version}</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>${mybatis.version}</version>
</dependency>

<!-- 数据库连接池 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>${druid.version}</version>
</dependency>

其中,${spring.version}, ${mybatis.version}, ${druid.version} 可以根据项目需要自行替换。

2. 数据访问类

在数据访问类中引入 Spring 注入的 Bean:

@Repository("userDao")
public class UserDaoImpl implements UserDao {
    @Autowired
    private DataSource dataSource;

    private SqlSessionFactory sqlSessionFactory;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Autowired
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        this.sqlSessionFactory = sqlSessionFactory;
    }

    public User getUserById(int id) {
        // 从 sqlSessionFactory 中获取 SqlSession,进而获得 UserMapper 接口代理对象
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            return userMapper.selectByPrimaryKey(id);
        } finally {
            sqlSession.close();
        }
    }
}

在注入的 DAO 实现类中,我们通过 @Autowired 注解自动注入 DataSource 和 SqlSessionFactory。这里需要注意:Spring 使用的是 CGLIB 创建 DAO 实例,而 JSP 使用的是 Java 反射机制创建 Servlet 实例,而 Java 反射机制不支持 autowired 字段,因此我们需要使用 @Autowired 注解标注 setDataSource()setSqlSessionFactory() 方法。

3. Spring 配置

在 Spring 配置文件中配置数据源、SqlSessionFactory 和 UserDao Bean。这里以 XML 配置文件为例:

<!-- 数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    ...
</bean>

<!-- MyBatis 配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="typeAliasesPackage" value="com.example.demo.entity" />
    <property name="mapperLocations" value="classpath*:mappers/*.xml" />
</bean>

<!-- UserDao Bean -->
<bean id="userDao" class="com.example.demo.dao.UserDaoImpl">
    <property name="dataSource" ref="dataSource" />
    <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

这里我们配置了 DataSource、SqlSessionFactory 和 UserDao Bean。其中 DataSource 的具体配置需要根据项目实际情况进行修改。SqlSessionFactory 需要配置数据源和 MyBatis 数据访问接口的位置。UserDao 需要配置 dataSource 和 sqlSessionFactory,用于实现注入。

4. Servlet 中调用 UserDao

在 Servlet 中注入 UserDao,并通过 UserDao 获取 User 数据:

@WebServlet(name = "userServlet", urlPatterns = "/user")
public class UserServlet extends HttpServlet {
    @Autowired
    private UserDao userDao;

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        // 注入 UserDao
        WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()).getAutowireCapableBeanFactory().autowireBean(this);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        int userId = Integer.parseInt(request.getParameter("id"));

        User user = userDao.getUserById(userId);
        PrintWriter out = response.getWriter();

        out.println("<html>");
        out.println("<head>");
        out.println("<title>User Info</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>User Info</h1>");
        out.println("<p>Id: " + user.getId() + "</p>");
        out.println("<p>Name: " + user.getName() + "</p>");
        out.println("</body>");
        out.println("</html>");
    }
}

在 Servlet 的 init 方法中,我们通过 WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()).getAutowireCapableBeanFactory().autowireBean(this) 注入 UserDao。

我们的 doGet 方法中通过 UserDao 获取指定 id 的 User 信息,并输出到网页中。

5. 测试

我们可以通过访问 http://localhost:8080/user?id=1 查看输出结果,输出结果应该包含 id 和 name 两个字段。

另外,我们还可以编写单元测试来测试 UserDao 是否正确注入,具体代码如下:

@RunWith(SpringRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class UserDaoTest {
    @Autowired
    private UserDao userDao;

    @Test
    public void testGetUserById() {
        User user = userDao.getUserById(1);
        Assert.assertNotNull(user);
        Assert.assertEquals(1, user.getId().intValue());
        Assert.assertEquals("张三", user.getName());
    }
}

我们使用了 Spring 的测试框架,在测试中自动注入了 UserDao。在测试过程中,我们调用 UserDao 的 getUserById() 方法,然后使用 JUnit 的断言方法来验证结果是否正确。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP 开发之servlet中调用注入spring管理的dao - Python技术站

(0)
上一篇 2023年6月16日
下一篇 2023年6月16日

相关文章

  • Java转JSON串的几种方式

    Java转JSON串的几种方式: 在Java开发中,将Java对象转化成JSON格式数据是很常见的一项操作。下面是几种常见的方式: 1. 使用Gson Gson是Google提供的一个Java JSON库,可以将JSON字符串和Java对象互相转化。可以通过以下步骤来使用Gson将Java对象转化成JSON格式数据: 引入Gson依赖: “` com.go…

    Java 2023年5月26日
    00
  • Spring基于注解管理bean实现方式讲解

    让我来讲解一下“Spring基于注解管理bean实现方式讲解”的完整攻略。 1. 什么是Spring注解管理Bean Spring注解管理Bean是一种不需要在XML或Java配置文件中手动定义bean实例的管理方式,而是使用注解的方式来进行实例的创建、初始化和依赖注入。相对于传统的XML或Java配置方式,使用注解可以使代码更加简洁,并且可以更加方便地进行…

    Java 2023年5月31日
    00
  • 详解Java类加载器与双亲委派机制

    详解Java类加载器与双亲委派机制 Java类加载器是Java虚拟机(JVM)的一个重要组成部分。类加载器负责将class文件从文件系统、网络等位置加载到内存中的虚拟机中,从而使得Java程序能够正确运行。在Java中,类加载器采用了“双亲委派机制”(Parent Delegation Model)来管理和加载类。 双亲委派机制 Java类加载器通过双亲委派…

    Java 2023年6月15日
    00
  • Java Stream流之求和的实现

    下面是关于“Java Stream流之求和的实现”的完整攻略: 什么是Java Stream Java Stream 是 Java 8 的新增特性,它提供了一种非常高效、简洁优美的数据处理方式,可以方便地完成各种数据处理操作。 Stream 可以看作是一种 数据流(Stream) ,数据从一个管道(Stream) 中依次经过各种操作进行处理,最终得到目标结果…

    Java 2023年5月26日
    00
  • mybatis如何使用Java8的日期LocalDate和LocalDateTime详解

    下面就是“mybatis如何使用Java8的日期LocalDate和LocalDateTime详解”: 介绍 在开发中,有时候需要将 Java 的日期类型存在数据库中,mybatis 也同样支持这样的操作。本篇文章将详细介绍如何使用 Java8 的日期类型 LocalDate 和 LocalDateTime。 mybatis 配置 在 mybatis 中,需…

    Java 2023年5月20日
    00
  • Kafka利用Java实现数据的生产和消费实例教程

    Kafka利用Java实现数据的生产和消费实例教程 Kafka是一个高性能的分布式消息队列,可以用于实现各种系统之间的异步通信以及数据流的处理。本文将介绍如何使用Java实现Kafka的数据生产和消费。以下是详细的步骤: 步骤一:安装和启动Kafka服务器 在开始使用Kafka之前,需要先安装Kafka服务器。Kafka服务器的安装过程可以参考Kafka官方…

    Java 2023年5月20日
    00
  • 详解idea打包jar的多种方式

    下面是详细讲解“详解idea打包jar的多种方式”的完整攻略。 一、什么是JAR包 JAR(Java Archive,Java归档文件),是Java平台的一种标准压缩文件格式,广泛应用于发布和分发Java代码。JAR包可以将多个Java类、资源文件、配置文件等打包成一个文件,便于发布和分发。 二、IDEA打包jar的多种方式 1. 使用IDEA自带的打包功能…

    Java 2023年5月20日
    00
  • 响应式编程初探

    响应式 响应式系统(Reactive System) 具有以下特质:即时响应性(Responsive)、回弹性(Resilient)、弹性(Elastic)以及消息驱动(Message Driven)响应式系统更加灵活,松耦合,可伸缩 即时响应性 只要有可能, 系统就会及时地做出响应。 即时响应是可用性和实用性的基石, 而更加重要的是,即时响应意味着可以快速…

    Java 2023年4月17日
    00
合作推广
合作推广
分享本页
返回顶部