楼主是个新人,最近做的一个项目用到了spring mvc,所以楼主开始研究,自己写了个小的程序,其中jdbcTemplate是在配置文件中配置的,但是在程序运行的时候,获得的jdbcTemplate一直为空,经过查阅资料,终于找到原因了。
applicationContext.xml配置文件
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver">
</property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
<property name="username" value="scott"></property>
<property name="password" value="123"></property>
</bean>
<bean id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
这个是配置文件,经过观察,发现问题不是出在配置文件中,然后查看dao层
UserInfoDaoImpl.java
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;
import com.xwtec.springmvc.user.dao.UserInfoDao;
import com.xwtec.springmvc.user.model.UserInfo;
import org.springframework.stereotype.Service;
@Service
public class UserInfoDaoImpl extends NamedParameterJdbcDaoSupport implements UserInfoDao{
@Resource
public void setSuperJdbcTemplate(JdbcTemplate jdbcTemplate)
{
super.setJdbcTemplate(jdbcTemplate);
}
@Resource(name="dataSource")
public void setSuperDataSource(DataSource dataSource){
setDataSource(dataSource);
}
public void addUser(UserInfo user) {
// TODO Auto-generated method stub
}
public int checkUser(String username, String password) {
int count = 0;
String sql = "select count(1) from user where username=? and password=?";
try
{
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("username", username);
paramMap.put("password", password);
count = getJdbcTemplate().queryForInt(sql, paramMap);
System.out.println(count);
}
catch (Exception e) {
e.printStackTrace();
}
return count;
}
}
发现dao层的注入也是没有问题的,向上看service层和action层发现问题
UserServiceImpl.java
import org.springframework.stereotype.Service;
import com.xwtec.springmvc.user.dao.UserInfoDao;
import com.xwtec.springmvc.user.dao.impl.UserInfoDaoImpl;
import com.xwtec.springmvc.user.service.UserService;
@Service
public class UserServiceImpl implements UserService {
private UserInfoDao userInfoDao = new UserInfoDaoImpl();
public UserInfoDao getUserInfoDao() {
return userInfoDao;
}
public void setUserInfoDao(UserInfoDao userInfoDao) {
this.userInfoDao = userInfoDao;
}
public int checkUser(String username, String password) {
int count = userInfoDao.checkUser(username, password);
return count;
}
}
在service层我new了一个dao的实例,同时给了get和set方法,但是我没有在配置文件中定义这个Bean,导致程序执行的时候并不是通过配置文件去加载这些实例,同样,给dao层注入的jdbcTemplate就为空了,action层同样new了一个service的实例,这里就不展示代码了,把改过后的代码展示一下
UserServiceImpl.java
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.xwtec.springmvc.user.dao.UserInfoDao;
import com.xwtec.springmvc.user.dao.impl.UserInfoDaoImpl;
import com.xwtec.springmvc.user.service.UserService;
@Service
public class UserServiceImpl implements UserService {
@Resource
private UserInfoDao userInfoDao = new UserInfoDaoImpl();
public int checkUser(String username, String password) {
int count = userInfoDao.checkUser(username, password);
return count;
}
}
UserAction.java
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.xwtec.springmvc.user.service.UserService;
@Controller
public class UserAction
{
@Resource
private UserService userService;
@Autowired
private HttpServletRequest request;
@RequestMapping("/user/userLogin.do")
public String userLogin()
{
String username = request.getParameter("username");
String password = request.getParameter("password");
int n = userService.checkUser(username, password);
request.setAttribute("username",username);
if(1==n)
{
return "welcome";
}
else
{
return "error";
}
}
}
改成下面这种方式之后,spring会通过@Resource注解根据name去获取对应的Bean。
楼主新人一个,有什么不对的地方欢迎指正。把问题发在这里,只是想给自己一个提醒。。。