欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Spring高級程序設計 17 基于Spring MVC的Web應

系統 2209 0

Spring高級程序設計 17 基于Spring MVC的Web應用開發



1MVC架構

MVC是模型(model)、視圖(view)、控制器(controller)。
有些應用需要處理用戶請求并操縱和顯示數據,MVC模式可以簡化其實現。


該模式由3個組件構成:
1、模型表示用戶希望看到的數據。通常情況下,模型由JavaBean構成。
2、視圖負責顯示模型。文件編輯器中的視圖組件會以恰當的格式顯示一段文本,視圖在Web應用中會生成客戶端瀏覽器可以解釋顯示的HTML。
3、控制器表示邏輯代碼,負責處理請求和執行用戶的意圖。他會構建恰當的模型并將其傳入視圖進行顯示。對Java Web應用來說,控制器多是一個Servlet。當然,控制器可以使用任意語言實現,只要Web容器支持就行。


2Spring MVC介紹

Spring MVC支持可以讓我們使用MVC模式二構建靈活方便應用,他的實現相當通用。
模型就是一個包含數據的簡單的Map,視圖就是一個接口,由他實現顯示數據,控制器是Controller接口的實現。


(Spring MVC不僅實現了Servlet,而且完全支持JSR 168 portlet開發)


Spring對Web應用下的MVC模式的實現基于DispatcherServlet。該Servlet會處理請求并調用恰當的控制元素對請求進行處理。
DispatcherServlet會攔截請求并決定由哪個控制器處理請求。Spring控制器的handling方法會返回一個ModelAndView實例。該實例持有對視圖和模型的引用。模型就是一個簡單的Map實例,他里面是JavaBean,View接口會顯示這些JavaBean。View接口定義 render方法。他遵循這樣的原則:View的實現可以是任何東西,只要客戶端能對其進行解析就行。


MVC實現
MVC入口方式

    <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<display-name></display-name>

	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.html</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>*.tile</url-pattern>
	</servlet-mapping>

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>
  

3使用處理器映射

org.springframework.web.servlet.HandlerMapping:
Interface to be implemented by objects that define a mapping between requests and handler objects.


This class can be implemented by application developers, although this is not necessary, as org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping and org.springframework.web.servlet.handler.SimpleUrlHandlerMapping are included in the framework. The former is the default if no HandlerMapping bean is registered in the application context.


HandlerMapping implementations can support mapped interceptors but do not have to. A handler will always be wrapped in a HandlerExecutionChain instance, optionally accompanied by some HandlerInterceptor instances. The DispatcherServlet will first call each HandlerInterceptor's preHandle method in the given order, finally invoking the handler itself if all preHandle methods have returned true.


The ability to parameterize this mapping is a powerful and unusual capability of this MVC framework. For example, it is possible to write a custom mapping based on session state, cookie state or many other variables. No other MVC framework seems to be equally flexible.


Note: Implementations can implement the org.springframework.core.Ordered interface to be able to specify a sorting order and thus a priority for getting applied by DispatcherServlet. Non-Ordered instances get treated as lowest priority.


HandlerMapping實現:
BeanNameUrlHandlerMapping:bean的名稱由URL標識。如果URL為/product/index.html,那么我們就必須將處理該映射的控制器bean的ID設為/product/index.html。該映射很適合小型應用,因為他不支持請求的通配符。
SimpleUrlHandlerMapping:憑借該處理器映射,我們可以在請求中(使用全名和通配符)處理該請求的控制器。
ControllerClassNameHandlerMapping:該處理器 映射屬于2.5引入的約定優于配置的方案。他會根據控制器的類名自動生成URL路徑。


org.springframework.web.servlet.handler.AbstractHandlerMapping:
Abstract base class for org.springframework.web.servlet.HandlerMapping implementations. Supports ordering, a default handler, and handler interceptors.


Note: This base class does not support exposure of the PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE. Support for this attribute is up to concrete subclasses, typically based on request URL mappings.




上面三個最終實現類都繼承了AbstractHandlerMapping,此類具有如下屬性:
List interceptors:該屬性表示使用的攔截器列表。
Object defaultHandler:在映射和處理器都不匹配的情況下,改屬性指定了默認的處理器。
int order:Spring可以根絕order屬性值對context中的所有處理器映射進行排序,并使用第一個匹配的處理器。


