2013年12月29日 星期日

Java connector to MySQL 設定

測試環境: Eclipse、Java、JDBC、MySQL、Windows7



本篇的筆記內容主要是記錄在Java 中透過JDBC連結至MySQL時所遇到的問題,要連上MySQL 當然必須要有一個趨動套件囉! 首先先上網去下載MySQL Connector driver的安裝程式,當執行安裝程式後,一執行你的Java 程式卻發生了找不到driver??? 怪了, 不是已經安裝好了 Connecotr了嗎?

筆記內容:
  • 下載 MySQL Connector/J 安裝程式
  • 撰寫Java程式
  • 設定方法一
  • 設定方法二
  • 執行結果




下載 MySQL Connector/J

到 MySQL 網頁上下載 MySQL Connector/J 的安裝程式: http://dev.mysql.com/downloads/connector/j/




執行安裝程式,預設的目錄是在 C:\Program Files(x86)\MySQL目錄中




撰寫 Java 程式

在Java 中只要簡單的透過JDBC 就可以連結到後端的 MySQL Database,當然你要先安裝好MySQL,以下程式有幾個地方要和你的環境有所對應,首先URL,我的環境中MySQL 是安裝在 192.168.1.11 的Windows server 2008 中,資料庫名稱是 Cal,Table Name 是 Test,其中有一個欄位是TOPIC(也要注意Windows server 2008的fire wall 是否有開放MySQL所使用到的Port)。其次是UserID 和Password也要改成你環境中的設定。


執行程式後,竟出現找到不 driver! 原來 MySQL Connecotr/J 的安裝程式只把必要的檔案複製到你的硬碟中,並未幫你設定好相關的開發環境。設定方式很簡單,有二種方式




設定方法一

第一種設定方法是從 eclipse IDE中來進行,由 IDE中Window->Preferences 開打 eclipse 設定視窗,找到Java/Installed JREs 項目,點選 Installed JRES中的 jre7(default) 再按 Edit 按鈕:


在JRE Definition 視窗中按下 “Add External JARS”按鈕:




找到 MySQL Connector J安裝的目錄,點選 “mysql-connector-java-5.1.28-bin.jar” 後按下"開啟舊檔"按鈕:


在JRE Definition 視窗中就可以看到已經加入的 JRE Library 設定,按下 "Finish”:



請將 eclipse 結束再重新開啟



設定方法二

先找到由 Connector 安裝程式安裝好的目錄,將 mysql-connecotr-java-5.1.28-bin.jar 複製


再將該檔案貼到 Jre7/lib/ext 目錄中即可





執行結果

透過上述二種方法中的任何一種,設定完成後,再執行一次,發現已經可以正常的遠端資料庫192.168.1.11中的 Test table 裡 Topic 欄位的值了。



2013年12月23日 星期一

修改 ASP.NET Identity 預設的 Table Name

測試環境: VS2013、MV5、Windows7



之前的幾篇有關 ASP.NET Identity 貼文中已經很清楚的了解如何新加入額外的欄位在Users Table 中,今天要來測試的是有沒有辦法由我們自行決定那些 ASP.NET Identity 架構所產生的Tables 的 Table Name呢?也許在您的應用程式中有某些特別的原因必須自行控制資料庫中Table 的名稱,包含由 ASP.NET Identity 所自動產生的系統 Tables,本文就來看看要如何達到這要的需求!



貼文內容:
  • 建立MVC5新專案並執行
  • 修改Tables Name
  • 啟動 Migration 功能
  • 更新資料庫
  • 執行結果




建立MVC5新專案

一樣透過VS2013 範本建立新專案, "檔案"=>"新增"=>”專案",選擇 Web 範本中的 “ASP.NET Web應用程式,按確定鍵後,於”新增ASP.NET專案”
視窗中點選"MVP”範本,並確定驗證方式是"個別使用者帳號"。完成專案建立後當您啟動系統,第一次登入時會自動ASP.NET Identity 所使用的那五個Tables(如下圖)





