1. 程式人生 > >SpringMVC框架(1)之(1.2 入門程式—常用的處理器對映器和處理器介面卡)

SpringMVC框架(1)之(1.2 入門程式—常用的處理器對映器和處理器介面卡)

1. 程式結構:

  1. 建立一個Web專案,匯入 Spring的 jar包:
    使用 Spring3.2.0(帶SpringMVC模組)
  2. web.xml 檔案中配置 DispatcherServlet前端控制器
    (DispatcherServlet作為 springmvc的中央排程器存在,降低了各個元件之間的耦合度;)
  3. springmvc.xml 檔案中配置 SpeingMVC架構三大元件中的 HandlerMapping處理器對映器:
    1. BeanNameUrlHandlerMapping:表示將定義的 Bean的名字作為請求的 url,根據 bean的 name查詢 Handler,將 action的 url配置在 bean的 name中;
    2. SimpleUrlHandlerMapping
    :是 BeanNameUrlHandlerMapping的增強版;
  4. springmvc.xml 檔案中配置 HandlerAdaptor處理器介面卡:
    SimpleControllerHandlerAdaptor:簡單控制器處理介面卡;(類的原始碼中的 supports方法中,將實現了 Controller介面的 bean作為 springmvc的 handler後端控制器;)
  5. springmvc.xml 檔案中開發 Handler後端控制器:
    (建立一個 ItemListController類 ItemListController.java實現 Controller;再在 springmvc.xml 檔案中配置 Handler;)
  6. springmvc.xml 檔案中配置 ViewResolver檢視解析器:
    InternalResourceViewResolver:支援 Jsp檢視解析;
  7. 請求路徑: http://localhost:8080 /專案名/配置介面卡Handler中的name名即請求路徑
    (ItemListController.java類中已經將資料填充到 request域中;為將 request域中內容顯示出來,需要在 jsp頁面中進行檢視開發;)
  8. 檢視開發:
    (jsp頁面進行檢視開發)

1. web.xml
(① < servlet> 標籤中:如果不配置 < init-param>

的contextConfigLocation,則預設查詢的是classpath下的:servlet名稱+"-servlet.xml"(springmvc-servlet.xml) ;② < servlet-mapping> < url-pattern>標籤中可配置 /,此工程所以請求全部由SpringMVC解析;可以配置 * .do, * .action,所有請求以*.do,*.action的有SpringMVC解析;不可配置 / *;③ 為了讓 servlet執行加快,在< servlet>標籤中新增 < load-on-startup>1< /load-on-startup>,讓 DispatcherServlet在伺服器啟動時自動啟動;)

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_3_1.xsd"
         version="3.0">
         
         <!-- 1.DiapatcherServlet前端控制器 -->
         <servlet>
         	<servlet-name>springmvc</servlet-name>
         	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	        <init-param> //
	         	<param-name>contextConfigLocation</param-name>
	         	<param-value>classpath:springmvc.xml</param-value>
	        </init-param>
	        <load-on-startup>1</load-on-startup> //
         </servlet>
         <servlet-mapping>
         	<servlet-name>springmvc</servlet-name>
         	<url-pattern>*.action</url-pattern> //
         </servlet-mapping>

         <welcome-file-list>

         </welcome-file-list>
</web-app>

2. springmvc.xml
①. HandlerMapping 處理器對映器中: BeanNameUrlHandlerMapping:表示將定義的 Bean的名字作為請求的 url;
SimpleControllerHandlerAdaptor:簡單控制器處理介面卡;根據配置的 handler的 id進行查詢;
②. HandlerAdaptor 處理器介面卡:
SimpleControllerHandlerAdaptor:簡單控制器處理介面卡;(下圖1類的原始碼中的 supports方法中,將實現了 Controller介面的 bean作為 springmvc的 handler後端控制器;)
HttpRequestHandlerAdaptor:要求 Handler(即Controller)實現 HttpRequestHandler介面;(下圖2類的原始碼中的 supports方法中,將實現了 Controller介面的 bean作為 springmvc的 handler後端控制器;下新建 3’. ItemListController2.java 類;)
在這裡插入圖片描述在這裡插入圖片描述
③. Handler 後端控制器:
因為 HandlerMapping 處理器對映器中是根據 bean的 name查詢 handler(即 BeanNameUrlHandlerMapping類,因為使用BeanNameUrlHandlerMapping處理器對映器,name的配置是url),所以配置 Handler的 bean要有 name,name設為 name="/itemsList.action";

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> 
	
	<!-- 3.配置Handler(因為使用BeanNameUrlHandlerMapping處理器對映器,name配置是url) -->
	<bean  id="itemsListController1" name="/itemsList.action" class="com.asd.ItemListController"></bean>
	<bean  id="itemsListController2" class="com.asd.ItemListController2"></bean>

	<!-- 1.處理器對映器 -->
	<!-- 法一:根據bean的name(自定義)查詢handler,將action的url配置在bean的name中 -->
	<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
	</bean>
	<!-- 法二:根據bean的name(自定義)查詢handler,將action的url配置在bean的name中 -->
	<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mapping">
			<props>
				<prop key="/items1.action">itemsListController1</prop>
			  //<prop key="/items2.action">itemsListController1</prop>
			    <prop key="/items2.action">itemsListController2</prop>
			</props>
		</property>
	</bean>

	<!-- 2.處理器介面卡 -->
	<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
	<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>

	<!-- 4.檢視解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>

