1. 程式人生 > >springMVC學習(三)表單提交之資料封裝

springMVC學習(三)表單提交之資料封裝

結合springmvc學習(一)和(二),我們可以讓伺服器啟動時,首先訪問hello.jsp,然後頁面提交後到TestController中,接著返回到hello.jsp頁面。專案結構如下:

配置如下:

①web.xml中配置如下:

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

   <servlet>
   		<servlet-name>dispatcherServlet</servlet-name>
   		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   		<init-param>
   			<description>指定配置檔案路徑</description>
   			<param-name>contextConfigLocation</param-name>
   			<param-value>/WEB-INF/applicationContext.xml</param-value>
   		</init-param>
   		<!-- 伺服器啟動時建立該servlet例項 -->
   		<load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
   		<servlet-name>dispatcherServlet</servlet-name>
   		<url-pattern>*.do</url-pattern>
   </servlet-mapping>
  <welcome-file-list>
    <welcome-file>hello.do</welcome-file>
  </welcome-file-list>
</web-app>

②applicationContext.xml中配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        	classpath:/org/springframework/beans/factory/xml/spring-beans-3.0.xsd 
        http://www.springframework.org/schema/context 
        	classpath:/org/springframework/context/config/spring-context-3.0.xsd 
        http://www.springframework.org/schema/mvc 
        	classpath:/org/springframework/web/servlet/config/spring-mvc-3.2.xsd ">
        
        <!-- 根據我們請求的不同來選擇呼叫相對應的controller -->
        <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        	<property name="mappings">
        		<props>
        			<prop key="testController.do">testController</prop>
        			<prop key="hello.do">urlPageDirect</prop>
        		</props>
        	</property>
        </bean>
        <bean id="urlPageDirect" class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
        
        <bean id="testController" class="com.zhongqian.controller.TestController"></bean>
        
        <!-- 檢視解析器,用來指定返回後的頁面 .如返回aa,則對於的頁面為/WEB-INF/jsp/aa.jsp -->
        <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
       		 <!-- 返回的檢視模型資料需要經過jstl來處理 -->
        	<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
        	<property name="prefix" value="/WEB-INF/jsp/" />
        	<property name="suffix" value=".jsp" />
        </bean>
</beans>

③hello.jsp頁面如下:
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
	<form method="post" action="testController.do">
		employeeID:<input type="text" name="empId"/><br/>
		empName:<input type="text" name="empName"/><br/>
		empAge:<input type="text" name="empAge"/><br/>
		emphireDate:<input type="text" name="empHireDate"/><br/>
		<input type="submit" value="submit"/> <input type="reset" value="cancel"/>
	</form>
</body>
</html>

④TestController程式碼如下:
public class TestController implements Controller{
	@Override
	public ModelAndView handleRequest(HttpServletRequest arg0,
			HttpServletResponse arg1) throws Exception {
		String name = arg0.getParameter("empName");
		System.out.println(name);
		return new ModelAndView("hello");
	}
}

啟動專案後頁面顯示如下:

暫且只輸入empName(後臺現在只對empName的值進行了接收),然後點選submit提交,後臺列印輸入的內容。

由後臺可知,是通過request.getParameter("name")來接收資料的,當表單資料過多時,這種方式顯然不夠好。現在TestController進行改進,如下:

public class TestController extends AbstractCommandController{
	@Override
	protected ModelAndView handle(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, BindException arg3)
			throws Exception {
		Employee emp = (Employee)arg2;
		System.out.println(emp);
		return new ModelAndView("hello");
	}
}

Employee類程式碼如下:
public class Employee {
	private int empId;
	private String empName;
	private int empAge;
	private Date emphireDate;
	@Override
	public String toString() {
		return empId+" ,"+empName+", "+empAge;
	}
        。。。//get/set方法省略
}
對於頁面hello.jsp,表單中name屬性值要與employee物件屬性名稱一致,這裡先要將empHiredate的name屬性去掉,避免報錯,後面會講到解決方案。現在問題是,表單提交時,物件封裝到改進後的TestController中handler方法的第二個引數,那麼spring在進行封裝時,是如何知道arg2對於的物件是Employee呢?因此在建立TestController對應的bean時,要作如下改動:
         <bean id="testController" class="com.zhongqian.controller.TestController">
            <property name="commandClass" value="com.zhongqian.entities.Employee" />
        </bean>
這是重新發布專案,輸入id,age,name三個輸入框後提交,在後臺會列印輸入的資料。說明資料成功封裝到了arg2中。

