以下要讲的案例来自于《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框架实现用户登录实例的更多相关文章

  1. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  2. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(四)——对 run.py 的调整

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  3. Django:用户登录实例

    Django:用户登录实例 一.源代码 1,login.html代码(登录界面): <!DOCTYPE html> <html lang="zh-CN"> ...

  4. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  5. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  6. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  7. 最新 Eclipse IDE下的Spring框架配置及简单实例

    前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...

  8. vue新手入门之使用vue框架搭建用户登录注册案例,手动搭建webpack+Vue项目(附源码,图文详解,亲测有效)

    前言 本篇随笔主要写了手动搭建一个webpack+Vue项目,掌握相关loader的安装与使用,包括css-loader.style-loader.vue-loader.url-loader.sass ...

  9. 基于Servlet的MVC模式用户登录实例

    关于MVC模式的简单解释 M Model,模型层,例如登录实例中,用于处理登录操作的类: V View,视图层,用于展示以及与用户交互.使用html.js.css.jsp.jQuery等前端技术实现: ...

随机推荐

  1. c# 浮点数计算问题

    给大家看个计算题,看看大家的算术能力. 0.1 +0.1 +0.1 - 0.3 等于几? 大家可能会说这么简单的问题,是不是看不起我?肯定等于0啊. 如果大家直接算的是没有问题的,但是如果用计算机呢? ...

  2. [05] 利用private来封装

    我们知道,面向对象开发的三大特点是:封装性.继承性.多态性 所谓封装性,实际上是表达了一种信息隐藏.从表面上来阐述,就是使用private修饰符来对属性或者方法进行信息隐藏,而使用public的方法控 ...

  3. Qt Creator编译运行成功,但是显示系统找不到指定的文件(比如urlmon.dll动态链接库)

    问题: 以前自己写的一个QT界面程序,在win 7 的32位系统上运行没有出现任何问题,但是重装系统之后,同样的程序放到win10 的64位系统下运行会出现警告:onecoreuap\inetcore ...

  4. Laravel的Nginx重写规则完整代码

    laravel基本重写规则 location / { index index.html index.htm index.php; try_files $uri $uri/ /index.php?$qu ...

  5. cnblogs第一天

    2017-08-25 21:27:16 今天算是真的下定决心要好好的去经营自己的博客了. flag也就不立了,毕竟,flag这种东西立了就是为了打脸的嘛....... 既然说是经营了,那必然是要认认真 ...

  6. Android 之xml解析

    HTTP网络传输中的数据组织方式有三种方式:1.HTML方式2.XML方式 3.JSON方式 XML称为可扩展标记语言,它与HTML一样,都是SGML(标准通用标记语言) XML是Internet环境 ...

  7. 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\ ...

  8. Java对象克隆详解

    原文:http://www.cnblogs.com/Qian123/p/5710533.html 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = appl ...

  9. 使用Gateway-Worker实现多人分组实时聊天 结合第三方tp

    一.基础知识1.Workerman是一款纯PHP开发的开源高性能的PHP socket 服务器框架.被广泛的用于手机app.移动通讯等领域的开发. 支持TCP长连接,支持Websocket.HTTP等 ...

  10. vue+axios 前端实现登录拦截(路由拦截、http拦截)

    一.路由拦截 登录拦截逻辑 第一步:路由拦截 首先在定义路由的时候就需要多添加一个自定义字段requireAuth,用于判断该路由的访问是否需要登录.如果用户已经登录,则顺利进入路由, 否则就进入登录 ...