AbstractUrlHandlerMapping extends AbstractHandlerMapping:
UrlPathHelper urlPathHelper:借助于該屬性,你可以通過UrlPathHelper來檢查URL。
boolean lazyInitHandlers = false:改屬性可以對單例(singleton)處理器進行延遲初始化(prototype處理器總是延遲初始化)。其默認值為false。


AbstractUrlHandlerMapping的實例變量UrlPathHelper urlPathHelper = new UrlPathHelper():
boolean alwaysUseFullPath = false:是否匹配全路徑。
boolean urlDecode = true:默認false。HttpServletRequest會返回未經解碼的URL和URI。如果希望在處理器出氣之前進行解碼,就改為true。默認是ISO-8859-1。




BeanNameUrlHandlerMapping配置:
(如果沒有指定HandlerMapping,默認情況下DispatcherServlet會實例化BeanNameUrlHandlerMapping)

    <beans>
	<bean name="index.html.form" class="MyIndexController"/>
</beans>
  



SimpleUrlHandlerMapping配置:

        <bean id="internalPathMethodNameResolver"
          class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
        <property name="suffix" value="Handler"/>
    </bean>
    <bean id="publicUrlMapping"
          class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <value>
                /index.html=indexController
                /exception/*.html=exceptionController
            </value>

        </property>
    </bean>
    <bean id="exceptionController"
          class="com.apress.prospring2.ch17.web.exception.ExceptionController">
        <property name="methodNameResolver" ref="internalPathMethodNameResolver"/>
    </bean>
    <bean id="indexController"
          class="com.apress.prospring2.ch17.web.IndexController">
    </bean>
  



4Spring控制器

控制器負責請求處理的一切:根據請求構建模型并將其傳到視圖以進行顯示。
Spring的DispatcherServlet會攔截客戶端發來的請求并使用HandlerAdapter的一個實現(該實現負責代理請求)做進一步的處理。 你可以自己實現HandlerAdapter,這樣就可以對請求所經過的命令鏈進行修改了。
DispatcherServlet有一個List handlerAdapters屬性,他可用來指定你想用的handlerAdapter實現。可以在自己的handlerAdapter中實現Ordered接口以指定順序。
如果handlerAdapters為空,使用默認的SimpleControllerHandlerAdapter。
SimpleControllerHandlerAdapter會將請求代理給Controller接口的實現(action需要實現Controller接口)。
Controller接口依賴于HttpServletRequest和HttpServletResponse,這意味著你只能將其用在Web應用中。


helloworld:

    package cn.partner4java.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class IndexController implements Controller {

	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		response.getWriter().println("hello,world");
		return null;
	}

}

  

1、AbstractController類
控制器只需要繼承AbstractController而不用實現Controller接口就可以直接訪問到ServletContext、WebApplicationContext、ApplicationContext、Log和MessageSourceAccessor。
WebContextGenerator和AbstractController屬性:
supportedMethods -- 支持和容許HTTP方法 -- GET、POST
requiresSession -- 是否需要HttpSession實現來處理請求 -- false
useExpiresHeader -- 是否使用HTTP1.0 expires頭 -- true
useCacheControlHeader -- 是否使用HTTP1.1 cache-control頭 -- true
cacheSeconds -- 讓客戶端對生成的內容緩存指定的秒數 -- -1
synchronizeOnSession -- 調用handleRequestInternal前,控制器是否應該同步HttpSession實例。這對客戶端可重用的請求處理的序列化非常有用 -- false


helloworld:

    package cn.partner4java.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class IndexController2 extends AbstractController {

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		setCacheSeconds(10);
		response.getWriter().println("hello world " + System.currentTimeMillis());
		return null;
	}

}
  

但是緩存不知道為什么不起作用




2、ParameterizableViewController
ParameterizableViewController extends AbstractController
它實現了handleRequestInternal方法以通過viewName屬性中的名字返回新的模型。返回的模型中并沒有數據,你使用控制器的唯一理由就是用其名字來顯示視圖。


helloworld:

    package cn.partner4java.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.ParameterizableViewController;

/**
 * getViewName()可以配置進來
 * @author partner4java
 *
 */
public class IndexController3 extends ParameterizableViewController {

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		response.getWriter().println("hello world");
		return null;
//		return new ModelAndView(getViewName());
	}
	
}

  





