springmvc 多个pojo提交参数是先跟pojo匹配还是先跟控制器匹配

第①步,确定从implicitModel中取数据的key。假如POJO用@modelAtrtibute(&aaa&)注解修饰,则key 的值就是aaa, 如果没有,则key的值就是POJO类名第一个字母小写。
第②步,从implicitModel中取key 对应的value,如果没有取到,判断控制器类是否用了@sessionAttribute注解修饰,且注解的value值中包含了key ,满足条件的话,就会去HttpSession中取key对应的value,没有取到会抛出异常。如果不满足条件,则会new 一个POJO对象,并且将表单的传递的请求参数赋值给POJO。
第③步,将POJO对象放入请求域中,key即为第①步确定的key。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场在springmvc框架中,前台传入到后台的form会经过springmvc自动封装到pojo类中,后台接受的时候可以在参数内直接接受这个java类。传参
通常情况下,前台的表单的类型诸如int,string等,都会根据pojo中字段的类型自动转换。所以为我们省去了不少麻烦,但很可惜其中不包括日期类型。原因
因为日期的格式多种多样,spring自身不适合对其进行封装。好在spring给出了便捷的方法给我们自己转换数据类型。具体实现在controller层中,加入以下代码段[code]@InitBinder
public void initBinder(WebDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));//true:允许输入空值,false:不能为空值
}可以解决这个问题。但是这个时候Date类型的参数是null的话,还是会报错。采用另外一种方式则更好,为null也不会报错,就是把请求参数封装为一个vo类,在对应的类属性上加上注解,这样[code]@DateTimeFormat(iso = ISO.DATE_TIME, pattern = "w:yyyy")
private Date startT
@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date lastLoginD另外如果使用验证框架,方法参数这样写(@Valid XxxParam param, BindingResult binding) ,就能直接通过BindingResult得到验证结果了。
如果您想留下此文,您可以将其发送至您的邮箱(将同时以邮件内容&PDF形式发送)
相关文章推荐
(Ctrl+Enter提交) &&
已有0人在此发表见解
&在& 16:58收藏到了
&&在信息爆炸的时代,您的知识需要整理,沉淀,积累!Lai18为您提供一个简单实用的文章整理收藏工具,在这里您可以收藏对您有用的技术文章,自由分门别类,在整理的过程中,用心梳理自己的知识!相信,用不了多久,您收藏整理的文章将是您一生的知识宝库!
· 蜀ICP备号-17、数据回显和异常处理(springmvc笔记) - 简书
7、数据回显和异常处理(springmvc笔记)
一、数据回显(工程springmvc-mybatis06)
1.1 pojo数据回显原理
其实在之前我们试验的过程发现数据是可以回显的,这里说明一下其原理。之前我们在页面中取数据的时候是直接使用的pojo数据。比如在页面editItems.jsp中我们${itemsCustom.name}这样取得数据,而且我们发现是可以回显的,这里我们将此页面进行改动:
&!-- 显示错误信息 --&
&c:if test="${allErrors != null}"&
&c:forEach items="${allErrors}" var="error"&
${error.defaultMessage }
&/c:forEach&
&form id="itemForm" action="${pageContext.request.contextPath }/items/editItemsSubmit.action" method="post"&
&input type="hidden" name="id" value="${items.id }" /& 修改商品信息:
&table width="100%" border=1&
&td&商品名称&/td&
&td&&input type="text" name="name" value="${items.name }" /&&/td&
&td&商品价格&/td&
&td&&input type="text" name="price" value="${items.price }" /&&/td&
&td&商品生产日期&/td&
&td&&input type="text" name="createtime" value="&fmt:formatDate value="${items.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/&"/&&/td&
&td&商品简介&/td&
&td&&textarea rows="3" cols="30" name="detail"&${items.detail }&/textarea&&/td&
&td colspan="2" align="center"&&input type="submit" value="提交" /&&/td&
说明:可以看到这里我们使用${items.name}取数据,测试一下发现是取不到数据的,因为显然我们的request域中没有以items为key的内容。于是我们在Controller方法中进行修改:
@RequestMapping(value="/editItems", method={RequestMethod.POST, RequestMethod.GET})
public String editItems(Model model, @RequestParam(value="id", required=true, defaultValue="") Integer items_id) throws Exception{
//调用service根据id查询商品信息
ItemsCustom itemsCustom = itemsService.findItemsById(items_id);
//通过形参中的model将model数据传递到页面
//相当于modelAndView.addObject("itemsCustom", itemsCustom);
model.addAttribute("items", itemsCustom);
return "items/editItems";
可以看到我们直接使用model.addAttribute("items", itemsCustom);将相关pojo数据以key为items存放到了request域中,此时我们在商品展示页面itemsList.jsp中点击修改的时候就会发现是有数据回显的。但是如果我们将相关数据填写完毕提交出现错误的时候发现却不能再回显了。这里我们需要说明pojo数据回显的原理。
pojo数据回显的原理:pojo数据传入Controller方法之后,springmvc自动将pojo数据放到request域,key等于pojo类名(首字母小写)。也就是说页面中的pojo数据会自动帮我们存入到request的域中,但是关键字确实pojo的类名(首字母小写)。这样我们就可以知道为什么最初是可以直接回显的,而之后却不能回显了,因为我们点击提交之后数据是封装到key为itemsCustom的request域中,而我们使用items为key进行取值当然是取不到的。
1.2 注解标识数据回显
在上一个例子中我们如果就想使用items为关键字进行取值,那就可以使用注解进行标识(ItemsController.java):
@RequestMapping("/editItemsSubmit")
public String editItemsSubmit(
Model model,
HttpServletRequest request,
Integer id,
@ModelAttribute("items") @Validated(value = { ValidationGroup1.class }) ItemsCustom itemsCustom,
BindingResult bindingResult) throws Exception {
model.addAttribute("allErrors", allErrors);//将错误信息传递到页面
return "items/editItems";//出错后回到修改页面
itemsService.updateItems(id, itemsCustom);
return "forward:queryItems.action";
说明:这里我们使用@ModelAttribute("items")标识我们在将相关pojo数据存入到request域中时使用的key为items,那么我们在页面中就可以取到了。
1.3 @ModelAttribute将方法的返回值传到页面
需求在商品查询列表页面,通过商品类型查询商品信息。在Controller中定义商品类型查询的方法,最终将商品类型传递到页面。
定义一个Controller方法
@ModelAttribute("itemtypes")
public Map&String, String& getItemTypes(){
Map&String, String& itemTypes = new HashMap&String,String&();
itemTypes.put("101", "数码");
itemTypes.put("102", "母婴");
return itemT
说明:这里我们只是用相关静态数据进行模拟,在实际开发中当然需要从数据库中查询。页面itemsList.jsp上可以得到itemTypes的数据:
商品类型:
&select name="itemtype"&
&c:forEach items="${itemtypes }" var="itemtype"&
&option value="${itemtype.key }"&${itemtype.value }&/option&
&/c:forEach&
1.3 数据回显最简单的方式
数据回显最简单的方式当然还是使用model,直接使用
model.addAttribute("items", itemsCustom);
这样我们直接将相关需要回显的数据设置到model中,在页面中自然可以取得了。最后注意:对于基本数据类型如果想要回显到页面只能使用此中方式,不能使用注解方式。
二、异常处理
系统中异常包括两类:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:
springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一的异常处理。
2.1 自定义异常类
对不同的异常类型定义异常类,继承Exception。CustomException.java
package cn.itcast.ssm.
//自定义异常处理器类
//针对预期的异常需要在程序中抛出此类异常
public class CustomException extends Exception{
//异常信息
public CustomException(String message){
super(message);
this.message =
public String getMessage() {
public void setMessage(String message) {
this.message =
2.2 全局异常处理器
思路:系统遇到异常,在程序中手动抛出,dao、service、Controller都将异常抛出,最后抛给前端控制器,前端控制器抛给全局异常处理器。解析出异常类型,如果该异常类型是系统自定义的异常,直接取出异常信息,在错误页面展示。否则,构造一个系统自定义的异常类(信息为未知错误)。CustomExceptionResolver.java
package cn.itcast.ssm.
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import org.springframework.web.servlet.HandlerExceptionR
import org.springframework.web.servlet.ModelAndV
public class CustomExceptionResolver implements HandlerExceptionResolver {
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
//这里的handler就是处理器适配器要执行的handler对象,此对象中只有一个方法
ex.printStackTrace();
CustomException customException =
//如果抛出的是系统自定义异常则直接转换
if(ex instanceof CustomException){
customException = (CustomException)
//如果抛出的不是系统自定义异常则重新构造一个未知错误异常。
customException = new CustomException("未知错误,请与系统管理 员联系!");
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("message", customException.getMessage());
modelAndView.setViewName("error");
return modelAndV
说明:我们定义一个全局异常处理器用于处理异常,从程序中我们可以看到,如果这个异常是编译时异常,我们使用自定义异常处理器将其捕获,使用自定义异常处理器类进行处理,但是如果是运行时异常,那么我们只能构造一个异常,给出相关信息。然后返回到error.jsp页面。最后我们还需要在springmvc配置文件中配置这个全局异常处理器:
&!-- 全局异常处理器,只要实现了HandlerExceptionResolver接口就是全局异常处理器 --&
&bean id="handlerExceptionResolver" class="cn.itcast.ssm.exception.CustomExceptionResolver"/&
在Controller方法ItemsController.java中:
@RequestMapping(value="/editItems", method={RequestMethod.POST, RequestMethod.GET})
public String editItems(Model model, @RequestParam(value="id", required=true, defaultValue="") Integer items_id) throws Exception{
//调用service根据id查询商品信息
ItemsCustom itemsCustom = itemsService.findItemsById(items_id);
//判断商品为空,抛出异常
if(itemsCustom == null){
throw new CustomException("需要修改的商品信息不存在");
//通过形参中的model将model数据传递到页面
//相当于modelAndView.addObject("itemsCustom", itemsCustom);
model.addAttribute("items", itemsCustom);
return "items/editItems";
可以看到我们在此方法中进行判断,如果查出来的商品信息为空,那么抛出相应的异常,在测试的时候我们使用地址http://localhost:8080/springmvc-mybatis06/items/editItems.action?id=144,访问,可以看到我们给出了一个根本不存在的id进行查询,显然是会报异常的。当然这里我们还需要改动一下业务方法,不然会报未知错误:ItemsServiceImpl.java
public ItemsCustom findItemsById(Integer id) throws Exception {
Items items = itemsMapper.selectByPrimaryKey(id);
//查询出来的数据可能需要进行一些业务处理,最后要返回ItemsCustom
ItemsCustom itemsCustom =
//将Items内容拷贝到ItemsCustom
if(items != null){
itemsCustom = new ItemsCustom();
BeanUtils.copyProperties(items, itemsCustom);
return itemsC
在这个方法中我们加入了对商品items的非空判断,以免出现空指针异常。这样测试才能达到效果。
2.4 异常抛出位置
前面已经说过,我们需要将各层的异常都抛出给前端控制器,然后前端控制器抛给全局异常处理器进行处理,但是异常到底在哪一层抛出呢?如果与业务功能相关的异常建议在service中抛出异常。与业务功能没有关系的异常建议在Controller方法中抛出。而对于上面的例子中的异常建议在service中抛出异常。
一名程序猿SpringMVC介绍_Java教程_动态网站制作指南
SpringMVC介绍
来源:人气:698
一、Sing Web MVC简介 &&&& Spring Web MVC是一种基于的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。 二、Spring Web MVC优势 1、清晰的角色划分:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器(&& Validator)、命令对象(Command& 请求参数绑定到的对象就叫命令对象)、表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)。 2、分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要; 3、由于命令对象就是一个POJO,无需继承框架特定API,可以使用命令对象直接作为业务对象; 4、和Spring 其他框架无缝集成,是其它Web框架所不具备的; 5、可适配,通过HandlerAdapter可以支持任意的类作为处理器; 6、可定制性,HandlerMapping、ViewResolver等能够非常简单的定制; 7、功能强大的数据验证、格式化、绑定机制; 8、利用Spring提供的Mock对象能够非常简单的进行Web层单元测试; 9、本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换。 10、强大的标签库,使JSP编写更容易。 三、Spring Web MVC处理请求的流程
1用户发送请求给前端控制器(DispatcherServlet) 2前端控制器讲请求委托给页面控制器/处理器 3处理器调用业务对象处理请求,业务对象处理完成请求后返回模型数据给处理器 4处理器将得到的ModelAndView(模型数据和试图逻辑名)返回给前端控制器 5前端控制器将模型数据传给视图并渲染视图 6前端控制器收回控制权,并将视图响应给用户 四、Hello World入门 1、前端控制器的配置 在web.中添加如下配置:
Java代码 &
&servlet&&&&&
&&&&&servlet-name&chapter2&/servlet-name&&&&&
&&&&&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&&&&&
&&&&&load-on-startup&1&/load-on-startup&&&&&
&/servlet&&&&&
&servlet-mapping&&&&&
&&&&&servlet-name&chapter2&/servlet-name&&&&&
&&&&&url-pattern&/&/url-pattern&&&&&
&/servlet-mapping&&&&&
&servlet-name&chapter2&/servlet-name&
&servlet-class&org.springframework.web.servlet.DispatcherServlet&/servlet-class&
&load-on-startup&1&/load-on-startup&
&/servlet&
&servlet-mapping&
&servlet-name&chapter2&/servlet-name&
&url-pattern&/&/url-pattern&
&/servlet-mapping&
load-on-startup:表示启动容器时初始化该Servlet; url-pattern:表示哪些请求交给Spring Web MVC处理, &/& 是用来定义默认servlet映射的。也可以如&*.html&表示拦截所有以html为扩展名的请求。 自此请求已交给Spring Web MVC框架处理,因此我们需要配置Spring的配置文件,默认DispatcherServlet会加载WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml配置文件。本示例为WEB-INF/ chapter2-servlet.xml。 2、Spring配置文件中配置HandlerMapping、HandlerAdapter
具体配置在WEB-INF/ chapter2-servlet.xml文件中
Java代码 &
&!--&HandlerMapping&--&&&&&
&bean&class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/&&&&&
&!--&HandlerAdapter&--&&&&&
&bean&class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/&&&&
&!-- HandlerMapping --&
&bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/&
&!-- HandlerAdapter --&
&bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/&
BeanNameUrlHandlerMapping:表示将请求的URL和Bean名字映射,如URL为 &上下文/hello&,则Spring配置文件必须有一个名字为&/hello&的Bean,上下文默认忽略。 SimpleControllerHandlerAdapter:表示所有实现了org.springframework.web.servlet.mvc.Controller接口的Bean可以作为Spring Web MVC中的处理器。如果需要其他类型的处理器可以通过实现HadlerAdapter来解决。 3、在Spring配置文件中配置ViewResolver 具体配置在WEB-INF/ chapter2-servlet.xml文件中:
Java代码 &
&!--&ViewResolver&--&&&&&
&bean&class="org.springframework.web.servlet.view.InternalResourceViewResolver"&&&&&
&&&&&property&name="viewClass"&value="org.springframework.web.servlet.view.JstlView"/&&&&&
&&&&&property&name="prefix"&value="/WEB-INF/jsp/"/&&&&&
&&&&&property&name="suffix"&value=".jsp"/&&&&&
&/bean&&&&&
&!-- ViewResolver --&
&bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"&
&property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/&
&property name="prefix" value="/WEB-INF/jsp/"/&
&property name="suffix" value=".jsp"/&
InternalResourceViewResolver:用于支持Servlet、JSP视图解析; &&& viewClass:JstlView表示JSP页面需要使用JSTL标签库,classpath中必须包含jstl的相关jar包; &&& prefix和suffix:查找视图页面的前缀和后缀(前缀[逻辑视图名]后缀),比如传进来的逻辑视图名为hello,则该该jsp视图页面应该存放在&WEB-INF/jsp/hello.jsp&; 4、开发处理器/页面控制器
Java代码 &
package&cn.javass.chapter2.web.&&&&
import&javax.servlet.http.HttpServletR&&&&
import&javax.servlet.http.HttpServletR&&&&
import&org.springframework.web.servlet.ModelAndV&&&&
import&org.springframework.web.servlet.mvc.C&&&&
public&class&HelloWorldController&implements&Controller&{&&&&
&&&&@Override&&&&
&&&&public&ModelAndView&handleRequest(HttpServletRequest&req,&HttpServletResponse&resp)&throws&Exception&{&&&&
&&&&&&&ModelAndView&mv&=&new&ModelAndView();&&&&
&&&&&&&mv.addObject("message",&"Hello&World!");&&&&
&&&&&&&mv.setViewName("hello");&&&&
&&&&&&&return&&&&&
package cn.javass.chapter2.web.
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import org.springframework.web.servlet.ModelAndV
import org.springframework.web.servlet.mvc.C
public class HelloWorldController implements Controller {
public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
//1、收集参数、验证参数
//2、绑定参数到命令对象
//3、将命令对象传入业务对象进行业务处理
//4、选择下一个页面
ModelAndView mv = new ModelAndView();
//添加模型数据 可以是任意的POJO对象
mv.addObject("message", "Hello World!");
//设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面
mv.setViewName("hello");
org.springframework.web.servlet.mvc.Controller:页面控制器/处理器必须实现Controller接口,注意别选错了;后边我们会学习其他的处理器实现方式; public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) :功能处理方法,实现相应的功能处理,比如收集参数、验证参数、绑定参数到命令对象、将命令对象传入业务对象进行业务处理、最后返回ModelAndView对象; ModelAndView:包含了视图要实现的模型数据和逻辑视图名;&mv.addObject("message", "Hello World!"); &表示添加模型数据,此处可以是任意POJO对象;&mv.setViewName("hello");&表示设置逻辑视图名为&hello&,视图解析器会将其解析为具体的视图,如前边的视图解析器InternalResourceVi。wResolver会将其解析为&WEB-INF/jsp/hello.jsp&。 我们需要将其添加到Spring配置文件(WEB-INF/chapter2-servlet.xml),让其接受Spring IoC容器管理:
Java代码 &
&!--&处理器&--&&&&&
&bean&name="/hello"&class="cn.javass.chapter2.web.controller.HelloWorldController"/&&&&&
&!-- 处理器 --&
&bean name="/hello" class="cn.javass.chapter2.web.controller.HelloWorldController"/&
name="/hello":前边配置的BeanNameUrlHandlerMapping,表示如过请求的URL为 &上下文/hello&,则将会交给该Bean进行处理。 5、开发视图页面
创建 /WEB-INF/jsp/hello.jsp视图页面:
Java代码 &
&%@&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"&&&&&
&html&&&&&
&head&&&&&
&meta&http-equiv="Content-Type"&content="text/&charset=UTF-8"&&&&&
&title&Hello&World&/title&&&&&
&/head&&&&&
&body&&&&&
${message}&&&&
&/body&&&&&
&/html&&&&&
&%@ 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"&
&meta http-equiv="Content-Type" content="text/ charset=UTF-8"&
&title&Hello World&/title&
${message}
${message}:表示显示由HelloWorldController处理器传过来的模型数据。 通过请求:http://localhost:9080/springmvc-chapter2/hello,如果页面输出&Hello World! &就表明我们成功了! 五、Spring MVC核心开发步骤:
1、& DispatcherServlet在web.xml中的部署描述,从而拦截请求到Spring Web MVC
2、& HandlerMapping的配置,从而将请求映射到处理器
3、& HandlerAdapter的配置,从而支持多种类型的处理器
4、& ViewResolver的配置,从而将逻辑视图名解析为具体视图技术
5、处理器(页面控制器)的配置,从而进行功能处理
优质网站模板

我要回帖

更多关于 spring boot pojo 的文章

 

随机推荐