使用Spring框架实现用户登录实例
以下要讲的案例来自于《Spring 3.X 企业应用开发实战》这本书。
针对我一周的摸索,现在总结几个易错点,当然,这是在我自己犯过错误的前提下总结出来的,如果有说的不到位的地方,欢迎大家指出。所使用的代码均出自《Spring 3.X 企业应用开发实战》chapter2,代码什么的都不重要,差别不大,主要是配置容易出问题。
1.UserDao的代码
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/2086255
既然说到了方法queryForObject,那么接下来简单说说此方法的几点注意事项:
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 返回都是单行单列一个数据,也就是说只能返回一条记录
(2)queryForObject()方法中,第三个参数是用来写返回值的类型的,如果需要返回的是int类型,就写Integer.class,需要返回long类型就写long.class.
2.UserServiceTest
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
使用Spring框架实现用户登录实例的更多相关文章
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(四)——对 run.py 的调整
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- Django:用户登录实例
Django:用户登录实例 一.源代码 1,login.html代码(登录界面): <!DOCTYPE html> <html lang="zh-CN"> ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- 最新 Eclipse IDE下的Spring框架配置及简单实例
前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...
- vue新手入门之使用vue框架搭建用户登录注册案例,手动搭建webpack+Vue项目(附源码,图文详解,亲测有效)
前言 本篇随笔主要写了手动搭建一个webpack+Vue项目,掌握相关loader的安装与使用,包括css-loader.style-loader.vue-loader.url-loader.sass ...
- 基于Servlet的MVC模式用户登录实例
关于MVC模式的简单解释 M Model,模型层,例如登录实例中,用于处理登录操作的类: V View,视图层,用于展示以及与用户交互.使用html.js.css.jsp.jQuery等前端技术实现: ...
随机推荐
- c# 浮点数计算问题
给大家看个计算题,看看大家的算术能力. 0.1 +0.1 +0.1 - 0.3 等于几? 大家可能会说这么简单的问题,是不是看不起我?肯定等于0啊. 如果大家直接算的是没有问题的,但是如果用计算机呢? ...
- [05] 利用private来封装
我们知道,面向对象开发的三大特点是:封装性.继承性.多态性 所谓封装性,实际上是表达了一种信息隐藏.从表面上来阐述,就是使用private修饰符来对属性或者方法进行信息隐藏,而使用public的方法控 ...
- Qt Creator编译运行成功,但是显示系统找不到指定的文件(比如urlmon.dll动态链接库)
问题: 以前自己写的一个QT界面程序,在win 7 的32位系统上运行没有出现任何问题,但是重装系统之后,同样的程序放到win10 的64位系统下运行会出现警告:onecoreuap\inetcore ...
- Laravel的Nginx重写规则完整代码
laravel基本重写规则 location / { index index.html index.htm index.php; try_files $uri $uri/ /index.php?$qu ...
- cnblogs第一天
2017-08-25 21:27:16 今天算是真的下定决心要好好的去经营自己的博客了. flag也就不立了,毕竟,flag这种东西立了就是为了打脸的嘛....... 既然说是经营了,那必然是要认认真 ...
- Android 之xml解析
HTTP网络传输中的数据组织方式有三种方式:1.HTML方式2.XML方式 3.JSON方式 XML称为可扩展标记语言,它与HTML一样,都是SGML(标准通用标记语言) XML是Internet环境 ...
- vim下处理文档中的\r\n\t字符
问题复现 拿到的文档中包含了大量的\r.\n.\t等字符,形如: \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\ ...
- Java对象克隆详解
原文:http://www.cnblogs.com/Qian123/p/5710533.html 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = appl ...
- 使用Gateway-Worker实现多人分组实时聊天 结合第三方tp
一.基础知识1.Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架.被广泛的用于手机app.移动通讯等领域的开发. 支持TCP长连接,支持Websocket.HTTP等 ...
- vue+axios 前端实现登录拦截(路由拦截、http拦截)
一.路由拦截 登录拦截逻辑 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录.如果用户已经登录,则顺利进入路由, 否则就进入登录 ...