使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM