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截取字符串的几种方法示例

    Java截取字符串的几种方法示例 在Java中,截取字符串的操作是非常常见同时也非常重要的,本文将介绍几种Java截取字符串的方法,以及相应的示例说明。 1. 使用substring()方法 Java中字符串类中提供了substring()方法,以便我们对字符串进行截取操作。substring()方法有两种重载形式: substring(int beginI…

    Java 2023年5月26日
    00
  • Java动态数组Arraylist存放自定义数据类型方式

    Java的动态数组ArrayList是一种可以调整大小的可变数组,它可以动态地添加、删除和修改元素,非常方便。如果要在ArrayList中存放自定义数据类型的元素,需要进行以下步骤: 1. 自定义数据类型的类定义 首先要定义一个类来表示自定义数据类型,该类需要实现Java中的Serializable 接口,以便可以进行序列化。 示例代码: import ja…

    Java 2023年5月26日
    00
  • JVM中对象的创建与OOP-Klass模型

    一、JVM中对象的创建 在Java中,对象的创建过程必须经过如下步骤: JVM读入指定类的二进制数据,并在方法区中生成类模板,同时为类变量和静态变量分配内存空间; JVM在堆上分配实际的对象空间,同时根据不同的访问控制权限设置对象的内部成员; 在对象空间中执行实例方法时,虚拟机通过对象的指针调用相应方法。 二、OOP-Klass模型 OOP-Klass模型是…

    Java 2023年5月26日
    00
  • java实现图形化界面计算器

    下面为您详细讲解“Java实现图形化界面计算器”的完整攻略。 1. 准备工作 在开始之前,需要确保您已经正确安装了Java开发环境(JDK),以及Java集成开发工具(IDE),如Eclipse或IntelliJ IDEA。 2. 创建界面 使用Java Swing工具包,可以很容易地创建图形化用户界面。您可以通过创建一个JFrame实例作为主窗口,然后添加…

    Java 2023年5月23日
    00
  • 浅谈java中对集合对象list的几种循环访问

    下面是详细讲解“浅谈java中对集合对象list的几种循环访问”的完整攻略。 一、背景 在Java中,集合是程序开发中经常用到的一种数据结构。而list则是最常用的集合之一。在对list进行操作时,最常见的操作之一便是循环访问其中的元素。Java中有多种循环遍历list的方式,我们来逐一了解。 二、for循环 for循环是最基本的循环方法。代码如下: Lis…

    Java 2023年5月26日
    00
  • 玩转spring boot MVC应用(2)

    “玩转springbootMVC应用(2)”是一个关于如何使用Spring Boot构建Web应用程序的攻略。在本攻略中,我们将详细讲解如何使用Spring Boot MVC来构建Web应用程序,并提供两个示例来演示如何使用Spring Boot MVC。 添加依赖 首先,我们需要在pom.xml文件中添加Spring Boot MVC的依赖。以下是一个示例…

    Java 2023年5月14日
    00
  • JVM之参数分配(全面讲解)

    JVM之参数分配(全面讲解) JVM在启动时可以通过一些参数来调整堆内存和虚拟机栈的大小,以此来优化程序性能和避免内存溢出等问题。本文将全面讲解JVM的参数分配,包括参数的类型、作用、和使用方式,并且提供两个示例说明。 JVM参数类型 JVM参数分为三种类型:标准参数、非标准参数和高级运行时参数。 标准参数:JVM提供的可见参数,以“-”开头,例如:-Xmx…

    Java 2023年5月26日
    00
  • 解决jsp开发中不支持EL问题

    在jsp开发中,有时会遇到EL表达式不被支持的问题。对此,下面是完整攻略: 问题背景 在jsp开发中,可以使用EL表达式来简化开发过程,但有时在使用EL表达式时会遭遇并发生“不支持EL表达式”的问题,通常会因为如下原因: web.xml文件缺少支持EL表达式的配置; 服务器版本过低,不支持EL表达式导致不生效; 需要使用el-api和jstl(JSP标准标签…

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