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