iT邦幫忙

DAY 4
0

無痛學習SpringMVC與Spring Security系列 第 4

Spring MVC處理Request流程介紹

在相關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程式


上一篇
Spring IoC概念及建立Spring Bean Configuration File(XML)
下一篇
以Java Config取代XML組態檔-以Dispatch Servlet為例
系列文
無痛學習SpringMVC與Spring Security31

1 則留言

0
noway
iT邦新手 5 級 ‧ 2017-01-01 10:09:33

您好:請問
新增一個DefaultController
新增index.jsp
這是 分別要加入到哪個PACKAGE 或目錄?

若 MyDAO 是加到 g1.springmvc.model.dao
那 DefaultController 要加到 g1.springmvc.controller嗎?
index.jsp 是要加到 src/main/webapp/WEB-INF/下 ?

另外 private DneUserRepository dneUserRepository;
無DneUserRepository? 要自己建嗎?

我要留言

立即登入留言