这是上传控制器的代码。用到了 formBackingObject,具体是做什么用的?求高手解释protected Object formBackingObject(HttpServletRequest request)
throws Exception {
String fileName = ServletRequestUtils.getStringParameter(request,
"fileName");
String tags = ServletRequestUtils.getStringParameter(request, "tags");
MultimediaFile uploadFile = new MultimediaFile();
uploadFile.setFileName(fileName);
uploadFile.setTags(tags);
return uploadFile;}protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {String fileName = ServletRequestUtils.getStringParameter(request,
"filename", null);
String author = ServletRequestUtils.getStringParameter(request,
"author", "佚名");
int userId = ServletRequestUtils.getIntParameter(request, "userid", -1);
int sortId = ServletRequestUtils.getIntParameter(request, "sortid", -1);
String tags = ServletRequestUtils.getStringParameter(request, "tags",
"");
Sort sort = service.readSortById(sortId);MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
CommonsMultipartFile orginalFile = (CommonsMultipartFile) multipartRequest
.getFile("uploadfile");// 表单中对应的文件名;
if (orginalFile != null && !orginalFile.isEmpty()) {// 如果有文章中带有附件
InputStream is = null;// 附件输入流
try {
is = orginalFile.getInputStream();
byte[] b = new byte[is.available()];
is.read(b);
String suffix = orginalFile.getOriginalFilename().substring(
orginalFile.getOriginalFilename().lastIndexOf(".") + 1)
.toLowerCase();fileName = (fileName == null || fileName.trim().length() < 1) ? orginalFile
.getOriginalFilename()
: fileName;
author = (author == null || author.trim().length() < 1) ? "佚名"
: author;
MultimediaFile uploadFile = new MultimediaFile();
uploadFile.setFileName(fileName);
uploadFile.setSortId(sort.getSortId());
uploadFile.setUserId(userId);
uploadFile.setAuthor(author);
uploadFile.setSortName(sort.getSortName());
uploadFile.setTags(tags);
uploadFile.setFilePath(resPath + "/" + sortId + "/");
uploadFile.setSize(b.length);
uploadFile.setSuffix(suffix);
if (service.addFile(uploadFile)) {
uploadFile = service.readFileByName(fileName);FileUtils.writeFile(b, resPath + "/" + sortId + "/",
uploadFile.getId() + "." + suffix);User user = service.readUserById(userId);
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":"
+ request.getServerPort() + path + "/";
if (user.getLevel() == 2) {
response.sendRedirect(basePath
+ "filelist.do?searchtype=3&userid="
+ user.getUserId());
} else {
response.sendRedirect(basePath + "readfiles.do");
}return null;} else {
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":"
+ request.getServerPort() + path + "/";
response.sendRedirect(basePath + "addfile.do?false=1");
return null;
}} catch (IOException exception) {
//exception.printStackTrace();
} finally {
if (is != null) {
//is.close();
}}}return null;}public MainService getService() {
return service;
}public void setService(MainService service) {
this.service = service;
}public String getResPath() {
return resPath;
}public void setResPath(String resPath) {
this.resPath = resPath;
}}

