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
jmeter(psot) 表單提交 註意項
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等程式碼對客戶端提交的資訊作出迴應。