Day-1 記錄自己學習spring的筆記
提要:根據《Spring 3.x 企業應用開發實戰》開頭一個用戶登錄的例子,按照上面敲的。
1.項目分層
dao:持久層
domain:領域對象(個人理解為數據表映射成一個Java類)
service:業務層
web:展現層
2.構建數據表
2.1 數據庫采用MySql 5.x 版本
2.2 建立兩個數據表 user 和 user_log 表 user 用來存放用戶信息,user_log用來存放user登錄信息
2.3 user:
user_log:
3.編寫UserDao、LoginLogDao類
3.1 UserDao
1 package com.zwy.dao;
2
3 import java.sql.ResultSet;
4 import java.sql.SQLException;
5
6 import org.springframework.beans.factory.annotation.Autowired;
7 import org.springframework.jdbc.core.JdbcTemplate;
8 import org.springframework.jdbc.core.RowCallbackHandler;
9 import org.springframework.stereotype.Repository;
10
11 import com.zwy.domain.User;
12
13 /**
14 * 通過@Repository注解定義一個DAO
15 * */
16 @Repository
17 public class UserDao {
18 @Autowired//自動注入JdbcTemplate
19 private JdbcTemplate jdbcTemplate;
20
21 /**
22 * 查詢用戶是否存在
23 * */
24 public int getMacthCount(String username,String password){
25 String sql="SELECT COUNT(*) FROM user WHERE user_name=? and password=? ";
26 return jdbcTemplate.queryForInt(sql, username,password);
27 }
28 /**
29 * 根據username找到相應的user 記錄(對象)
30 * */
31 public User findUserByUserName(final String username){
32 String sql="SELECT id,user_name,credits FROM user WHERE user_name=?";
33 final User user=new User();
34 jdbcTemplate.query(sql, new Object[]{username}, new RowCallbackHandler() {
35 public void processRow(ResultSet reSet) throws SQLException {
36 user.setId(reSet.getInt("id"));
37 user.setUserName(reSet.getString("user_name"));
38 user.setCredits(reSet.getInt("credits"));
39 }
40 });
41 return user;
42 }
43 /**
44 * 根據useid更新相應的user (對象)在數據庫中的記錄
45 * 更新積分,登錄IP,登錄時間
46 * */
47 public void updateLoginInfo(User user){
48 String sql="UPDATE user SET credits=?,last_ip=?,last_time=?"
49 +" WHERE id=?";
50 jdbcTemplate.update(sql, user.getCredits(),user.getLastIp(),user.getLastTime(),user.getId());
51 }
52 }
3.2 LoginLogDao類
package com.zwy.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import com.zwy.domain.UserLog;
@Repository
public class LoginLogDao {
@Autowired
private JdbcTemplate jdbcTemplate;
/**
* 插入一條登錄記錄
* */
public void insertLoginLog(UserLog user){
String sql="INSERT INTO user_log(user_id,ip,log_time)"
+" VALUES (?,?,?)";
jdbcTemplate.update(sql,user.getUserId(),user.getIp(),user.getLogTime());
}
}
省略了domain 實體類的代碼
4.業務層UserService的代碼
通過業務層組織持久化層的DAO完成業務邏輯操作
package com.zwy.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zwy.dao.LoginLogDao;
import com.zwy.dao.UserDao;
import com.zwy.domain.User;
import com.zwy.domain.UserLog;
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Autowired
private LoginLogDao loginLogDao;
/**
* 登錄業務
* */
public boolean userLogin(String username,String password){
int count=userDao.getMacthCount(username, password);
return count>0;
}
/**
* 根據username找到User對象
* */
public User finUserByUserName(String username){
User user=userDao.findUserByUserName(username);
return user;
}
/**
* 成功登錄,更新user的積分並添加到user_log
* */
public void successLoginLog(User user){
if(user!=null){
user.setCredits(5+user.getCredits());
UserLog userLog=new UserLog();
userLog.setUserId(user.getId());
userLog.setIp(user.getLastIp());
userLog.setLogTime(user.getLastTime());
userDao.updateLoginInfo(user);
loginLogDao.insertLoginLog(userLog);
}
}
}
5.配置applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">
<!--1. 掃描類包,把標注spring注解的類自動轉化成bean,同時完成bean的注入 -->
<context:component-scan base-package="com.zwy.dao"/>
<context:component-scan base-package="com.zwy.service" />
<!-- 2.定義一個使用DBCP的數據源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="com.mysql.jdbc.Driver"
p:url="jdbc:mysql://192.168.1.106:3306/spring"
p:username="root"
p:password="123456"
/>
<!-- 3.定義Spring-JDBC模板bean-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource" />
<!--4.配置事務管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
p:dataSource-ref="dataSource"
/>
<!--5.配置AOP,讓service包下的方法處於增強事務中-->
<aop:config proxy-target-class="true">
<aop:pointcut expression=" execution(* com.zwy.service..*(..))" id="serviceMethod"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
</beans>
6.在Junit4下測試Service的方法
package com.zwy.service;
import java.util.Date;
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.zwy.domain.User;
@RunWith(SpringJUnit4ClassRunner.class)//1.基於junit4的spring測試框架
@ContextConfiguration(locations={"/applicationContext.xml"})//2.啟動spring容器
public class TestService {
@Autowired
private UserService userService;
@org.junit.Test
public void userLogin(){
boolean b1=userService.userLogin("admin", "123456");
boolean b2=userService.userLogin("admin", "1111");
System.out.println(b1+","+b2);
}
@org.junit.Test
public void findUser(){
User user=userService.finUserByUserName("admin");
System.out.println(user);
}
@Test
public void successLog(){
User user=userService.finUserByUserName("admin");
user.setLastIp("192.168.1.101");
user.setLastTime(new Date());
userService.successLoginLog(user);
}
}
7.編寫Web層,用到SpringMVC框架
ModelAndView 是這個包下的org.springframework.web.servlet.ModelAndView;不要搞成其他包下相同名字的類
package com.zwy.web;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.zwy.domain.User;
import com.zwy.service.UserService;
//標注成為springMVC controller
@Controller
public class LoginController {
@Autowired
private UserService userService;
//來自處理index.html
@RequestMapping(value="/index.html")
public String loginPage(){
return "login";
}
//來自處理loginCheck.html的請求
@RequestMapping(value="/loginCheck.html")
public ModelAndView loginCheck(HttpServletRequest request,LoginCommod loginCommod){
boolean isLogin=userService.userLogin(loginCommod.getUsername(), loginCommod.getPassword());
if(isLogin){
User user=userService.finUserByUserName(loginCommod.getUsername());
user.setLastIp(request.getRemoteAddr());
user.setLastTime(new Date());
userService.successLoginLog(user);
request.getSession().setAttribute("user", user);
return new ModelAndView("main");
}else {
//參數1:邏輯視圖名 參數2:數據模型 ---參數3:數據對象
//request會以(數據模型,數據對象)的形勢返回。
return new ModelAndView("login", "error", "用戶名或者密碼錯誤!");
}
}
}
1 package com.zwy.web;
2 //封裝了form表單提交的信息
3 public class LoginCommod {
4 private String username;
5 private String password;
6 public String getUsername() {
7 return username;
8 }
9 public void setUsername(String username) {
10 this.username = username;
11 }
12 public String getPassword() {
13 return password;
14 }
15 public void setPassword(String password) {
16 this.password = password;
17 }
18
19 }
8配置web.xml
web容器自動啟動Spring容器
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 3 <!--1. 從類路徑下加載spring配置文件,classpath關鍵字特指類路徑下加載 --> 4 <context-param> 5 <param-name>contextConfigLocation</param-name> 6 <param-value>classpath:applicationContext.xml</param-value> 7 </context-param> 8 <!-- 2.負責啟動spring容器監聽器,它將引用1處的上下文參數獲得spring配置文件地址 --> 9 <listener> 10 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 11 </listener> 12 <!-- spring MVC主控制的servlet --> 13 <servlet> 14 <!-- spring MVC的配置文件的名字 serviletName-servlet.xml --> 15 <servlet-name>zwy</servlet-name> 16 <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class> 17 <!-- 18 1)load-on-startup元素標記容器是否在啟動的時候就加載這個servlet(實例化並調用其init()方法)。 19 2)正數的值越小,該servlet的優先級越高,應用啟動時就越先加載。 20 --> 21 <load-on-startup>2</load-on-startup> 22 </servlet> 23 <!-- spring MVC處理的URL --> 24 <servlet-mapping> 25 <servlet-name>zwy</servlet-name> 26 <url-pattern>*.html</url-pattern> 27 </servlet-mapping> 28 <welcome-file-list> 29 <welcome-file>index.jsp</welcome-file> 30 </welcome-file-list> 31 </web-app>
9.配置zwy-servlet.xml
放在WEB-INF目錄下,放在src目錄下報錯
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
">
<!-- 1.掃描web包,應用Spring注解 -->
<context:component-scan base-package="com.zwy.web" />
<!--
2.配置視圖解析器,將ModelAndView及字符串解析為具體的頁面
prefix指定在視圖名所添加的前綴
suffix指定在視圖名後添加的後綴
InternalResourceViewResolver:通過在邏輯視圖名前後加後綴
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:viewClass="org.springframework.web.servlet.view.JstlView"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp"
/>
</beans>
**注意 加入log4j日志框架,否則Spring框架會報錯