解决方案 »

  1.   

    1.当表单控制器接收到GET请求时,它调用formBackingObject()方法,创建表单对象。该方法可以被子类覆盖,对于编辑操作的表单来说,你可以通过该方法从数据库中加载表单对象,当表单页面显示时,表单显示出待编辑的数据了;2. 表单对象和页面表单数据之间需要通过属性编辑器实现双向转化,对于非基本数据类型或String类型的属性来说,你可能需要注册一些自定义编辑器。你可以 通过覆盖initBinder()方法,通过调用binder.registerCustomEditor()的方法注册编辑器; 3. 表单对象通过bindOnNewForm属性(可以通过配置设置,默认为false)判断是否需要将GET请求参数绑定到 formBackingObject()方法创建的表单对象中。如果bindOnNewForm为true,执行绑定操作,在绑定完成后,还将调用 onBindOnNewForm()回调方法(子类可以提供具体实现)。否则到下一步。不过一般情况下,GET请求参数是用于加载等编辑表单对象的ID 值,如topicId、forumId等,一般无需进行绑定; 4.调用referenceData()方法(子类可提供具体实现)准 备一些关联的数据,如性别下拉框数据,学历下拉框数据等。一般采用ModelMap创建视图业务中需要用到的请求属性数据,键为属性名,值为属性值,如 ModelMap("param1", "paramValue1");5.使用控制器formView定义的视图渲染表单对象; 6.用户填写或更改表单后,提交表单,向表单控制器发起一个POST请求; 7.接收到POST请求时,表单控制器知道这是一个表单数据提交的操作,所以启动表单提交处理流程; 8. 首先通过sessionForm属性判断表单控制器是否启用了Session。如果启用了Session,直接从Session中取出原表单对象,否则再 次调用formBackingObject()方法构造出一个表单对象。sessionForm默认为false,可以通过配置进行调整,启用 Session可能提高运行性能,但会占用一定的内存; 9.将POST请求参数填充到表单对象中; 10.调用onBind()方法,该方法允许你在表单填充完成后,合法性校验之前执行一些特定的操作; 11.如果validateOnBinding属性设置为true,注册在控制器中的校验器开始工作,对表单对象的属性值执行合法性校验。如果有合法性错误,将被注册到Errors对象中(关于如何注册校验器,我们将稍后介绍);12.调用onBindAndValidate()方法,该方法允许你在数据绑定及合法性校验后,执行一些额外的自定义操作,你也可以在这里,执行一些额外的合法性校验; 13.调用processFormSubmission()方法处理提交任务,该方法内部又包含后续几步工作;14.判断方法入参传入errors是否包含错误,如果包含错误返回到formView对应的表单页面中,否则到下一步; 15.通过isFormChangeRequest()方法(默认为false)判断请求是否为表单更改请求,如果为true,调用onFormChange()方法,然后返回到formView对应的表单页面,否则到下一步; 16.如果子类覆盖了onSubmit()方法,执行之,否则执行子类的doSubmitAction()方法。通过这两者之一完成业务的处理,然后返回successView属性指定的成功页面。
      

  2.   

    Spring MVC 表单控制  SimpleFormController 良葛格的SimpleFormController教學
    http://www.javaworld.com.tw/confluence/pages/viewpage.action?pageId=2356
      

  3.   

    好心人给解释下,在这个代码中formBackingObject到底在做什么
      

  4.   

    看着有点儿乱,下次请这样,美观一些,呵呵protected Object formBackingObject(HttpServletRequest request)
    throws Exception {
    String fileName = ServletRequestUtils.getStringParameter(request,
    "fileName");
    String tags = ServletRequestUtils.getStringParameter(request, "tags");
    MultimediaFile uploadFile = new MultimediaFile();
    uploadFile.setFileName(fileName);
    uploadFile.setTags(tags);
    return uploadFile;}protected ModelAndView onSubmit(HttpServletRequest request,
    HttpServletResponse response, Object command, BindException errors)
    throws Exception {String fileName = ServletRequestUtils.getStringParameter(request,
    "filename", null);
    String author = ServletRequestUtils.getStringParameter(request,
    "author", "佚名");
    int userId = ServletRequestUtils.getIntParameter(request, "userid", -1);
    int sortId = ServletRequestUtils.getIntParameter(request, "sortid", -1);
    String tags = ServletRequestUtils.getStringParameter(request, "tags",
    "");
    Sort sort = service.readSortById(sortId);MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
    CommonsMultipartFile orginalFile = (CommonsMultipartFile) multipartRequest
    .getFile("uploadfile");// 表单中对应的文件名;
    if (orginalFile != null && !orginalFile.isEmpty()) {// 如果有文章中带有附件
    InputStream is = null;// 附件输入流
    try {
    is = orginalFile.getInputStream();
    byte[] b = new byte[is.available()];
    is.read(b);
    String suffix = orginalFile.getOriginalFilename().substring(
    orginalFile.getOriginalFilename().lastIndexOf(".") + 1)
    .toLowerCase();fileName = (fileName == null || fileName.trim().length() < 1) ? orginalFile
    .getOriginalFilename()
    : fileName;
    author = (author == null || author.trim().length() < 1) ? "佚名"
    : author;
    MultimediaFile uploadFile = new MultimediaFile();
    uploadFile.setFileName(fileName);
    uploadFile.setSortId(sort.getSortId());
    uploadFile.setUserId(userId);
    uploadFile.setAuthor(author);
    uploadFile.setSortName(sort.getSortName());
    uploadFile.setTags(tags);
    uploadFile.setFilePath(resPath + "/" + sortId + "/");
    uploadFile.setSize(b.length);
    uploadFile.setSuffix(suffix);
    if (service.addFile(uploadFile)) {
    uploadFile = service.readFileByName(fileName);FileUtils.writeFile(b, resPath + "/" + sortId + "/",
    uploadFile.getId() + "." + suffix);User user = service.readUserById(userId);
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
    + request.getServerName() + ":"
    + request.getServerPort() + path + "/";
    if (user.getLevel() == 2) {
    response.sendRedirect(basePath
    + "filelist.do?searchtype=3&userid="
    + user.getUserId());
    } else {
    response.sendRedirect(basePath + "readfiles.do");
    }return null;} else {
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://"
    + request.getServerName() + ":"
    + request.getServerPort() + path + "/";
    response.sendRedirect(basePath + "addfile.do?false=1");
    return null;
    }} catch (IOException exception) {
    //exception.printStackTrace();
    } finally {
    if (is != null) {
    //is.close();
    }}}return null;}public MainService getService() {
    return service;
    }public void setService(MainService service) {
    this.service = service;
    }public String getResPath() {
    return resPath;
    }public void setResPath(String resPath) {
    this.resPath = resPath;
    }}
      

  5.   

    String fileName = ServletRequestUtils.getStringParameter(request,
    "fileName");
    String tags = ServletRequestUtils.getStringParameter(request, "tags");
    ---表单页面里有filename和tags表单项,这里取值MultimediaFile uploadFile = new MultimediaFile();
    uploadFile.setFileName(fileName);
    uploadFile.setTags(tags);
    ---给表单里的上传的文件附件设置filename和tags
      

  6.   

    主要是 formBackingObject起到了什么作用?谢谢了
      

  7.   

    大体看来下,应该是提交到formBackingObject里面,获取上传的文件。//获取需要的数据
    String fileName = ServletRequestUtils.getStringParameter(request,
    "fileName");
    String tags = ServletRequestUtils.getStringParameter(request, "tags");
    //通过这个操作上传的文件
    MultimediaFile uploadFile = new MultimediaFile();//最后返回
    return uploadFile;
    //-----你应该看一下在哪个地方调用了这个方法,我没有在你贴出来的代码中找到调用