在相關Web Framework出現前,開發傳統Java Web應用程式,免不了要除了撰寫Servlet class程式,還得到web.xml設定一堆Servlet Mapping來告訴Web Container處理Client端所發出的URL Request要用哪一個Servlet來處理,這讓初學者覺得學習門檻比較高,後來有Struts等framework出現來協助加速開發Web應用程式且更容易實現MVC架構,今天就要跟大家分享Spring MVC處理Request的流程以及撰寫一支Hello World程式。
在Spring MVC中只有一個Servlet來handle所有的Request,這是一種Front Controller的Design Pattern,Spring MVC稱作DispatchServlet,透過這個Servlet再把Request交由對應的handler來處理(handler跟Controller在Spring MVC中幾乎是同義字,只是Spring稱作RequestHandler),例如要從資料庫取得資料,則Handler或是Controller就向Model中的相關Service取得資料後,作一些判斷或是加工後,傳給View層中的ViewResolver產生回應Response的頁面或是其他格式如JSON或是XML,Controller、Model、View層間通常以org.springframework.ui.Model物件來傳遞data,該物件本質上是個Map,之後會常看到。
首先,STS新增Spring Bean Configuration File,命名為dispatcherservlet.xml,並將相關的namespace加入,beans、mvc、context為必須,aop、jdbc、oxm、tx也可以一併加入。
因為我們將使用Annotation來作URL Mapping,故必須宣告<mvc: annotation-driven>,另外resources通常也會作mapping,以免網頁存取不到相對路徑的靜態檔案如css檔以及圖檔等,再來需要一個render jsp網頁的bean,其類別為org.springframework.web.servlet.view.InternalResourceViewResolver,在jsp網頁中常用的JSTL標籤故一併宣告,另外通常Controller傳回的是邏輯名稱,故在Resolver這邊需要宣告prefix告訴Spring MVC網頁的資料夾,宣告suffix告訴Spring MVC網頁副檔名為.jsp,最後我們還需要<context:Component-scan>指定有含有Annotation class的package,其作用為掃描指定的package註冊含有@Component, @Controller, @Repository, @Service等地class為bean,其code如下
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
......
<context:component-scan
base-package="tw.blogger.springtech.springmvc.controller, tw.blogger.springtech.springmvc.model" />
<context:annotation-config />
<mvc:annotation-driven />
<mvc:resources location="/resources/" mapping="/resources/**" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
<beans>
需要在web.xml加入Dispatchservlet以及對應的mapping,其code如下:
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/springconfig/dispatchservletcontext.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
新增一個DefaultController,@RequstMapping即為Controller處理的URL,method為HTTP的GET,Controller方法帶Model參數,以利傳遞變數到jsp網頁
@Controller
public class DefaultController {
@Autowired
private DneUserRepository dneUserRepository;
@RequestMapping(value="/", method=RequestMethod.GET)
public String showIndexPage(Model model){
model.addAttribute("hello", "Hello World!");//傳遞hello變數到jsp網頁,其值為Hello World!
return "index";
}
}
新增index.jsp,存取model變數用${}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>${hello }</title>
<h1>${hello }</h1>
啟動Server,即完成第一支Hello World程式
您好:請問
新增一個DefaultController
新增index.jsp
這是 分別要加入到哪個PACKAGE 或目錄?
若 MyDAO 是加到 g1.springmvc.model.dao
那 DefaultController 要加到 g1.springmvc.controller嗎?
index.jsp 是要加到 src/main/webapp/WEB-INF/下 ?
另外 private DneUserRepository dneUserRepository;
無DneUserRepository? 要自己建嗎?