3、MultiActionController類
通過該Controller實現,你可以將多個URL映射到同一個控制器上并使用不同的方法來處理各種URL。
AbstractController的另兩個屬性--delegate和methodNameResolver用于告訴MultiActionController調用哪個對象的哪個方法來處理每個請求。
如果delegate為默認值或者null,控制器就會調用MultiActionController子類自己的方法;如果delegate屬性不為null就會調用代理的方法。
methodNameResolver屬性的值必須是MethodNameResolver的實現。
MethodNameResolver實現:
InternalPathMethodNameResolver -- 從路徑的最后一部分(文件部分)獲取方法名并去掉擴展名。在使用該解析器解析路徑時會將/servlet/foo.html映射到方法public ModelAndView foo(..)上。這也是MultiActionController所用的默認實現。
ParameterMethodNameResolver -- 從特定的請求參數獲取方法名。其默認的參數名是action,可以在context文件中修改。
PropertiesMethodNameResolver -- 從外部的屬性文件中獲取方法名。可以指定精確的映射規則,如/test.html=handleTest,還可以使用通配符,如/*=handleAll


以方法名作為請求匹配:

    //http://localhost:8080/springmvc/index/view.html?productId=10
public class IndexController4 extends MultiActionController {

	public ModelAndView view(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		response.getOutputStream().println(
				"Viewing product" + request.getParameter("productId"));
		return null;
	}
}

	<bean id="publicUrlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<value>
				/index/view.html=indexController4
            </value>
		</property>
	</bean>
	<bean id="indexController4" class="cn.partner4java.controller.IndexController4"/>

  

    以viewHandler方法名的方式調用(去掉擴展名,增加“Handler”字符串):
public class IndexController5 extends MultiActionController {

	public ModelAndView viewHandler(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		response.getOutputStream().println(
				"Viewing product" + request.getParameter("productId"));
		return null;
	}
}

	<bean id="publicUrlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<value>
				/product/view.html=indexController5
            </value>
		</property>
	</bean>

	<bean id="internalPathMethodNameResolver"
		class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
		<!-- Specify a common suffix for handler method names. Will be appended 
			to the internal path found in the URL: e.g. internal path "baz", suffix "Handler" 
			-> method name "bazHandler". -->
		<property name="suffix" value="Handler" />
	</bean>
	<bean id="indexController5" class="cn.partner4java.controller.IndexController5">
		<property name="methodNameResolver" ref="internalPathMethodNameResolver" />
	</bean>



可以通過設置paramName屬性來改變這一點,可以將defaultMethodName屬性設為調用的方法名:
//http://localhost:8080/springmvc/product/a.html?productId=131&method=view
//http://localhost:8080/springmvc/product/a.html?productId=131
public class IndexController6 extends MultiActionController {

	public ModelAndView view(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		response.getOutputStream().println(
				"Viewing product" + request.getParameter("productId"));
		return null;
	}
}

	<bean id="publicUrlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<value>
				/product/a.html=indexController6
            </value>
		</property>
	</bean>
	<bean id="parameterMethodNameResolver"
		class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
		<property name="paramName" value="method" />
		<property name="defaultMethodName" value="view" />
	</bean>
	<bean id="indexController6" class="cn.partner4java.controller.IndexController6">
		<property name="methodNameResolver" ref="parameterMethodNameResolver" />
	</bean>

	
	
從外部的屬性文件中獲取方法名:
//http://localhost:8080/springmvc/pro/viewpro.html?productId=22
public class IndexController7 extends MultiActionController {

	public ModelAndView view(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		response.getOutputStream().println(
				"Viewing product" + request.getParameter("productId"));
		return null;
	}
}

	<bean id="publicUrlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<value>
				/pro/viewpro.html=indexController7
			</value>
		</property>
	</bean>
	<bean id="propertiesMethodNameResolver"
		class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
		<property name="mappings">
			<value>
				/pro/view.html=view
				/pro/v*.html=view
			</value>
		</property>
	</bean>
	<bean id="indexController7" class="cn.partner4java.controller.IndexController7">
		<property name="methodNameResolver" ref="propertiesMethodNameResolver" />
	</bean>

  



5攔截器

    HandlerInterceptor
提供默認實現HandlerInterceptorAdapter:
demo:
public class BigBrotherHandlerInterceptor extends HandlerInterceptorAdapter {

	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("BigBrotherHandlerInterceptor postHandle:"
				+ request.getContextPath());
	}

}

	<bean id="bigBrotherHandlerInterceptor" class="cn.partner4java.interceptor.BigBrotherHandlerInterceptor"/>

	<bean id="publicUrlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="interceptors">
			<list>
				<ref local="bigBrotherHandlerInterceptor"/>
			</list>
		</property>
		<property name="mappings">
			<value>
				/index.html=indexController
			</value>
		</property>
	</bean>
  



6視圖、本地化和主題

    以編程的方式使用試圖:
客戶端必須實現View接口的唯一方法--render(Map model, HttpServletRequest request, HttpServletResponse response)

demo:
public class PlainTextView implements View {

	public String getContentType() {
		return "text/plain";
	}

	public void render(Map model, HttpServletRequest request,
			HttpServletResponse response) throws Exception {
        response.setContentType("text/plain");
        response.addHeader("Content-disposition", "attachment; filename=output.txt");
        PrintWriter writer = response.getWriter();
        for(Iterator k = model.keySet().iterator();k.hasNext();){
        	Object key = k.next();
        	writer.print(key);
        	writer.println(" contains:");
        	writer.println(model.get(key));
        }
	}

}

public class IndexController8 extends MultiActionController {
	private View view;

	public ModelAndView view(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		setCacheSeconds(10);
		Map model = new HashMap();
		model.put("Greeting", "hello world");
		model.put("Server time", new Date());
		
		return new ModelAndView(view, model);
	}

	public void setView(View view) {
		this.view = view;
	}
}


	<bean id="publicUrlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="interceptors">
			<list>
				<ref local="bigBrotherHandlerInterceptor"/>
			</list>
		</property>
		<property name="mappings">
			<value>
				/index8/view.html=indeController8
			</value>
		</property>
	</bean>
	<bean id="plainTextView" class="cn.partner4java.view.PlainTextView"/>
	<bean id="indeController8" class="cn.partner4java.controller.IndexController8">
		<property name="view" ref="plainTextView"/>
	</bean>
	
	
	
使用試圖解析器:
ViewResolver是一種策略接口,SpringMVC會根絕視圖名和locale使用它來尋找并實例化恰當的視圖。
ViewResolver的實現:
BeanNameViewResolver:這個簡單的實現會以bean的形式得到配置在applicationContext中的View。
ResourceBundleViewResolver:將視圖定義在單獨的配置文件中,這樣就無需在applicationContext文件中配置View bean了。支持國際化。
UrlBasedViewResolver:根絕URL實例化恰當的視圖,我們可以使用前綴和后綴來配置URL。不支持國際化。
XmlViewResolver:解析類似于ResourceBundleViewResolver,也需要將視圖定義放在單獨的文件中。不支持國際化。

    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
        <property name="basename" value="views"/>
    </bean>

那么就會有views.properties默認或者其他語言的  messages.properties
properties格式:
products-edit.class=org.springframework.web.servlet.view.JstlView
products-edit.url=/WEB-INF/views/en_GB/product/edit.jsp
#products-edit.class=org.springframework.web.servlet.view.freemarker.FreeMarkerView
#products-edit.url=product/edit.ftl
#products-edit.class=org.springframework.web.servlet.view.velocity.VelocityView
#products-edit.url=product/edit.vm

controller調用方式:
    public ModelAndView index(HttpServletRequest request,
                              HttpServletResponse response) {

        return new ModelAndView("products-index", "products", products);
    }


使用本地化消息:
通過spring:message標簽呈現。


使用Locale:
ResourceBundleViewResolver國際化底層實現方式,Spring使用LocalResolver接口攔截請求并調用其方法來讀取和設置Locale。
LocaleResolver實現:
AcceptHeaderLocaleResolver:根據用戶發送的accept-language頭返回。
CookieLocaleResolver:根絕客戶端的cookie來識別,用戶可以指定語言無需改變瀏覽器。
FixedLocaleResolver:返回配置好的。
SessionLocaleResolver:類似于cookie。

使用主題:
    <bean id="themeResolver"
          class="org.springframework.web.servlet.theme.FixedThemeResolver">
        <property name="defaultThemeName">
            <value>cool</value>
        </property>
    </bean> 
cool.properties
default.properties

<link rel="stylesheet" href="<spring:theme code="css"/>">

  



7命令控制器

命令控制器可以通過表單提交來組裝命令對象的屬性。由于命令控制器會與Spring標簽庫緊密協作來簡化數據驗證,因此在其中執行業務驗證再適合不過了。
AbstractCommandController:用來提供對驗證和數據綁定的基本支持,你可以用它來實現自己的命令控制器。
AbstractFormController:繼承自AbstractCommandController,可以處理html表單提交。處理request中的值并將其組裝成控制器的命令對象。還能檢測表單的重復提交,同時還可以在代碼而不是Spring context文件中指定顯示的視圖。有一個有用的方法Map referenceData(),他為表單視圖返回模型對象(java.util.Map類型)。在該方法中,你可以輕松傳遞用于表單頁面的參數。
SimpleFormController:你可以指定初始和隨后的視圖,同時還可以用提交的數據來設定需要組裝的命令對象。
AbstractWizardFormController:有助于實現向導式的頁面集,因為他必須放在當前的HttpSession中,這樣你需要實現validatePage()方法來檢查當前頁面上的數據是否有效以及向導是否可以進入到下一個界面。最后會會調用processFinish()方法,以表明其完成了向導的最后一個界面,同時也表明數據是有效的,可以傳到業務層。但是Spring建議使用Spring Web Flow替代本使用。


1、使用表單控制器
2、探索AbstractWizardFormController類
3、 文件上傳


(具體本節內容查看P567-P580)




8處理異常

    Spring提供了HandlerExceptionResolver來處理控制器中的異常。
提供的開箱方式:
<bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
	<property name="defaultErrorView" value="defaultErrorView"/>
	<property name="exceptionMappings">
		<props>
			<prop key="java.lang.NullPointerException">nullPointerErrorView</prop>
			<prop key="javax.servlet.ServletException">servletErrorView</prop>
		</props>
	</property>
</bean>


自己實現:
public class ApressExceptionResolver implements HandlerExceptionResolver {

	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {
		Map<String, Object> model = new HashMap<String, Object>();
		model.put("message", ex.getMessage());
		return new ModelAndView("/exception.jsp", model);
	}

}
配置很簡單,你只需要定義一個實現了HandlerExceptionResolver的bean就可以,id都可以省略,spring就會那他來處理異常。(約定優于配置,后面還很多這種用法)
<bean id="exceptionResolver" class="cn.partner4java.ApressExceptionResolver"/>

  



9Spring與其他Web技術

1、使用JSP
2、使用Velocity
3、FreMarker
4、使用XSLT視圖
5、使用PDF視圖
6、實現PDF視圖
7、使用Excel視圖
8、使用Tiles
9、JasperReports報表引擎


(具體查看P583-P626)




10Spring的約定優于配置

    控制器約定:
Spring2.0提供了ControllerClassHandlerMapping類,實現了HandlerMapping接口。
該類根絕Spring配置文件中控制器類的名字將請求URL映射到控制器類上。

demo:
會匹配去掉Controller的類名的路徑
//http://localhost:8080/springmvc/defaulttest.html
//http://localhost:8080/springmvc/defaulttestwwwwwwwww.html
public class DefaultTestController implements Controller {


	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		return new ModelAndView("/test/mytest.vm");
	}

}
配置文件就兩行:
	<bean
		class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
	<bean class="cn.partner4java.controller.DefaultTestController" />

	
	
MultiActionController約定:
Demo:
//http://localhost:8080/springmvc/defaulttest2/view.html
public class DefaultTest2Controller extends MultiActionController {

	public ModelAndView view(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		return new ModelAndView("/test/mytest.vm");
	}

}

	<bean
		class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
	<bean class="cn.partner4java.controller.DefaultTest2Controller"/>	

還可以像Controller一樣給予一個統一方法后綴:
public ModelAndView viewHandler

	<bean id="internalPathMethodNameResolver"
		class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
		<!-- Specify a common suffix for handler method names. Will be appended 
			to the internal path found in the URL: e.g. internal path "baz", suffix "Handler" 
			-> method name "bazHandler". -->
		<property name="suffix" value="Handler" />
	</bean>
	<bean id="indexController5" class="cn.partner4java.controller.IndexController5">
		<property name="methodNameResolver" ref="internalPathMethodNameResolver" />
	</bean>	
	



模型約定:
ModelAndView引入的private ModelMap model;(ModelMap extends LinkedHashMap),就是只需要寫入數據,具體數據對應的存儲名稱是什么,根據變量名字生成,首字母小寫。



視圖約定:
就是會自動識別視圖,如果返回的ModelAndView并沒有指定
public class DefaultTest3Controller extends MultiActionController {

	public ModelAndView view(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		return new ModelAndView();
	}
}

	<bean id="viewNameTranslator" 
		class="org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator" />
	<bean
		class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
	<bean class="cn.partner4java.controller.DefaultTestController" />
	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"/>
		<property name="suffix" value=".jsp"/>
	</bean>

創建文件/WebRoot/WEB-INF/views/defaulttest3/view.jsp
最后會訪問到上面的view.jsp	
	
  


11使用注解配置控制器

    @Controller注解:
@Controller注解簡化了控制類的聲明。無需再去實現Controller接口或繼承任何Spring的控制器類,甚至都無需引用Servlet API了。
@Controller
public class IndexController {
...
}
<context:component-scan base-package="cn.partner4java.controller"/>

======================

@RequestMapping注解:
用于將URL映射到控制器類或特定的方法上。
@Controller
@RequestMapping("/index/ann.html")
public class IndexController {
	
	@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})
	public ModelAndView displayIndex(HttpServletRequest request,
            HttpServletResponse response){
		return new ModelAndView("/index.jsp");
	}
}
或
@Controller
public class IndexController2 {
	
	@RequestMapping("/index2/ann.html")
	public ModelAndView displayIndex(HttpServletRequest request,
            HttpServletResponse response){
		return new ModelAndView("/index.jsp");
	}
}


===============

@RequestParam注解:
用于將控制器的請求參數綁定到控制器中的方法參數上。
(注意返回類型可以變為了String)
//http://localhost:8080/springmvc/index3/ann.html?productId=12
@Controller
public class IndexController3 {
	
	@RequestMapping("/index3/ann.html")
	public String displayIndex(@RequestParam("productId") int productId,
			ModelMap model){
		model.put("productId", productId);
		return "/index.jsp";
	}
}

前臺獲取:${productId }


===============

@ModelAttribute注解:
一:如果方法返回的類型需要用到模型中,可以使用本注解。該注解會用方法的返回值來組裝模型屬性,這是通過其參數和模型名實現的。
	@ModelAttribute("types")
	public Collection<String> populateProductTypes() {
        List<String> types = new ArrayList<String>();
        types.add("Books");
        types.add("CDs");
        types.add("MP3 Players");

        return types;
    }
二:用于方法參數上,特定名稱的模型屬性就會映射到方法參數上。
	@RequestMapping(method = RequestMethod.POST)
	public String processSubmit(@ModelAttribute("product")Product product, BindingResult result,
			SessionStatus status) {

	    System.out.println(product);

        return "products-index";
	}


參數也可以隨意加入:
	@RequestMapping("/index3/ann3.html")
	public String displayIndex3(@ModelAttribute("product") Product product,
			BindingResult result,SessionStatus status,ModelMap model2){
		System.out.println(result.hasErrors());
		model2.put("product", product);
		return "/index.jsp";
	}	
  




Spring高級程序設計 17 基于Spring MVC的Web應用開發


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本jizzz | 日本视频网站在线观看 | 色综合久久丁香婷婷 | 日韩精品中文乱码在线观看 | 青青草国产精品欧美成人 | 国产91久久最新观看地址 | 久久99精品热在线观看15 | 欧美午夜视频 | xifan在线a精品一区二区视频网站 | 999宝藏网 | 亚久久 | 日本高清视频在线播放 | 国产精品尤物在线观看一区 | 日韩免费一区二区 | 日韩一区二区福利 | 久久精品二| 91精品久久久久久久久久 | 波多野结衣在线资源 | 成年网站在线播放 | 九九久久99 | 亚洲精品视频观看 | 爱色av| 久久精品一本到99热免费 | 香蕉视频免费 | 久久综合丁香激情久久 | asian极品呦女爱爱 | 日韩国产欧美在线观看 | 欧美va在线观看 | 成人夜间视频 | 精品免费视频 | 刑事侦缉档案1 | 免费黄色在线 | 一个色综合亚洲伊人久久 | 九色 在线 | 免费在线成人 | 日韩高清免费在线观看 | 天天做夜夜操 | 中国一级毛片在线视频 | 亚洲第一视频网站 | 欧美zzzz| 26uuu中文字幕 |