SpringMVC学习--参数绑定

  • spring参数绑定过程 

  从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上。springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变更接收。

 

  • 默认支持的类型

  直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。

  1、HttpServletRequest

  通过request对象获取请求信息。

  2、HttpServletResponse

  通过response处理响应信息

  3、HttpSession

  通过session对象得到session中存放的对象

  4、Model/ModelMap

  model是一个接口,modelMap是一个接口实现。用:将model数据填充到request域。

  • 简单类型

  通过@RequestParam对简单类型的参数进行绑定。如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功,如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。通过required属性指定参数是否必须要传入,如果设置为true,没有传入参数,则会报错。

  • POJO绑定

  1、简单的POJO

  将pojo对象中的属性名于传递进来的属性名对应,如果传进来的参数名称和对象中的属性名称一致则将参数值设置在pojo对象中

 

  2、复杂的POJO

   与简单的POJO差不过,只是在页面上将页面属性设置为pojo类型的属性,如:

1 <input type="text" name="items.name" />
  • 自定义参数绑定实现日期类型绑定

  对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。将请求日期数据串传成 日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。

  自定义日期类型绑定:

 1 public class CustomDateConverter implements Converter<String,Date>{
 2 
 3     @Override
 4     public Date convert(String source) {
 5         //将实际的字符串转为date类型
 6         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 7         try {
 8             //转换成功直接返回
 9             return sdf.parse(source);
10         } catch (ParseException e) {
11             // TODO Auto-generated catch block
12             e.printStackTrace();
13         }
14         //转换失败返回null
15         return null;
16     }
17 
18 }

  配置方式:springmvc.xml

 1 <mvc:annotation-driven conversion-service="conversionService"/>
 2 <!-- 自定义参数绑定 -->
 3     <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
 4         <!-- 转换器 -->
 5         <property name="converters">
 6             <list>
 7                 <!-- 日期类型转换 -->
 8                 <bean class="com.luchao.converter.CustomDateConverter"/>
 9             </list>
10         </property>
11     </bean>
  • 集合类型绑定

  1、数组绑定

  如果要批量删除删除,用户在页面选择多个商品,批量删除。

  将页面选择(多选)的商品id,传到controller方法的形参,方法形参使用数组接收页面请求的多个商品id

  如下代码:

 

1 // 批量删除
2     @RequestMapping(value="/deleteItems")
3     public void deleteItems(String[] item_ids) throws Exception {
4         for (String string : item_ids) {
5             System.out.println(string);
6         }
7     }

 

  2、list绑定

  通常在需要批量提交数据时,将提交的数据绑定到list<pojo>中,比如:成绩录入(录入多门课成绩,批量提交)。

  页面属性:

 

<c:forEach items="${itemsList }" var="item" varStatus="status">
<tr>    <td><input name="itemsList[${status.index }].name" value="${item.name }"/></td><td><input name="itemsList[${status.index }].price" value="${item.price }"/></td><td><input name="itemsList[${status.index }].createtime" value="<fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td><td><input name="itemsList[${status.index }].detail" value="${item.detail }"/></td></tr>
</c:forEach>

 

  controller中将包装list集合的POJO作为参数。

  3、Map绑定

  页面属性:

<tr>
<td>学生信息:</td>
<td>
姓名:<inputtype="text"name="itemInfo['name']"/>
年龄:<inputtype="text"name="itemInfo['price']"/>
</td>
</tr>

  controller中将包装Map集合的POJO作为参数。

 

 

  如果出现乱码问题,需要添加一个拦截器,spring已经帮我们实现,配置如下:web.xml

 1 <filter>
 2         <filter-name>CharacterEncodingFilter</filter-name>
 3         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
 4         <init-param>
 5             <param-name>encoding</param-name>
 6             <param-value>utf-8</param-value>
 7         </init-param>
 8     </filter>
 9     <filter-mapping>
10         <filter-name>CharacterEncodingFilter</filter-name>
11         <url-pattern>/*</url-pattern>
12     </filter-mapping>

  另外,也可以将tomcat配置文件添加编码与工程编码一致,如下:

1 <Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

  另外一种方法对参数进行重新编码:

1 String userName = new 
2 String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")

  ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码。最后一种实现比较麻烦。

  现在对SpringMVC已经有了一定的认识,比较其与struts2的一些特点可以加强认识。

  1、springmvc基于方法开发的,struts2基于类开发的。

  springmvcurlcontroller方法映射。映射成功后springmvc生成一个Handler对象,对象中只包括了一个method方法执行结束,形参数据销毁。springmvccontroller开发类似service开发。

  2、springmvc可以进行单例开发,并且建议使用单例开发,struts2通过类的成员变量接收参数,无法使用单例,只能使用多例。

  3、经过实际测试,struts2速度慢,在于使用struts标签,如果使用struts建议使用jstl

 

转载于:https://www.cnblogs.com/lcngu/p/5510362.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

现代物理学7大经典问题,你能理解几个?或许一个都不能理解

来源&#xff1a;搜狐新闻算法与数学之美相对论相对论是物理学中两大著名理论之一&#xff0c;两者都是阿尔伯特爱因斯坦提出的。1905年爱因斯坦出版了狭义相对论&#xff0c;后者确定最终宇宙速度极限&#xff1a;光速。并称时间因某物体移动的速度而实现加速或者减慢。1916年…

unity asset store下载不了_Unity手游实战:从0开始SLG——资源管理系统-基础篇(三)AssetBundle原理...

先用一句话介绍一下AssetBundle吧。AssetBundle系统提供了一种压缩文件的格式&#xff0c;可以把1到多个文件进行索引和序列化。Unity项目在交付安装之后&#xff0c;会通过AssetBundle对不包含代码的资源进行更新。这就允许开发人员先提交一个小的应用程序包&#xff0c;将运行…

matlab中GUIDE的UItable居中方法

需要借助JAVA&#xff0c;代码示意如下&#xff1a; import javax.swing.*; %导入javax.swing类 table findjobj(handles.uitable1); %需要findjobj.m文件&#xff0c;matlab中是没有的 table1 get(table,Viewport); jtable get(table1,View); renderer jtable.getCellRe…

MySQL Workbench运行脚本

首先在SCHEMAS区域右击&#xff0c;选择创建“create schema” 填入自定义名称&#xff0c;点击“apply” 在弹出来的框中点击“apply”&#xff0c;再在弹出来的框中点击finish 点击菜单栏“file”——“run SQL script”&#xff0c;选择sql文件&#xff0c;在下面选择刚刚创…

自动驾驶事故权威揭秘:算法和软件错误太多

本文来源&#xff1a;AutoR智驾自动驾驶发展就好比是登月计划。从传感器到人工智能&#xff0c;经典的电子供应链已经形成了一个协作矩阵&#xff0c;致力于实现自动驾驶车辆的安全性。为此&#xff0c;还需进行大量硬件和软件开发工作&#xff0c;以确保驾驶员、乘客和行人受到…

MySQL新建数据库和表

首先在MySQL Workbench上&#xff08;如果没有的话建议安装一个&#xff09;新建一个数据库 首先在SCHEMAS区域右击&#xff0c;选择创建“create schema” 填入自定义名称&#xff0c;点击“apply”&#xff0c;这里我命名为crashcourse 在弹出来的框中点击“apply”&#xf…

【微读书】《人工智能颠覆未来战争》连载之一:机器战胜人类?——AlphaGo人机对战的启示...

来源&#xff1a;中国指挥与控制学会编者按目前&#xff0c;人工智能技术正加速向军事领域渗透&#xff0c;军事智能化既面临千载难逢的发展机遇&#xff0c;也面临前所未有的挑战。如何加强风险研究和预判&#xff0c;防范重大风险&#xff0c;已经客观而现实地摆在我们面前。…

《崛起的超级智能》入选中国好书2019年7月榜单

来源&#xff1a;中国好书中国好书评选活动由中国图书评论学会主办&#xff0c;旨在通过好书推介传递正能量&#xff0c;推动和引导全民阅读。中国图书评论学会是由中宣部出版局创办、国家新闻出版广电总局主管的国家一级学会。自2014年举办首届年度好书盛典至今&#xff0c;“…

.net函数查询_SQL查询语句总是先执行SELECT?你们都错了!

很多 SQL 查询都是以 SELECT 开始的。不过&#xff0c;最近我跟别人解释什么是窗口函数&#xff0c;我在网上搜索”是否可以对窗口函数返回的结果进行过滤“这个问题&#xff0c;得出的结论是”窗口函数必须在 WHERE 和 GROUP BY 之后&#xff0c;所以不能”。于是我又想到了另…

大数据世界要熟悉的5门语言

大数据世界要熟悉的5门语言课程 Python OpenStack Java Hadoop Scala Spark Shell Linux SQL DB JS 华丽分割线 转载于:https://www.cnblogs.com/TendToBigData/p/10501438.html

知识图谱嵌入(KGE):方法和应用的综述

来源&#xff1a;专知导读本文主要是参考《Knowledge Graph Embedding: A Survey of Approaches and Applications》和刘知远的《知识表示学习的研究与进展》做的总结&#xff0c;主要介绍了最近关于知识图谱嵌入所涉及到的研究方法&#xff0c;主要从融合事实信息、融合附加信…

支持向量机matlab代码程序_支持向量机(SVM)小结

什么是SVM&#xff1f;SVM(全称&#xff1a;Support Vector Machine)支持向量机&#xff0c;这只是它的名称&#xff0c;向量就是和我们以前学过的向量一样(下文有介绍)&#xff0c;它可以有效解决分类问题(我们只讨论分类问题)&#xff0c;何为分类呢&#xff1f;顾名思义&…

俄罗斯拟明年在36万台华为平板安装“极光”操作系统

来源&#xff1a;环球时报据路透社报道&#xff0c;有消息人士表示&#xff0c;俄罗斯政府已经开始与华为公司就36万台平板电脑安装俄罗斯自己研发的操作系统&#xff08;OS&#xff09;"极光"(Aurora&#xff0c;也称奥罗拉)的一项计划展开谈判。路透社表示&#xf…

mysql 命令 kill_MySQL之死锁检测

最近&#xff0c;笔者在查看线上服务日志时&#xff0c;发现spring大量异常&#xff0c;异常中都显示了同样的报错信息&#xff0c;信息如下。Deadlock found when trying to get lock; try restarting transaction调研之后发现是mysql发生了死锁&#xff0c;这也是笔者第一次遇…

干货丨清华大学天机芯团队赵明国:《基于自然动力学的机器人控制——无人驾驶自行车及被动行走》...

来源&#xff1a; 机器人大讲堂8月1日&#xff0c;清华大学依托精密仪器系的类脑计算研究中心施路平教授团队在《自然》&#xff08;Nature&#xff09;杂志上发表了一篇封面文章&#xff0c;发布了一项最新研究成果——类脑计算芯片“天机芯”。同时&#xff0c;搭载天机芯&am…

判断随机抽取代码_问卷调查:定量研究中的抽样问题(2)- 非随机抽样介绍

所谓抽样&#xff0c;就是从我们需要研究的所有目标群体中&#xff0c;按照某种原则&#xff0c;挑选出一定量的样本&#xff0c;用他们的研究结果&#xff0c;代表目标群体整体结果。既然&#xff0c;抽样的目的是通过对一部分被选择的样本来推断总体&#xff0c;就要求我们抽…

欧洲估值最高的5家人工智能创业公司

来源&#xff1a;资本实验室今年初&#xff0c;据伦敦风险投资公司MMC的调查&#xff0c;四成自称为人工智能公司的欧洲创业公司实际上并未在核心业务中涉及到人工智能&#xff0c;人工智能仅为吸引投资的漂亮外衣。这一数据发布后&#xff0c;激起了轩然大波&#xff0c;不仅引…

keras安装_代码详解:构建一个简单的Keras+深度学习REST API

在本教程中&#xff0c;我们将介绍一个简单的方法来获取Keras模型并将其部署为REST API。本文所介绍的示例将作为你构建自己的深度学习API的模板/起点——你可以扩展代码&#xff0c;根据API端点的可伸缩性和稳定性对其进行定制。具体而言&#xff0c;我们将了解&#xff1a; 如…

马云对话马斯克(全文):要警惕AI?该移民火星?如何更长寿?马化腾反对产业割裂和技术脱钩...

来源&#xff1a;未来论坛今天&#xff08;8月29日&#xff09;&#xff0c;2019年世界人工智能大会在上海召开&#xff0c;500余位国内外顶尖高校、行业领军企业、国际组织的重要嘉宾&#xff0c;全球AI知名企业领袖齐聚于此。本次大会以“智联世界&#xff0c;无限可能”为主…

给plt.axvline设置图例(label)

plt.axvline的其中一个参数是label&#xff0c;用于给这条垂直线设置标签。但加上后就是不显示这个这个图例&#xff0c;代码如下&#xff1a; sns.kdeplot(data) plt.axvline(-2, colorr, linestyle--, label0.9) plt.show() 原因会因为没有加这一句&#xff1a; plt.legend…