springMVC學習筆記四(資料型別轉換和資料驗證)
資料型別轉換
Spring 內建的 PropertyEditor 如下所示:
類名 說明 預設是否註冊
ByteArrayPropertyEditor String<——>byte[] √
ClassEditor String<——>Class
當類沒有發現丟擲 IllegalArgumentException √
CustomBooleanEditor String<——>Boolean
true/yes/on/1 轉換為 true,false/no/off/0 轉換為 false √
CustomCollectionEditor 陣列/Collection——>Collection
普通值——>Collection(只包含一個物件)
如 String——>Collection
不允許 Collection——>String(單方向轉換) √
CustomNumberEditor String<——>Number(Integer、Long、Double) √
FileEditor String<——>File √
InputStreamEditor String——>InputStream
單向的,不能 InputStream——>String √
LocaleEditor String<——>Locale,
(String 的形式為[語言]_[國家]_[變數],這與 Local 物件的
toString()方法得到的結果相同) √
PatternEditor String<——>Pattern √
PropertiesEditor String<——>java.lang.Properties √
URLEditor String<——>URL √
StringTrimmerEditor 一個用於 trim 的 String 型別的屬性編輯器
如預設刪除兩邊的空格,charsToDelete 屬性:
可以設定為其他字元 emptyAsNull 屬性:
將一個空字串轉化為 null 值的選項。 ×
CustomDateEditor String<——>java.util.Date ×
Spring 內建的 PropertyEditor 支援的屬性(符合 JavaBean 規範)操作:
表示式 設值/取值說明
username 屬性 username
設值方法 setUsername()/取值方法 getUsername() 或 isUsername()
schooInfo.schoolType 屬性 schooInfo 的巢狀屬性 schoolType
設值方法 getSchooInfo().setSchoolType()
取值方法 getSchooInfo().getSchoolType()
hobbyList[0] 屬性 hobbyList 的第一個元素
索引屬性可能是一個數組、列表、
其它天然有序的容器。
map[key] 屬性 map(java.util.Map 型別)
map 中 key 對應的值
自定義屬性編輯器進行資料繫結
模型物件
/**
* 用於測試屬性編輯器
*
* @version
*
* @Description:
*
* @author <a href="mailto:
*
* @since 2014-7-28
*
*/
public class DataBinderTestModel {
/* 使用者名稱 */
private String username;
/* boolean值測試 */
private boolean bool;
/* 學校資訊 */
private SchoolInfoModel schoolInfo;
/* 集合測試 */
private List hobbyList;
/* map測試 */
private Map map;
/* 電話號碼 */
private PhoneNumberModel phoneNumber;
/* 日期型別測試 */
private Date date;
/* string-->enum型別轉換 */
private UserState state;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public boolean isBool() {
return bool;
}
public void setBool(boolean bool) {
this.bool = bool;
}
public SchoolInfoModel getSchoolInfo() {
return schoolInfo;
}
public void setSchoolInfo(SchoolInfoModel schoolInfo) {
this.schoolInfo = schoolInfo;
}
public List getHobbyList() {
return hobbyList;
}
public void setHobbyList(List hobbyList) {
this.hobbyList = hobbyList;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public PhoneNumberModel getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(PhoneNumberModel phoneNumber) {
this.phoneNumber = phoneNumber;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public UserState getState() {
return state;
}
public void setState(UserState state) {
this.state = state;
}
}
public class PhoneNumberModel {
/* 區號 */
private String areaCode;
/* 電話號碼 */
private String phoneNumber;
public String getAreaCode() {
return areaCode;
}
public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
屬性編輯器
/**
* phoneNumber屬性編輯器
*
* @version
*
* @Description:
*
* @author <a href="mailto:
*
* @since 2014-7-28
*
*/
public class PhoneNumberEdit extends PropertyEditorSupport {
Pattern pattern = Pattern.compile("^(\\d{3,4})-(\\d{7,8})$");
@Override
public String getAsText() {
PhoneNumberModel phoneNumber = (PhoneNumberModel) getValue();
return null == phoneNumber ? "" : phoneNumber.getAreaCode() + "-" + phoneNumber.getPhoneNumber();
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
// 如果值為空
if (null == text || !StringUtils.hasLength(text)) {
setValue(null);
}
Matcher matcher = pattern.matcher(text);
if (matcher.matches()) {
PhoneNumberModel phoneNumber = new PhoneNumberModel();
phoneNumber.setAreaCode(matcher.group(1));
phoneNumber.setPhoneNumber(matcher.group(2));
setValue(phoneNumber);
} else {
throw new IllegalArgumentException(String.format("型別轉換失敗,需要格式[010-12345678]", text));
}
}
}
控制器DataBinderTestController
public class DataBinderTestController extends AbstractCommandController {
/**
* 構造器
*/
public DataBinderTestController() {
// 設定命令物件
setCommandClass(DataBinderTestModel.class);
// 設定命令物件的名字
setCommandName("dataBinderTest");
}
@Override
protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception {
System.out.println("command" + command);
return new ModelAndView("bindAndValidate/success").addObject("dataBinderTest", command);
}
@Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
super.initBinder(request, binder);
// 註冊自定義屬性編輯器
// 註冊日期型別屬性編輯器
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
CustomDateEditor dateEditor = new CustomDateEditor(df, true);
binder.registerCustomEditor(Date.class, dateEditor);
// 註冊電話號碼編輯器
binder.registerCustomEditor(PhoneNumberModel.class, new PhoneNumberEdit());
}
}
sping配置檔案
<!-- 用於測試屬性編輯器 -->
<bean name="/dataBind" class="cn.yue.mvc.controller.DataBinderTestController" />
頁面檢視F/jsp/bindAndValidate/success.jsp
<%@ page language="java" pageEncoding="UTF-8"
contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page isELIgnored="false"%>
<!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>success</title>
</head>
<body>
EL phoneNumber:${dataBinderTest.phoneNumber}
<br /> EL state:${dataBinderTest.state}
<br /> EL date:${dataBinderTest.date}
<br />
</body>
</html>
測試請求路徑
http://localhost:8089/dataBind?username=yue&bool=yes&schooInfo.specialty=computer&hobbyList[0]%20=program&hobbyList[1]=music&map[key1]=value1&map[key2]=value2&phoneNumber=010-12345678&date=2014-7-28%2016:48:48&state=blocked
註冊propertyEditor
/**
* 批量註冊propertyEditor
*
* @version
*
* @Description:
*
* @author <a href="mailto:
*
* @since 2014-7-28
*
*/
public class MyWebBindingInitializer implements WebBindingInitializer {
@Override
public void initBinder(WebDataBinder binder, WebRequest request) {
// 註冊自定義屬性編輯器
// 註冊日期型別屬性編輯器
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
CustomDateEditor dateEditor = new CustomDateEditor(df, true);
binder.registerCustomEditor(Date.class, dateEditor);
// 註冊電話號碼編輯器
binder.registerCustomEditor(PhoneNumberModel.class, new PhoneNumberEdit());
}
}
DataBinderTestController,註釋掉 initBinder 方法
修改spring配置檔案
<!--批量註冊屬性編輯器 -->
<!-- 註冊WebBindingInitializer實現 -->
<bean id="myWebBindingInitializer"
class="cn.yue.mvc.controller.support.initializer.MyWebBindingInitializer" />
<bean name="/dataBind" class="cn.yue.mvc.controller.DataBinderTestController">
<!-- 注入WebBindingInitializer實現 -->
<property name="webBindingInitializer" ref="myWebBindingInitializer" />
</bean>
測試請求路徑
http://localhost:8089/dataBind?username=yue&bool=yes&schooInfo.specialty=computer&hobbyList[0]%20=program&hobbyList[1]=music&map[key1]=value1&map[key2]=value2&phoneNumber=010-12345678&date=2014-7-28%2016:48:48&state=blocked
***************************************************************************
將我們自定義的 PropertyEditor 放在和你的模型類同包下即可, Editor 命名規則必須是“模型類名 Editor",以PhoneNumberModel為例,PhoneNumberModelEdit可以放在相同目錄下,Spring 會自動使用標準 JavaBean 架構進行自動識別
// 註冊電話號碼編輯器
// binder.registerCustomEditor(PhoneNumberModel.class, new
// PhoneNumberModelEdit());
MyWebBindingInitializer中可以註釋掉以下內容
// 註冊電話號碼編輯器
// binder.registerCustomEditor(PhoneNumberModel.class, new
// PhoneNumberModelEdit());
測試請求路徑
http://localhost:8089/dataBind?username=yue&bool=yes&schooInfo.specialty=computer&hobbyList[0]%20=program&hobbyList[1]=music&map[key1]=value1&map[key2]=value2&phoneNumber=010-12345678&date=2014-7-28%2016:48:48&state=blocked
**************************************************************************
資料驗證
bindException-->bindingResult-->errors
示例程式碼如下:
資料繫結失敗
控制器
public class ErrorController extends AbstractCommandController {
/**
* 構造器
*/
public ErrorController() {
setCommandClass(DataBinderTestModel.class);
setCommandName("command");
}
@Override
protected ModelAndView handle(HttpServletRequest reque, HttpServletResponse respon, Object command, BindException errors) throws Exception {
// 使用者名稱不能為空
errors.reject("username.not.empty");
// 帶有預設錯誤訊息
errors.reject("username.not.empty1", "使用者名稱不能為空1");
// 帶有引數和預設值錯誤訊息
errors.reject("username.length.error", new Object[] { 5, 10 }, "使用者名稱長度不正確,必須在5-10之間");
// 得到錯誤相關的模型資料
Map model = errors.getModel();
return new ModelAndView("bindAndValidate/error", model);
}
}
public class DataBinderErrorTestController extends SimpleFormController {
/**
* 構造器
*/
public DataBinderErrorTestController() {
setCommandClass(DataBinderTestModel.class);
setCommandName("dataBinderTest");
}
@Override
protected ModelAndView showForm(HttpServletRequest request, HttpServletResponse response, BindException errors) throws Exception {
// 如果表單提交有任何錯誤都會再回到表單展示頁
System.out.println(errors);
return super.showForm(request, response, errors);
}
/**
* 表單提交成功進行資料處理
*/
@Override
protected void doSubmitAction(Object command) throws Exception {
System.out.println(command);
super.doSubmitAction(command);
}
/**
* 註冊屬性編輯器
*/
@Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
super.initBinder(request, binder);
// 註冊自定義屬性編輯器
// 註冊日期型別屬性編輯器
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
CustomDateEditor dateEditor = new CustomDateEditor(df, true);
binder.registerCustomEditor(Date.class, dateEditor);
// 註冊電話號碼編輯器
binder.registerCustomEditor(PhoneNumberModel.class, new PhoneNumberModelEdit());
}
}
spring配置檔案:
<!-- 錯誤資訊:獲取錯誤碼對應的錯誤訊息 -->
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages" />
<property name="fileEncodings" value="utf-8" />
<property name="cacheSeconds" value="120" />
</bean>
<bean name="/error" class="cn.yue.mvc.controller.ErrorController" />
<!-- 測試資料繫結失敗 -->
<bean name="/dataBindError" class="cn.yue.mvc.controller.DataBinderErrorTestController">
<property name="formView" value="bindAndValidate/input" />
<property name="successView" value="bindAndValidate/success" />
</bean>
messages.properties檔案
username.not.empty=使用者名稱不能為空
username.length.error=使用者名稱長度不合法,長度必須在{0}到{1}之間
頁面檢視/jsp/bindAndValidate/error.jsp
<%@ page language="java" pageEncoding="UTF-8"
contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!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>success</title>
</head>
<body>
<!-- 表單的預設命令物件名為command -->
<form:form commandName="command">
<form:errors path="*"></form:errors>
</form:form>
</body>
</html>
/jsp/bindAndValidate/input.jsp檔案內容如下:
<%@ page language="java" pageEncoding="UTF-8"
contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!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>success</title>
</head>
<body>
<!-- 表單的命令物件名為dataBinderTest -->
<form:form commandName="dataBinderTest">
<form:errors path="*" cssStyle="color:red"></form:errors>
<br />
<br />
bool:<form:input path="bool" />
<br />
phoneNumber:<form:input path="phoneNumber" />
<br />
date:<form:input path="date" />
<br />
<input type="submit" value="提交" />
</form:form>
</body>
</html>
提交表單會提示如下錯誤 :
**************************************************************************
//錯誤訊息
Failed to convert property value of type java.lang.String to required type boolean for property bool; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [123]
Failed to convert property value of type java.lang.String to required type java.util.Date for property date; nested exception is java.lang.IllegalArgumentException: Could not parse date: Unparseable date: "123"
Failed to convert property value of type java.lang.String to required type cn.yue.mvc.model.PhoneNumberModel for property phoneNumber; nested exception is java.lang.IllegalArgumentException: 型別轉換失敗,需要格式[010-12345678]
//表單資料
bool: 123
phoneNumber:123
date:123
//控制檯錯誤資訊
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 3 errors
Field error in object 'dataBinderTest' on field 'bool': rejected value [123]; codes [typeMismatch.dataBinderTest.bool,typeMismatch.bool,typeMismatch.boolean,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dataBinderTest.bool,bool]; arguments []; default message [bool]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'boolean' for property 'bool'; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [123]]
Field error in object 'dataBinderTest' on field 'date': rejected value [123]; codes [typeMismatch.dataBinderTest.date,typeMismatch.date,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dataBinderTest.date,date]; arguments []; default message [date]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'date'; nested exception is java.lang.IllegalArgumentException: Could not parse date: Unparseable date: "123"]
Field error in object 'dataBinderTest' on field 'phoneNumber': rejected value [123]; codes [typeMismatch.dataBinderTest.phoneNumber,typeMismatch.phoneNumber,typeMismatch.cn.yue.mvc.model.PhoneNumberModel,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [dataBinderTest.phoneNumber,phoneNumber]; arguments []; default message [phoneNumber]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'cn.yue.mvc.model.PhoneNumberModel' for property 'phoneNumber'; nested exception is java.lang.IllegalArgumentException: 型別轉換失敗,需要格式[010-12345678]]
***************************************************************************
資料繫結失敗,錯誤碼的查詢順序
1、typeMismatch.命令物件名.屬性名
2、typeMismatch.屬性名
3、typeMismatch.屬性全限定類名(包名.類名)
4、typeMismatch
修改message.propertites檔案新增錯誤訊息
typeMismatch.dataBinderTest.date=您輸入的資料格式錯誤,請重新輸入(格式:2014-07-299 10:32:17)
重接提交表單看到如下訊息:
Failed to convert property value of type java.lang.String to required type boolean for property bool; nested exception is java.lang.IllegalArgumentException: Invalid boolean value [123]
//此處為新增的錯誤訊息內容
您輸入的資料格式錯誤,請重新輸入(格式:2014-07-299 10:32:17)
Failed to convert property value of type java.lang.String to required type cn.yue.mvc.model.PhoneNumberModel for property phoneNumber; nested exception is java.lang.IllegalArgumentException: 型別轉換失敗,需要格式[010-12345678]
bool:123
phoneNumber:123
date:123
資料不合法:
驗證不合法資料的兩種格式:
a 程式設計式驗證器驗證
b 宣告式驗證
程式設計式驗證器
public class UserModelValidator implements Validator {
/* 使用者名稱正則 */
private static final Pattern USERNAME_PATTERN = Pattern.compile("[a-zA-Z]\\w{4,19}");
/* 使用者密碼正則 */
private static final Pattern PASSWORD_PATTERN = Pattern.compile("[a-zA-Z0-9]{5,20}");
/* 使用者名稱遮蔽字 */
private static final Set<String> FORBINDDDEN_WORD_SET = new HashSet<String>();
static {
FORBINDDDEN_WORD_SET.add("fuck");
FORBINDDDEN_WORD_SET.add("admin");
}
@Override
public boolean supports(Class<?> clazz) {
// 只對userModel型別的目標實施驗證
return UserModel.class == clazz;
}
/**
* 驗證的具體方法
*/
@Override
public void validate(Object target, Errors errors) {
// 檢查使用者名稱屬性是否為空
ValidationUtils.rejectIfEmpty(errors, "username", "username.not.empty");
UserModel user = (UserModel) target;
// 檢查使用者名稱是否合法
if (!USERNAME_PATTERN.matcher(user.getUsername()).matches()) {
errors.rejectValue("username", "username.not.illegal");
}
for (String forbiddenWord : FORBINDDDEN_WORD_SET) {
if (user.getUsername().contains(forbiddenWord)) {
errors.rejectValue("username", "username.forbidden", new Object[] { forbiddenWord }, "您的使用者名稱包含非法關鍵字");
break;
}
}
// 檢查使用者密碼
if (!PASSWORD_PATTERN.matcher(user.getPassword()).matches()) {
errors.rejectValue("password", "password.not.illegal", "密碼不合法");
}
}
}
spring配置檔案新增如下:
<!-- 編碼實現資料合法性驗證 -->
<bean id="userModelValidator"
class="cn.yue.mvc.controller.support.validator.UserModelValidator" />
<bean name="/validator" class="cn.yue.mvc.controller.RegisterSimpleFormController">
<property name="formView" value="registerAndValidator" />
<property name="successView" value="redirect:/success" />
<property name="validator" ref="userModelValidator" />
</bean>
message.propertites檔案新增如下內容:
username.not.illegal=使用者名稱錯誤,必須以字母開頭,只能出現字母、數字、下劃線,並且長度在5-20之間
username.forbidden=使用者名稱中包含非法關鍵詞【{0}】
password.not.illegal=密碼長度必須在 5-20 之間
頁面檢視:/jsp/registerAndValidator.jsp
<%@ page language="java" pageEncoding="UTF-8"
contentType="text/html; charset=UTF-8"%>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>success</title>
</head>
<body>
<form:form commandName="user">
<form:errors path="*" cssStyle="color:red" />
<br />
username:<form:input path="username" />
<form:errors path="username" cssStyle="color:red" />
<br />
password:<form:password path="password" />
<form:errors path="password" cssStyle="color:red" />
<br />
<input type="submit" value="註冊" />
</form:form>
</body>
</html>
測試:http://localhost:8089/validator
使用者名稱中包含非法關鍵詞【shit】
密碼長度必須在 5-20 之間
username:shit123 使用者名稱中包含非法關鍵詞【shit】
password: 密碼長度必須在 5-20 之間
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
在multiactionController控制器中,沒有方法提供error物件
建立errors物件,新增到模型中即可
BindException errors = new BindException(user, getCommandName(user));
//如果使用者名稱為空
if(!StringUtils.hasLength(user.getUsername())) {
//注入錯誤碼
errors.rejectValue("username", "username.not.empty");
}
//如果有錯誤就返回新增頁面,顯示錯誤訊息
if(errors.hasErrors()) {
return new ModelAndView(getCreateView()).addAllObjects(errors.getModel());
}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
宣告式驗證器 jsr-303驗證框架
基於controll介面的實現不能使用該方式,需要以註解的方式才可以
參考:http://jinnianshilongnian.iteye.com/blog/1752171
相關推薦
springMVC學習筆記四(資料型別轉換和資料驗證)
=============================資料型別轉換和資料驗證======================= 資料型別轉換 Spring 內建的 PropertyEditor 如下所示: 類名 說明
Selenium3+webdriver學習筆記5(模擬常用鍵盤和滑鼠事件)
#!/usr/bin/env python# -*- coding:utf-8 -*-from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom selenium.webdriver.common.acti
springMVC學習筆記二(獲取引數,返回Model資料)
Controller如何獲取引數 1利用原有的Servlet方法,使用HttpServletRequest 2利用@RequestParam註解 @RequestParam("username")String name,當username在reques
資料結構學習筆記四(二分查詢)
一、什麼是二分查詢 二分查詢針對的是一個有序的資料集合,每次都通過更區間的中間元素做對比,將要查詢的區間縮小為原來的一半,直到找到要查詢的元素,或者區間被縮小為0。其時間複雜度為O(logn)。
Maven學習筆記四(坐標和依賴)
Maven學習筆記 坐標 什麽是坐標? 在平面幾何中坐標(x,y)可以標識平面中唯一的一點 Maven 坐標主要組成 groupId:定義當前 Maven 項目隸屬項目、組織 artifactId:定義實際項目中的一個模塊 version:定義當前項目的當前版本
Vue.js實戰 學習筆記 四(v-bind及class與style綁定)
自動 turn ont === 形式 new for function href DOM元素經常動態地綁定一些class或style(比如輪播時的active) Vue.js使用v-bind指令進行對class和style多種方法的綁定:通過表達式計算出字符串結果 如筆
Lua菜鳥教程學習筆記四(重難點 續)
內容會持續更新,有錯誤的地方歡迎指正,謝謝! Lua 檔案 I/O Lua I/O 庫用於讀取和處理檔案。分為簡單模式(和C一樣)、完全模式(以一種面對物件的形式,將所有的檔案操作定義為檔案控制代碼的方法)。如果同時讀取多個檔案的話,使用完全模式則較為合適。 簡單模式 以
微信小程式學習筆記四(持續更新)---征服scroll-view下拉重新整理
貼圖 大概實現這種使用swiper做tab切換,資料頁面下拉重新整理的效果。 官方提供的scroll-view作為容器,如果在scroll-view使用onPullDownRefresh實現下拉重新整理,會存在頁面重新整理卡,並且重新整理會出現在tab之上,使
ROS學習筆記21(錄製與回放資料)
1 錄製資料(通過建立一個bag檔案) 本小節將教你如何記錄ROS系統執行時的話題資料,記錄的話題資料將會累積儲存到bag檔案中。 首先,執行以下命令: roscore rosrun turtlesim turtlesim_node rosrun turtlesim
Spring學習筆記四(AOP中的通知引數和註解開發)
1.前言 上一篇部落格介紹瞭如何通過AOP來切入我們想實現的公共性的功能,這篇部落格來講一下,當我們攔截到方法後,如何來獲取通知引數。這也是AOP的精髓所在,通過AOP可以實現偷樑換柱的功能。我
nginx學習筆記四(nginx啟動時候的master和worker程序)
nginx一般情況下都是配置成一個多程序的程式,由一個master程序和多個worker程序組成,master程序通過訊號來管理worker程序的執行狀態。下面從程式碼的角度來分析master和worker程序的啟動情形。 1.在main函式最後,會根據配置方式,決定ngi
C++ Primer 學習筆記 — 隱式類型別轉換
1.瞭解 explicit用來防止由建構函式定義的隱式轉換。要明白它的作用,首先要了解隱式轉換:可以用單個實參來呼叫的建構函式定義了從形參型別到該類型別的一個隱式轉換。 #include <string> #include <iostream>
SpringMVC-8 資料型別轉換、資料格式化與資料校驗
1. 資料繫結流程 SpringMVC通過反射機制對目標處理方法進行解析,將請求訊息繫結到處理方法的入參中。其中,資料繫結的核心部件是DataBinder,執行機制如下: 資料繫結的具體流程說明如下: SpringMVC主框架將S
Java學習筆記29(集合框架三:泛型)
出了 oar sta package 獲取 demo 強制 lis oid 泛型的概念: 簡單地講,就是同一個方法(類),可以接受不同的數據類型並運行得到相對應的結果,不會出現安全問題 上一篇有一段這樣的代碼: 沒有定義集合類型、叠代器類型 package demo;
Maven學習筆記三(Eclipse創建Maven項目)
Maven學習筆記配置 Eclipse Maven 環境 1.配置 Manen 地址 將下載的Maven導入進來,然後勾選使用 2.設置 setting.xml 地址 選中Maven下conf目錄下的settings.xml,然後local Reposi
SpringMVC總結--資料格式轉換和資料校驗
SpringMVC資料繫結流程 A:SpingMVC 主框架將 ServletRequest 物件及目標方法的入參例項傳遞 WebDataBinderFactory 例項,以建立DataBinder 例項物件 &nbs
機器人作業系統(ROS)淺析(肖軍浩 博士 譯) 學習筆記一(第一章到第五章)
機器人作業系統(ROS)淺析(肖軍浩 博士 譯) 學習筆記 第一章: 第 1 章 緒論 1.1 選擇 ROS 的理由 分散式計算 現代機器人系統往往需要多個計算機同時執行多個 程序,例如: (1)一些機器人搭載多臺計算機,每臺計算機用於控制機器人的 部分驅動器或感測器
多執行緒學習筆記--02(物件及變數的併發訪問)
1.學習目標 Synchronized物件監視器為Object時的使用 Synchronized物件監視器為Class時的使用
學習筆記 c++ (C++ 類模板的靜態成員)
程式碼: #include<iostream> using namespace std; template<typename T> class XYZ { public: void putpri(); static
學習筆記 c++ (用類來實現投票選舉)
程式碼: #include<iostream> #include<string> using namespace std; int p[5] ={0,0,0,0,0};//記票器 class xuanju { public: x