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

相關文章
相關標籤/搜索