1. 程式人生 > >實戰 :Spring MVC + 註解 +SqlServer 框架搭建及詳解

實戰 :Spring MVC + 註解 +SqlServer 框架搭建及詳解

先說一下Spring3 MVC的優點:

spring MVC 屬於輕量級框架

1、Spring3 MVC的學習難度小於Struts2,Struts2用不上的多餘功能太多。呵呵,當然這不是決定因素。

2、Spring3 MVC很容易就可以寫出效能優秀的程式,Struts2要處處小心才可以寫出效能優秀的程式(指MVC部分)

3、Spring3 MVC的靈活是你無法想像的,Spring的擴充套件性有口皆碑,Spring3 MVC當然也不會落後,不會因使用了MVC框架而感到有任何的限制。

對於SpringMVC的一些文件型理論知識我不再多加贅述,今天主要是一步一步的開始搭建框架,當然這是我工作中的成果。

不多說,上程式碼:

1.建立Web project,我使用的是myeclipse。起名為Springmvc(名字自定)


2.引用SpringMVC 需要的核心jar包:


3.配置web.xml檔案

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	version="2.5">
	<!-- 配置監聽器 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!-- 在專案啟動時,載入Src/config下的所有以 spring- 開頭的.xml 配置檔案 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:config/spring-*.xml</param-value>
	</context-param>
	<!--專案啟動後預設開啟的頁面 -->
	<welcome-file-list>
		<welcome-file>login.jsp</welcome-file>
	</welcome-file-list>
	<!--這裡的配置是關鍵,servlet-name  -->
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 配置載入相應的檔案 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath*:config/springmvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<!-- 配置servlet對映  
	  在訪問URL時路徑要寫為:  /service/+ Controller 層@RequestMapping("/admin") 中的admin /+方法上的@RequestMapping(value = "/login")中的 login 
	 例如  登陸表單  提交的action就是     /service/admin/login -->
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/service/*</url-pattern>
	</servlet-mapping>

</web-app>


4.配置Spring.xml檔案,此檔案的名稱必須與web.xml中的servlet-name名稱一致。

<?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:context="http://www.springframework.org/schema/context"
	xmlns:cache="http://www.springframework.org/schema/cache"   xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:jdbc="http://www.springframework.org/schema/jdbc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans  
            http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
            http://www.springframework.org/schema/context  
            http://www.springframework.org/schema/context/spring-context-3.1.xsd  
            http://www.springframework.org/schema/tx  
            http://www.springframework.org/schema/tx/spring-tx-3.1.xsd  
            http://www.springframework.org/schema/jdbc  
            http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
            http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd"
	default-autowire="byName">
	<!-- 自動搜尋@Controller標註的類 -->
	<context:component-scan base-package="com.yfapp.platform" />
	<context:annotation-config />

	<bean
		class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
	<!-- 啟動Spring MVC的註解功能,完成請求和註解POJO的對映 -->
	<bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name = "messageConverters">
		  <list>
		   <bean class="org.springframework.http.converter.StringHttpMessageConverter">
		   <property name="supportedMediaTypes">
		    <list>
		     <value>text/plain;charset=UTF-8</value>
		    </list>
		   </property>
		   </bean>
		  </list>
		</property>
	</bean>

	<!-- Default ViewResolver -->
	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		<property name="prefix" value="" />
		<property name="suffix" value=".jsp"></property>
	</bean>
 <!-- 啟用快取註解功能,這個是必須的,否則註解不會生效,另外,該註解一定要宣告在spring主配置檔案中才會生效 -->  
 <cache:annotation-driven cache-manager="cacheManager"/>  
<bean id="cacheManager" class="org.springframework.cache.concurrent.ConcurrentMapCacheManager" />   
</beans>

5.配置資料庫讀取檔案jdbc.properties放在類資料夾src下我這裡載入的是SqlServer資料庫

driverClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver     //連線的資料庫
url=jdbc:sqlserver://127.0.0.1:1433; DatabaseName=renji          
username=sa
password=admin


6.配置資料庫相關的檔案

spring-application.xml(檔名稱可以自定義,但是需要在web.xml檔案中載入這裡即對應web.xml中的<!--在你專案啟動時載入spring- 開頭的.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:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
	<!-- 讀取資原始檔   步驟5 的檔案 -->
	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="location" value="classpath:jdbc.properties" />
	</bean>
	<!-- 這個是Spring的注入技術   給org.apache.commons.dbcp.BasicDataSource 類的屬性注入對應的值 ,讀取資料庫配置資訊-->
	<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${driverClassName}"></property>
		<property name="password" value="${password}"></property>
		<property name="username" value="${username}"></property>
		<property name="url" value="${url}"></property>
	</bean>
	<!-- 這個是向第7步中的 DbUtilsTemplate.java 類的dataSource變數注入值  -->
	<bean id="dbUtilsTemplate" class="com.yfapp.platform.dao.template.DbUtilsTemplate"> 
        <property name="dataSource" ref="dataSource" /> 
	</bean> 
	
</beans>

7.資料庫操作類:DbUtilsTemplate.java這是我封裝好的工具類直接使用就可以了。

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.MapHandler;
import org.apache.commons.dbutils.handlers.MapListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class DbUtilsTemplate {
	private DataSource dataSource; 
	private QueryRunner queryRunner; 
	private static final Log LOG = LogFactory.getLog(DbUtilsTemplate.class); 

	public void setDataSource(BasicDataSource dataSource) { 
		this.dataSource = dataSource; 
	} 

	/** 
	 * 執行sql語句 
	 * @param sql sql語句 
	 * @return 受影響的行數 
	 */ 
	public int update(String sql) { 
		return update(sql, null); 
	} 

	/** 
	 * 執行sql語句 
	 * <code> 
	 * executeUpdate("update user set username = 'kitty' where username = ?", "hello kitty"); 
	 * </code> 
	 * @param sql sql語句 
	 * @param param 引數 
	 * @return 受影響的行數 
	 */ 
	public int update(String sql, Object param) { 
		return update(sql, new Object[] { param }); 
	} 

	/** 
	 * 執行sql語句 
	 * @param sql sql語句 
	 * @param params 引數陣列 
	 * @return 受影響的行數 
	 */ 
	public int update(String sql, Object[] params) { 
		queryRunner = new QueryRunner(dataSource,true); 
		int affectedRows = 0; 
		try { 
			if (params == null) { 
				affectedRows = queryRunner.update(sql); 
			} else { 
				affectedRows = queryRunner.update(sql, params); 
			} 
		} catch (SQLException e) { 
			LOG.error("Error occured while attempting to update data", e); 
		} 
		return affectedRows; 
	} 

	/** 
	 * 執行批量sql語句 
	 * @param sql sql語句 
	 * @param params 二維引數陣列 
	 * @return 受影響的行數的陣列 
	 */ 
	public int[] batchUpdate(String sql, Object[][] params) { 
		queryRunner = new QueryRunner(dataSource,true); 
		int[] affectedRows = new int[0]; 
		try { 
			affectedRows = queryRunner.batch(sql, params); 
		} catch (SQLException e) { 
			LOG.error("Error occured while attempting to batch update data", e); 
		} 
		return affectedRows; 
	}     

	/** 
	 * 執行查詢,將每行的結果儲存到一個Map物件中,然後將所有Map物件儲存到List中 
	 * @param sql sql語句 
	 * @return 查詢結果 
	 */ 
	public List<Map<String, Object>> queryForList(String sql) { 
		return queryForList(sql, null);
	} 

	/** 
	 * 執行查詢,將每行的結果儲存到一個Map物件中,然後將所有Map物件儲存到List中 
	 * @param sql sql語句 
	 * @param param 引數 
	 * @return 查詢結果 
	 */ 
	public List<Map<String, Object>> queryForList(String sql, Object param) { 
		return queryForList(sql, new Object[] {param}); 
	} 

	/** 
	 * 執行查詢,將每行的結果儲存到一個Map物件中,然後將所有Map物件儲存到List中 
	 * @param sql sql語句 
	 * @param params 引數陣列 
	 * @return 查詢結果 
	 */ 
	@SuppressWarnings("unchecked") 
	public List<Map<String, Object>> queryForList(String sql, Object[] params) { 
		queryRunner = new QueryRunner(dataSource,true); 
		List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); 
		try { 
			if (params == null) { 
				list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler()); 
			} else { 
				list = (List<Map<String, Object>>) queryRunner.query(sql, new MapListHandler(), params); 
			} 
		} catch (SQLException e) { 
			LOG.error("Error occured while attempting to query data", e); 
		} 
		return list; 
	} 

	/** 
	 * 執行查詢,將每行的結果儲存到Bean中,然後將所有Bean儲存到List中 
	 * @param entityClass 類名 
	 * @param sql sql語句 
	 * @return 查詢結果 
	 */ 
	public <T> List<T> queryForList(Class<T> entityClass, String sql) { 
		return queryForList(entityClass, sql, null); 
	} 

	/** 
	 * 執行查詢,將每行的結果儲存到Bean中,然後將所有Bean儲存到List中 
	 * @param entityClass 類名 
	 * @param sql sql語句 
	 * @param param 引數 
	 * @return 查詢結果 
	 */ 
	public <T> List<T> queryForList(Class<T> entityClass, String sql, Object param) { 
		return queryForList(entityClass, sql, new Object[] { param }); 
	} 

	/** 
	 * 執行查詢,將每行的結果儲存到Bean中,然後將所有Bean儲存到List中 
	 * @param entityClass 類名 
	 * @param sql sql語句 
	 * @param params 引數陣列 
	 * @return 查詢結果 
	 */ 
	@SuppressWarnings("unchecked") 
	public <T> List<T> queryForList(Class<T> entityClass, String sql, Object[] params) { 
		queryRunner = new QueryRunner(dataSource,true); 
		List<T> list = new ArrayList<T>(); 
		try { 
			if (params == null) { 
				list = (List<T>) queryRunner.query(sql, new BeanListHandler(entityClass)); 
			} else { 
				list = (List<T>) queryRunner.query(sql, new BeanListHandler(entityClass), params); 
			} 
		} catch (SQLException e) { 
			LOG.error("Error occured while attempting to query data", e); 
		} 
		return list; 
	} 

	/** 
	 * 查詢出結果集中的第一條記錄,並封裝成物件 
	 * @param entityClass 類名 
	 * @param sql sql語句 
	 * @return 物件 
	 */ 
	public <T> T query(Class<T> entityClass, String sql) { 
		return queryFirst(entityClass, sql, null); 
	} 

	/** 
	 * 查詢出結果集中的第一條記錄,並封裝成物件 
	 * @param entityClass 類名 
	 * @param sql sql語句 
	 * @param param 引數 
	 * @return 物件 
	 */ 
	public <T> T queryFirst(Class<T> entityClass, String sql, Object param) { 
		return queryFirst(entityClass, sql, new Object[] { param }); 
	} 

	/** 
	 * 查詢出結果集中的第一條記錄,並封裝成物件 
	 * @param entityClass 類名 
	 * @param sql sql語句 
	 * @param params 引數陣列 
	 * @return 物件 
	 */ 
	@SuppressWarnings("unchecked") 
	public <T> T queryFirst(Class<T> entityClass, String sql, Object[] params) { 
		queryRunner = new QueryRunner(dataSource,true); 
		Object object = null; 
		try { 
			if (params == null) { 
				object = queryRunner.query(sql, new BeanHandler(entityClass)); 
			} else { 
				object = queryRunner.query(sql, new BeanHandler(entityClass), params); 
			} 
		} catch (SQLException e) { 
			LOG.error("Error occured while attempting to query data", e); 
		} 
		return (T) object; 
	} 

	/** 
	 * 查詢出結果集中的第一條記錄,並封裝成Map物件 
	 * @param sql sql語句 
	 * @return 封裝為Map的物件 
	 */ 
	public Map<String, Object> queryFirst(String sql) { 
		return queryFirst(sql, null); 
	} 

	/** 
	 * 查詢出結果集中的第一條記錄,並封裝成Map物件 
	 * @param sql sql語句 
	 * @param param 引數 
	 * @return 封裝為Map的物件 
	 */ 
	public Map<String, Object> queryFirst(String sql, Object param) { 
		return queryFirst(sql, new Object[] { param }); 
	} 

	/** 
	 * 查詢出結果集中的第一條記錄,並封裝成Map物件 
	 * @param sql sql語句 
	 * @param params 引數陣列 
	 * @return 封裝為Map的物件 
	 */ 
	@SuppressWarnings("unchecked") 
	public Map<String, Object> queryFirst(String sql, Object[] params) { 
		queryRunner = new QueryRunner(dataSource,true); 
		Map<String, Object> map = null; 
		try { 
			if (params == null) { 
				map = (Map<String, Object>) queryRunner.query(sql, new MapHandler()); 
			} else { 
				map = (Map<String, Object>) queryRunner.query(sql, new MapHandler(), params); 
			} 
		} catch (SQLException e) { 
			LOG.error("Error occured while attempting to query data", e); 
		} 
		return map; 
	} 

	/** 
	 * 查詢某一條記錄,並將指定列的資料轉換為Object 
	 * @param sql sql語句 
	 * @param columnName 列名 
	 * @return 結果物件 
	 */ 
	public Object queryForObject(String sql, String columnName) { 
		return queryForOjbect(sql, columnName, null); 
	} 

	/** 
	 * 查詢某一條記錄,並將指定列的資料轉換為Object 
	 * @param sql sql語句 
	 * @param columnName 列名 
	 * @param param 引數 
	 * @return 結果物件 
	 */ 
	public Object queryForObject(String sql, String columnName, Object param) { 
		return queryForOjbect(sql, columnName, new Object[] { param }); 
	} 

	/** 
	 * 查詢某一條記錄,並將指定列的資料轉換為Object 
	 * @param sql sql語句 
	 * @param columnName 列名 
	 * @param params 引數陣列 
	 * @return 結果物件 
	 */ 
	public Object queryForOjbect(String sql, String columnName, Object[] params) { 
		queryRunner = new QueryRunner(dataSource,true); 
		Object object = null; 
		try { 
			if (params == null) { 
				object = queryRunner.query(sql, new ScalarHandler(columnName)); 
			} else { 
				object = queryRunner.query(sql, new ScalarHandler(columnName), params); 
			} 
		} catch (SQLException e) { 
			LOG.error("Error occured while attempting to query data", e); 
		} 
		return object; 
	} 

	/** 
	 * 查詢某一條記錄,並將指定列的資料轉換為Object 
	 * @param sql sql語句 
	 * @param columnIndex 列索引 
	 * @return 結果物件 
	 */ 
	public Object queryForObject(String sql, int columnIndex) { 
		return queryForObject(sql, columnIndex, null); 
	} 

	/** 
	 * 查詢某一條記錄,並將指定列的資料轉換為Object 
	 * @param sql sql語句 
	 * @param columnIndex 列索引 
	 * @param param 引數 
	 * @return 結果物件 
	 */ 
	public Object queryForObject(String sql, int columnIndex, Object param) { 
		return queryForObject(sql, columnIndex, new Object[] { param }); 
	} 

	/** 
	 * 查詢某一條記錄,並將指定列的資料轉換為Object 
	 * @param sql sql語句 
	 * @param columnIndex 列索引 
	 * @param params 引數陣列 
	 * @return 結果物件 
	 */ 
	public Object queryForObject(String sql, int columnIndex, Object[] params) { 
		queryRunner = new QueryRunner(dataSource,true); 
		Object object = null; 
		try { 
			if (params == null) { 
				object = queryRunner.query(sql, new ScalarHandler(columnIndex)); 
			} else { 
				object = queryRunner.query(sql, new ScalarHandler(columnIndex), params); 
			} 
		} catch (SQLException e) { 
			LOG.error("Error occured while attempting to query data", e); 
		} 
		return object; 
	} 
	/**
	 * 獲取記錄數
	 * @param sql
	 * @param entityClass
	 * @return 結果物件
	 */
	public Object  getCount(String sql,Class entityClass){
		queryRunner = new QueryRunner(dataSource,true); 
		Object i=null;
		try {
			List list = (List) queryRunner.query(sql, new BeanListHandler(entityClass));
			if(list.size()>0){
				i=list.get(0);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return i;
	}

	/**
	 * 獲取記錄數
	 * @param sql
	 * @param entityClass
	 * @param param
	 * @return 結果物件
	 */
	public Object getCount(String sql,Class entityClass,Object param ){
		return getCount(sql,entityClass,new Object[] { param });
	}
	/**
	 * 獲取記錄數
	 * @param sql
	 * @param entityClass
	 * @param Object[] params
	 * @return 結果物件
	 */
	public Object getCount(String sql,Class entityClass,Object[] params ){
		queryRunner = new QueryRunner(dataSource,true);
		Object i=null;
		try{
			if (params == null) {
				i= getCount(sql,entityClass);
			}else{
				List list = (List) queryRunner.query(sql, new BeanListHandler(entityClass),params);
				if(list.size()>0){
					i=list.get(0);
				}
			}
		}catch (Exception e) {
		}
		return i;
	}
} 
8。到此為止,框架已經搭建成功了,可以啟動一下專案,


啟動成功!

下面我寫個測試例子大家看一下:

我的專案是寫成了三層分開的架構,控制層(Controller),服務層介面(Service),服務層實現類(ServiceImpl),資料庫操作介面(Dao),資料庫操作實現類(DaoImpl).


1.login頁面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>

	<form action="service/admin/login" method="post">
		<div class="user clr">
			<span class="fl">管 理 員 :</span><input name="adminCode" type="text"
				class="fl " />
		</div>
		<div class="user clr">
			<span class="fl">密    碼 :</span><input
				name="adminPwd" type="password" class="fl" />
		</div>
		<div class="user clr">
			<input name="" type="reset" value="重 置" class="cancel_btn fr" /><input
				name="" type="submit" class="login_btn fr" value="登 錄" />
		</div>
	</form>

</body>
</html>

2.Controller(控制)層的程式碼:AdminController.java
package com.yfapp.platform.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.yfapp.platform.entity.Admin;
import com.yfapp.platform.service.AdminService;

@Controller
@RequestMapping("/admin")
public class AdminController {
	@Autowired
	private AdminService adminService;

	/**
	 * 管理員登陸
	 * @param admin    登陸傳入的使用者物件
	 * @return String  要跳轉到的頁面
	 */
	@RequestMapping(value = "/login")
	public String login(HttpServletRequest request, HttpServletResponse response, Admin admin) throws Throwable {
		Admin ad =new Admin();
		if(null!=admin.getAdminPwd()||null!=admin.getAdminCode()){
			ad = adminService.login(admin);
		}else{
			ad=null;
		}
		if (null != ad) {
			request.getSession().setAttribute("admin", ad);
			return "/indexhome";
		} else {
			request.setAttribute("imgs", "請重新登入!");
			return "/login";
		}
	}
}
3.服務層介面:AdminService.java  以及 服務層實現類AdminServiceImpl.java
package com.yfapp.platform.service;


import com.yfapp.platform.entity.Admin;

public interface AdminService{
	//登陸
	Admin login(Admin admin);
}
package com.yfapp.platform.service.impl;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.yfapp.platform.dao.AdminDao;
import com.yfapp.platform.entity.Admin;
import com.yfapp.platform.service.AdminService;

@Service("adminService")
public class AdminServiceImpl implements AdminService{
	@Autowired
	private AdminDao adminDao;

	/**
	 * 登陸
	 */
	public Admin login(Admin admin){
		return adminDao.login(admin);
	}
}
4.資料庫操作介面類  BaseDao.java   和  AdminDao.java

BaseDao.java是基礎的操作類,這裡面可以將寫一些基本的資料庫操作方法比如增刪改查,我這裡就不寫了,寫這個主要是對映資料庫連線,建立連線池。

AdminDao.java是功能模組的介面類,如果你要寫別的模組的時候只需要想AdminDao一樣繼承BaseDao就行,當然如果不需要BaseDao 也可以不寫BaseDao,這樣寫只是應用了java的思想。使用了泛型。

package com.yfapp.platform.dao;

import java.io.Serializable;

public interface BaseDao<PO,ID extends Serializable> {
	
}
package com.yfapp.platform.dao;


import com.yfapp.platform.entity.Admin;


public interface AdminDao extends BaseDao<Admin, Integer>{

	// 登陸
	Admin login(Admin admin);
}
5.資料庫操作介面實現類  BaseDaoImpl.java   和  AdminDaoImpl.java
package com.yfapp.platform.dao.impl;

import java.io.Serializable;

import org.springframework.beans.factory.annotation.Autowired;

import com.yfapp.platform.dao.BaseDao;
import com.yfapp.platform.dao.template.DbUtilsTemplate;


public class BaseDaoImpl<PO,ID extends Serializable> implements BaseDao<PO,ID>
{       //這個是之前說的資料庫操作幫助類,使用註解的方式,此變數在spring-application.xml中注入值。
	@Autowired
	protected DbUtilsTemplate dbUtilsTemplate;
}
package com.yfapp.platform.dao.impl;


import org.springframework.stereotype.Repository;

import com.yfapp.platform.dao.AdminDao;
import com.yfapp.platform.entity.Admin;

@Repository
public class AdminDaoImpl extends BaseDaoImpl<Admin, Integer> implements AdminDao {
	/**
	 * 管理員登陸
	 */
	public Admin login(Admin admin) {
		String sql="select adminCode,adminPwd,loginTime from yf_admin where adminCode=? and adminPwd=?";
		Object[] params = { admin.getAdminCode(),admin.getAdminPwd() };
		Admin ad = dbUtilsTemplate.queryFirst(Admin.class, sql, params);
		return ad;
	}
}

6。我的測試資料庫表結構,使用的是SqlServer:


7.登陸成功要跳轉的頁面:indexhome.jsp

<%@page import="com.yfapp.platform.entity.Admin"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";

	Admin admin = (Admin) request.getSession().getAttribute("admin");
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
	歡迎您:<%=admin.getAdminCode()%>|上次登入時間:<%=admin.getLoginTime()%>
	|今天是:
	<span id="webjx"><script>
		setInterval(
				"webjx.innerHTML=new Date().toLocaleString()+' 星期'+'日一二三四五六'.charAt(new Date().getDay());",
				1000);
	</script> </span>
</body>
</html>

8.重新執行專案:

測試結果:


點選登陸:


完了!