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使用poi导出Excel的方法

    下面是关于”Java使用POI导出Excel的方法”的完整攻略。 简介 POI是Apache基金会的开源项目,可以用Java编写程序生成Microsoft Office文档格式,包括Word、Excel和PowerPoint。POI能够读取和写入Microsoft Office文件的各种属性和内容。在本教程中,我们将学习如何利用POI将数据导出到Excel文…

    Java 2023年5月20日
    00
  • java读取文件内容,解析Json格式数据方式

    Java 读取文件内容并解析 Json 格式数据的方式可以通过 Gson 这个 Google 提供的开源库来实现。 以下是实现步骤: 步骤1:导入Gson库 在 pom.xml 中添加以下依赖: <dependencies> <dependency> <groupId>com.google.code.gson</gr…

    Java 2023年5月20日
    00
  • kotlin中数据类重写setter getter的正确方法

    当我们创建一个Kotlin数据类时,它会自动为每一个属性创建默认的 getter 和 setter 方法。但是如果我们需要对某个属性重写 getter 或 setter 方法,我们该怎么做呢? 首先,我们需要在数据类中定义属性并为其提供一个初始值。然后我们需要为该属性定义一个自定义的 setter 或 getter 方法。 下面是一些示例代码,可帮助您理解如…

    Java 2023年5月23日
    00
  • 如何使用BigDecimal实现Java开发商业计算

    如何使用BigDecimal实现Java开发商业计算 Java开发中涉及商业计算时,使用double或float计算往往会存在精度问题,因此使用BigDecimal类进行计算可以避免此类问题。下面我们详细讲解如何使用BigDecimal实现Java开发商业计算的完整攻略。 引入BigDecimal类 首先需要在代码中引入BigDecimal类。 import…

    Java 2023年5月26日
    00
  • javascript正则表达式之search()用法实例

    JavaScript正则表达式之search()用法实例 简介 在 JavaScript 中,正则表达式是一个非常强大的功能。正则表达式用于对文本进行模式匹配和替换。search()方法是 JavaScript RegExp 对象的一个方法。search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。 语法 search() 方…

    Java 2023年6月15日
    00
  • java正则表达式获取大括号小括号内容并判断数字和小数亲测可用

    下面是详细讲解“java正则表达式获取大括号小括号内容并判断数字和小数亲测可用”的完整攻略。 正则表达式获取大括号小括号内容 获取小括号内的内容 String str = "这是一个测试(string)的字符串"; // 小括号内的正则表达式 String regex = "\\((.*?)\\)"; Pattern …

    Java 2023年5月26日
    00
  • JAVA各种OOM代码示例与解决方法

    “JAVA各种OOM代码示例与解决方法”攻略 什么是OOM OOM是”Out Of Memory”的缩写,意为内存用尽。Java程序中,如果申请内存超过了JVM所限制的最大内存,则会发生OOM异常。在Java程序中,由于内存泄漏或者分配内存过多导致的OOM异常较为常见。 OOM异常的种类 Java heap spaceJVM使用的java堆内存中没有多余的空…

    Java 2023年5月20日
    00
  • hibernate通过session实现增删改查操作实例解析

    通过session实现增删改查(CRUD)操作是Hibernate中最常用的功能之一。下面,我们将为大家提供一份完整的攻略来帮助开发者掌握这一技能。 准备工作 在开始之前,你需要完成以下任务: 确保你已经有了合适的Hibernate版本,并且配置好了Hibernate的环境。 在Hibernate的配置文件中设置好数据库连接参数。 在你的Java程序中导入H…

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