2014年4月22日 星期二

用Spring 撰寫第一個Java Web Application

Spring是Java常聽到的Framework,

而使用Spring MVC開發Web Application也已是許多公司企業的解決方案之一,

經過一陣子學習如何使用強大的Spring之後,

下面就簡單紀錄一下如何用Eclipse搭配Spring MVC快速建立一個Template Project。

(免得少年癡呆症發作,過沒多久就全部忘光光:S )



首先,若不想花時間另外裝Maven等等的套件,

就要選用EE版的Eclipse,裡面已經包山包海甚麼基本套件都有了。

接著可到Marketplace去下載STS (Spring Tool Suite)套件,

在Find文字框查找關鍵字sts就可以很快速找到一系列的版本,

選擇適合你Eclipse的版本後點選安裝。


套件內含很多子套件,基本上全裝就OK


接下來的安裝步驟沒甚麼特別,

最後安裝成功後會要重啟Eclipse,

重啟之後,世界就變得不一樣了,

讓我們到 New->Other... 裡面看一下,


多了Spring相關的類型可以新增,

我們選擇 Spring Project看看裡面有甚麼。


找到了各種專案的Template,

選擇我們要的 Spring MVC Project,並給定一個Project name,


最後一步是給定初始的Package,

所有的初始設定就完成啦。


點選Finish後,

Eclipse就會開始建立檔案的Template,

建好之後Maven就會開始下載所需要的jar檔,

所以會稍微lag一下子,要等它Build好專案,

完成後可看到以下的專案結構,

這就是一個初始的Spring MVC專案啦!


既然是MVC,那當然不可或缺的就是Model、View、Controller,

在專案目錄中我們可看到Template中已包含了

範例的Controller (HomeController.java)和他的View (home.jsp),

而Model則是在Controller中被組織起來,

以HomeController的例子來看:

@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
 logger.info("Welcome home! The client locale is {}.", locale);
  
 Date date = new Date();
 DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
  
 String formattedDate = dateFormat.format(date);
  
 model.addAttribute("serverTime", formattedDate );
  
 return "home";
}

@RequestMapping這個注解定義了此Controller在哪種URL Pattern會被連入,

也就是說當URL Pattern指定為根目錄並且方法為GET時,會進這支Method。



而此頁面該用哪個View呈現,則是定義在return的字串中,

預設Spring已經設定好View的JSP檔案路徑在 webapps/WEB-INF/views/ 下,

並且副檔名是 .jsp,

因此 return "home" 代表的就是此頁面會使用

webapps/WEB-INF/views/home.jsp 這個JSP檔案當做呈現的View。



而Model則是由參數的形式傳遞,

我們在Controller的Method中可以用addAttribute把資料塞進Model裡傳給JSP端呈現。

範例檔案內他塞了 serverTime 這個屬性到Model內,而值是目前的時間戳記,

範例的home.jsp檔案內只有簡單一行

<p> The time on the server is ${serverTime}. </p>

就可以把Model的資料取出來使用,使用起來算是滿直覺的。



雖然這個Template Project範例很簡單,

但其實已把M、V、C三個部分用簡單易懂的方式區隔出來,

並且容易開發,算是滿好的一個開發典型。

如果要挑甚麼問題的話可能是Model那一塊現在還不是很好控制,

但這未來可以用JPA等Framework去解決。



最後需要的是運行這個專案,

既然是Web Application,自然就需要Web Server,

而EE版的Eclipse也內建好這塊功能了,

我們可以先切到Server的頁籤下去新增一個Web Server,


這邊先以Apache的Tomcat 7.0為例進行Server的安裝設定。


點選下一步後,

要選擇Tomcat的路徑,如果你的電腦之前就裝過Tomcat 7,

可選擇Browse...去找到對應的路徑,

否則可選擇Download and Install立馬裝一個新的。


裝好或指定好Tomcat路徑後,

最後就是設定這個Tomcat要起哪些Web Application,

把我們的mvc Project加入設定清單,就完成最後的手續。


完成後此時 Server的頁籤應該會多出一個 Tomcat 7的名字,

並且展開後下面掛著一個mvc的專案。


最後就來實際執行看看吧,

在Tomcat 7上點選右鍵→Start


打開瀏覽器輸入網址:http://localhost:8080/mvc

看到以下Hello World畫面和當前時間戳記,就代表第一個MVC Web Application成功啦

可喜可賀!


4 則留言:

  1. 撰文風格很有趣,感謝分享 :)

    回覆刪除
    回覆
    1. 謝謝, 老實說是因為沒什麼料所以才在內文加油添醋一下, 真不好意思:p

      刪除
    2. 謝謝你的解說,對我很有幫助。

      刪除
  2. 想請問
    已經連接上了tomcat6.0確定以連線了

    結果跳出http state 500-的錯誤

    內容
    ------------------------------------------------------
    type Exception report

    message

    description The server encountered an internal error () that prevented it from fulfilling this request.

    exception

    org.apache.jasper.JasperException: Unable to read TLD "META-INF/c.tld" from JAR file "file:/C:/Users/user/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/SpringMVC/WEB-INF/lib/jstl-1.2.jar": org.apache.jasper.JasperException: Failed to load or instantiate TagLibraryValidator class: org.apache.taglibs.standard.tlv.JstlCoreTLV
    org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:51)
    org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:409)
    org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:181)
    org.apache.jasper.compiler.TagLibraryInfoImpl.(TagLibraryInfoImpl.java:182)
    org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:420)
    org.apache.jasper.compiler.Parser.parseDirective(Parser.java:476)
    org.apache.jasper.compiler.Parser.parseElements(Parser.java:1426)
    org.apache.jasper.compiler.Parser.parse(Parser.java:133)
    org.apache.jasper.compiler.ParserController.doParse(ParserController.java:216)
    org.apache.jasper.compiler.ParserController.parse(ParserController.java:103)
    org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:167)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:306)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:273)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
    org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
    org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1180)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    note The full stack trace of the root cause is available in the Apache Tomcat/6.0.14 logs.

    該如何解決呢??

    回覆刪除