一、網站系統開發需要掌握的技術;
1、介面和使用者體驗:
①要了解Web在各大瀏覽器的執行情況,必須保證站點在主要瀏覽器上都能正常執行。至少要測試Gecko、Webkit、IE和Opera等引擎。不同的作業系統,可能也會影響瀏覽器如何呈現網站。除了瀏覽器,網站還有其他使用方式:手機、搜尋引擎等等。應該充分了解這些情況下,網站的執行狀況。
②知道怎麼能在基本不影響使用者使用的情況下升級網站。通常來說,必須有版本控制系統和資料備份機制。
③保密性,不要直接顯示使用者的Email地址和各項資訊,至少不要用純文字顯示。
④作為一個友好的網站,不要讓使用者看到那些不友好的出錯提示。
⑤為你的網站設定一些合理的使用限制,一旦超過門檻值,就自動停止服務,這與網站安全相關。
⑥知道如何實現網頁的漸進式增強。
⑦使用者發出POST請求後,總是將其重導向至另外一個網頁。
⑧不要忘記網站的可訪問性,比如要考慮殘疾人如何使用網站。
2、安全性:
①閱讀《OWASP開發指南》,它提供了全面的網站安全指導。
②永遠不要信任使用者提交的資料
③瞭解SQL隱碼攻擊及其預防方法,做好安全措施,防止資訊洩露。
④不要明文儲存使用者的密碼,要hash處理後再儲存。
⑤不要對你的使用者認證系統太自信,它可能很容易就被攻破,並不是那麼安全,總會有人去找出一些漏洞,要提早意識到這個問題。
⑥在登入頁面及其他處理敏感資訊的頁面,使用SSL、HTTPS。
⑦瞭解如何處理信用卡。
⑧要了解如何對付session劫持。
⑨避免“跨站點執行”。
⑩避免“跨域偽造請求”。
除此之外,還有一些要注意的地方:
及時打上補丁,讓系統始終跟上最新版本。確認資料庫連線資訊的安全性。跟蹤攻擊技術的最新發展,以及使用的平臺的最新安全漏洞。閱讀Google的《瀏覽器安全手冊》。閱讀《網路軟體的黑客手冊》。
3、效能:
①只要有可能,就使用快取。要正確理解和使用Http caching與HTML5離線儲存。
②優化圖片。不要把一個圖片檔案,作為重複出現的網頁背景圖案。
③學習如何用gzip和deflate內容。
④將多個樣式表檔案或指令碼檔案,合為一個檔案,這樣可以減少瀏覽器的http請求數,以及減小gzip壓縮後的檔案總體積。
⑤如果你的網頁用到大量的小體積圖片(比如工具欄),就應該使用Css image script,目的是減少http請求數。
⑥大流量的網站應該考慮將網頁物件分佈在多個域名。
⑦靜態內容都應該放在一個不需要使用cookie的獨立域名之上。因為域名之下如果有,那麼客戶端向該域名發出的每次http請求,都會附上cookie內容。這裡的一個好方法就是使用"內容分發網路"。
⑧將瀏覽器完成網頁渲染所需要的http請求數最小化。
⑨使用Google的Closure Complier壓縮JavaScript檔案,YUI Compresser亦可。
⑩確保網站根目錄下有favicon.ico檔案,因為即使網頁中根本不包括這個檔案,瀏覽器也會自動發出對它的請求。如果這個檔案不存在,就會產生大量的404錯誤,消耗光伺服器的頻寬。
4、搜尋引擎優化:
①使用"搜尋引擎友好"的URL形式,比如example.com/pages/45-article-title,而不是example.com/index.php?page=45。
②不要使用"點選這裡"之類的超級連結,因為這樣等於浪費了一個SEO機會,而且降低了"螢幕朗讀器"的使用效果。
③建立一個XML sitemap檔案,它的預設位置一般是/sitemap.xml(即放在網站根目錄下)。
④當你有多個URL指向同一個內容時,在網頁程式碼中使用<link rel ="canonical ".../>。
⑤使用Google的 Webmaster Tools和Yahoo的 Site Explorer。
⑥從一開始就使用Google Analyties。
⑦知道robots.txt的作用,以及搜尋引擎蜘蛛的工作原理。
⑧將www.example.com的訪問請求導向example.com,或者採用相反的做法,目的是防止Google把它們當做兩個網站,分開計算排名。
⑨知道存在著惡意或行為不正當的網路蜘蛛。
⑩如果網站有非文字的內容(比如視訊、音訊等等),你應該參考Google的sitemap擴充套件協議。
5、技術:
①理解HTTP協議,諸如GET、POST、sessions、cookies之類的概念,包括"無狀態"是什麼意思。
②確保XHTML和HTML和CSS符合W3C標準,使得它們能夠通過檢驗。這可以使網頁避免觸發瀏覽器的古怪行為,而且使它在"螢幕朗讀器"和手機上也能正常工作。
③理解瀏覽器如何處理JavaScript指令碼。
④理解網頁上的JavaScript檔案、樣式表檔案和其他資源是如何裝載及執行的,考慮它們對頁面效能有何影響。在某些情況下,可能應該將指令碼檔案放置在網頁的尾部。
⑤理解JavaScript沙箱的工作原理,尤其是如果打算使用iframe。
⑥瞭解301重定向和302重定向之間的區別(這也是一個SEO相關問題)。
⑦知道JavaScript可能無法使用或被禁用,以及Ajax並不是一定會執行。"不允許指令碼執行"正在某些使用者中變得流行,手機瀏覽器對指令碼的支援千差萬別,而Google索引網頁時不執行大部分的指令碼檔案。
⑧儘可能多得了解部署平臺。
⑨考慮使用樣式表重置。
⑩考慮使用JavaScript框架,使用它們可以不用考慮瀏覽器之間的差異。
6、解決bug:
①建立一個有效的錯誤報告機制。
②程式設計師20%的時間用於編碼,80%的時間用於維護,根據這一點相應合理的安排時間。
③建立某些途徑或系統,讓使用者可以與後臺接觸,提出建議和批評。
④為將來的維護和客服人員撰寫文件,解釋清楚系統是怎麼執行的。
⑤除了備份機制,你還必須有一個恢復機制。
⑥使用某種版本控制系統儲存你的檔案,比如Subversion或Git。
⑦不要忘記做單元測試,Selenium之類的框架會有用。
二、本次課堂測試的源程式程式碼:
IUserDao.java:
1 package com.user.gb.dao; 2 import java.util.List; 3 import com.user.gb.model.User; 4 public interface IUserDao 5 { 6 public void add(User user); 7 public void delete(String username); 8 public void update(User user); 9 public User load(int id); 10 public User load(String username); 11 public List<User> load(); 12 }
UserDaoImpl.java:
1 package com.user.gb.dao; 2 import java.sql.Connection; 3 import java.sql.PreparedStatement; 4 import java.sql.ResultSet; 5 import java.sql.SQLException; 6 import java.util.ArrayList; 7 import java.util.List; 8 import com.user.gb.Util.GBUtil; 9 import com.user.gb.model.User; 10 import com.user.gb.model.UserException; 11 public class UserDaoImpl implements IUserDao 12 { 13 public void add(User user) 14 { 15 Connection connection=GBUtil.getConnection(); 16 String sql="select count(*) from xinxi where username=?"; 17 PreparedStatement preparedStatement=null; 18 ResultSet resultSet=null; 19 try 20 { 21 preparedStatement=connection.prepareStatement(sql); 22 preparedStatement.setString(1, user.getUsername()); 23 resultSet=preparedStatement.executeQuery(); 24 while(resultSet.next()) 25 { 26 if(resultSet.getInt(1)>0) 27 { 28 throw new UserException("使用者名稱已存在!"); 29 } 30 } 31 } 32 catch (SQLException e) 33 { 34 // TODO Auto-generated catch block 35 e.printStackTrace(); 36 } 37 sql="insert into xinxi(username,password) value(?,?)"; 38 try 39 { 40 preparedStatement=connection.prepareStatement(sql); 41 preparedStatement.setString(1, user.getUsername()); 42 preparedStatement.setString(2, user.getPassword()); 43 preparedStatement.executeUpdate(); 44 } 45 catch (SQLException e) 46 { 47 // TODO Auto-generated catch block 48 e.printStackTrace(); 49 } 50 finally 51 { 52 GBUtil.close(connection); 53 GBUtil.close(preparedStatement); 54 GBUtil.close(resultSet); 55 } 56 } 57 @Override 58 public void delete(String username) 59 { 60 Connection connection=GBUtil.getConnection(); 61 String sql="delete from xinxi where username = ?"; 62 PreparedStatement preparedStatement=null; 63 try 64 { 65 preparedStatement=connection.prepareStatement(sql); 66 preparedStatement.setString(1, username); 67 preparedStatement.executeUpdate(); 68 } 69 catch (SQLException e) 70 { 71 e.printStackTrace(); 72 } 73 finally 74 { 75 GBUtil.close(connection); 76 GBUtil.close(preparedStatement); 77 } 78 } 79 public void update(User user) 80 { 81 Connection connection=GBUtil.getConnection(); 82 String sql="update xinxi set password = ? where username = ?"; 83 PreparedStatement preparedStatement=null; 84 try 85 { 86 preparedStatement=connection.prepareStatement(sql); 87 preparedStatement.setString(1, user.getPassword()); 88 preparedStatement.setString(2, user.getUsername()); 89 preparedStatement.executeUpdate(); 90 } 91 catch (SQLException e) 92 { 93 e.printStackTrace(); 94 } 95 finally 96 { 97 GBUtil.close(connection); 98 GBUtil.close(preparedStatement); 99 } 100 } 101 public User load(int id) 102 { 103 Connection connection=GBUtil.getConnection(); 104 String sql="select * from xinxi where id=?"; 105 User user=null; 106 PreparedStatement preparedStatement=null; 107 ResultSet resultSet=null; 108 try 109 { 110 preparedStatement=connection.prepareStatement(sql); 111 preparedStatement.setInt(1, id); 112 resultSet=preparedStatement.executeQuery(); 113 while(resultSet.next()) 114 { 115 user=new User(); 116 user.setId(id); 117 user.setUsername(resultSet.getString("username")); 118 user.setPassword(resultSet.getString("password")); 119 } 120 } 121 catch (SQLException e) 122 { 123 e.printStackTrace(); 124 } 125 finally 126 { 127 GBUtil.close(connection); 128 GBUtil.close(preparedStatement); 129 GBUtil.close(resultSet); 130 } 131 return user; 132 } 133 public User load(String username) 134 { 135 Connection connection=GBUtil.getConnection(); 136 String sql="select * from xinxi where username=?"; 137 User user=null; 138 PreparedStatement preparedStatement=null; 139 ResultSet resultSet=null; 140 try 141 { 142 preparedStatement=connection.prepareStatement(sql); 143 preparedStatement.setString(1, username); 144 resultSet=preparedStatement.executeQuery(); 145 while(resultSet.next()) 146 { 147 user=new User(); 148 user.setId(resultSet.getInt("id")); 149 user.setUsername(username); 150 user.setPassword(resultSet.getString("password")); 151 } 152 } 153 catch (SQLException e) 154 { 155 e.printStackTrace(); 156 } 157 finally 158 { 159 GBUtil.close(connection); 160 GBUtil.close(preparedStatement); 161 GBUtil.close(resultSet); 162 } 163 return user; 164 } 165 public List<User> load() 166 { 167 Connection connection=GBUtil.getConnection(); 168 String sql="select * from xinxi "; 169 PreparedStatement preparedStatement=null; 170 ResultSet resultSet=null; 171 List<User> users=new ArrayList<User>(); 172 User user=null; 173 try 174 { 175 preparedStatement=connection.prepareStatement(sql); 176 resultSet=preparedStatement.executeQuery(); 177 while(resultSet.next()) 178 { 179 user=new User(); 180 user.setId(resultSet.getInt("id")); 181 user.setUsername(resultSet.getString("username")); 182 user.setPassword(resultSet.getString("password")); 183 users.add(user); 184 } 185 } 186 catch (SQLException e) 187 { 188 e.printStackTrace(); 189 } 190 finally 191 { 192 GBUtil.close(connection); 193 GBUtil.close(preparedStatement); 194 GBUtil.close(resultSet); 195 } 196 return users; 197 } 198 }
User.java:
1 package com.user.gb.model; 2 public class User 3 { 4 private int id; 5 private String username; 6 private String password; 7 public int getId() 8 { 9 return id; 10 } 11 public void setId(int id) 12 { 13 this.id = id; 14 } 15 public String getUsername() 16 { 17 return username; 18 } 19 public void setUsername(String username) 20 { 21 this.username = username; 22 } 23 public String getPassword() 24 { 25 return password; 26 } 27 public void setPassword(String password) 28 { 29 this.password = password; 30 } 31 }
UserException.java:
1 package com.user.gb.model; 2 public class UserException extends RuntimeException 3 { 4 public UserException() 5 { 6 super(); 7 } 8 public UserException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) 9 { 10 super(message, cause, enableSuppression, writableStackTrace); 11 } 12 public UserException(String message, Throwable cause) 13 { 14 super(message, cause); 15 } 16 public UserException(String message) 17 { 18 super(message); 19 } 20 public UserException(Throwable cause) 21 { 22 super(cause); 23 } 24 }
GBUtil.java:
1 package com.user.gb.Util; 2 import java.sql.Connection; 3 import java.sql.DriverManager; 4 import java.sql.PreparedStatement; 5 import java.sql.ResultSet; 6 import java.sql.SQLException; 7 public class GBUtil 8 { 9 public static Connection getConnection() 10 { 11 try 12 { 13 Class.forName("com.mysql.jdbc.Driver"); 14 } 15 catch(ClassNotFoundException e) 16 { 17 e.printStackTrace(); 18 } 19 String url="jdbc:mysql://localhost:3306/denglu?useSSL=false"; 20 Connection connection=null; 21 try 22 { 23 connection=DriverManager.getConnection(url, "root", "242772"); 24 } 25 catch (SQLException e) 26 { 27 // TODO Auto-generated catch block 28 e.printStackTrace(); 29 System.out.println("資料庫連線失敗"); 30 } 31 return connection; 32 } 33 public static void close(Connection connection) 34 { 35 try 36 { 37 if(connection!=null) 38 { 39 connection.close(); 40 } 41 } 42 catch(SQLException e) 43 { 44 e.printStackTrace(); 45 } 46 } 47 public static void close(PreparedStatement preparedStatement) 48 { 49 try 50 { 51 if(preparedStatement!=null) 52 { 53 preparedStatement.close(); 54 } 55 } 56 catch(SQLException e) 57 { 58 e.printStackTrace(); 59 } 60 } 61 public static void close(ResultSet resultSet) 62 { 63 try 64 { 65 if(resultSet!=null) 66 { 67 resultSet.close(); 68 } 69 } 70 catch(SQLException e) 71 { 72 e.printStackTrace(); 73 } 74 } 75 }
add.jsp:
1 <%@page import="com.user.gb.dao.UserDaoImpl"%> 2 <%@page import="com.user.gb.model.User"%> 3 <%@page import="com.user.gb.model.UserException"%> 4 <%@page import="com.user.gb.Util.GBUtil"%> 5 <%@ page language="java" contentType="text/html; charset=UTF-8" 6 pageEncoding="UTF-8"%> 7 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 8 <html> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10 <% 11 String username=request.getParameter("username"); 12 String password=request.getParameter("password"); 13 String repassword=request.getParameter("repassword"); 14 if(username==null||"".equals(username.trim())) 15 { 16 request.setAttribute("error","使用者名稱不能為空!"); 17 %> 18 <jsp:forward page="addInput.jsp"></jsp:forward> 19 <% 20 } 21 if(password==null||"".equals(password.trim())) 22 { 23 request.setAttribute("error","密碼不能為空!"); 24 %> 25 <jsp:forward page="addInput.jsp"></jsp:forward> 26 <% 27 } 28 if(repassword==null||"".equals(repassword.trim())) 29 { 30 request.setAttribute("error","再次輸入密碼以示確認!"); 31 %> 32 <jsp:forward page="addInput.jsp"></jsp:forward> 33 <% 34 } 35 if(!password.trim().equals(repassword.trim())) 36 { 37 request.setAttribute("error","兩次輸入的密碼不一致。請確認後再進行操作!"); 38 %> 39 <jsp:forward page="addInput.jsp"></jsp:forward> 40 <% 41 } 42 User user=new User(); 43 user.setUsername(username); 44 user.setPassword(password); 45 UserDaoImpl userDao=new UserDaoImpl(); 46 try 47 { 48 userDao.add(user); 49 %> 50 <h2 style="color:blue">使用者儲存成功!</h2> 51 <% 52 } 53 catch(UserException e) 54 { 55 %> 56 <h2 style="color:red">error:<%=e.getMessage() %></h2> 57 <% 58 } 59 %> 60 </html>
addInput.jsp:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>使用者註冊</title> 8 </head> 9 <body> 10 <form action="add.jsp" method="get"> 11 <table align="center" border="2" width="500"> 12 <tr> 13 <td>使用者名稱:</td> 14 <td> 15 <input type="text" name="username" /> 16 </td> 17 </tr> 18 <tr> 19 <td>密碼:</td> 20 <td> 21 <input type="password" name="password" /> 22 </td> 23 </tr> 24 <tr> 25 <td>確認密碼:</td> 26 <td> 27 <input type="password" name="repassword" /> 28 </td> 29 </tr> 30 <tr align="center"> 31 <td colspan="2"> 32 <input type="submit" value="提交" /> 33 <input type="reset" value="重置" /> 34 </td> 35 </tr> 36 </table> 37 </form> 38 <br> 39 <% 40 if(request.getAttribute("error")!=null) 41 { 42 %> 43 <h2 align="center" style="color:red"> <%=request.getAttribute("error") %></h2> 44 <% 45 } 46 %> 47 </body> 48 </html>
delete.jsp:
1 <%@page import="com.user.gb.dao.UserDaoImpl"%> 2 <%@page import="com.user.gb.model.User"%> 3 <%@page import="com.user.gb.model.UserException"%> 4 <%@page import="com.user.gb.Util.GBUtil"%> 5 <%@ page language="java" contentType="text/html; charset=UTF-8" 6 pageEncoding="UTF-8"%> 7 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 8 <html> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10 <% 11 String username=request.getParameter("username"); 12 String password=request.getParameter("password"); 13 UserDaoImpl userDao=new UserDaoImpl(); 14 User user=null; 15 user=userDao.load(username); 16 if(user==null) 17 { 18 request.setAttribute("error", "您要刪除的使用者不存在"); 19 %> 20 <jsp:forward page="deleteInput.jsp"></jsp:forward> 21 <% 22 } 23 if(!user.getPassword().equals(password)) 24 { 25 request.setAttribute("error", "您輸入的密碼不正確,無權刪除該使用者!"); 26 %> 27 <jsp:forward page="deleteInput.jsp"></jsp:forward> 28 <% 29 } 30 userDao.delete(username); 31 %> 32 <h2 align="center" style="color:blue">學號為<%=user.getUsername() %>的使用者已經被刪除!</h2><br> 33 </html>
deleteInput.jsp:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>使用者刪除</title> 8 </head> 9 <body> 10 <form action="delete.jsp" method="get"> 11 <table align="center" border="2" width="500"> 12 <tr> 13 <td>請輸入要刪除的使用者名稱:</td> 14 <td> 15 <input type="text" name="username" /> 16 </td> 17 </tr> 18 <tr> 19 <td>該使用者的密碼為:</td> 20 <td> 21 <input type="password" name="password" /> 22 </td> 23 </tr> 24 <tr align="center"> 25 <td colspan="2"> 26 <input type="submit" value="刪除" /> 27 </td> 28 </tr> 29 </table> 30 </form> 31 <br> 32 <% 33 if(request.getAttribute("error")!=null) 34 { 35 %> 36 <h2 align="center" style="color:red"> <%=request.getAttribute("error") %></h2> 37 <% 38 } 39 %> 40 </body> 41 </html>
select.jsp:
1 <%@page import="com.user.gb.dao.UserDaoImpl"%> 2 <%@page import="com.user.gb.model.User"%> 3 <%@page import="com.user.gb.model.UserException"%> 4 <%@page import="com.user.gb.Util.GBUtil"%> 5 <%@ page language="java" contentType="text/html; charset=UTF-8" 6 pageEncoding="UTF-8"%> 7 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 8 <html> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10 <title>搜尋</title> 11 </head> 12 <% 13 String username=request.getParameter("username"); 14 if(username==null||"".equals(username.trim())) 15 { 16 request.setAttribute("error", "查詢內容不能為空!"); 17 %> 18 <jsp:forward page="selectInput.jsp"></jsp:forward> 19 <% 20 } 21 User user=null; 22 UserDaoImpl userDao=new UserDaoImpl(); 23 user=userDao.load(username); 24 if(user==null) 25 { 26 request.setAttribute("error", "您查詢的使用者不存在!"); 27 %> 28 <jsp:forward page="selectInput.jsp"></jsp:forward> 29 <% 30 } 31 else 32 { 33 %> 34 <h2 align="center" style="color:blue">查詢結果為:編號: <%=user.getId() %>學號:<%=user.getUsername() %>密碼: <%=user.getPassword() %></h2> 35 <% 36 } 37 %> 38 </html>
selectInput.jsp:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>使用者搜尋</title> 8 </head> 9 <form action="select.jsp" method="get"> 10 <table align="center" border="2" width="500"> 11 <tr> 12 <td>請輸入您要搜尋的使用者名稱:</td> 13 <td> 14 <input type="text" name="username" /> 15 </td> 16 </tr> 17 <tr align="center"> 18 <td colspan="2"> 19 <input type="submit" value="查詢" /> 20 </td> 21 </tr> 22 </table> 23 </form> 24 <% 25 if(request.getAttribute("error")!=null) 26 { 27 %> 28 <h2 align="center" style="color:red"><%=request.getAttribute("error") %></h2> 29 <% 30 } 31 %> 32 </html>
update.jsp:
1 <%@page import="com.user.gb.dao.UserDaoImpl"%> 2 <%@page import="com.user.gb.model.User"%> 3 <%@page import="com.user.gb.model.UserException"%> 4 <%@page import="com.user.gb.Util.GBUtil"%> 5 <%@ page language="java" contentType="text/html; charset=UTF-8" 6 pageEncoding="UTF-8"%> 7 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 8 <html> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10 <% 11 String username=request.getParameter("username"); 12 String password=request.getParameter("password"); 13 String newpassword=request.getParameter("newpassword"); 14 String newrepassword=request.getParameter("newrepassword"); 15 if(username==null||"".equals(username.trim())) 16 { 17 request.setAttribute("error","請輸入要修改的使用者名稱!"); 18 %> 19 <jsp:forward page="updateInput.jsp"></jsp:forward> 20 <% 21 } 22 if(password==null||"".equals(password.trim())) 23 { 24 request.setAttribute("error","原密碼不能為空!!"); 25 %> 26 <jsp:forward page="updateInput.jsp"></jsp:forward> 27 <% 28 } 29 if(newpassword==null||"".equals(newpassword.trim())) 30 { 31 request.setAttribute("error","新密碼不能為空!"); 32 %> 33 <jsp:forward page="updateInput.jsp"></jsp:forward> 34 <% 35 } 36 if(newrepassword==null||"".equals(newrepassword.trim())) 37 { 38 request.setAttribute("error","必須再次輸入新密碼,以免出現錯誤!"); 39 %> 40 <jsp:forward page="updateInput.jsp"></jsp:forward> 41 <% 42 } 43 User user=new User(); 44 UserDaoImpl userDao=new UserDaoImpl(); 45 user=userDao.load(username); 46 if(user==null) 47 { 48 request.setAttribute("error","該使用者不存在,請重新輸入。"); 49 %> 50 <jsp:forward page="updateInput.jsp"></jsp:forward> 51 <% 52 } 53 if(!user.getPassword().equals(password)) 54 { 55 request.setAttribute("error", "原密碼不正確,無法修改!"); 56 %> 57 <jsp:forward page="updateInput.jsp"></jsp:forward> 58 <% 59 } 60 if(!newpassword.equals(newrepassword)) 61 { 62 request.setAttribute("error", "兩次輸入的新密碼不一致,請確認後再操作,修改失敗!"); 63 %> 64 <jsp:forward page="updateInput.jsp"></jsp:forward> 65 <% 66 } 67 user.setUsername(username); 68 user.setPassword(newpassword); 69 userDao.update(user); 70 %> 71 <h2 style="color:blue">使用者修改成功!</h2> 72 </html>
updateInput.jsp:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>使用者修改</title> 8 </head> 9 <body> 10 <form action="update.jsp" method="get"> 11 <table align="center" border="2" width="500"> 12 <tr> 13 <td>要進行修改的使用者名稱:</td> 14 <td> 15 <input type="text" name="username" /> 16 </td> 17 </tr> 18 <tr> 19 <td>原密碼:</td> 20 <td> 21 <input type="password" name="password" /> 22 </td> 23 </tr> 24 <tr> 25 <td>新密碼:</td> 26 <td> 27 <input type="password" name="newpassword" /> 28 </td> 29 </tr> 30 <tr> 31 <td>請再次輸入密碼:</td> 32 <td> 33 <input type="password" name="newrepassword" /> 34 </td> 35 </tr> 36 <tr align="center"> 37 <td colspan="2"> 38 <input type="submit" value="提交" /> 39 <input type="reset" value="重置" /> 40 </td> 41 </tr> 42 </table> 43 </form> 44 <% 45 if(request.getAttribute("error")!=null) 46 { 47 %> 48 <h2 align="center" style="color:red"><%=request.getAttribute("error") %></h2> 49 <% 50 } 51 %> 52 </body> 53 </html>
denglu.jsp:
1 <%@page import="com.user.gb.dao.UserDaoImpl"%> 2 <%@page import="com.user.gb.model.User"%> 3 <%@page import="com.user.gb.model.UserException"%> 4 <%@page import="com.user.gb.Util.GBUtil"%> 5 <%@ page language="java" contentType="text/html; charset=UTF-8" 6 pageEncoding="UTF-8"%> 7 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 8 <html> 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 10 <% 11 String username=request.getParameter("username"); 12 String password=request.getParameter("password"); 13 if(username==null||"".equals(username.trim())) 14 { 15 request.setAttribute("error","使用者名稱不能為空!"); 16 %> 17 <jsp:forward page="dengluInput.jsp"></jsp:forward> 18 <% 19 } 20 if(password==null||"".equals(password.trim())) 21 { 22 request.setAttribute("error","密碼不能為空!"); 23 %> 24 <jsp:forward page="dengluInput.jsp"></jsp:forward> 25 <% 26 } 27 User user=null; 28 UserDaoImpl userDao=new UserDaoImpl(); 29 user=userDao.load(username); 30 if(user==null) 31 { 32 request.setAttribute("error","該使用者名稱不存在!"); 33 %> 34 <jsp:forward page="dengluInput.jsp"></jsp:forward> 35 <% 36 } 37 if(!password.equals(user.getPassword())) 38 { 39 request.setAttribute("error","密碼錯誤!"); 40 %> 41 <jsp:forward page="dengluInput.jsp"></jsp:forward> 42 <% 43 } 44 else 45 { 46 %> 47 <h2 align="center" style="color:blue">登入成功!</h2> 48 <a href="addInput.jsp">使用者註冊</a> 49 <a href="deleteInput.jsp">刪除使用者</a> 50 <a href="updateInput.jsp">修改密碼</a> 51 <a href="selectInput.jsp">查詢使用者</a> 52 <% 53 } 54 %> 55 </html>
dengluInput.jsp:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 7 <title>登入</title> 8 </head> 9 <body> 10 <form action="denglu.jsp" method="get"> 11 <table align="center" border="2" width="500"> 12 <tr> 13 <td>使用者名稱:</td> 14 <td> 15 <input type="text" name="username" /> 16 </td> 17 </tr> 18 <tr> 19 <td>密碼:</td> 20 <td> 21 <input type="password" name="password" /> 22 </td> 23 <td> 24 <a href="updateInput.jsp">修改密碼</a> 25 </td> 26 </tr> 27 <tr align="center"> 28 <td colspan="4"> 29 <input type="submit" value="登入" /> 30 </td> 31 </tr> 32 </table> 33 </form> 34 <br> 35 <% 36 if(request.getAttribute("error")!=null) 37 { 38 %> 39 <h2 align="center" style="color:red"><%=request.getAttribute("error") %></h2> 40 <% 41 } 42 %> 43 </body> 44 </html>
三、執行結果截圖:
初始介面:
不輸入任何東西直接登入:
密碼錯誤時:
登入成功:
由四個選項分別將使用者匯入到不同的介面,對應增刪改查:
增加(初始):
當使用者名稱已存在:
使用者儲存成功:
刪除(初始):
刪除成功:
修改(初始):
修改使用者不存在時:
修改使用者時密碼不正確:
修改成功:
查詢:
成功查詢:
使用者不存在時:
四、列出你對這門課的希望和自己的目標,並具體列出你計劃每週花多少時間在這門課上。
這幾周的時間,我希望寫出一個可用的,有實際使用者的軟體。 能夠完整體驗軟體生命週期,對於各個階段有實際的瞭解,對於軟體設計有實際的掌握,對敏捷軟體開發的具體技術有實踐能力。在個人作業和團隊作業中, 瞭解團隊的各個角色,和各個角色的互動。對於其中一個角色有實際的深入體驗。 學習如何與不同的角色打交道,培養團隊精神,學會解決衝突的幾種方法。
每天可以花費三四個小時用來程式設計,每週下來三十個小時左右,程式設計重要的還是練習,把寫程式當做日常。