如下要講的案例來自於《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