軟件工程概論第一次作業
1.需要網站系統開發需要掌握的技術;
(1)lJava語言
(2)面向對象分析設計思想
(3)設計模式和框架結構
(4)XML語言
(5)網頁腳本語言
(6)數據庫
(7)應用服務器
(8)集成開發環境
下面我們具體地看每個技術.
1、Java語言
Java語言體系比較龐大,包括多個模塊。從WEB項目應用角度講有JSP、Servlet、JDBC、JavaBean(Application)四部分技術。
(1)、Java Database Connectivity (JDBC)技術
在Java Web應用開發中,數據庫管理系統(RDBMS)的使用是不可缺少的。JDBC(Java Database Connectivity) 是一種用於執行 SQL 語句的 Java API。它由一組用 Java 編程語言編寫的類和接口組成。JDBC 為工具/數據庫開發人員提供了一個標準的API,使他們能夠用純Java API 來編寫數據庫應用程序。
簡單地說,JDBC 可做三件事:
l與數據庫建立連接,
l發送 SQL 語句,
l處理結果。
(2)、Servlet技術
Servlet是運行在服務器端的程序,可以被認為是服務器端的applet。servlet被Web服務器(例如Tomcat)加載和執行,就如同applet被瀏覽器加載和執行一樣。servlet從客戶端(通過Web服務器)接收請求,執行某種操作,然後返回結果。
Servlet的主要優點包括
lServlet是持久的。servlet只需Web服務器加載一次,而且可以在不同請求之間保持服務(例如一次數據庫連接)。
lServlet是與平臺無關的。如前所述,servlet是用Java編寫的,它自然也繼承了Java的平臺無關性。
lServlet是可擴展的。由於servlet是用Java編寫的,它就具備了Java所能帶來的所有優點。Java是健壯的、面向對象的編程語言,它很容易擴展以適應你的需求。servlet自然也具備了這些特征。
lServlet是安全的。從外界調用一個servlet的惟一方法就是通過Web服務器。這提供了高水平的安全性保障,尤其是在你的Web服務器有防火墻保護的時候。
lServlet可以在多種多樣的客戶機上使用。由於servlet是用Java編寫的,所以你可以很方便地在HTML中使用它們。
(3)、JavaServer Pages(JSP) 技術
JSP是從Servlet上分離出來的一小部分,簡化了開發,加強了界面設計。JSP定位在交互網頁的開發。運用Java語法,但功能較Servlet弱了很多,並且高級開發中只充當用戶界面部分。JSP容器收到客戶端發出的請求時,首先執行其中的程序片段,然後將執行結果以HTML格式響應給客戶端。其中程序片段可以是:操作數據庫、重新定向網頁以及發送 E-Mail 等等,這些都是建立動態網站所需要的功能。所有程序操作都在服務器端執行,網絡上傳送給客戶端的僅是得到的結果,與客戶端的瀏覽器無關,因此,JSP 稱為Server-Side Language。
JavaServer Pages的主要優點包括
●一次編寫,各處執行(Write once, Run Anywhere)特性
作為Java 平臺的一部分,JavaServer Pages 技術擁有Java語言“一次編寫,各處執行”的特點。隨著越來越多的供貨商將JavaServer Pages 技術添加到他們的產品中,您可以針對自己公司的需求,做出審慎評估後,選擇符合公司成本及規模的服務器,假若未來的需求有所變更時,更換服務器平臺並不影響之前所投下的成本、人力所開發的應用程序。
● 搭配可重復使用的組件
JavaServer Pages技術可依賴於重復使用跨平臺的組件(如:JavaBean或Enterprise JavaBean組件)來執行更復雜的運算、數據處理。開發人員能夠共享開發完成的組件,或者能夠加強這些組件的功能,讓更多用戶或是客戶團體使用。基於善加利用組件的方法,可以加快整體開發過程,也大大降低公司的開發成本和人力。
● 采用標簽化頁面開發
Web 網頁開發人員不一定都是熟悉Java 語言的程序員。因此,JSP 技術能夠將許多功能封裝起來,成為一個自定義的標簽,這些功能是完全根據XML 的標準來制訂的,即JSP 技術中的標簽庫(Tag Library)。因此,Web 頁面開發人員可以運用自定義好的標簽來達成工作需求,而無須再寫復雜的Java 語法,讓Web 頁面開發人員亦能快速開發出一動態內容網頁。
今後,第三方開發人員和其他人員可以為常用功能建立自己的標簽庫,讓Web 網頁開發人員能夠使用熟悉的開發工具,如同HTML 一樣的標簽語法來執行特定功能的工作。
● N-tier 企業應用架構的支持
有鑒於網際網絡的發展,為因應未來服務越來越繁雜的要求,且不再受地域的限制,因此,
必須放棄以往Client-Server的Two-tier 架構,進而轉向更具威力、彈性的分散性對象系統。由於JavaServer Page 技術是Java 2 Platform Enterprise Edition (J2EE)集成中的一部分,它主要是負責前端顯示經過復雜運算後之結果內容,而分散性的對象系統則是主要依賴EJB ( Enterprise JavaBean )和JNDI ( Java Naming and Directory Interface )構建而成。
(4)、JavaBean(Application)應用組件技術
Application是Java應用程序,在WEB項目和一些開發中主要應用JavaBean。它就是Application的一部分,邏輯運算能力很強,能極大的發揮Java語言的優點。JavaBean 被稱為是Java 組件技術的核心。JavaBean 的結構必須滿足一定的命名約定。JavaBean能提供常用功能並且可以重復使用,這使得開發人員可以把某些關鍵功能和核心算法提取出來封裝成為一個組件對象,這樣就增加了代碼的重用率和系統的安全性。
高級的WEB項目會應用到以上所有技術,它們之間聯合使用和協作開發會提高開發的效率和系統的性能。
2、面向對象分析設計思想
Java語言是完全面向對象的語言,所以在項目設計時會有很大的幫助,在設計時應盡量舍棄以往的面向過程的設計方式。
在分析項目業務關系的時候,應用一些UML(Unified Modeling Language)圖,例如常用的用例圖(use case diagram),類圖(class diagram),時序圖(sequence diagram)等等,會有很大的幫助,這樣能盡快找出業務邏輯主要面對的對象,然後對每個對象進行行為劃分,最後再實現對象之間的集成和通信。
3、設計模式和框架結構
Java從語言角度來講不是很難,但是從整體設計角度來講我們還需要了解一些高級應用框架。如果要設計一個良好的框架結構,單單只掌握Java語言遠遠不夠。這就涉及到一個設計模式,還有和設計模式相關的一些知識。
設計模式在Java項目實施過程更是重中之重。主要在與兩層的設計模式、三層的設計模式和N層的設計模式。它直接決定著項目的應用、部署和實際開發設計。
在普通的WEB項目中很多采用兩層的開發結構。JSP+Servlet或JSP+JavaBean。當對開發要求高的項目中使用很多的還是MVC的三層開發結構,也就是JSP+Servlet+JavaBean。它能分有效的分離邏輯開發,使開發人員能專註於各自的開發。同時也能時整個開發結構流程更清晰,但是需要比較高的開發配合度。
在項目中,我們經常使用著名的Model-View-Controller(MVC)架構。MVC架構是隨著smalltalk language語言的發展提出的,它是一個著名的用戶界面設計架構。經典的MVC架構把一個組件(可認為是整個應用程序的一個模塊)劃分成三部分組 Model管理這個模塊中所用到的數據和業務邏輯。而View 管理模塊如何顯示給用戶,Controller 決定如何處理用戶和該模塊交互式時候產生的事件 如用戶點擊一個按鈕等。
4、XML語言
在服務器和設計模式結構中會應用到自定義文件,而且在應用高級設計時也會定義自用的標簽,現在流行的是用XML去定義配置,所以XML語言應該有一定掌握。
當前,Java 2平臺企業版(J2EE)架構在廠商市場和開發者社區中倍受推崇。作為一種工具,可擴展標記語言(XML)簡化了數據交換、進程間消息交換這一類的事情,因而對開發者逐漸變得有吸引力,並開始流行起來。自然,在J2EE架構中訪問或集成XML解決方案的想法也很誘人。因為這將是強大系統架構同高度靈活的數據管理方案的結合。
XML的應用似乎是無窮無盡的,但它們大致上可以分為三大類:
1、簡單數據的表示和交換(針對XML的簡單API(SAX)和文檔對象模型(DOM)語法解析,不同的文檔類型定義(DTDs)和概要(schemas))
2、用戶界面相關、表示相關的上下文(可擴展樣式表語言(XSL),可擴展樣式表語言轉換(XSLT))
3、面向消息的計算(XML-RPC(遠程過程調用),基於SOAP協議的Web 服務(Web Services),電子化業務XML(ebXML))
5、網頁腳本語言
為了提高WEB項目的整體性能,提高人機交互的友好界面,網頁的腳本語言是很有用處的,有的時候可以解決很大的難題或提高程序的性能和應用性。
網頁腳本語言的執行都是在客戶端執行的,速度很很快,並且大多的操作與服務器沒有交互運算,所以在一些應用中非常理想。在設計WEB項目的應用中,網頁的腳本語言起著不能忽視的作用,所以如果設計WEB項目的應用中,對JavaScript應有一定的了解。
JavaScript是一種基於對象(Object Based)和事件驅動(Event Driven)並具有安全性能(Secure)的腳本語言。使用它的目的是與HTML超文本標記語言、Java 腳本語言(Java小程序)一起實現在一個Web頁面中鏈接多個對象,與Web客戶交互作用。從而可以開發客戶端的應用程序等。它是通過嵌入或調入在標準的HTML語言中實現的。它具有以下幾個基本特點:
1.它是一種腳本編寫語言
JavaScript是一種腳本語言,它采用小程序段的方式實現編程。像其它腳本語言一樣,JavaScript同樣已是一種解釋性語言,它提供了一個易的開發過程。
它的基本結構形式與C、C++、VB十分類似。但它不像這些語言一樣,需要先編譯,而是在程序運行過程中被逐行地解釋。它與HTML標識結合在一起,從而方便用戶的使用操作。
2. 基於對象的語言。
JavaScript是一種基於對象的語言,同時以可以看作一種面向對象的。這意味著它能運用自己已經創建的對象。因此,許多功能可以來自於腳本環境中對象的方法與腳本的相互作用。
3.簡單性
JavaScript的簡單性主要體現在:首先它是一種基於Java基本語句和控制流之上的簡單而緊湊的設計, 從而對於學習Java是一種非常好的過渡。其次它的變量類型是采用弱類型,並未使用嚴格的數據類型。
4.安全性
JavaScript是一種安全性語言,它不允許訪問本地的硬盤,並不能將數據存入到服務器上,不允許對網絡文檔進行修改和刪除,只能通過瀏覽器實現信息瀏覽或動態交互。從而有效地防止數據的丟失。
5. 動態性
JavaScript是動態的,它可以直接對用戶或客戶輸入做出響應,無須經過Web服務程序。它對用戶的響應,是采用以事件驅動的方式進行的。所謂事件驅動,就是指在主頁(Home Page)中執行了某種操作所產生的動作,就稱為“事件”(Event)。比如按下鼠標、移動窗口、選擇菜單等都可以視為事件。當事件發生後,可能會引起相應的事件響應。
6、開發工具
(1)、數據庫
在主要的應用中,數據庫相關的環節應用很多,所以對數據庫應該有一定了解。不能單單只了解一種數據庫,因為在很多實際開發中會提出很多數據庫解決方案,所以只有在了解多種數據庫的情況下才能有一個比較方案。
對於數據庫應該了解他的性能和一些基本的操作常識,還有該數據庫的特點。而針對與Java語言WEB項目的數據庫開發則主要是對JDBC的應用,還有數據庫事務處理和連接池等高級概念的應用。
(2)、Web服務器
同數據庫一樣,應該了解該服務器的性能,特點和一些常識。
在應用方面,Web服務器主要是針對於配置和部署,對目錄的配置,調試;對配置文件屬性的修改;對訪問權限和並發性的控制;Java類的部署等。
(3)、集成開發環境(IDE):
“公欲善其事, 必先利其器”. 對於Web應用開發人員來講,好的集成開發環境(IDE:Integrated Development Enviroment)是非常重要的。目前在市場上占主導位置的一個集成開發工具就是Eclipse.
本次課堂測試的源程序代碼:
package com.jaovo.msg.model;
public class User {
private int ID;
private String Username;
private String Nickname;
private String Password;
public int getID() {
return ID;
}
public String getUsername() {
return Username;
}
public void setUsername(String username) {
Username = username;
}
public String getNickname() {
return Nickname;
}
public void setNickname(String nickname) {
Nickname = nickname;
}
public String getPassword() {
return Password;
}
public void setPassword(String password) {
Password = password;
}
public void setID(int iD) {
ID = iD;
}
}
package com.jaovo.msg.Util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DBUtil {
public static Connection getConnection()
{
//加載驅動
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
} catch (InstantiationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
String user = "sa";
String password = "yyh678";
String url = "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Users";// 數據源
Connection con =null;
try {
con = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}// 連接數據庫對象
return con;
}
public static void close(Connection connection)
{
try {
if(connection!=null)
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void close(PreparedStatement preparedstatement)
{
try {
if(preparedstatement!=null)
preparedstatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void close(ResultSet resultSet)
{
try {
if(resultSet!=null)
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.jaovo.msg.Util;
public class UserException extends RuntimeException{
public UserException() {
super();
// TODO Auto-generated constructor stub
}
public UserException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
// TODO Auto-generated constructor stub
}
public UserException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
public UserException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public UserException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
}
package com.jaovo.msg.dao;
import java.util.List;
import com.jaovo.msg.model.User;
public interface IUserDao {
//定義接口
public void add(User user);
public void delete(User user);
public void update(User user);
public User load(int ID);
public User load(String Username);
public List<User> load();
}
package com.jaovo.msg.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.jaovo.msg.Util.DBUtil;
import com.jaovo.msg.Util.UserException;
import com.jaovo.msg.model.User;
public class UserDaoImpl implements IUserDao {
@Override
public void add(User user) {//增加用戶
//獲得連接對象
//System.out.println("在心裏");
Connection connection = DBUtil.getConnection();
//準備sql語句
String sql = "select count(*) from table_user where Username=?";
//創建語句傳輸對象
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1, user.getUsername());
//接受結果集
resultSet=preparedStatement.executeQuery();
//遍歷結果集
while(resultSet.next())
{
if(resultSet.getInt(1)>0)
{
throw new UserException("用戶已存在") ;
}
}
sql="insert into table_user(Username,Password,Nickname) values (?,?,?)";
preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1, user.getUsername());
preparedStatement.setString(2, user.getPassword());
preparedStatement.setString(3, user.getNickname());
preparedStatement.executeUpdate();
System.out.println("存儲成功");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//關閉資源
DBUtil.close(resultSet);
DBUtil.close(preparedStatement);
DBUtil.close(connection);
}
}
@Override
public void delete(User user) {
//獲得連接對象
Connection connection = DBUtil.getConnection();
//準備sql語句
String sql = "delete from table_user where Username= ?";
//創建語句傳輸對象
PreparedStatement preparedStatement = null;
try {
preparedStatement= connection.prepareStatement(sql);
preparedStatement.setString(1, user.getUsername());
preparedStatement.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBUtil.close(preparedStatement);
DBUtil.close(connection);
}
}
@Override
public void update(User user) {
//獲得連接對象
Connection connection = DBUtil.getConnection();
//準備sql語句
String sql = "update table_user set Password = ?,Nickname = ?where Username=?";
//創建語句傳輸對象
PreparedStatement preparedStatement = null;
try {
preparedStatement= connection.prepareStatement(sql);
preparedStatement.setString(1, user.getPassword());
preparedStatement.setString(2, user.getNickname());
preparedStatement.setString(3,user.getUsername());
preparedStatement.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBUtil.close(preparedStatement);
DBUtil.close(connection);
}
}
@Override
public User load(int ID) {
//獲得連接對象
Connection connection = DBUtil.getConnection();
//準備sql語句
String sql = "select * from table_user where ID=?";
//創建語句傳輸對象
PreparedStatement preparedStatement = null;
ResultSet resultSet=null;
User user=null;
try {
preparedStatement=connection.prepareStatement(sql);
preparedStatement.setInt(1, ID);
resultSet=preparedStatement.executeQuery();
while(resultSet.next())
{
user=new User();
user.setID(ID);
user.setPassword(resultSet.getString("Password"));
user.setUsername(resultSet.getString("Username"));
user.setNickname(resultSet.getString("Nickname"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBUtil.close(resultSet);
DBUtil.close(preparedStatement);
DBUtil.close(connection);
}
return user;
}
@Override
public User load(String Username) {
//獲得連接對象
Connection connection = DBUtil.getConnection();
//準備sql語句
String sql = "select * from table_user where Username=?";
//創建語句傳輸對象
PreparedStatement preparedStatement = null;
ResultSet resultSet=null;
User user=null;
try {
preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1, Username);
resultSet=preparedStatement.executeQuery();
while(resultSet.next())
{
user=new User();
user.setID(resultSet.getInt("ID"));
user.setPassword(resultSet.getString("Password"));
user.setUsername("Username");
user.setNickname(resultSet.getString("Nickname"));
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBUtil.close(resultSet);
DBUtil.close(preparedStatement);
DBUtil.close(connection);
}
return user;
}
@Override
public List<User> load() {
//獲得連接對象
Connection connection = DBUtil.getConnection();
//準備sql語句
String sql = "select * from table_user";
//創建語句傳輸對象
PreparedStatement preparedStatement = null;
ResultSet resultSet=null;
List<User> users=new ArrayList<User>();
User user=null;
try {
preparedStatement=connection.prepareStatement(sql);
resultSet=preparedStatement.executeQuery();
while(resultSet.next())
{
user=new User();
user.setID(resultSet.getInt("ID"));
user.setPassword(resultSet.getString("Password"));
user.setUsername(resultSet.getString("Username"));
user.setNickname(resultSet.getString("Nickname"));
users.add(user);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
DBUtil.close(resultSet);
DBUtil.close(preparedStatement);
DBUtil.close(connection);
}
return users;
}
public void bianli(User user)
{
//獲得連接對象
Connection connection = DBUtil.getConnection();
//準備sql語句
String sql = "select count(*) from table_user where Username=?";
//創建語句傳輸對象
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1, user.getUsername());
//接受結果集
resultSet=preparedStatement.executeQuery();
//遍歷結果集
while(resultSet.next())
{
if(resultSet.getInt(1)==0)
{
throw new UserException("登陸失敗,用戶不存在") ;
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//關閉資源
DBUtil.close(resultSet);
DBUtil.close(preparedStatement);
DBUtil.close(connection);
}
}
public int empty(User user)
{
int m=0;
//獲得連接對象
Connection connection = DBUtil.getConnection();
//準備sql語句
String sql = "select count(*) from table_user where Username=?";
//創建語句傳輸對象
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
preparedStatement=connection.prepareStatement(sql);
preparedStatement.setString(1, user.getUsername());
//接受結果集
resultSet=preparedStatement.executeQuery();
//遍歷結果集
while(resultSet.next())
{
if(resultSet.getInt(1)>0)
{
m=1;
}
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//關閉資源
DBUtil.close(resultSet);
DBUtil.close(preparedStatement);
DBUtil.close(connection);
}
return m;
}
}
運行結果截圖:
說明課堂測試未按時完成的原因:
周六聽課後,課下沒有復習,只知道老師在上課的時候大概講了什麽,不會動手操作。在上課之前,一直在學習如何鏈接數據庫,剛學會如何鏈接數據庫,怎麽建表。而且關於網頁的好多東西都不明白是怎麽回事,好多方法都不知道怎麽用。
列出你對這門課的希望和自己的目標,並具體列出你計劃每周花多少時間在這門課上:
學完這門課後,我希望自己可以獨立設計一個網站,類似教務系統那樣,可以實現對數據庫的增刪改查,還可以在手機上使用。對於學習這門課的時間,我想,除了上課時間,每周都要有至少14小時來學習這門課程。
軟件工程概論第一次作業