(請特別注意 ASPNetUsers中的第一個欄位名稱為Id)




修改Table Name

在AspNet.Identity抽象架構中二個主要的觀念就是 users 和 stores。 users 指的是系統中使用者的相關資訊,而stores 則是將使用者帳戶資訊儲存至資料來源(data source)中及由資料來源(data source)讀取出來。在ASP.NET Identity架構下最主要的二個組件(Assembly)是 Microsoft.AspNet.Identity.Core 及 Microsoft.AspNet.Identity.EntityFramework,這二個組件的主要功能正好就是對映到前述的二個觀念中。

在Identity.Core中有二個主要的 class : UserManager 及 RoleManager,其中UserManager可以說是最重要的,它是被使用來建立、搜尋/取得、移除:
  • Users
  • Passwords
  • Claims
  • Link to roles
  • Link to logins



而在 Microsoft.AspNet.Identity.EntityFramework的UserStore則負責將由UserManager所產生的使用者帳戶物件寫入至資料來源/由資料來源讀取出來。

由前述的說明中可以知道要想要達成的"資料表(table name )更名"需求可以從Microsoft.AspNet.Identity.EntityFramework中IdentityDbContext的 OnModelCreating() 來動手腳。



首先用 Dot Net Reflector 打開Microsoft.AspNet.Identity.EntityFramework,找到 IdentityDbContext class,檢視一下 OnModelCreating() 就會發現由系統自動產生的的預設Table Name就在這段程式中,同時注意到它是可覆寫的。



接下來要開始改寫的工作,先找到 “Models”目錄下的”IdentityModels.cs” 中的 ApplicationDbContext class (如下圖)



在這個class 中去覆寫 OnModelCreating() method



完整程式如下:
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Data.Entity;
using System.Linq.Expressions;

namespace ToDoProject.Models
{
   // You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
   public class ApplicationUser : IdentityUser
   {
       [Display(Name="所在城市")]
       public string HomeTown { get; set; }
       public DateTime? BirthDate { get; set; }
       public virtual ICollection<ToDo> ToDoes { get; set; }
   }

   public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
   {
       public ApplicationDbContext()
           : base("DefaultConnection")
       {
       }

       public DbSet<ToDo> ToDoes { get; set; }

       protected override void OnModelCreating(DbModelBuilder modelBuilder)
       {
           modelBuilder.Entity<IdentityUser>().ToTable("MyUsers").Property(p => p.Id).HasColumnName("UserId");
           modelBuilder.Entity<ApplicationUser>().ToTable("MyUsers").Property((Expression<Func<ApplicationUser, string>>)(u => u.UserName)).IsRequired();
           modelBuilder.Entity<ApplicationUser>().HasMany<IdentityUserRole>(u => u.Roles);
           modelBuilder.Entity<IdentityUserRole>().HasKey(r => new { UserId = r.UserId, RoleId = r.RoleId }).ToTable("MyUserRoles");
           modelBuilder.Entity<IdentityUserLogin>().HasKey(l => new { UserId = l.UserId, LoginProvider = l.LoginProvider, ProviderKey = l.ProviderKey }).ToTable("MyUserLogins").HasRequired<IdentityUser>(u => u.User);
           modelBuilder.Entity<IdentityUserClaim>().ToTable("MyUserClaims").HasRequired<IdentityUser>(u => u.User);
           modelBuilder.Entity<IdentityRole>().ToTable("MyRoles").Property((Expression<Func<IdentityRole, string>>)(r => r.Name)).IsRequired();
       }
   }
}




啟動 Migration功能



更新資料庫






更新資料庫成功後,透過伺服器總管,可以看到系統所產生的Table Name 已經都變成我們自行定義的名稱了,甚至連 Users Table 中的 Primary Key都由預設的ID改變成 UserId了。




參考文章:


2013年12月20日 星期五

建置一個支援google、Facebook帳號可登錄的MVC5應用程式

測試環境: VS2013、MV5、Windows7




用社交網站上的帳號來登錄至應用系統中的是當紅的技術應用(OAuth2、OpenID),在VS2013中非常的貼心的在即有的範本中建妥相關的程式,你只要依序操作建立新專案的步驟就能很容易的讓應用程式也趕上時代潮流。在本貼文中要來試試看如何讓你的應用程式可以使用Facebook、Google帳號來登入。同時也要嘗試為這些帳號增加額外的欄位。


貼文內容:
  • 建立MVC5新專案


  • 啟動Google 帳號登入功能
    • 修改 Startup.Auth.cs


  • 啟動 Facebook 帳號登入功能
    • 在 Facebook 中建立 App
    • 啟動 MVC5專案中 SSL 功能
    • 修改 Startup.Auth.cs


  • 幫帳戶增加額外欄位




建立MVC5新專案


新增=>專案=>ASP.NET Web 應用程式



選擇 MVC,按下 "變更驗證" 按鈕


選擇 “個別使用者帳戶”



啟動Google 帳號登入功能


開啟 App_Start/Startup.Auth.cs



將最後一行程式註解去除。



按F5執行程式,點選登入功能



在登入畫面中,點選"Google”按鈕,出現選擇帳戶的瀏覽器畫面(或點選 “新增帳戶"功能來登入新帳號),點選要用來登入的帳號



按下"接受"按鈕



按下"註冊"按鈕(也可以自行修改系統中的使用者名稱),這個註冊畫面只有在以新帳號第一次登錄系統時才會出現。





下圖是以Google 帳號登入成功的畫面。到此我們已經完成了讓我們的應用程式可以接受以Google 帳號登錄的功能了。



可以打開資料庫中的 AspNetUsers 表格有一筆記錄




啟動Facebook 帳號登入功能


1. 在瀏覽器中輸入  https://developers.facebook.com/apps 來登入Facebook
2. 登入Facebook開發者網頁中,如果你不是以開發者身份來登入,請執行"註冊為開發者"功能
3. 執行”Create a new App”功能


進行 Facebook 管理者功能中建立new App


執行 Create a new App



輸入 App名稱




記下 App ID 及 App Secret ,待會在我們 MVC5專案中必須填入這些資訊。



啟動MVC5專案中的 SSL 功能



記錄下 SSL URL




將上述的SSL URL 填入 Facebook App => Settings => Advanced => Valid OAuth redirect URIs 欄位中並按下 “Save Changes” 按鈕





修改 Startup.Auth.cs,將 app.UseFacebookAuthentication 註解拿掉,並加入 appId 及 appSecret。



在VS2013 按下F5執行程式



按下"登入" ,選擇 Facebook



按下註冊按鈕(你可以自行修改使用者名稱)




登入成功畫面



打開資料庫 AspNetUsers table :




幫帳戶新增額外欄位
建立MVC5新專案


接下來我們來看看如何幫這些外在帳戶資料新增額外的欄位。我們多加了二個欄位: 居住城市、生日。


打開 models/IdentityModels.cs,加入新欄位: HomeTown、BirthDate



打開 Models/AccountViewModels.cs ,幫External Account Login  用的 ViewModel 也加入這兩個欄位:



再打開 Controllers/AccountController.cs 也要在 外部帳號註冊所使用的 Action method 中加入這二個新欄位:



最後要修改的是View,打開Views/Account/ExternalLoginConfirmation.cshtml,在View中加入這二個欄位:



在"套件管理器主控台"中依序輸入以下指令


以上新增欄位的作業完成了,當然必須要把這些修改的動作更新到資料庫中,打開套件管理主控台,依序輸入以下指令:


  1. Enable-Migrations
  2. Add-Migration Init
  3. Update-Database
完成後你可檢查一下資料庫結構是不是變了:





當您選擇用 Facebook 帳號登入後的註冊畫面:(顯示出額外加入的二個欄位)