簡單Web開發流程全解——下
接著簡單Web開發流程全解——上 沒說完的地方接著寫,現在來講一講關於後端實現和開發流程的東西。
後端實現
一、環境配置與連結 Eclipse JSP/Servlet 環境搭建 這個是用eclipse搭建jsp和servlet環境的,這樣就可以在eclipse上進行Web的開發和除錯。 按照上述搭建好環境以後 應該有如上列表。 如果有想要我們團隊開發的demo的朋友可以私信聯絡我,不過我一般上的比較少,除非是有新的東西學完了記錄一下才會上,所以還請見諒。 有些同學在使用我的demo的時候遇到了找不到宣告之類的問題,這是因為每個人預設配置的jdk和jre不完全一樣,所以應該在build path裡面進行修改。如下圖:
二、程式碼編寫 關於後端程式碼編寫,首先要接收前端頁面傳回來的get和post或者其他訪問,然後是處理之後和資料庫進行連線進行獲取資料或者修改資料或者查詢資料的操作。 所以第一步應當就是連結資料庫。 1.連結資料庫
/** * */ package utils; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * @author ly * */ public class DBhelper { public String url = "jdbc:mysql://localhost:3306/dreamnight?useUnicode=true&characterEncoding=UTF-8"; public String username = "root"; public String password = "root"; public static DBhelper instance = null; // 通過靜態程式碼塊註冊資料庫驅動,保證註冊只執行一次 static { try { Class.forName("com.mysql.jdbc.Driver").newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); } } private DBhelper() { } /** * 獲得類例項 * * @return */ public static DBhelper getInstance() { // 給類加鎖,防止執行緒併發 synchronized (DBhelper.class) { if (instance == null) { instance = new DBhelper(); } } return instance; } /** * 獲得連線 * * @return * @throws SQLException */ public Connection getConnection() throws SQLException { return DriverManager.getConnection(url, username, password); } /** * 關閉連線 * * @param conn * @param st * @param rs */ public static void closeConnection(Connection conn, Statement st, ResultSet rs) { try { if (rs != null) { rs.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (st != null) { st.close(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } }
每一部分的功能可以參見注釋,這裡只提醒一下,這個寫法因為用了單一例項模型所以保證了一次只能由一個訪問連結資料庫,實現了序列化訪問資料庫,雖然很安全,但是對於並行處理極為不利。還要注意url連結的時候附帶的引數,也是為了實現中文字元的傳遞。 2.處理前方返回的request
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
一般是繼承原有的HttpServlet類,通過複寫原有的doGet等函式從而將需要的功能加入到我們寫的servlet中。 3.在訪問請求以後,一般就需要和資料庫進行互動,存取資料了,可以在jdbc的幫助下執行需要的sql語句。例如一個簡單的統計相同id的項數可以用如下所示程式碼實現:
public int getTotal(int s1) {
int total = 0;
try {
Connection c = DBhelper.getInstance().getConnection();
Statement s = c.createStatement();
String sql = "select count(*) from Commit where threadID = "+String.valueOf(s1);
ResultSet rs = s.executeQuery(sql);
while (rs.next()) {
total = rs.getInt(1);
}
System.out.println("total:" + total);
DBhelper.closeConnection(c, s, rs);
} catch (Exception e) {
e.printStackTrace();
}
return total;
}
4.為了管理我們的資料型別,我們還需要建立資料型別的類,用以統一定義介面 5.放一張剛寫完的專案的截圖 上圖中,entity只放置資料型別,servlet放置處理方法,updateTo放置連結資料庫的方法,utils放置資料庫連結配置,各部分各司其職,即使某一部分修改也不會影響其他模組。 最後提醒一下,在寫sql語句時,要注意sql語句中字串的單引號,有時候需要單獨新增。 三、其他注意事項和遇到的問題 1.在第一次登陸的時候,可以通過Session變數儲存一些本次連結的全域性資訊,這種資訊可以在前端頁面和後端servlet直接呼叫。
request.getSession().setAttribute("USER", user);
//第一次登陸將user物件儲存在名字為“USER”的變數裡面
User USER=(User)request.getSession().getAttribute("USER");
//之後想要獲得變數“USER”的值就可以用這種直接呼叫的方式
2.注意引數的傳回
request.setAttribute("Threads", threads);
//這一句程式碼是將threads變數以Threads的名字傳到前端
之後在前端的呼叫如下:
<c:forEach items="${threads}" var="thread" varStatus="st">
<tr>
<td><div class="well" ><strong> <img src = "./images/person2.JPG" alt="user_pic" style= "float: left; height:40px; width:60px;padding-left: 20px">
<p style= "float:left;padding-left: 20px;padding-top:10px">:</p>
<a href="threadDetails?threadID=${thread.getThreadID()}&start=0&ifclick=1" style = "float:left;padding-left: 5px;padding-top:1px;font-size:17px"> ${thread.getThreadName()}</a></strong> <br>
<br>
<div> </div>
<div class="text-center col-md-1" > <a style= "float:center;">${thread.getFromAccount()}</a> </div>
<hr class="hr1">
<a style = "float:center;padding-left:5px;font-size: 20px;color:#3A3A3A">${thread.getText()}</a>
<ul class="nav navbar-nav navbar-right">
<li><a href="#" style="font-weight:bold;">點選數目:${thread.getNumReading()}</a></li>
<li><a href="#">評論數目:${thread.getNumCommit()}</a></li>
</ul>
<br>
</div></td>
</tr>
<div> </div>
</c:forEach>
即通過jsp的變數引用就可以獲得servlet傳回來的變數值,而且這個值可以是字串,數字,以及其他比較複雜的資料型別和列表。
3.servlet頁面跳轉
request.getRequestDispatcher("***.jsp").forward(request, response);
上述語句可以實現servlet向某一確定jsp的跳轉,如果想要跳轉到另一個servlet的話,可以先在web.xml中進行定義,再把目標檔案路徑改為定義的"url-pattern"就可以從一個servlet不經過前端直接跳到下一個servlet。
4.字元傳遞亂碼問題 字串傳遞可以有三個地方出問題,前端,servlet,資料庫。前面已經說過了,前端要在頁面上設定utf-8編碼,資料庫在建立的時候也要用utf-8字符集,至於後端servlet,也要用uft-8的方式編碼請求和相應資訊
response.setContentType("text/html; charset=UTF-8");
request.setCharacterEncoding("utf-8");
5.知道servlet的朋友們都知道,servlet語法並不是這樣的,那麼為什麼這樣寫就可以獲得servlet的功能呢?那是因為java可以幫助我們自動生成servlet語法格式的檔案,並在建立伺服器被訪問時自動執行這些檔案。 我電腦上的路徑是這樣的 \eclipse\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\dreamnight\org\apache\jsp 開啟以後,就會發現如下介面: 可以發現,servlet的程式碼由java語句輸出生成。
開發流程
軟體工程的開發過程是一個很好的減少推諉抵賴的方法,前面確定的東西都會成為後面的依據。需求分析,流程圖和業務邏輯,資料流圖和關係模型,看起來冗餘,但是真正在使用的時候還是十分方便必要的。