以上就是给各位分享Spring中WebDataBinder使用详解,其中也会对spring的web进行解释,同时本文还将给你拓展005-spring-data-elasticsearch3.0.0.0
以上就是给各位分享Spring中WebDataBinder使用详解,其中也会对spring的web进行解释,同时本文还将给你拓展005-spring-data-elasticsearch 3.0.0.0 使用【三】-spring-data 之 Spring 数据扩展、3.13、@InitBinder 和 WebDataBinder、Android 官方 DataBinding(三):RecyclerView 使用 ViewDataBinding 更新数据、android.databinding.InverseBindingAdapter的实例源码等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:- Spring中WebDataBinder使用详解(spring的web)
- 005-spring-data-elasticsearch 3.0.0.0 使用【三】-spring-data 之 Spring 数据扩展
- 3.13、@InitBinder 和 WebDataBinder
- Android 官方 DataBinding(三):RecyclerView 使用 ViewDataBinding 更新数据
- android.databinding.InverseBindingAdapter的实例源码
Spring中WebDataBinder使用详解(spring的web)
这篇文章主要为大家详细介绍了Spring中WebDataBinder的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Spring MVC Validator @InitBinder and WebDataBinder;Validator是一个用来我们自定义验证的sping接口,WebDataBinder 绑定你的自定义参数,你直接在你的控制器类中通过@InitBinder 注解的方式配置 Web 数据绑定.registerCustomEditor()是一个属性编辑器,比如自定义的日期编辑它绑定web请求参数到JavaBean的属性;
下面一个例子,我们创建一个JavaBean(username, password, email and date of birth of a user),我们创建两个自定义的验证类.第一个,我们验证用户名和密码.第二个,验证邮箱,
在Eclipse中Demo的结构
Validator 是一个有两个方法的接口;
boolean supports(Class> clazz) : 检验参数是否验证成功的实例类;
void validate(Object target, Errors errors) : 如果 supports() 方法返回真, target object 合法. Errors.rejectValue() 方法用一个字段名注册错误信息;
UserValidator.java
package com.concretepage.validators; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; import com.concretepage.User; @Component public class UserValidator implements Validator { @Override public boolean supports(Class> clazz) { return User.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { User user = (User)target; ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "","Username is empty"); ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "", "Password is empty"); if (user.getName().length()
EmailValidator.java
package com.concretepage.validators; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; import com.concretepage.User; @Component public class EmailValidator implements Validator { @Override public boolean supports(Class> clazz) { return User.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { User user = (User)target; ValidationUtils.rejectIfEmptyOrWhitespace(errors, "email", "","Email is empty"); if (!user.getEmail().contains("@")) { errors.rejectValue("email","", "Email is not valid."); } } }
User.java
package com.concretepage; import java.util.Date; public class User { private String name; private String password; private String email; private Date dob; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getpassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public Date getdob() { return dob; } public void setdob(Date dob) { this.dob = dob; } }
MyWorldController
package com.concretepage; import java.text.SimpleDateFormat; import java.util.Date; import javax.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.modelattribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.concretepage.validators.EmailValidator; import com.concretepage.validators.UserValidator; @Controller @RequestMapping("/myworld") public class MyWorldController { @Autowired private UserValidator userValidator; @Autowired private EmailValidator emailValidator; @RequestMapping(value="signup", method = RequestMethod.GET) public ModelAndView user(){ return new ModelAndView("user","user",new User()); } @InitBinder public void dataBinding(WebDataBinder binder) { binder.addValidators(userValidator, emailValidator); SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, "dob", new CustomDateEditor(dateFormat, true)); } @RequestMapping(value="save", method = RequestMethod.POST) public String createuser(@modelattribute("user") @Valid User user,BindingResult result, ModelMap model) { if(result.hasErrors()) { return "user"; } System.out.println("Name:"+ user.getName()); System.out.println("Email:"+ user.getEmail()); System.out.println("Date of Birth:"+ user.getdob()); model.addAttribute("msg", "Welcome to My World!"); return "success"; } }
Form页面表单
User Name:
Password :
Email :
Date of Birth :
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小编。
上一篇:Spring MVC的优点与核心接口_动力节点Java学院整理下一篇:Spring Boot实战之逐行释义Hello World程序 热门搜索:
showModelessDialog()使用详解
Genius使用详解
spring注解
Vista中使用率最高的11条命令使用详解
JavaScript中this关键字使用方法详解
相关文章
Spring中WebDataBinder使用详解
2021-11-19阅读(9135)评论(0)推荐()这篇文章主要为大家详细介绍了Spring中WebDataBinder的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
简单了解如何在spring中使用RabbitMQ
2021-11-05阅读(3148)评论(0)推荐()这篇文章主要介绍了简单了解如何在spring中使用RabbitMQ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参...
dubbo在Spring和Spring Boot中的使用详解
2021-10-18阅读(9729)评论(0)推荐()这篇文章主要介绍了dubbo在Spring和Spring Boot中的使用详解,需要的朋友可以参考下
spring boot(三)之Spring Boot中Redis的使用
2021-10-06阅读(4245)评论(0)推荐()这篇文章主要介绍了spring boot(三)之Spring Boot中Redis的使用,非常不错,具有参考借鉴价值,需要的朋友可以参考下
Spring中常用注解的详细介绍
2021-11-19阅读(9943)评论(0)推荐()这篇文章主要介绍了Spring中常用注解的详细介绍的相关资料,需要的朋友可以参考下
详解spring容器的使用流程
2021-11-05阅读(4566)评论(0)推荐()今天给大家带来的是关于Java的相关知识,文章围绕着spring容器的使用流程展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
Spring Security 在 Spring Boot 中的使用详解【集中式】
2021-11-19阅读(9378)评论(0)推荐()这篇文章主要介绍了Spring Security 在 Spring Boot 中的使用【集中式】,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作...
取消
有人回复时邮件通知我
提交评论
© 2021 小编
工信部备案号:琼ICP备2022000316号
005-spring-data-elasticsearch 3.0.0.0 使用【三】-spring-data 之 Spring 数据扩展
续
1.8、Spring 数据扩展
这些扩展使 Spring Data 在各种环境下的使用成为可能。目前大部分的整合都是针对 Spring MVC。
1.8.1、Querydsl 扩展
Querydsl 是一个框架,它可以通过流畅的 API 构建静态类型的 SQL 查询。
几个 Spring Data 模块通过 QueryDslPredicateExecutor 提供与 Querydsl 的集成。
示例、QueryDslPredicateExecutor 接口


public interface QueryDslPredicateExecutor<T> {
//查找并返回与Predicate匹配的单个实体
Optional<T> findById(Predicate predicate);
//查找并返回与谓词匹配的所有实体
Iterable<T> findAll(Predicate predicate);
//返回匹配Predicate的实体的数量
long count(Predicate predicate);
//判断返回与Predicate匹配的实体是否存在
boolean exists(Predicate predicate);
// … more functionality omitted.
}
要使用 Querydsl 支持,只需在存储库接口上扩展 QueryDslPredicateExecutor 即可。
interface UserRepository extends CrudRepository<User, Long>, QueryDslPredicateExecutor<User> {
}
以上使用 Querydsl 谓词可以编写类型安全查询。
Predicate predicate = user.firstname.equalsIgnoreCase("dave").and(user.lastname.startsWithIgnoreCase("mathews"));
userRepository.findAll(predicate);
1.8.2、web 支持
如果模块支持存储库编程模型,则 Spring Data 模块附带各种 Web 支持。与 Web 相关的东西需要类路径上的 Spring MVC JAR,其中一些甚至提供了与 Spring HATEOAS 的集成。通常,通过在 JavaConfig 配置类中使用 @EnableSpringDataWebSupport 注释来启用集成支持。
启用 web 支持
@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
class WebConfiguration {}
或者 xml 配置


<bean class="org.springframework.data.web.config.SpringDataWebConfiguration" />
<!-- If you''re using Spring HATEOAS as well register this one *instead* of the former -->
<bean class="org.springframework.data.web.config.HateoasAwareSpringDataWebConfiguration" />
基本的 web 支持
上面显示的配置设置将注册一些基本组件:
DomainClassConverter 使 Spring MVC 能够根据请求参数或路径变量来解析存储库管理的域类的实例。
HandlerMethodArgumentResolver 实现,以便 Spring MVC 根据请求参数解析 Pageable 和 Sort 实例。
DomainClassConverter
DomainClassConverter 允许您直接在 Spring MVC 控制器方法签名中使用域类型,因此您不必通过存储库手动查找实例:


@Controller
@RequestMapping("/users")
class UserController {
@RequestMapping("/{id}")
String showUserForm(@PathVariable("id") User user, Model model) {
model.addAttribute("user", user);
return "userForm";
}
}
正如你所看到的,该方法直接接收一个用户实例,不需要进一步查找。通过让 Spring MVC 首先将路径变量转换为域类的 id 类型并最终通过在为域类型注册的存储库实例上调用 findById(...)来访问实例,可以解决该实例。
目前,存储库必须实施 CrudRepository 才有资格被发现用于转换。
HandlerMethodArgumentResolvers for Pageable and Sort
上面的配置片段还注册了 PageableHandlerMethodArgumentResolver 以及 SortHandlerMethodArgumentResolver 的一个实例。注册使页面和排序成为有效的控制器方法参数


@Controller
@RequestMapping("/users")
class UserController {
private final UserRepository repository;
UserController(UserRepository repository) {
this.repository = repository;
}
@RequestMapping
String showUsers(Model model, Pageable pageable) {
model.addAttribute("users", repository.findAll(pageable));
return "users";
}
}
此方法签名将导致 Spring MVC 尝试使用以下默认配置从请求参数派生 Pageable 实例:
表 1. 对 Pageable 实例评估的请求参数
|
您想要检索的页面,索引为 0,默认为 0。 |
|
要检索的页面大小,默认为 20。 |
|
属性应该按格式属性 property(,ASC | DESC)排序。默认排序方向是升序。如果您想切换路线,请使用多个排序参数,例如 |
更多 spring 扩展以及支持 web 支持请查看
3.13、@InitBinder 和 WebDataBinder
这一部分示例见这个项目的 mvc 分支下的 WebDataBinderController.java
① 用@InitBinder
自定义数据绑定
用@InitBinder
注解的控制器方法,允许你直接在你的控制器类中配置 Web 数据绑定。@InitBinder
标记初始化WebDataBinder
的方法,WebDataBinder
被用于填充被注解的处理方法的命令和表单对象参数。
这些初始化绑定器(Init-binder)方法支持@RequestMapping
方法支持的所有参数,处理命令/表单对象以及相关的校验结果对象。初始化绑定器方法必须不带返回值,所以它们通常被声明为 void 的。典型的参数包括WebDataBinder
和WebRequest
或者java.util.Locale
,允许用代码方式注册特定上下文的编辑器(context-specific editors)。
下面的例子演示了使用@InitBinder
为所有的java.util.Date
表单属性配置一个CustomDateEditor
:
@Controller
public class MyFormController
{
@InitBinder
protected void initBinder(WebDataBinder binder)
{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
// ...
}
相对地,从 Spring 4.2 开始,考虑使用addCustomFormatter
来指定Formatter
实现以代替PropertyEditor
实例。如果你恰好在一个共享的FormattingConversionService
中也有一个个基于Formatter
的设置(setup),这会非常用,同样的规则可以用重用于控制器指定的绑定规则的变化:
@Controller
public class MyFormController
{
@InitBinder
protected void initBinder(WebDataBinder binder)
{
binder.addCustomFormatter(new DateFormatter("yyyy-MM-dd"));
}
// ...
}
② 配置一个自定义的WebBindingInitializer
为了表达(externalize)数据绑定初始化,你可以提供一个自定义的WebBindingInitializer
接口实现,然后你可以通过为RequestMappingHandlerAdapter
来提供一个自定义 Bean 配置来启动WebBindingInitializer
,所以要重写默认配置。
下面的例子来自 PetClinic 应用程序(虽然文档上说了一下,可我也不知道这个项目在哪里……),展示了一个配置,使用一个自定义WebBindingInitializer
接口实现——org.springframework.samples.petclinic.web.ClinicBindingInitializer
,它配置的PropertyEditors
需要几个控制器。
<bean>
<property name="cacheSeconds" value="0"/>
<property name="webBindingInitializer">
<bean/>
</property>
</bean>
@InitBinder
方法也可以定义在一个带有@ControllerAdvice
注解的类中,在这种情况下,它们用于匹配控制器。这提供了一个使用WebBindingInitializer
的代替方法。详情见“使用@ControllerAdvice
和@RestControllerAdvice
通知控制器一节”。
Android 官方 DataBinding(三):RecyclerView 使用 ViewDataBinding 更新数据
本例基于 Android 官方 DataBinding,在 RecyclerView 上实现一个简单需求:点击一个 button 按钮,增加一个数据元素,并更新的 view 上。
(1)首先写一个布局,这个布局上面放一个按钮 button,下面一个标准 Android RecyclerView。Button 按钮的实现一个简单的功能:没点击一次就增加一个数据元素,然后更新到 RecyclerView。recycler_view_layout.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="添加元素" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
(2)和附录文章 1,2,写数据模型 User,对比这个 User 和附录 1,2 的 User 建模时候的异同,User.java:
package zhangphil.test;
import android.databinding.BaseObservable;
//import android.databinding.Bindable;
/**
* Created by Phil on 2017/8/17.
*/
public class User extends BaseObservable {
private String id;
private String name;
private String blog;
public void setId(String id) {
this.id = id;
//notifyPropertyChanged(BR.id);
}
//@Bindable
public String getId() {
return this.id;
}
public void setName(String name) {
this.name = name;
//notifyPropertyChanged(BR.name);
}
//@Bindable
public String getName() {
return this.name;
}
public void setBlog(String blog) {
this.blog = blog;
//notifyPropertyChanged(BR.blog);
}
//@Bindable
public String getBlog() {
return this.blog;
}
}
(3)因为是一个 RecyclerView,RecyclerView 需要 Adapter,在 Adapter 中需要一个布局 layout,为 User 的数据找到 View,Adapter 需要的子 view 布局这里将写 View 和 Model 的绑定代码,item.xml:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="zhangphil.test.User" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.id}"
android:textColor="@android:color/holo_red_light" />
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
android:textColor="@android:color/holo_red_light" />
<TextView
android:id="@+id/blog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.blog}"
android:textColor="@android:color/holo_red_light" />
<View
android:layout_width="match_parent"
android:layout_height="1px"
android:background="@android:color/holo_blue_bright" />
</LinearLayout>
</layout>
(4)上层 Java 代码,注意观察 ViewHolder 的写法。比较关键的是在创建 ViewHolder 时候传入的 ViewDataBinding。在 Adapter 的 onBindViewHolder 里面,仅需两行代码就实现数据模型和 View 的绑定,MainActivity.java:
package zhangphil.test;
import android.databinding.DataBindingUtil;
import android.databinding.ViewDataBinding;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import static zhangphil.test.BR.user;
public class MainActivity extends AppCompatActivity {
private int index = 0;
private ItemAdapter mItemAdapter;
private ArrayList<User> mItems;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.recycler_view_layout);
mItems = new ArrayList();
for (int i = 0; i < 1; i++) {
User u = new User();
u.setId(index + "");
u.setName("zhangphil @" + index);
u.setBlog("blog.csdn.net/zhangphil @" + index);
mItems.add(u);
index++;
}
RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
mItemAdapter = new ItemAdapter();
mRecyclerView.setAdapter(mItemAdapter);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
User u = new User();
u.setId(index + "");
u.setName("zhangphil @" + index);
u.setBlog("blog.csdn.net/zhangphil @" + index);
mItems.add(u);
mItemAdapter.notifyDataSetChanged();
index++;
}
});
}
private class ItemAdapter extends RecyclerView.Adapter<ItemViewHolder> {
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.item, viewGroup, false);
ItemViewHolder holder = new ItemViewHolder(binding);
return holder;
}
@Override
public void onBindViewHolder(ItemViewHolder viewHolder, int i) {
viewHolder.getBinding().setVariable(user, mItems.get(i));
viewHolder.getBinding().executePendingBindings();
}
@Override
public int getItemCount() {
return mItems.size();
}
}
private class ItemViewHolder extends RecyclerView.ViewHolder {
private ViewDataBinding binding;
public ItemViewHolder(ViewDataBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
public void setBinding(ViewDataBinding binding) {
this.binding = binding;
}
public ViewDataBinding getBinding() {
return this.binding;
}
}
}
代码运行结果,每点击一次 button,数据增加一个,更新:
附录:
1,《Android 官方 DataBinding 简例(一)》链接:http://blog.csdn.net/zhangphil/article/details/77322530
2,《Android 官方 DataBinding(二):动态数据更新 notifyPropertyChanged》链接:http://blog.csdn.net/zhangphil/article/details/77328688
android.databinding.InverseBindingAdapter的实例源码
@InverseBindingAdapter(attribute = "android:text",event = "android:textAttrChanged") public static Integer getIntegerText(TextView view) { CharSequence text = view.getText(); if (text != null && text.length() > 0) { return Integer.valueOf(text.toString()); } return null; }
@InverseBindingAdapter(attribute = "android:text") public static float getText(TextInputEditText dimView) { try { String dimstring = dimView.getText().toString(); float dimVal = Float.parseFloat(dimstring); return dimVal; } catch (NumberFormatException e) { // Return 0 for Now return 0; } }
@InverseBindingAdapter(attribute = "scrollPosition") public static int getScrollPosition(RecyclerView recyclerView) { if (recyclerView.getChildCount() == 0) { return 0; } return recyclerView.getChildAdapterPosition(recyclerView.getChildAt(0)); }
@InverseBindingAdapter(attribute = "selectedValue",event = "selectedValueAttrChanged") public static String captureSelectedValue(AppCompatSpinner pAppCompatSpinner) { return (String) pAppCompatSpinner.getSelectedItem(); }
@InverseBindingAdapter(attribute = "bind:selectedValue",event = "bind:selectedValueAttrChanged") public static String captureSelectedValue(Spinner pSpinner) { return (String) pSpinner.getSelectedItem(); }
@InverseBindingAdapter(attribute = "selectedItemPosition") public Integer getSelectedItemPosition(AppCompatSpinner spinner) { return spinner.getSelectedItemPosition(); }
@InverseBindingAdapter(attribute = "app:text",event = "android:textAttrChanged") public static String getTextString(TextView view) { return view.getText().toString(); }
@InverseBindingAdapter(attribute = "refreshing",event = "refreshingAttrChanged") public static boolean isRefreshing(SwipeRefreshLayout view) { return view.isRefreshing(); }
@InverseBindingAdapter(attribute = "page") public static int getPage(ViewPager pager) { return pager.getCurrentItem(); }
@InverseBindingAdapter(attribute = "android:checked",event = "android:checked") public static boolean getViewChecked(CheckBox view) { return view.isChecked(); }
我们今天的关于Spring中WebDataBinder使用详解和spring的web的分享已经告一段落,感谢您的关注,如果您想了解更多关于005-spring-data-elasticsearch 3.0.0.0 使用【三】-spring-data 之 Spring 数据扩展、3.13、@InitBinder 和 WebDataBinder、Android 官方 DataBinding(三):RecyclerView 使用 ViewDataBinding 更新数据、android.databinding.InverseBindingAdapter的实例源码的相关信息,请在本站查询。
本文标签: