苏州网站建设一条龙,wordpress人才网主题,免费推广网站怎么做,微信公众号的h5网站开发学习视频:12001 数据绑定_哔哩哔哩_bilibili 目录
1.数据绑定
简单数据绑定
默认类型数据绑定
简单数据类型绑定的概念
参数别名的设置 PathVariable注解的两个常用属性
POJO绑定
自定义类型转换器
xml方式
注解方式
数组绑定
集合绑定
复杂POJO绑定
属性为对象类… 学习视频:12001 数据绑定_哔哩哔哩_bilibili 目录
1.数据绑定
简单数据绑定
默认类型数据绑定
简单数据类型绑定的概念
参数别名的设置 PathVariable注解的两个常用属性
POJO绑定
自定义类型转换器
xml方式
注解方式
数组绑定
集合绑定
复杂POJO绑定
属性为对象类型的数据绑定
属性为List类型的数据绑定
属性为Map类型的数据绑定
消息转换器—HttpMessageConverter接口
JSON转换器配置和静态资源访问配置
2.页面跳转
返回值为void类型的页面跳转到默认页面
返回值为String类型的页面跳转(不携带数据)
返回值为String类型的页面跳转(携带数据)
返回值为ModelAndView类型的页面跳转
3.数据回写
普通字符串的回写
JSON数据的回写
ResponseBody注解 1.数据绑定 数据绑定的概念 在程序运行时Spring MVC接收到客户端的请求后会根据客户端请求的参数和请求头等数据信息将参数以特定的方式转换并绑定到处理器的形参中。Spring MVC中将请求消息数据与处理器的形参建立连接的过程就是Spring MVC的数据绑定。 Spring MVC数据绑定的过程图 Spring MVC数据绑定中的信息处理过程 Spring MVC数据绑定中的信息处理过程的步骤描述如下。 1Spring MVC将ServletRequest对象传递给DataBinder。 2将处理方法的入参对象传递给DataBinder。 3DataBinder调用ConversionService组件进行数据类型转换、数据格式化等工作并将ServletRequest对象中的消息填充到参数对象中。 4调用Validator组件对已经绑定了请求消息数据的参数对象进行数据合法性校验。 5校验完成后会生成数据绑定结果BindingResult对象Spring MVC会将BindingResult对象中的内容赋给处理方法的相应参数。 简单数据绑定
默认类型数据绑定 当使用Spring MVC默认支持的数据类型作为处理器的形参类型时Spring MVC的参数处理适配器会默认识别这些类型并进行赋值。Spring MVC常见的默认类型如下所示。 HttpServletRequest获取请求信息。 HttpServletResponse处理响应信息。 HttpSession获取session中存放的对象。 Model/ModelMapModel是一个接口ModelMap是一个类Model的实现类对象和ModelMap对象都可以设置model数据model数据会填充到request域。 Controller
public class UserController {/*** 默认参数类型:* HttpServletRequest:请求* HttpServletResponse:响应* HttpSession:session对象* Model:模型,用于存放页面需要的数据的* return*/RequestMapping(/findById)public String findById(HttpServletRequest request,HttpServletResponse response,HttpSession session,Model model){System.out.println(response);System.out.println(session);//向模型中存放数据model.addAttribute(msg,你好);//获取请求中参数String useridrequest.getParameter(userid);System.out.println(根据id查询用户信息:userid);return success;}}bodyh1hello springMVC!!!/h1${msg}
/body 简单数据类型绑定的概念 简单数据类型的绑定就是指Java中基本类型如int、double、String等的数据绑定。在Spring MVC中进行简单类型的数据绑定只需客户端请求参数的名称和处理器的形参名称一致即可请求参数会自动映射并匹配到处理器的形参完成数据绑定。 RequestMapping(/getUsername)public String getUsername(String username){System.out.println(用户名:username);return success;}这时候没有接收到
参数别名的设置 需要注意的是有时候客户端请求中参数名称和处理器的形参名称不一致这就会导致处理器无法正确绑定并接收到客户端请求中的参数。为此Spring MVC提供了RequestParam注解来定义参数的别名完成请求参数名称和处理器的形参名称不一致时的数据绑定。 RequestParam注解的属性 RequestMapping(/getUsername)public String getUsername(RequestParam(value name,defaultValue it)String username){System.out.println(用户名:username);return success;}去掉s的时候用户名为默认值 it PathVariable注解的两个常用属性 当请求的映射方式是REST风格时上述对简单类型数据绑定的方式就不适用了。为此Spring MVC提供了PathVariable注解通过 PathVariable注解可以将URL中占位符参数绑定到处理器的形参中。PathVariable注解有以下两个常用属性。 value用于指定URL中占位符名称。 required是否必须提供占位符默认值为true。 PathVariable注解的使用
RequestMapping(/user/{name})public String getpPathVariable(PathVariable(name) String username){System.out.println(路径中的参数:username);return success;}POJO绑定
POJO数据绑定的概念 POJO类型的数据绑定就是将所有关联的请求参数封装在一个POJO中然后在方法中直接使用该POJO作为形参来完成数据绑定。 POJO数据绑定的使用场景 在使用简单数据类型绑定时可以很容易的根据具体需求来定义方法中的形参类型和个数然而在实际应用中客户端请求可能会传递多个不同类型的参数数据如果还使用简单数据类型进行绑定那么就需要手动编写多个不同类型的参数这种操作显然比较繁琐。为解决这个问题可以使用POJO类型进行数据绑定。 public class User {private String username;private String password;Overridepublic String toString() {return User{ username username \ , password password \ };}public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public String getPassword() {return password;}public void setPassword(String password) {this.password password;}
}% page contentTypetext/html;charsetgb2312%
htmlheadmeta http-equivContent-Type contenttext/html; charsetutf-8title注册/title/head
bodyform action${pageContext.request.contextPath}/registerUsermethodpost用户名input typetext nameusername /br /密nbsp;nbsp;nbsp;码input typepassword namepassword /br /input typesubmit value注册/
/form/body
/htmlRequestMapping(/registerUser)public String registerUser(User user){System.out.println(user信息:user);return success;}这里的参数name的名字和实体类User的属性名一样。可以直接映射 自定义类型转换器
自定义类型转换器使用场景 Spring MVC默认提供了一些常用的类型转换器这些类型转换器可以将客户端提交的参数自动转换为处理器形参类型的数据。然而默认类型转换器并不能将提交的参数转换为所有的类型。此时就需要开发者自定义类型转换器来将参数转换为程序所需要的类型。 RequestMapping(/getBirthday)public String getBirthday(Date birthday){System.out.println(出生日期:birthday);return success;} 类型转换失败这时候就需要类型转换器 xml方式
Converter接口的使用
public class DateConverter implements ConverterString, Date {Overridepublic Date convert(String s) {String dateFormatPattern yyyy-MM-dd;SimpleDateFormat sdf new SimpleDateFormat(dateFormatPattern);Date date null;try {date sdf.parse(s);} catch (ParseException e) {e.printStackTrace();System.out.println(请采用正确的格式:dateFormatPattern);}return date;}}RequestMapping(/getBirthday)public String getBirthday(Date birthday){System.out.println(出生日期:birthday);return success;}!--配置格式转换器的工厂--bean idconversionService classorg.springframework.context.support.ConversionServiceFactoryBeanproperty nameconvertersarraybean classcom.it.convert.DateConverter/bean/array/property/bean!--注解驱动--mvc:annotation-driven conversion-serviceconversionService/ 注意“yyyy-MM-dd”这里的dd后面不要有空格不然写2021-01-01会得不到正确结果 在上述案例中日期类型的格式转换是基于XML配置自定义转换器实现的。除了XML方式之外还可以通过DateTimeFormat注解来简化日期类型的格式转换。使用DateTimeFormat注解完成日期类型的格式转换无需自定义转换器也无需在配置文件中定义转换器工厂或格式化工厂只需将DateTimeFormat定义在方法的形参前面或成员变量上方就可以为当前参数或变量指定类型转换规则。 注解方式 RequestMapping(/getBirthday)public String getBirthday(DateTimeFormat(pattern yyyy-MM-dd) Date birthday){System.out.println(出生日期:birthday);return success;}mvc:annotation-driven/mvc:annotation-driven数组绑定
数组绑定的使用场景 在实际开发中可能会遇到客户端请求需要传递多个同名参数到服务器端的情况这种情况采用前面的简单数据绑定的方式显然是不合适的。此时可以使用数组来接收客户端的请求参数完成数据绑定。 % page languagejava contentTypetext/html; charsetUTF-8pageEncodingUTF-8%
htmlheadtitle提交商品/title/headbody
form action${pageContext.request.contextPath }/getProductsmethodposttable width220px border1trtd选择/tdtd商品名称/td/trtrtdinput nameproIds value1 typecheckbox/tdtdSSM框架实战/td/trtrtdinput nameproIds value2 typecheckbox/tdtdJavaWeb案例/td/tr/tableinput typesubmit value提交商品/
/form/body/htmlpublic class Product {private String proId;private String proName;Overridepublic String toString() {return Product{ proId proId \ , proName proName \ };}public String getProId() {return proId;}public void setProId(String proId) {this.proId proId;}public String getProName() {return proName;}public void setProName(String proName) {this.proName proName;}
}Controller
public class ProductController {RequestMapping(/getProducts)public String getProducts(String[] proIds){for (String proId : proIds){System.out.println(商品的id为proId);}return success;}
}注意:String[] 后面的proIds要和input里面的name的值一样 集合绑定 集合中存储简单类型数据时数据的绑定规则和数组的绑定规则相似需要请求参数名称与处理器的形参名称保持一致。不同的是使用集合绑定时处理器的形参名称需要使用RequestParam注解标注。 如果getProducts( )方法中不使用RequestParam注解Spring MVC默认将List作为对象处理赋值前先创建List对象然后将proIds作为List对象的属性进行处理。由于List是接口无法创建对象所以会出现无法找到构造方法异常。如果将类型更改为可创建对象的类型如ArrayList可以创建ArrayList对象但ArrayList对象依旧没有proIds属性因此无法正常绑定数据为空。此时需要告知Spring MVC的处理器proIds是一组数据 而不是一个单一数据。通过RequestParam注解将参数打包成参数数组或集合后Spring MVC才能识别该数据格式并判定形参类型是否为数组或集合并按数组或集合对象的形式操作数据。 RequestMapping(/getProducts)public String getProducts(RequestParam(proIds) ListString proIds){for (String proId : proIds){System.out.println(商品的id为proId);}return success;}复杂POJO绑定
属性为对象类型的数据绑定
public class Order {private String orderId;public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId orderId;}
}public class User {private String username;private String password;private Order order;public Order getOrder() {return order;}public void setOrder(Order order) {this.order order;}RequestMapping(/findOrderWithUser)public String findUserWithOrder(User user){System.out.println(用户名:user.getUsername());System.out.println(订单号:user.getOrder().getOrderId());return success;}
% page languagejava contentTypetext/html;charsetUTF-8 pageEncodingUTF-8%
htmlheadmeta http-equivContent-Type contenttext/html; charsetUTF-8title订单信息/title/headbodyformaction${pageContext.request.contextPath }/findOrderWithUsermethodpost所属用户input typetext nameusername /br /订单编号input typetext nameorder.orderId /br /input typesubmit value查询 /
/form /body/html属性为List类型的数据绑定
public class User {private String username;private String password;private ListOrder orders;private ListString address;public ListOrder getOrders() {return orders;}public void setOrders(ListOrder orders) {this.orders orders;}public ListString getAddress() {return address;}public void setAddress(ListString address) {this.address address;}
public class Order {private String orderId;private String orderName;public String getOrderName() {return orderName;}public void setOrderName(String orderName) {this.orderName orderName;}public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId orderId;}
} Controller(/showOrders)public class OrderController{RequestMapping(/showOrders)public String showOrders(User user){ListOrder orders user.getOrders();ListString addressuser.getAddress();for (int i0;iorders.size();i){Order order orders.get(i);address.get(i);System.out.println(订单编号:order.getOrderId() 地址是:address);}return success;}}% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %
htmlheadtitle订单信息/title/headbody
form action${pageContext.request.contextPath }/showOrdersmethodposttable width220px border1trtd订单号/tdtd订单名称/tdtd配送地址/td/trtrtdinput nameorders[0].orderId value1 typetext/tdtdinput nameorders[0].orderName valueJava基础教程typetext/tdtdinput nameaddress value北京海淀 typetext/td/tr/tableinput typesubmit value订单信息/
/form /body/html属性为Map类型的数据绑定
public class Order {private String orderId;private HashMapString,ProductproductInfo;public HashMapString, Product getProductInfo() {return productInfo;}public void setProductInfo(HashMapString, Product productInfo) {this.productInfo productInfo;}public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId orderId;}
}public class Product {private String proId;private String proName;Overridepublic String toString() {return Product{ proId proId \ , proName proName \ };}public String getProId() {return proId;}public void setProId(String proId) {this.proId proId;}public String getProName() {return proName;}public void setProName(String proName) {this.proName proName;}
}RequestMapping(/orderInfo)public String getOrderinfo(Order order){//遍历订单中的商品信息System.out.println(订单的编号:order.getOrderId());HashMapString, Product productInfoorder.getProductInfo();SetString keysproductInfo.keySet();for (String key:keys){Product productproductInfo.get(key);System.out.println(类型:key商品名称:product.getProName());}return success;}}% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %
form action${pageContext.request.contextPath}/orderInfomethodposttable border1trtd colspan2
订单id:input typetext nameorderId value1/td/tr
trtd商品Id/tdtd商品名称/td/tr
trtdinput nameproductInfo[生鲜].proId value1typetext/tdtdinput nameproductInfo[生鲜].proName value三文鱼 typetext/td
/trtrtdinput nameproductInfo[酒水].proId value2typetext/tdtdinput nameproductInfo[酒水].proName value红牛 typetext/td/tr/table
input typesubmit value提交/
/form 消息转换器—HttpMessageConverter接口 客户端不同的请求HttpServletRequest中数据的MediaType可能会不同如果想将HttpServletRequest中的数据转换成指定对象或者将对象转换成指定格式的数据就需要使用对应的消息转换器来实现。Spring中提供了一个HttpMessageConverter接口作为消息转换器。因为数据的类型有多种所以Spring中提供了多个HttpMessageConverter接口的实现类其中MappingJackson2HttpMessageConverter是HttpMessageConverter接口的实现类之一在处理请求时可以将请求的JSON报文绑定到处理器的形参对象在响应请求时将处理器的返回值转换成JSON报文。 HttpMessageConverter与Converter类型转换器的区别 需要注意的是HttpMessageConverter消息转换器和之前所学习的Converter类型转换器是有区别的。HttpMessageConverter消息转换器用于将请求消息中的报文数据转换成指定对象或者将对象转换成指定格式的报文进行响应Converter类型转换器用于对象之间的类型转换。 由于本次演示的是异步数据提交需要使用jQuery所以需要将jQuery文件导入到项目中以便发送ajax请求。在项目的/webapp文件夹下创建名称为js的文件夹在js文件夹中导入jQuery文件。 public class Product {private String proId;private String proName;Overridepublic String toString() {return Product{ proId proId \ , proName proName \ };}public String getProId() {return proId;}public void setProId(String proId) {this.proId proId;}public String getProName() {return proName;}public void setProName(String proName) {this.proName proName;}
}public class Order {private String orderId;private HashMapString,ProductproductInfo;public HashMapString, Product getProductInfo() {return productInfo;}public void setProductInfo(HashMapString, Product productInfo) {this.productInfo productInfo;}public String getOrderId() {return orderId;}public void setOrderId(String orderId) {this.orderId orderId;}
}% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %
htmlheadtitle异步提交商品/titlescript typetext/javascriptsrc${pageContext.request.contextPath}/js/jquery-3.4.1.min.js/script/head
/html
form idproductstable border1trth商品id/thth商品名称/thth提交/th/trtrtdinput nameproId value1 idproId typetext/tdtdinput nameproName value三文鱼 idproName typetext/tdtdinput typebutton value提交单个商品onclicksumbmitProduct()/td/trtrtdinput nameproId value2 idproId2 typetext/tdtdinput nameproName value红牛 idproName2 typetext/tdtdinput typebutton value提交多个商品onclicksumbmitProducts()/td/tr/table/form
script typetext/javascriptfunction sumbmitProduct() {var proId $(#proId).val();var proName $(#proName).val();$.ajax({ url: ${pageContext.request.contextPath }/getProduct,type: post,data: JSON.stringify({proId: proId, proName: proName}),contentType: application/json;charsetUTF-8,dataType: json,success: function (response) {alert(response);} }); }function sumbmitProducts() {var pro1{proId:$(#proId).val(),proName:$(#proName).val()}var pro2{proId:$(#proId2).val(),proName:$(#proName2).val()}$.ajax({ url: ${pageContext.request.contextPath }/getProductList,type: post,data: JSON.stringify([pro1,pro2]),contentType: application/json;charsetUTF-8,dataType: json,success: function (response) {alert(response);} }); }
/script
/scriptmvc:annotation-driven/mvc:annotation-driven!-- 配置静态资源的访问--mvc:resources mapping/js/** location/js/ /RequestMapping(/getProduct)public String getProduct(RequestBody Product product){System.out.println(单个商品:product);return success;}RequestMapping(/getProductList)public String getProductList(RequestBody ListProduct productList){System.out.println(多个商品:);productList.forEach(product - {System.out.println(product);});return success;} JSON转换器配置和静态资源访问配置 JSON转换器配置和静态资源访问配置除了之前讲解的配置方案之外还可以通过其他方式完成下面讲解两种配置方式使用bean元素配置JSON转换器和静态资源访问的配置方式。 使用bean元素配置JSON转换器
!-- 使用bean元素配置注解方式的处理器映射器 --
bean classorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping /
!-- 使用bean元素配置注解方式的处理器适配器 --
bean classorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapterproperty namemessageConverterslist!-- 配置JSON转换器 --bean classorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter//list/property
/bean静态资源访问的配置方式 使用mvc:default-servlet-handler配置静态资源 mvc:default-servlet-handler /激活Tomcat默认的Servlet来处理静态资源访问 servlet-mappingservlet-namedefault/servlet-nameurl-pattern*.js/url-pattern
/servlet-mappingservlet-mappingservlet-namedefault/servlet-nameurl-pattern*.css/url-pattern
/servlet-mapping 2.页面跳转
返回值为void类型的页面跳转到默认页面 当Spring MVC方法的返回值为void类型方法执行后会跳转到默认的页面。默认页面的路径由方法映射路径和视图解析器中的前缀、后缀拼接成拼接格式为“前缀方法映射路径后缀”。如果Spring MVC的配置文件中没有配置视图解析器则会报HTTP Status 500错误。 代码演示 RequestMapping(/register)public void showPageByVoid(){System.out.println(showPageByVoid running);}% page contentTypetext/html;charsetutf-8 languagejava %
htmlheadmeta http-equivContent-Type contenttext/html; charsetutf-8title注册/title/head
bodyform action${pageContext.request.contextPath}/registerUsermethodpost用户名input typetext nameusername /br /密nbsp;nbsp;nbsp;码input typepassword namepassword /br /input typesubmit value注册/
/form/body
/html返回值为String类型的页面跳转(不携带数据) RequestMapping(/showPageByString)public String showPageByString(){System.out.println(showPageByString running);return register;}注意:void类型默认映射路径名就是视图名称 string返回值默认直接是视图名称 返回值为String类型的页面跳转的转发方式 当方法的返回值为普通的字符串时Spring MVC在方法执行后会默认以转发的方式响应给客户端。除了这种默认的转发方式还可以返回指定前缀的字符串来设定处理器执行后对请求进行转发还是重定向设定转发和重定向的字符串格式如下所示。 forward:需要转发到的资源路径redirect:需要重定向到的资源路径 RequestMapping(/showPageByForward)public String showPageByForward() {System.out.println(showPageByForward running);return forward:order.jsp; }RequestMapping(/showPageByRedirect)public String showPageByRedirect() {System.out.println(showPageByRedirect running);return redirect:http://www.itheima.com; } 以及把showPageByRedirect复制过去也是可以访问到的 返回值为String类型的页面跳转(携带数据) RequestMapping(/showPageByRequest)public String showPageByRequest(HttpServletRequest request) {System.out.println(showPageByRequest running);request.setAttribute(username,request); return register;}% page contentTypetext/html;charsetutf-8 languagejava %
htmlheadmeta http-equivContent-Type contenttext/html; charsetutf-8title注册/title/head
bodyform action${pageContext.request.contextPath}/registerUsermethodpost用户名input typetext nameusername value${username} /br /密nbsp;nbsp;nbsp;码input typepassword namepassword /br /input typesubmit value注册/
/form/body
/html另一种
RequestMapping(/showPageByModel)public String showPageByModel(Model model) {System.out.println(showPageByRequest running);//传递数据model.addAttribute(username,model);return register;}返回值为ModelAndView类型的页面跳转
ModelAndView对象组成部分 使用方法的返回值可以设定跳转的逻辑视图名称使用Model等对象实现页面跳转时传输数据。除此之外Spring MVC还提供了兼顾视图和数据的对象ModelAndViewModelAndView对象包含视图相关内容和模型数据两部分其中视图相关的内容可以设置逻辑视图的名称也可以设置具体的View实例模型数据则会在视图渲染过程中被合并到最终的视图输出。 ModelAndView设置视图和数据模型的方法 ModelAndView方法说明 setViewName()方法和setView()方法都是为ModelAndView对象设置视图的方法其中前者使用更方便因此setViewName()方法比较常用。后3个方法都是向ModelAndView对象中添加模型数据的其中addObject(Object attributeValue)方法添加的attributeValue默认名称为attributeValue类型全限定名的最后一个单词且首字母小写addObject(String attributeName, Object attributeValue)方法可以在页面上以${attributeName}方式取出attributeValue。 RequestMapping(/showModelAndView)public ModelAndView showModelAndView() {ModelAndView modelAndView new ModelAndView();//数据设置modelAndView.addObject(username,santi);User user new User(); user.setPassword(password);modelAndView.addObject(user,user);//视图设置modelAndView.setViewName(register);return modelAndView;}3.数据回写
普通字符串的回写
Controller
public class DataController {RequestMapping(/showDataByResponse)public void showDataByResponse(HttpServletResponse response){try {response.getWriter().write(success);} catch (IOException e) {e.printStackTrace();}}}JSON数据的回写 RequestMapping(showDataByJSON)public void showDataByJSON(HttpServletResponse response) {try { ObjectMapper om new ObjectMapper();//创建user对象User user new User();user.setUsername(santi); user.setPassword(666);//转换成json字符串String ujson om.writeValueAsString(user);response.getWriter().print(ujson);} catch (IOException e) {e.printStackTrace();}}ResponseBody注解 ResponseBody注解可以标注在方法和类上当标注在类上时表示该类中的所有方法均应用ResponseBody注解。如果需要当前类中的所有方法均应用ResponseBody注解也可以使用RestController注解。 ResponseBody注解的2个使用要求 使用ResponseBody注解项目至少需要符合2个要求分别如下所示。 1.项目中有转换JSON相关的依赖。 2.可以配置转换JSON数据的消息类型转换器。 针对上述两个要求chapter12项目都已经满足项目的pom.xml文件中引入了Jackson相关的依赖可以用于转换JSONSpring MVC的配置文件中配置的mvc:annotation-driven /元素默认注册了Java数据转JSON数据的消息转换器。 RequestMapping(/showDataByJSON)ResponseBodypublic User showDataByJSON() {//创建user对象User user new User();user.setUsername(santi); user.setPassword(666);//转换成json字符串return user;}通过一个案例演示使用ResponseBody注解回写JSON格式的对象数据和集合数据 RequestMapping(/getUser)ResponseBodypublic User getUser(){User user new User();user.setUsername(abc);user.setPassword(213);return user;}RequestMapping(/addProducts)ResponseBodypublic ListProduct addProducts(){ListProduct productListnew ArrayList();Product p1new Product();p1.setProId(p01);p1.setProName(三文鱼);Product p2new Product();p2.setProId(p02);p2.setProName(茅台);productList.add(p1);productList.add(p2);return productList;}