</beans>

3. ItemListController.java
(類中List < Items> itemsList,所以需要建立一個 Items.java類;需要轉發到指定的 jsp頁面,所以需要一個 itemsList.jsp頁面,放在 WEB-INF下建立的 jsp資料夾中(所以類中 modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp");):
在這裡插入圖片描述

public class ItemListController implements Controller{
	public ModelAndView handleRequest(HttpServletRequest request,HttpServletResponse response)throws Exception{
		//靜態資料(商品列表)
		List<Items> itemsList=new ArrayList<Items>();
		Items item1=new Items();
		item1.setName("筆記本");
		item1.setPrice(5000);
		item1.setDetail("膝上型電腦");

		Items item2=new Items();
		item2.setName("手機");
		item2.setPrice(5000);
		item2.setDetail("華為手機");

		itemsList.add(item1);
		itemsList.add(item2);

		ModelAndView modelAndView=new ModelAndView();
		//填充資料到 request域中
		modelAndView.addObject("items",itemsList);
		//檢視
		//指定轉發的jsp頁面
		modelAndView.setViewName("/WEB-INF/jsp/itemsList.jsp");
		return modelAndView;
	}
}

3’. ItemListController2.java
(使用 HandlerAdaptor 處理器介面卡: HttpRequestHandlerAdaptor:要求 Handler(即Controller)實現 HttpRequestHandler介面 的介面卡方式;以下類完成後。 ①.2. springmvc.xml 檔案 配置 處理器介面卡< bean class=“org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter”>< /bean>;②. 再在 2. springmvc.xml 檔案 配置 Handler,即 新增 handler的 bean其 id=“itemsListController2” ; 再在 ③. 處理器對映器 中配置< prop key="/items2.action">itemsListController2< /prop>;自總結:根據處理器對映器中的 key值 /items2.action(即請求的url)對應的值 itemsListController2即為 handler的 bean的 id,根據 itemsListController2找到對應的 Controller類;

public class ItemListController2 implements HttpRequestHandler{
	public void handleRequest(HttpServletRequest request,HttpServletResponse response)throws ServletExpection,IOException{
		//靜態資料(商品列表)
		List<Items> itemsList=new ArrayList<Items>();
		Items item1=new Items();
		item1.setName("筆記本");
		item1.setPrice(5000);
		item1.setDetail("膝上型電腦");

		Items item2=new Items();
		item2.setName("手機");
		item2.setPrice(5000);
		item2.setDetail("華為手機");

		itemsList.add(item1);
		itemsList.add(item2);

		request.setAttribute("items",itemsList);
		request.getRequestDispatcher("/WEB-INF/jsp/itemsList.jsp").forward(request,response);
	}
}

3’. Items.java

public class Items{
	private int id;
	private String name;
	private double price;
	private String detail;
	private String pic;
	private Date createDate;
	get、set();
}

3’’. ItemsList.jsp
(< c:foreach>顯示要用到 jstl標籤,所以文字頭要新增一行:)

<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<body>
	<table width="100%" border="1">
		<tr><td>商品名稱</td><td>商品價格</td><td>商品詳情</td></tr>
		<c:foreach items="${items}" var="item">
			<tr><td>${item.name}</td><td>${item.price}</td><td>${item.detail}</td></tr>
		</c:foreach>
	</table>
</body>

執行結果:
URL請求路徑:http://localhost:8080 /專案名/配置介面卡Handler中的name名即請求路徑(可顯示 表中結果)