使用Spring框架实现用户登陆实例

如下要讲的案例来自于《Spring 3.X 企业应用开发实战》这本书。html

 

针对我一周的摸索,如今总结几个易错点,固然,这是在我本身犯过错误的前提下总结出来的,若是有说的不到位的地方,欢迎你们指出。所使用的代码均出自《Spring 3.X 企业应用开发实战》chapter2,代码什么的都不重要,差异不大,主要是配置容易出问题。java

1.UserDao的代码web

package com.baobaotao.dao;
import
org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.stereotype.Repository; import com.baobaotao.domain.User; import java.sql.ResultSet; import java.sql.SQLException; /** * Created by RACHEL on 2017/10/11. */ @Repository public class UserDao { @Autowired//自动注入JdbcTemplate的Bean private JdbcTemplate jdbcTemplate; public User findUserByUserName(final String userName) { //根据用户名查询用户的SQL语句 String sqlStr = "SELECT user_id,user_name,credits from t_user where user_name=?"; final User user = new User(); jdbcTemplate.query(sqlStr,new Object[]{userName}, new RowCallbackHandler() { public void processRow(ResultSet resultSet) throws SQLException { user.setUserID(resultSet.getInt("user_id")); user.setUserName(userName); user.setCredits(resultSet.getInt("credits")); } }); return user; } public int getMatchCount(String userName, String password) { String sqlStr = "select count(*) from t_user where user_name=? and password=?"; Object args[] = new Object[]{userName, password}; return jdbcTemplate.queryForObject(sqlStr, new Object[] {userName, password},int.class); } public void updateLoginInfo(User user) { String sqlStr = "update t_user set last_visit=?,last_ip=?,credits=? where user_id=?"; Object args[] = new Object[]{user.getLastVisit(), user.getLastIP(), user.getCredits(), user.getUserID()}; jdbcTemplate.update(sqlStr, args); } }

   注意被标记的那段代码,是否是与书上有些许不一样。书上用的是queryForInt(……)方法,而我换成了queryForObject方法,这是由于:spring 3.2.2版本以后,jdbctemplate中的queryForInt已经被取消了,  如今,所有用queryForObject了(包括queryForLong),queryForObject能代替queryForInt方法。关于这个问题,推荐一篇博客:http://jackyrong.iteye.com/blog/2086255spring

 既然说到了方法queryForObject,那么接下来简单说说此方法的几点注意事项:sql

 public int getMatchCount(String userName, String password) {
        String sqlStr = "select count(*) from t_user where user_name=? and password=?";
        Object args[] = new Object[]{userName, password};
        return jdbcTemplate.queryForObject(sqlStr, new Object[] {userName, password},integer.class); //注意,这段代码与书上不一样,若用书上那段代码确定会报错
    }

queryForObject方法的写法:queryForObject(String sql, Object[] args, Class<T> requiredType){}数据库

       (1)JdbcTemple.queryForObject 返回都是单行单列一个数据,也就是说只能返回一条记录app

       (2)queryForObject()方法中,第三个参数是用来写返回值的类型的,若是须要返回的是int类型,就写Integer.class,须要返回long类型就写long.class.dom

2.UserServiceTestjsp

package com.baobaotao.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.baobaotao.domain.User;
import com.baobaotao.services.UserService;

import static org.junit.Assert.assertTrue;
/**
 * Created by RACHEL on 2017/10/11.
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext.xml"})//assign spring profile
public class UserServiceTest {
    @Autowired
    private UserService userService;
    @Test
    //mark the manner of test
    public void hasMatchUser() throws Exception {
        boolean b1 = userService.hasMatchUser("aa","123"); //注意,这段测试代码不要照着书写,应该对应改为你在数据库中的用户名和密码;
boolean b2 = userService.hasMatchUser("aa","1223"); 换句话说,这里设置的用户名和密码必须与你在数据库中设置的同样,不然会找不到页面 assertTrue(b1); assertTrue(!b2); } @Test public void findUserByUserName() throws Exception { User user = userService.findUserByUserName("aa"); //用户名必须与数据库设置的用户名匹配 } }

3.web.xml文件学习

<servlet>
  <servlet-name>demo7</servlet-name>
  <servlet-class>
    org.springframework.web.servlet.DispatcherServlet
  </servlet-class>
  <load-on-startup>3</load-on-startup>
</servlet>

<servlet-mapping>
  <servlet-name>demo7</servlet-name>
  <url-pattern>*.html</url-pattern>
</servlet-mapping>
</web-app>

注意,<servlet-name>……</servlet-name>中,必须是你的工程名,不要写错成baobaotao。我当时就是由于这个缘由,一直报错,404找不到页面,倒腾了一天。But,若是你们将工程名和main下面的文件名都设置成baobaotao,也就没这么多事了。。

4.servlet.xml文件

<bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver"
        p:viewClass="org.springframework.web.servlet.view.JstlView" 
        p:prefix="/WEB-INF/"
        p:suffix=".jsp" />

</beans>

 若是你没有在WEB-INF下面建jsp文件夹,而是直接把main.jsp和login.jsp直接放到WEB-INF下, p:prefix="/WEB-INF/jsp"。这段代码表示的是你.jsp文件的存储路径,因此必须与本身对应的路径一直,不然会由于找不到路径报404错。


最后,给你们推荐一篇不错的博文,当时学习时,对个人帮助仍是挺大的,以此共勉:http://www.cnblogs.com/yangyquin/p/5289604.html

相关文章
相关标签/搜索