如何ios 封装自定义viewSpringMVC对页面参数的封装规则

SpringMVC框架学习(11)
SpringMVC中的参数绑定还是蛮重要的,所以单独开一篇文章来讲解。本文所有案例代码的编写均建立在前文的案例基础之上,因此希望读者能仔细阅读这篇文章。
默认支持的数据类型
现在有这样一个需求:打开商品编辑页面,展示商品信息。这是我对这个需求的分析:编辑商品信息,需要根据商品id查询商品信息,然后展示到页面。我这里假设请求的url为/itemEdit.action,由于我想要根据商品id查询商品信息,所以需要传递商品id这样一个参数。最终的一个响应结果就是在商品编辑页面中展示商品详细信息,如下:
为了解决这个需求,必然要有一个商品编辑页面,这里将如下editItem.jsp复制到工程的/WEB-INF/jsp目录下。
商品编辑页面——editItem.jsp
&%@ page language="java" contentType="text/ charset=UTF-8"
pageEncoding="UTF-8"%&
&%@ taglib uri="/jsp/jstl/core" prefix="c" %&
&%@ taglib uri="/jsp/jstl/fmt"
prefix="fmt"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
http-equiv="Content-Type" content="text/ charset=UTF-8"&
&修改商品信息&
id="itemForm" action="${pageContext.request.contextPath }/updateitem.action" method="post"&
type="hidden" name="id" value="${item.id }" /& 修改商品信息:
width="100%" border=1&
&商品名称&
& type="text" name="name" value="${item.name }" /&&
&商品价格&
& type="text" name="price" value="${item.price }" /&&
&商品简介&
& rows="3" cols="30" name="detail"&${item.detail }&
colspan="2" align="center"& type="submit" value="提交" /&
当然了,在商品列表展示页面——itemList.jsp中,我们还须注意编辑修改这个超链接,如下图所示:
所有前端页面准备好之后,接下来就要编写后台业务代码了。
编写Service层代码
首先在ItemService接口中添加如下一个方法:
Items getItemById(int id);
如此一来,ItemService接口的代码就变为:
public interface ItemService {
List&Items& getItemList();
Items getItemById(int id);
紧接着在ItemService接口的实现类——ItemServiceImpl.java中实现以上方法,即在ItemServiceImpl实现类中添加如下方法:
public Items getItemById(int id) {
Items items = itemsMapper.selectByPrimaryKey(id);
Controller类的参数绑定
要根据商品id查询商品数据,需要从请求的参数中把请求的id取出来。id应该包含在Request对象中。可以从Request对象中取id。因此我们应在ItemController类中添加如下方法:
public ModelAndView editItem(HttpServletRequest request) {
String strId = request.getParameter("id");
int id = new Integer(strId);
Items items = itemService.getItemById(id);
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("item", items);
modelAndView.setViewName("editItem");
return modelAndV
如果想获得Request对象只需要在Controller类方法的形参中添加一个参数即可。SpringMVC框架会自动把Request对象传递给方法。这就是SpringMVC框架默认支持的参数类型。
SpringMVC框架默认支持的参数类型
处理器形参中添加如下类型的参数,处理适配器会默认识别并进行赋值。
HttpServletRequest:通过request对象获取请求信息。
HttpServletResponse:通过response处理响应信息。
HttpSession:通过session对象得到session中存放的对象。
Model/ModelMap:ModelMap是Model接口的实现类,我们可通过Model或ModelMap向页面传递数据,如下:
Items items = itemService.getItemById(id)
model.addAttribute("item", items)
页面中通过${item.XXXX}获取item对象的属性值。
使用Model和ModelMap的效果是一样的,如果直接使用Model接口,SpringMVC会实例化ModelMap。如果使用Model接口,那么editItem方法可以改造成:
@RequestMapping("/itemEdit")
public String editItem(HttpServletRequest request,
HttpServletResponse response, HttpSession session, Model model) {
String strId = request.getParameter("id");
int id = new Integer(strId);
Items items = itemService.getItemById(id);
model.addAttribute("item", items);
return "editItem";
如果使用Model接口则可以不使用ModelAndView对象,Model对象可以向页面传递数据(model是框架给我们传递过来的对象,所以这个对象不需要我们返回),View对象则可以使用String返回值替代。不管是Model还是ModelAndView,其本质都是使用Request对象向jsp传递数据。
简单数据类型绑定
当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。从Request取参数的方法可以进一步简化。这样一来,editItem方法可以改造成:
@RequestMapping("/itemEdit")
public String editItem(Integer id, Model model) {
Items items = itemService.getItemById(id);
model.addAttribute("item", items);
return "editItem";
支持的数据类型
SpringMVC框架支持的数据类型有:
整形:Integer、int
字符串:String
单精度:Float、float
双精度:Double、double
布尔型:Boolean、boolean
说明:对于布尔类型的参数,请求的参数值为true或false。处理器方法可是这样的:
public String editItem(Model model,Integer id,Boolean status) throws Exception {
至于请求的url,可是http://localhost:8080/xxx.action?id=2&status=false。
注意:参数类型推荐使用包装数据类型,因为基础数据类型不可以为null。
@RequestParam
使用@RequestParam注解常用于处理简单类型的绑定。
value:参数名字,即入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入。
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报如下错误:
defaultValue:默认值,表示如果请求中没有同名参数时的默认值。
使用@RequestParam注解,editItem方法可以改造成:
@RequestMapping("/itemEdit")
public String editItem(@RequestParam(value="id",defaultValue="1",required=true) Integer ids, Model model) {
Items items = itemService.getItemById(ids);
model.addAttribute("item", items);
return "editItem";
形参名称为ids,但是这里使用value=”id”限定请求的参数名为id,所以页面传递参数的名称必须为id。注意:如果请求参数中没有id将抛出异常:
这里通过required=true限定id参数为必须传递,如果不传递则报400错误,可以使用defaultvalue设置默认值,即使required=true也可以不传id参数值。
绑定pojo类型
现有这样一个需求:将页面修改后的商品信息保存到数据库表中。这是我对这个需求的分析:我这里假设请求的url为/updateitem.action,由于我想要将页面修改后的商品信息保存到数据库表中,所以需要传递的参数是表单中的数据。最终的一个响应结果就是跳转到更新成功页面。
使用pojo接收表单数据
如果提交的参数很多,或者提交的表单中的内容很多的时候可以使用pojo接收数据。要求pojo对象中的属性名和表单中input的name属性一致。就像下图所示:
编写Service层代码
首先在ItemService接口中添加如下一个方法:
void updateItem(Items items);
如此一来,ItemService接口的代码就变为:
public interface ItemService {
List&Items& getItemList();
Items getItemById(int id);
void updateItem(Items items);
紧接着在ItemService接口的实现类——ItemServiceImpl.java中实现以上方法,即在ItemServiceImpl实现类中添加如下方法:
public void updateItem(Items items) {
itemsMapper.updateByPrimaryKeySelective(items);
Controller类的参数绑定
在Controller类中使用pojo数据类型进行参数绑定,即应在ItemController类中添加如下方法:
@RequestMapping("/updateitem")
public String updateItems(Items items) {
itemService.updateItem(items);
return "success";
请求的参数名称和pojo的属性名称一致,会自动将请求参数赋值给pojo的属性。注意:提交的表单中不要有日期类型的数据,否则会报400错误。如果想提交日期类型的数据需要用到后面的自定义参数绑定的内容。
最后的响应结果就是跳转到更新成功页面。所以还须在/WEB-INF/jsp目录下编写一个jsp页面——success.jsp,如下:
&%@ page language="java" contentType="text/ charset=UTF-8"
pageEncoding="UTF-8"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
http-equiv="Content-Type" content="text/ charset=UTF-8"&
&Insert title here&
&商品更新成功!!!&
这样,当我们修改完商品信息之后,去数据库表中瞧一瞧,就会看到中文乱码情况了,如下:
我们知道表单提交的方式是post,那么如何来解决post提交的中文乱码问题呢?我们可在web.xml文件中加入一个过滤器,如下:
&CharacterEncodingFilter&
&org.springframework.web.filter.CharacterEncodingFilter&
&encoding&
&CharacterEncodingFilter&
注意:以上只可以解决post请求乱码问题。
对于get请求方式中文参数出现乱码解决方法有两个:
修改tomcat配置文件添加编码与工程编码一致,如下:
URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/&
另外一种方法对参数进行重新编码:
String username = new String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8");
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。
解决完post提交的中文乱码问题之后,再次修改商品信息,去数据库表中瞧一瞧,将发现一切正常。
绑定包装pojo
现有这样一个需求:使用包装的pojo接收商品信息的查询条件。下面是我的需求分析:
首先,在com.itheima.springmvc.pojo包下编写一个包装类,定义如下:
public class QueryVo {
public Items getItems() {
public void setItems(Items items) {
this.items =
然后在itemList.jsp页面中添加如下input输入项:
&input type="text" name="items.id" /&
&input type="text" name="items.name" /&
添加的位置我已在下图框出:
接着在ItemController类中添加如下方法:
@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo) {
// 打印绑定结果
System.out.println(queryVo.getItems().getId())
System.out.println(queryVo.getItems().getName())
return "success"
最后的一个访问流程大致就是这样:
自定义参数绑定
有这样一个需求:在商品修改页面可以修改商品的生产日期,并且根据业务需求自定义日期格式。
要解决这个需求,首先要在editItem.jsp页面中添加商品生产日期的输入项,因此该页面应改造为:
&%@ page language="java" contentType="text/ charset=UTF-8"
pageEncoding="UTF-8"%&
&%@ taglib uri="/jsp/jstl/core" prefix="c" %&
&%@ taglib uri="/jsp/jstl/fmt"
prefix="fmt"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
http-equiv="Content-Type" content="text/ charset=UTF-8"&
&修改商品信息&
id="itemForm" action="${pageContext.request.contextPath }/updateitem.action" method="post"&
type="hidden" name="id" value="${item.id }" /& 修改商品信息:
width="100%" border=1&
&商品名称&
& type="text" name="name" value="${item.name }" /&&
&商品价格&
& type="text" name="price" value="${item.price }" /&&
&商品生产日期&
& type="text" name="createtime"
value="&fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/&" /&&
&商品简介&
& rows="3" cols="30" name="detail"&${item.detail }&
colspan="2" align="center"& type="submit" value="提交" /&
我们还是一如往前地修改商品的信息(当然包含修改商品的生产日期),当我们点击提交按钮时,发现报400错误,如下:
我之前就已讲过:提交的表单中不要有日期类型的数据,否则会报400错误。如果想提交日期类型的数据需要用到后面的自定义参数绑定的内容。所以要真正解决这个需求,就必然要用到自定义参数绑定的内容。下面是我对这个需求的分析:由于日期数据有很多种格式,所以SpringMVC没办法把字符串转换成日期类型。所以需要自定义参数绑定。前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。在SpringMVC中可以在处理器适配器上自定义Converter进行参数绑定。如果使用&mvc:annotation-driven/&,可以在此标签上进行扩展。
自定义Converter
在com.itheima.springmvc.converter下编写一个自定义Converter——DateConverter.java,如下:
public class DateConverter implements Converter&String, Date& {
public Date convert(String source) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(source);
return date;
} catch (ParseException e) {
e.printStackTrace();
return null;
配置Converter
如果使用&mvc:annotation-driven/&,可以在此标签上进行扩展。在springmvc.xml配置文件中添加如下配置:
conversion-service="conversionService" /&
id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean"&
name="converters"&
class="com.itheima.springmvc.converter.DateConverter"/&
其实配置Converter还有另一种方式,不过实际开发中用到的很少,这里还是讲一下,按照这种方式配置完Converter之后,springmvc.xml配置文件就为:
&?xml version="1.0" encoding="UTF-8"?&
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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd"&
base-package="com.itheima.springmvc.controller"/&
id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean"&
name="converters"&
class="com.itheima.springmvc.converter.DateConverter"/&
id="customBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"&
name="conversionService" ref="conversionService" /&
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"&
name="webBindingInitializer" ref="customBinder"&&
class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/&
class="org.springframework.web.servlet.view.InternalResourceViewResolver"&
name="prefix" value="/WEB-INF/jsp/"&&
name="suffix" value=".jsp"&&
注意:此方法需要独立配置处理器映射器、适配器,不再使用&mvc:annotation-driven/&。
这样当我们修改商品的信息(当然包含修改商品的生产日期)时,就能修改成功了,并不会报400的错误。
SpringMVC与Struts2的不同
SpringMVC的入口是一个servlet即前端控制器,而Struts2入口是一个filter过虑器。
SpringMVC是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),Struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
Struts2采用值栈存储请求和响应的数据,通过OGNL存取数据,SpringMVC通过参数解析器将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过request域传输到页面。jsp视图解析器默认使用jstl。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:378003次
积分:7122
积分:7122
排名:第3216名
原创:132篇
转载:132篇
译文:132篇
评论:161条
文章:102篇
阅读:86366
文章:19篇
阅读:16488
阅读:2319
阅读:2311
文章:12篇
阅读:9719
文章:34篇
阅读:35120
(2)(78)(63)(22)(19)(8)(7)(7)(2)(49)(41)(36)(25)3844人阅读
SpringMVC(62)
百度,google了半天即使再万能的stackoverflow上也没有得到解答,今天偶然间发现springmvc注解@RequestParam不是通过HttpServletRequest.java的getParameter(String name)方法得到的参数值,而是通过getParameterValues得到的,怪不得debug了半天getParameter方法就是未被调用,filter也没生效。
相关代码如下:
RequestFilter.java
package&com.zuidaima.
import&java.io.IOE
import&java.io.UnsupportedEncodingE
import&javax.servlet.FilterC
import&javax.servlet.ServletE
import&javax.servlet.http.HttpServletR
import&javax.servlet.http.HttpServletRequestW
import&javax.servlet.http.HttpServletR
import&org.springframework.web.filter.OncePerRequestF
public&class&RequestFilter&extends&OncePerRequestFilter
&&&&public&String
filter(HttpServletRequest request, String input) {
&&&&&&&&String
&&&&&&&&&&&&&&&&
&&&&&&&&if&(input
==&null&||
input.trim().equals(&(null)&))
&&&&&&&&&&&&&&&&&&&&&&&&ret=null;
&&&&&&&&&&&&return&
&&&&&&&&final&String
userAgent = request.getHeader(&User-Agent&);
&&&&&&&&final&String
method = request.getMethod();
&&&&&&&&&&&&&&&&
&&&&&&&&if&(method.equalsIgnoreCase(&get&)
&&&&&&&&&&&&&&&&||
userAgent.toLowerCase().indexOf(&android&)
&&&&&&&&&&&&try&{
&&&&&&&&&&&&&&&&ret
=&new&String(input.getBytes(&ISO8859-1&),&&utf-8&);
&&&&&&&&&&&&}&catch&(UnsupportedEncodingException
&&&&&&&&&&&&&&&&e.printStackTrace();
&&&&&&&&&&&&}
&&&&&&&&return&
&&&&@Override
&&&&protected&void&doFilterInternal(final&HttpServletRequest
&&&&&&&&&&&&HttpServletResponse
response, FilterChain chain)
&&&&&&&&&&&&throws&ServletException,
IOException {
&&&&&&&&chain.doFilter(new&HttpServletRequestWrapper(request)
&&&&&&&&&&&&@Override
&&&&&&&&&&&&public&String
getParameter(String name) {
&&&&&&&&&&&&&&&&String
value =&super.getParameter(name);
&&&&&&&&&&&&&&&&return&filter(this,
&&&&&&&&&&&&}
&&&&&&&&&&&&@Override
&&&&&&&&&&&&public&String[]
getParameterValues(String name) {
&&&&&&&&&&&&&&&&String[]
values =&super.getParameterValues(name);
&&&&&&&&&&&&&&&&if&(values
&&&&&&&&&&&&&&&&&&&&return&null;
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&for&(int&i
i & values. i++) {
&&&&&&&&&&&&&&&&&&&&values[i]
= filter(this,
values[i]);
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&return&
&&&&&&&&&&&&}
&&&&&&&&},
response);
当然必须在web.xml中配置启动该过滤器:
&&&&&&&&&filter-name&RequestFilter&/filter-name&
&&&&&&&&&filter-class&com.zuidaima.filter.RequestFilter&/filter-class&
&&&&&/filter&
&&&&&filter-mapping&
&&&&&&&&&filter-name&RequestFilter&/filter-name&
&&&&&&&&&url-pattern&*.htm&/url-pattern&
&&&&&/filter-mapping&
这样就可以实现全局的控制springmvc的参数过滤,比如xss,编解码等业务,比在每个springmvc方法中对每个参数值进行判断和过滤简单方便多了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:417152次
积分:6620
积分:6620
排名:第3645名
原创:164篇
转载:568篇
评论:29条
细节决定成败,
态度决定一切。
文章:32篇
阅读:14228
(3)(5)(1)(3)(5)(1)(2)(1)(3)(6)(2)(24)(32)(31)(1)(6)(108)(7)(25)(232)(65)(12)(2)(2)(6)(2)(4)(21)(120)扩展SpringMVC以支持绑定JSON格式的请求参数 - 开涛的博客—公众号:kaitao-1234567,一如既往的干货分享 - ITeye博客
博客分类:
此方案是把请求参数(JSON字符串)绑定到java对象,,@RequestBody是绑定内容体到java对象的。
问题描述:
你好,对于如下的json数据,springmvc的数据绑定该如何做?
accessionDate
deptIds [{"deptId":4,"isPrimary":true}]
fax 3423432
gender true
其实就是我前台一表单提交的数据,extjs form提交的,关键在于deptIds的映射,数组不知怎么解决,还有就是springmvc的数据绑定好像要求javabean与json中的数据一一对应,否则也会出错
如请求参数是deptIds={"deptId":4,"isPrimary":true}]
是一个json数组,此时需要绑定为一个对象,该如何实现呢?
解决方案:
类似于之前写的,扩展spring的HandlerMethodArgumentResolver以支持自定义的数据绑定方式。
1、请下载附件的代码,放到工程中;
2、在RequestMappingHandlerAdapter添加自定义HandlerMethodArgumentResolver Bean;
&bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"&
&!--线程安全的访问session--&
&property name="synchronizeOnSession" value="true"/&
&property name="customArgumentResolvers"&
&bean class="cn.javass.spring.mvc.method.annotation.RequestJsonParamMethodArgumentResolver"/&
&bean class="cn.javass.spring.mvc.method.annotation.FormModelMethodArgumentResolver"/&
&/property&
//customArgumentResolvers用于注入自定义的参数解析器,此处我们注入了RequestJsonParamMethodArgumentResolver。
3、使用方式
@RequestMapping("/list")
public String list(@RequestJsonParam("list") List&Integer& list)
4、测试控制器
package cn.javass.chapter6.web.controller.
import java.util.A
import java.util.L
import java.util.S
import org.springframework.stereotype.C
import org.springframework.web.bind.annotation.RequestM
import cn.javass.chapter6.model.DataBinderTestM
import cn.javass.chapter6.model.UserM
import cn.javass.spring.mvc.bind.annotation.RequestJsonP
import cn.javass.spring.mvc.util.MapW
@Controller
@RequestMapping("/jsonparam")
public class JsonParamController {
http://localhost:9080/springmvc-chapter6/jsonparam/list?list=[1,2,34]
//fail http://localhost:9080/springmvc-chapter6/jsonparam/list?list=[1,2,a]
@RequestMapping("/list")
public String list(@RequestJsonParam("list") List&Integer& list) {
System.out.println(list);
return "redirect:/success";
http://localhost:9080/springmvc-chapter6/jsonparam/set?set=[1,2,34]
//fail http://localhost:9080/springmvc-chapter6/jsonparam/set?set=[1,2,a]
@RequestMapping("/set")
public String set(@RequestJsonParam("set") Set&Integer& set) {
System.out.println(set);
return "redirect:/success";
http://localhost:9080/springmvc-chapter6/jsonparam/array?array=[1,2,3]
//fail http://localhost:9080/springmvc-chapter6/jsonparam/array?array=[1,2,a]
@RequestMapping("/array")
public String list(@RequestJsonParam("array") int[] array) {
System.out.println(Arrays.toString(array));
return "redirect:/success";
http://localhost:9080/springmvc-chapter6/jsonparam/map?map={"a":1, "b":2}
//fail http://localhost:9080/springmvc-chapter6/jsonparam/map?map={"a":1, "b":a}
@RequestMapping("/map")
public String map(@RequestJsonParam(value = "map", required=false) MapWapper&String, Integer& map) {
System.out.println(map);
return "redirect:/success";
//UserModel[]
http://localhost:9080/springmvc-chapter6/jsonparam/array2?array=[{"username":"123"},{"username":"234"}]
@RequestMapping("/array2")
public String array2(@RequestJsonParam(value = "array") UserModel[] array) {
System.out.println(Arrays.toString(array));
return "redirect:/success";
//List&UserModel&
http://localhost:9080/springmvc-chapter6/jsonparam/list2?list=[{"username":"123"},{"username":"234"}]
@RequestMapping("/list2")
public String list2(@RequestJsonParam(value = "list") List&UserModel& list) {
System.out.println(list);
return "redirect:/success";
//Set&UserModel&
http://localhost:9080/springmvc-chapter6/jsonparam/set2?set=[{"username":"123"},{"username":"234"}]
@RequestMapping("/set2")
public String set2(@RequestJsonParam(value = "set") Set&UserModel& set) {
System.out.println(set);
return "redirect:/success";
//Map&String, UserModel&
http://localhost:9080/springmvc-chapter6/jsonparam/map2?map={"a":{"username":"123"},"b":{"username":"234"}}
//暂不支持 Map&UserModel, UserModel&
@RequestMapping("/map2")
public String map2(@RequestJsonParam(value = "map") MapWapper&String, UserModel& map) {
System.out.println(map);
return "redirect:/success";
http://localhost:9080/springmvc-chapter6/jsonparam/model1?model={"username":123,"password":234,"realname":"zhang","workInfo":{"city":"abc","job":"abc","year":"abc"}, "schoolInfo":{"schoolType":"1","schoolName":"1","specialty":"1"}}
//没有realname1
//fail http://localhost:9080/springmvc-chapter6/jsonparam/model1?model={"username":123,"password":234,"realname1":123}
@RequestMapping("/model1")
public String model1(@RequestJsonParam(value = "model", required=true) UserModel user) {
System.out.println(user);
return "redirect:/success";
http://localhost:9080/springmvc-chapter6/jsonparam/model2?model={"state":"normal"}
//List&基本类型&
http://localhost:9080/springmvc-chapter6/jsonparam/model2?model={"hobbyList":["film", "music"]}
//Map&基本类型,基本类型&
http://localhost:9080/springmvc-chapter6/jsonparam/model2?model={"map":{"key":"value", "a":"b"}}
@RequestMapping("/model2")
public String model2(@RequestJsonParam(value = "model", required=true) DataBinderTestModel model) {
System.out.println(model);
return "redirect:/success";
//List&UserModel&
http://localhost:9080/springmvc-chapter6/jsonparam/model3?model={"userList":[{"username":"1"},{"username":"2"}]}
//Map&String,UserModel&
http://localhost:9080/springmvc-chapter6/jsonparam/model3?model={"userMap":{"1":{"username":"1"},"2":{"username":"2"}}}
//暂不支持 类似于 Map&UserModel, UserModel& 形式
@RequestMapping("/model3")
public String model3(@RequestJsonParam(value = "model") DataBinderTestModel model) {
System.out.println(model);
return "redirect:/success";
支持的spring版本:
springmvc 3.0 和 3.1.x。
支持绑定的数据:
模型、集合、数组、MapWapper(Map的一个包装器,通过getInnerMap获取真实Map)
暂时不支持JSR-303数据校验.
1、和一样的缺点。
spring自定义的参数解析器会放在默认解析器之后,不能指定order,因此如果我们@FormModel("map") Map map,此map会变成Model(请参考 第六部分、Model Map ModelMap),希望未来的版本支持自定义顺序来解决这个问题;此处我们使用MapWapper解决,可以通过MapWapper.getInnerMap()拿到我们需要的Map。
2、支持的jackson版本是1.4.2,版本比较老,spring3.2里程碑版已升级到2.x。
3、暂时没有提供JSR303数据校验。
欢迎大家反馈问题,我会及时修正。
下载次数: 2409
浏览 94078
谢谢您的分享,很大程度上帮助了我,非常感谢,疑惑的是为什么spring没考虑这类Jackson绑定的问题,是不是这个版本如此而已,现在spring mvc 4对此类Jackson的绑定有提供解决方案吗?对啊,spring4.0这个对这个有更好的绑定吗
我按照以上说的写的,然后在请求controller的时候报错。500 解析失败。请帮忙。用的版本是3.2.1 ,请绑我看看。错误信息:Caused by: java.lang.NoSuchMethodException: [Ldkd.paltform.authority.domain.RoleA.&init&() at java.lang.Class.getConstructor0(Unknown Source) at java.lang.Class.getDeclaredConstructor(Unknown Source) at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:105) ... 71 more------------------------------------------------------------有默认的构造器。
文中提到支持spring 3.0,那么支持3.0.5.RELEASE吗?我使用OSGI,所以不能升级到spring的新版本,只能用3.0.5.RELEASE,按文中所配置,发现很多spring的class都没有。那不是说明缺jar包嘛,报的是哪个类?
jqzyjack 写道jinnianshilongnian 写道caizi12 写道需要给UserModel设置什么注解吗你仔细看看这篇文章就知道了,都写的很明确了我也出现你的问题,找到原因了得把&!-- 默认的注解映射的支持 --& &!-- &mvc:annotation-driven /& --&和&!-- &mvc:default-servlet-handler /& --&注释掉,不然会调用默认的Servlet处理器,就是涛大说的那个问题!希望能解决你的问题我看了,我的之前就没这两个配置,也会报这个错,你能把你配置发给我吗。1.
&!--Spring3.1开始的注解 HandlerMapping:将请求的URL和Bean名字映射 --&
&bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /&
&!--Spring3.1开始的注解 HandlerAdapter --&
&bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"&
&property name="synchronizeOnSession" value="true"/&
&property name="customArgumentResolvers"&
&bean class="com.student.convertor.RequestJsonParamMethodArgumentResolver"/&
&bean class="com.student.convertor.FormModelMethodArgumentResolver"/&
&/property&
&bean class="com.student.controller.JsonParamController"/&
&bean class="com.student.controller.FormModelController"/&
我的SpringMVC.xml就加了这两个!
jinnianshilongnian 写道caizi12 写道需要给UserModel设置什么注解吗你仔细看看这篇文章就知道了,都写的很明确了我也出现你的问题,找到原因了得把&!-- 默认的注解映射的支持 --& &!-- &mvc:annotation-driven /& --&和&!-- &mvc:default-servlet-handler /& --&注释掉,不然会调用默认的Servlet处理器,就是涛大说的那个问题!希望能解决你的问题我看了,我的之前就没这两个配置,也会报这个错,你能把你配置发给我吗。
caizi12 写道需要给UserModel设置什么注解吗你仔细看看这篇文章就知道了,都写的很明确了我也出现你的问题,找到原因了得把&!-- 默认的注解映射的支持 --& &!-- &mvc:annotation-driven /& --&和&!-- &mvc:default-servlet-handler /& --&注释掉,不然会调用默认的Servlet处理器,就是涛大说的那个问题!希望能解决你的问题
需要给UserModel设置什么注解吗你仔细看看这篇文章就知道了,都写的很明确了
caizi12 写道用了之后怎么有这个错呢,不都是接口吗?我是spring3.1的。
21:52:57,434 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Could not complete request
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.List]: Specified class is an interface
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:101)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:131)
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:102)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:74)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:155)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
instantiateClass(BeanUtils.java:101) at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:131) at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81) at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:102) at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:74) at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:155) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) at org.springframework.web.servlet.mvc.met从错误看 它走了@ModelAttribute& 你是不是使用错了注解啊刚开始把这几个类放进去,然后按上面的配置配置好,一访问就这样,后来用你的测试用例也是提示这样的异常。
用了之后怎么有这个错呢,不都是接口吗?我是spring3.1的。
21:52:57,434 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Could not complete request
org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.List]: Specified class is an interface
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:101)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:131)
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:102)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:74)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:155)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)
instantiateClass(BeanUtils.java:101) at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:131) at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81) at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:102) at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:74) at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:155) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:117) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) at org.springframework.web.servlet.mvc.met从错误看 它走了@ModelAttribute& 你是不是使用错了注解啊
jinnianshilongnian 写道wzm1195 写道wzm1195 写道博主,请教一下,怎么实现jsp上的json对象和处理类的List绑定?我感觉和博主的这篇文章内容很相似,但是却实现不了!没太明白你的意思,能否给个简单的示例如tuser有4个属性,我在jsp上面用easyui添加了4条tuser记录,提交后怎么配置才能使处理器对应方法的参数List&tuser&的内容为提交的内容?我用DataBinderTestModel总是得到为null。1、你试试直接使用 数组/List&Model&即可啊不需要使用我这个注解& 场景不一样我这个注解是当http://localhost:9080/springmvc-chapter6/jsonparam/model3?model={"userList":[{"username":"1"},{"username":"2"}]}& 传输的数据是json字符串时才有用
& 上一页 1
jinnianshilongnian
浏览量:1693837
浏览量:2079327
浏览量:4191524
浏览量:174048
浏览量:1176831
浏览量:185194
浏览量:3490963
浏览量:432385
浏览量:450736
翻了一下评论,发现早在14年就有哥们儿提示这个疑问,结果到现在 ...
这看懂这句。规则:“资源标识符:操作:对象实例ID”,subj ...
xul0038 写道amberlike 写道您好,我有个问题想 ...
萌小短 写道waj_615 写道请问shiro加入authc权 ...

我要回帖

更多关于 c 封装自定义控件 的文章

 

随机推荐