沒想到我的上一篇博客有這么多人看,還有幾位看完之后給我留言加油,不勝感激,備受鼓勵,啥都別說了,繼續系列文章之第二篇。(如果沒看過我第一篇博客的朋友,可以到我的主頁上先瀏覽完再看這篇文章,以免上下文對不上)
前面已經創建完項目了,那么下面一個步驟就是逐一新建在MVC框架中負責V(視圖)、C(控制器)、M(模型)的對應文件。
第一步:創建項目(已完成)
第二步:新建負責V(視圖)的JSP文件
在文件夾Web-Root下新建名為MyJsp.jsp的JSP文件,代碼如下:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 7 <html> 8 <head></head> 9 <!--對於初學者,上面的代碼都可以暫時不必理會 --> 10 <body> 11 <form action="login.do" method="post"> <!--所提交的表單,action為"login.do",發出請求是post--> 12 <p>賬號:<input type="text" name="id" /></p> <!--所輸入的"賬號"在提交后的標示是"id",下同 --> 13 14 <p>密碼:<input type="text" name="password" /> 15 16 <p><input type="submit" value="登錄"> </p> <!--表單提交按鈕,顯示名稱為"登錄"--> 17 </form> 18 </body> 19 </html>
在創建完之后,記得在web.xml中,將<welcome-file-list>節點中的內容改成上面這個文件的文件名MyJsp.jsp。(建議初學者做完這個步驟之后先運行一遍項目,看看效果如何,再看看有沒有出錯的地方)
如果運行的效果如下圖,那應該就沒什么問題了。
所謂的V(視圖),通俗地來講,就是用戶所看到的內容。具體到這個java web項目,就是用戶所看到的頁面。
第三步:新建負責C(控制器)的Servlet
首先,要在src目錄下新建一個包,包名為cc.MyMVC.servlet。然后,再在該包下新建一個servlet文件,名為MyServlet,代碼如下:
1 package cc.MyMVC.servlet; 2 import java.io.IOException; 3 import javax.servlet.ServletException; 4 import javax.servlet.http.HttpServlet; 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 8 import cc.MyMVC.POJO.MyPOJO; 9 10 public class MyServlet extends HttpServlet { 11 public MyServlet() { 12 super(); 13 } 14 15 public void destroy() { 16 super.destroy(); 17 } 18 19 public void doGet(HttpServletRequest request, HttpServletResponse response) 20 throws ServletException, IOException { 21 } 22 23 //以下為關鍵代碼,初學者只需看此處,其他地方都可以暫且不管 24 public void doPost(HttpServletRequest request, HttpServletResponse response)//處理post請求的方法 25 throws ServletException, IOException { 26 boolean b=false; 27 MyPOJO myPOJO=new MyPOJO();//新建MyPOJO類的對象myPOJO 28 29 //根據標示名獲取JSP文件中表單所包含的參數 30 String id=request.getParameter("id"); 31 String password=request.getParameter("password"); 32 33 b=myPOJO.login(id,password);//使用模型對賬號和密碼進行驗證,返回一個boolean類型的對象 34 35 if(b){ //如果驗證結果為真,跳轉至登錄成功頁面 36 response.sendRedirect("LoginSuccessful.jsp"); 37 } 38 else { //如果驗證結果為假,跳轉至登錄失敗頁面 39 response.sendRedirect("LoginFailed.jsp"); 40 } 41 42 } 43 44 public void init() throws ServletException { 45 } 46 }
很不幸,第三步提到的模型(M)還沒有創建,大家可以略過。大家可以看到,這個servlet中doGet方法里的代碼都被刪光光了,無法處理get請求。而這個對我們這個項目可以說是毫無影響,看到我們第二步創建的jsp文件,會發現表單提交的方式是post請求,所以,我們只需要實現doPost方法就好了,並且這個方法將處理提交的post請求。
控制器(C)的作用,就是對流程的控制,接收視圖傳來的參數,交由模型進行處理,再根據處理的結果決定下一步的操作。具體到本項目,servlet接收jsp傳來的參數id和password,交由POJO處理,根據返回的boolean結果跳轉到登錄成功(失敗)的頁面。
第四步:修改web.xml文件,注冊servlet並且建立action與servlet之間的映射。
前面說到,MyServlet.servlet會處理提交的請求,那么,為什么servlet會接收到這個請求呢?因為,我事先修改了web.xml文件,在里面添加了相應的代碼。web.xml的完整代碼如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 <!--以上內容暫時不需要理解,如果不明白可跳過--> 8 9 <servlet> 10 <servlet-name>MyServlet</servlet-name><!--定義servlet的名稱 --> 11 <servlet-class>cc.MyMVC.servlet.MyServlet</servlet-class><!--對應servlet所屬的文件名 --> 12 </servlet> 13 14 <servlet-mapping> <!-- 建立servlet與action之間的映射 --> 15 <servlet-name>MyServlet</servlet-name> <!-- 映射中servlet的名稱,已定義 --> 16 <url-pattern>/login.do</url-pattern> <!-- 所對應的action --> 17 </servlet-mapping> 18 <!--以上內容為新添加的代碼,請重點關注--> 19 20 21 <welcome-file-list> <!--welcome-file-list開頭--> 22 <welcome-file>MyJsp.jsp</welcome-file> <!--設置歡迎頁面,也就是項目啟動后瀏覽器展示的第一個頁面--> 23 </welcome-file-list> <!--welcome-file-list結尾--> 24 25 </web-app>
看到關於action的那一行XML代碼,是否想到了什么呢?沒錯,就是jsp表單中所定義的action。試着修改,看看會有什么效果?
第五步:新建M(模型)的POJO文件
POJO(Plain Ordinary Java Objects)簡單的Java對象,實際就是普通JavaBeans,是為了避免和EJB混淆所創造的簡稱。POJO實質上可以理解為簡單的實體類,顧名思義POJO類的作用是方便程序員使用數據庫中的數據表。——《百度百科》
首先,在src文件下新建包,包名為cc.MyMVC.POJO。然后在該包下新建class文件,名為MyPOJO。
為了讓讀者,尤其是初學者更快地理解MVC,而不是將精力耗費在理解POJO以及數據庫操作上面,我將POJO進行了盡可能的簡化。代碼如下:
1 package cc.MyMVC.POJO; 2 3 public class MyPOJO { 4 public boolean login(String id,String password){ 5 if(id.equals("admin")&&password.equals("123456")){//判斷用戶名以及密碼是否與設定相符 6 return true; 7 } 8 else return false; 9 } 10 }
第六步:新建V(視圖)中的另外兩個JSP文件
在Web-Root文件夾下新建兩個jsp文件,分別命名為LoginSuccessful.jsp以及LoginFailed.jsp。代碼如下:
1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 </head> 11 <body> 12 Login Successful. <br> 13 </body> 14 </html>
1 <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 </head> 11 12 <body> 13 Login Failed. <br> 14 </body> 15 </html>
第七步:跑項目,看效果
(1)輸入賬號:admin,密碼:123456 將會跳轉到頁面如下:
(2)輸入錯誤的賬號或錯誤的密碼,將會跳轉到頁面如下:
直到這里,示例項目已經構建和演示完畢了。為了簡化說明,狠心把許多重要但是對此次說明可能有妨礙的知識點給砍掉了。例如,web.xml為什么可以決定歡迎頁,為什么可以進行servlet的配置;HTTP中的post請求以及get請求又是什么樣的?諸如此類,不一而足。再提一下林信良老師的《Servlet&JSP學習筆記》,里面有更加詳細的講解,強烈推薦!
MVC框架,主要是對應用的分層,在web項目中尤其流行,算是最基礎的分層模式。初學者可能還不了解MVC框架的作用,甚至會覺得這樣做故作高深,最后像我當初那樣,把所有的代碼都擠到一個或幾個jsp文件當中。其實,隨着項目規模的逐漸龐大以及團隊成員的增加,分層的思想不僅有助於分工合作,還增加了項目的伸縮性,降低了測試和debug的工作量和難度。
最后,一句話,實踐最重要!
歡迎大家給我留言。剛開始寫技術博客,很多東西都不懂,虛心接受各路大牛的批評建議。如果有不明白的地方,請給我留言,如果是我所能夠回答的一定會盡快回復。我關注的領域主要是在java web開發、J2EE等方面,對linux、php、算法等方面都比較感興趣,如果有想看的專題入門文章別的地方找不到,沒問題,告訴我,如果合適的話,我來寫!