下面是关于 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技术站