下面來處理對於最後一個輸入框empHireDate的處理,將它的name屬性新增上,執行輸入資料後,提交將出現一個奇怪的結果無論輸入什麼emphireDate的值都為空!這是為什麼?在spring進行資料封裝即資料繫結時,提交到後臺的資料都是String型別,對於基本的資料型別會自動的進行轉化,即將String型別轉化int,float等。但是當我們對int的資料型別輸入時,輸入的不是全數字,這個時候轉化就會失敗,但是程式並不報錯,而是將對應的值設為0,即取其預設值.

     那麼如何解決輸入時間的為空的問題呢?這個時候我們就要自定義屬性編輯器了!這裡我們就不自定義了屬性編輯器了,使用springmvc提供一個自定義時間編輯器。接著就要使用這個編輯器了,在TestController中重寫initBinder方法。如下:

@Override
	protected void initBinder(HttpServletRequest request,
			ServletRequestDataBinder binder) throws Exception {
		System.out.println("oooo");
		binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
	}

配置好後,重啟發布,不知道為何,我這裡還是為null。╮(╯▽╰)╭。。。。這裡不再深究了。應為在spring3.0後,已經不推薦這樣做了,這裡學習只是為了更好理解springmvc。

除了AbstractCommandController外,spring還提供了FormController來對錶單資料進行封裝。那麼兩者之間有什麼不同呢?請看如下:

建立一個TestFormController如下:

public class TestFormController extends SimpleFormController {
	//用於將頁面需要的資料傳送到頁面
	protected Map referenceData(HttpServletRequest request) throws Exception {
		Map<String,String[]> map = new HashMap<String,String[]>();
		map.put("deptList", new String[]{"sale","oa","it"});
		return map;
	}
	
	@Override
	protected ModelAndView onSubmit(Object command) throws Exception {
		Employee emp = (Employee)command;
		System.out.println(emp);
		return new ModelAndView(getSuccessView());
	}
	
	@Override
	protected void initBinder(HttpServletRequest request,
			ServletRequestDataBinder binder) throws Exception {
		binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
	}
}

對應bean的配置:
 <bean id="testFormController" class="com.zhongqian.controller.TestFormController">
            <property name="commandClass" value="com.zhongqian.entities.Employee" />
            <property name="formView" value="hello"/>
            <property name="successView" value="hello"/>
        </bean>

另外在handlerMapping需要新增
<prop key="testFormController.do">testFormController</prop>
當用戶以get請求訪問testFormController.do時,會直接跳轉到formView對應的檢視。並且在跳轉到檢視前,會呼叫reffrenceData方法,將頁面需要的資料傳送到頁面。當用於以Post請求時,則會呼叫onSubmit()方法。
修改hello.jsp頁面使用jstl標籤,顯示如下:

輸入正確資料後提交,後臺列印相應的資訊。

相關推薦

springMVC學習提交資料封裝

結合springmvc學習(一)和(二),我們可以讓伺服器啟動時,首先訪問hello.jsp,然後頁面提交後到TestController中,接著返回到hello.jsp頁面。專案結構如下: 配置如下: ①web.xml中配置如下: <?xml version="

微信小程式學習筆記提交、PHP後臺資料互動

【form表單提交】 form.wxml: <form bindsubmit="formSubmit" bindreset="formReset"> <view> 暱稱:<input type="text" name="nic

和圖片

sele 技術 fcc 註意 round btn hold 分享 style 一、表單 1. 基本實例 單獨的表單控件會被自動賦予一些全局樣式。所有設置了 .form-control 類的 <input>、<textarea> 和 <sele

Struts學習-標簽,一個實例練習

area 輸入 pan als 視覺效果 font pack quest 文本 表單標簽將在 HTML 文檔裏被呈現為一個表單元素 使用表單標簽的優點: 表單回顯 對頁面進行布局和排版 標簽的屬性可以被賦值為一個靜態的值或一個 OGNL 表達式. 如果在賦值時使用了一個

SpringMVC學習詳解 Dispatcher

