實戰 :Spring MVC + 註解 +SqlServer 框架搭建及詳解
原始碼下載:http://download.csdn.NET/detail/u010469432/6786687
https://blog.csdn.net/u010469432/article/details/17587699
先說一下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檔案
[html] view plain copy
<?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名稱一致。
[html] view plain copy
<?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資料庫
[html] view plain copy
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檔案-->)
[html] view plain copy
<?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這是我封裝好的工具類直接使用就可以了。
[html] view plain copy
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頁面:
[html] view plain copy
<%@ 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
[html] view plain copy
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
[html] view plain copy
package com.yfapp.platform.service;
import com.yfapp.platform.entity.Admin;
public interface AdminService{
//登陸
Admin login(Admin admin);
}
[html] view plain copy
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的思想。使用了泛型。
[html] view plain copy
package com.yfapp.platform.dao;
import java.io.Serializable;
public interface BaseDao<PO,ID extends Serializable> {
}
[html] view plain copy
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
[html] view plain copy
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;
}
[html] view plain copy
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 {
&nb