模块说明:Spring是一站式的框架,对web、service、dao层都提供了实现技术,本模块就是使用Spring框架对各层实现技术的搭建过程。。
登录模块功能简介:从实现上将模块分为web层、Dao层、Service层,数据库使用mysql 。 。
1.创建需要用到的数据库表
2.使用Spring的JDBC模板JdbcTemplate完成dao层的设计(也就是完成对数据库的访问操作)
本模块涉及到对两张数据表的操作,故有两个dao的类,分别对每个表执行相应的操作:
UserDao.java
@Repository(value="userDao") //通过Spring注解定义一个Dao
public class UserDao{
@Autowired
private JdbcTemplate jdbcTemplate;
//根据用户名和密码查询是否在数据库中存在记录,若存在返回1,否则返回0
public int getMatchCount(String userName,String password){
String sql = "select count(*) from spring_login "+
" where username=? and password=?";
return jdbcTemplate.queryForObject(sql, new Object[]{userName,password},Integer.class);
}
//根据用户名查找定位到指定的用户
public User findUserByUserName(final String userName){
String sql = "select userid,username,credits "
+" from spring_login where username=?";
final User user = new User();
jdbcTemplate.query(sql,new Object[]{userName},
new RowCallbackHandler(){
public void processRow(ResultSet rs) throws SQLException{
user.setUserid(rs.getInt("userid"));
user.setUsername(userName);
user.setCredits(rs.getInt("credits"));
}
});
return user;
}
//更新用户信息
String sql = "update spring_login set last_visit=?,credits=? "
+" where userid=?";
jdbcTemplate.update(sql, new Object[]{user.getLast_visit(),user.getCredits(),user.getUserid()});
}
}
LoginLogDao.java
@Repository(value="loginLogDao")
public class LoginLogDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void insertLog(LoginLog loginLog){
String sql = "insert into spring_loginlog(userid,ip,login_datetime)"
+" values(?,?,?)";
Object[] args={loginLog.getUserid(),loginLog.getIp(),loginLog.getLoginDate()};
jdbcTemplate.update(sql, args);
}
}
3.在完成对数据库操作的dao层编码后,编写service层代码,用来调用dao层,实现业务逻辑处理
UserService.java
@Service(value="userService")
public class UserService {
@Autowired
private UserDao userDao;
@Autowired
private LoginLogDao loginLogDao;
//根据用户名密码判断数据库中是否有对应的记录
public boolean hasMatchUser(String userName,String password){
int matchCount = userDao.getMatchCount(userName, password);
return matchCount > 0;
}
//按用户名查找用户
public User findUserByUserName(String userName){
return userDao.findUserByUserName(userName);
}
public void loginSuccess(User user){
user.setCredits(5+user.getCredits());
LoginLog loginLog = new LoginLog();
loginLog.setUserid(user.getUserid());
loginLog.setLoginDate(user.getLast_visit());
userDao.updateLoginInfo(user);
loginLogDao.insertLog(loginLog);
}
}
4.接下来就到了web层的编码, 使用SpringMVC
LoginController.java
@Controller //标注成为一个Spring MVC的controller
public class LoginController {
@Autowired
private UserService userService;
//负责处理/index.html的请求
@RequestMapping(value="/index.html")
public String loginPage(){
return "login";
}
//负责处理/loginCheck.html的请求
@RequestMapping(value="/loginCheck.html")
public ModelAndView loginCheck(HttpServletRequest request,LoginCommand loginCommand){
boolean isValidUser = userService.hasMatchUser(loginCommand.getUserName(), loginCommand.getPassword());
if(!isValidUser){
return new ModelAndView("login","error","用户名或密码错误。");
}else{
User user = userService.findUserByUserName(loginCommand.getUserName());
user.setLast_visit(new Date());
userService.loginSuccess(user);
request.getSession().setAttribute("user", user);
return new ModelAndView("main");
}
}
}
以上就已经是完成了登录模块的实现,其上提供的都是模块中最核心的类。至于配置文件就不再一一给出,下面给出Spring的配置文件:
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- 指定扫描类包,使相应注解生效 -->
<context:component-scan base-package="com.baobaotao"/>
<!--配置数据源DataSource-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<!--指定连接数据库的驱动-->
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<!--指定连接数据库的URL-->
<property name="url" value="jdbc:mysql://localhost:3306/mytest"></property>
<!--指定连接数据库的用户名-->
<property name="username" value="root"></property>
<!--指定连接数据库的密码-->
<property name="password" value="546784"></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
<!-- 通过aop配置提供事务增强,让service包下的所有bean的所有方法拥有事务 -->
<aop:config proxy-target-class="true">
<aop:pointcut expression="execution(* com.baobaotao.service..*(..))" id="serviceMethod"/>
<aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
</beans>
总结:以上是部分最核心的代码,本次记录只是为了留住代码,方便以后能够重用。这个模块的实现,我是跟着教材一步步做的,在功能逻辑上还算清晰。遇到的问题:在调试过程中,由于在我参照的代码中没有给我提供具体的jar包,所以在调试的时候报了好几个找不到jar包的错误。在jar包都引入后,还是没有直接成功,在一直调试灭有成功后,我试着写单元测试,后来发现是service层配置的有问题,于是我慢慢屏蔽代码需找错误,最后的错误就是我事务配置的格式的那个表达式写的不对(我看的视频教的事务配置只是列举一个,然后本模块是用到了另一个配置,然后我就使用自己看视频的那个配置经验来,以为是可以的,结果是错的,哎,,果然还是要继续深入学习啊。。。)。虽然这次的功能逻辑不算复杂,但是在解决问题的过程中还是花了些许的时间,其实总结一句话就是还是经验不足,还是代码敲的不够多。。。
目前已经来到公司实习,但好像公司暂时没有想让新人直接接触项目,于是乎我就“重操旧业”,继续学习spring、springmvc、mybatis等,,基础不够牢固,只能现在有空多补点了。机会是留个有准备的人的,也许下一个机会我的能力就会有所达到了,加油!
(ps: 这算是第一次写博客文章,不知道该怎么写,有写的不对的地方,希望大家多多批评指正!如果有能用的上的,那就一起相互交流学习)