前端控制器 Dispatcherservlet 截獲請求後做了什麼工作呢?DispatcherServlet 又是如何分派請求的呢? 分析DispatcherServlet 原始碼如下: protected void initStrategies(ApplicationContext

axios在vue中的應用—— 提交上傳圖片

使用axios實現圖片預覽、圖片上傳等功能: methods: { // 圖片預覽 priviewImg(e) { // ... }, // 提交表單 sumitRefund() { let fd = new FormDat

python--基礎學習字串引號、雙引號、引號

#單引號str1='python'#單引號中使用雙引號str2='"python"'#雙引號中使用單引號str3="'python'"#三單引號str4='''python'''#三單引號中間使用雙引號str5='''"python"'''#三單引號中有換行符str6='''hellopython'''#

SpringMVC學習

資料校驗 1.匯入jar包 2.配置校驗器,並加入介面卡 3.bean上新增校驗資訊 4.controller上校驗資訊的處理 一:jar包的匯入 二:配置校驗器validator <!-- 校驗器,配置validator --> <

憤怒的WebAPI——

一、表單內容操作 1、輸入框 <input type="text" id="ipt" value="這是舊的內容"> <script> var ipt = document.getElementById('ipt'); console

SpringMVC 學習——對映請求引數 & 請求引數

請求處理方法籤名 •Spring MVC 通過分析處理方法的籤名,將 HTTP 請求信 息綁定到處理方法的相應人蔘中。 •Spring MVC 對控制器處理方法籤名的限制是很寬鬆的, 幾乎可以按喜歡的任何方式對方法進行籤名。 •必要時可以對方法及方法入參標注相應的註解( @PathV

資料的蒐集和react元件的生命週期

四:表單資料的蒐集 (1)         問題: 在react應用中, 如何收集表單輸入資料 (2)         包含表單的元件分類

用Python寫網路爬蟲系列處理

import urllib,urllib2 LOGIN_URL = r'http://example.webscraping.com/user/login' LOGIN_EMAIL = '[email protected]' LOGIN_PASSWORD ='q

Struts2學習———— 引數自動封裝和引數型別自動轉換

前篇文章對struts2的一個入門,重點是對struts2的架構圖有一個大概的瞭解即可,之後的幾篇文章,就是細化struts2,將struts2中的各種功能進行梳理,其實學完之後,對struts2的使用不外乎這幾點,引數自動封裝,攔截器的使用,資料校驗,ognl表達(值棧和actionContext的講解),

SpringMVC學習———— springmvc資料校驗的實現

一、什麼是資料校驗?       這個比較好理解,就是用來驗證客戶輸入的資料是否合法,比如客戶登入時,使用者名稱不能為空,或者不能超出指定長度等要求,這就叫做資料校驗。       資料校驗分為客戶端校驗和服務端校驗         客戶端校驗:js校驗         服務端校驗:springmvc

從零開始學 Web HTML

大家好,這裡是「 Daotin的夢囈 」從零開始學 Web 系列教程。此文首發於「 Daotin的夢囈 」公眾號,歡迎大家訂閱關注。在這裡我會從 Web 前端零基礎開始,一步步學習 Web 相關的知識點,期間也會分享一些好玩的專案。現在就讓我們一起進入 Web 前端學習的冒險之旅吧! 一、表格 1

spring boot學習---驗證

表單驗證 1.表單驗證 修改 StuController中getAdd方法 @RequestMapping(method=RequestMethod.POST) public String getAdd(@Valid Stu stu,Bindi

jmeterpsot 提交 註意項

ica img lpad 日誌 mage 分享圖片 直接 border container Form表單提交:直接使用表單方式提交即可,此方式采取頁面直接跳轉的形式。用jmeter請求的時候,日誌打印傳的參數是空的。考慮到form提交和http的提交請求頭可能是不一樣的,所

Java學習面向對象封裝

所有 成對 main 將不 同時 執行順序 編譯失敗 sta sin 封 裝(面向對象特征之一):是指隱藏對象的屬性和實現細節,僅對外提供公共訪問方式。 好處:將變化隔離;便於使用;提高重用性;安全性。 封裝原則:將不需要對外提供的內容都隱藏起來,把屬性都隱藏,提供公共方法

SpringMVC實戰-處理POST提交JSON資料

1.表單提交 2.JSON串 1、客戶端請求 String url = "http://localhost:8080/order/create"; String data = "{\"id\":3, \"cat

網頁開發學習

表單是網頁中提供的一種互動式操作手段,無論是提交搜尋的資訊,還是網上註冊等都需要使用表單。使用者可以通過提交表單資訊與伺服器進行動態交流。表單主要可以分為兩部分:一是HTML原始碼描述的表單;二是提交後的表單處理,需要使用伺服器端編寫好 JSP等程式碼對客戶端提交的資訊作出迴應。