问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

ajax+spring

发布网友 发布时间:2022-05-15 01:46

我来回答

4个回答

懂视网 时间:2022-05-15 06:07

最近在开发一个可以上传图片到服务器的web表面页面,下面给大家分享需求和实现思路,需要的的朋友参考下吧

由于项目需要,开发一个可以上传图片到服务器的web表单页面。

一、 需求

Web表单页面,可以通过表单上传图片以及其他文字信息。

二、 图片上传的流程

之前没有做过这类页面,通过查询资料。发现比较常见的做法,是先将图片上传到服务器端的某个文件目录下,服务器向前台返回图片的存储路径;之后,前台将图片存储路径以及其他表单信息一起提交到服务器,所有的表单信息存储在数据库中。

三、 方法

由于项目需要,我这里介绍两种图片上传方法,第一种是使用ajax对一个图片直接上传;第二种是先在前台将图片切割为较小的文件,之后使用ajax分别上传图片到服务器,服务器实现对文件的拼接。(方法二适合较大文件的上传)下面我分别对两种方法做介绍。

方法一: 直接上传

1 html页面

<pre name="code" class="html"><!DOCTYPE html> 
<head></head> 
<body> 
<form id="uploadForm" action="/PicSubmit/form" method="post" enctype="multipart/form-data" onsubmit="return submit_check()" class="bootstrap-frm" ></pre><pre name="code" class="html"><input id = "sid" type = "text" name="name" /></pre><pre name="code" class="html"><pre name="code" class="html"><input id = "fileImage" type = "file" name="filename" /></pre><pre name="code" class="html"><input id = "addressid" type = "hidden" name="address" /></pre><pre name="code" class="html"><input id="ajaxsub" type="button" class="button" value="上传图片" onclick="fileUpload()<span style="font-family: Arial, Helvetica, sans-serif;">" /> </span></pre><pre name="code" class="html"><input type="submit" class="button" value="提交表单" /> 
<input type="reset" class="button" value="重置表单" /> 
</pre></body></html><p></p> 
<pre></pre> 
<br> 
<pre></pre> 
这一部分需要注意的是,form表单的enctype属性必须设置为“multipart/form-data”,在Html5中,如果需要多张图片一起上传,可以在<input type="file"> 标签中,增加multiple属性,例如:<input type="file" id= “fileImage” multiple />。<br> 
<br> 
<br> 
<p></p> 
<p>2 js</p> 
<p>(1)js使用ajax提供的ajaxfileupload.js库。这个库使用起来还是比较方便的,和普通的ajax函数使用方法几乎相同。首先,需要ajaxfileupload.js库文件。这里需要注意,我之前在网上下载了一个ajaxfileupload.js文件不能用,浪费了很长时间,我直接把js库文件粘贴到这里,方便分享。</p> 
<p></p><pre name="code" class="javascript">// JavaScript Document</pre><pre name="code" class="javascript">// ajax file uplaod 
jQuery.extend({ 
 createUploadIframe: function(id, uri) 
 { 
 //create frame 
 var frameId = 'jUploadFrame' + id; 
 if(window.ActiveXObject) { 
 var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />'); 
 if(typeof uri== 'boolean'){ 
 io.src = 'javascript:false'; 
 } 
 else if(typeof uri== 'string'){ 
 io.src = uri; 
 } 
 } 
 else { 
 var io = document.createElement('iframe'); 
 io.id = frameId; 
 io.name = frameId; 
 } 
 io.style.position = 'absolute'; 
 io.style.top = '-1000px'; 
 io.style.left = '-1000px'; 
 document.body.appendChild(io); 
 return io; 
 }, 
 createUploadForm: function(id, fileElementId) 
 { 
 //create form 
 var formId = 'jUploadForm' + id; 
 var fileId = 'jUploadFile' + id; 
 var form = jQuery('<form action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>'); 
 var oldElement = jQuery('#' + fileElementId); 
 var newElement = jQuery(oldElement).clone(); 
 jQuery(oldElement).attr('id', fileId); 
 jQuery(oldElement).before(newElement); 
 jQuery(oldElement).appendTo(form); 
 //set attributes 
 jQuery(form).css('position', 'absolute'); 
 jQuery(form).css('top', '-1200px'); 
 jQuery(form).css('left', '-1200px'); 
 jQuery(form).appendTo('body'); 
 return form; 
 }, 
 ajaxFileUpload: function(s) { 
 // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout 
 s = jQuery.extend({}, jQuery.ajaxSettings, s); 
 var id = s.fileElementId; 
 var form = jQuery.createUploadForm(id, s.fileElementId); 
 var io = jQuery.createUploadIframe(id, s.secureuri); 
 var frameId = 'jUploadFrame' + id; 
 var formId = 'jUploadForm' + id; 
 if( s.global && ! jQuery.active++ ) 
 { 
 // Watch for a new set of requests 
 jQuery.event.trigger( "ajaxStart" ); 
 } 
 var requestDone = false; 
 // Create the request object 
 var xml = {}; 
 if( s.global ) 
 { 
 jQuery.event.trigger("ajaxSend", [xml, s]); 
 } 
 var uploadCallback = function(isTimeout) 
 { 
 // Wait for a response to come back 
 var io = document.getElementById(frameId); 
 try 
 { 
 if(io.contentWindow) 
 { 
  xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null; 
  xml.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document; 
 }else if(io.contentDocument) 
 { 
  xml.responseText = io.contentDocument.document.body?io.contentDocument.document.body.innerHTML:null; 
  xml.responseXML = io.contentDocument.document.XMLDocument?io.contentDocument.document.XMLDocument:io.contentDocument.document; 
 } 
 }catch(e) 
 { 
 jQuery.handleError(s, xml, null, e); 
 } 
 if( xml || isTimeout == "timeout") 
 { 
 requestDone = true; 
 var status; 
 try { 
  status = isTimeout != "timeout" ? "success" : "error"; 
  // Make sure that the request was successful or notmodified 
  if( status != "error" ) 
  { 
  // process the data (runs the xml through httpData regardless of callback) 
  var data = jQuery.uploadHttpData( xml, s.dataType ); 
  if( s.success ) 
  { 
  // ifa local callback was specified, fire it and pass it the data 
  s.success( data, status ); 
  }; 
  if( s.global ) 
  { 
  // Fire the global callback 
  jQuery.event.trigger( "ajaxSuccess", [xml, s] ); 
  }; 
  } else 
  { 
  jQuery.handleError(s, xml, status); 
  } 
 } catch(e) 
 { 
  status = "error"; 
  jQuery.handleError(s, xml, status, e); 
 }; 
 if( s.global ) 
 { 
  // The request was completed 
  jQuery.event.trigger( "ajaxComplete", [xml, s] ); 
 }; 
 // Handle the global AJAX counter 
 if(s.global && ! --jQuery.active) 
 { 
  jQuery.event.trigger("ajaxStop"); 
 }; 
 if(s.complete) 
 { 
  s.complete(xml, status); 
 } ; 
 jQuery(io).unbind(); 
 setTimeout(function() 
 { try 
 { 
  jQuery(io).remove(); 
  jQuery(form).remove(); 
 } catch(e) 
 { 
  jQuery.handleError(s, xml, null, e); 
 } 
 }, 100); 
 xml = null; 
 }; 
 } 
 // Timeout checker 
 if( s.timeout > 0 ) 
 { 
 setTimeout(function(){ 
 if( !requestDone ) 
 { 
  // Check to see ifthe request is still happening 
  uploadCallback( "timeout" ); 
 } 
 }, s.timeout); 
 } 
 try 
 { 
 var form = jQuery('#' + formId); 
 jQuery(form).attr('action', s.url); 
 jQuery(form).attr('method', 'POST'); 
 jQuery(form).attr('target', frameId); 
 if(form.encoding) 
 { 
 form.encoding = 'multipart/form-data'; 
 } 
 else 
 { 
 form.enctype = 'multipart/form-data'; 
 } 
 jQuery(form).submit(); 
 } catch(e) 
 { 
 jQuery.handleError(s, xml, null, e); 
 } 
 if(window.attachEvent){ 
 document.getElementById(frameId).attachEvent('onload', uploadCallback); 
 } 
 else{ 
 document.getElementById(frameId).addEventListener('load', uploadCallback, false); 
 } 
 return {abort: function () {}}; 
 }, 
 uploadHttpData: function( r, type ) { 
 var data = !type; 
 data = type == "xml" || data ? r.responseXML : r.responseText; 
 // ifthe type is "script", eval it in global context 
 if( type == "script" ) 
 { 
 jQuery.globalEval( data ); 
 } 
 // Get the JavaScript object, ifJSON is used. 
 if( type == "json" ) 
 { 
 eval( "data = " + data ); 
 } 
 // evaluate scripts within html 
 if( type == "html" ) 
 { 
 jQuery("<p>").html(data).evalScripts(); 
 } 
 return data; 
 }, 
 handleError: function( s, xhr, status, e ) { 
 // If a local callback was specified, fire it 
 if ( s.error ) { 
 s.error.call( s.context || s, xhr, status, e ); 
 } 
 // Fire the global callback 
 if ( s.global ) { 
 (s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] ); 
 } 
 } 
});</pre><p></p> 
<p><br> 
</p>

(2)之后调用ajaxfileupload.js库,编写图片上传脚本,这里命名为ajaxfileuplaod_implement.js

输出现问题,在web.xml中做如下配置:</p> 
<p></p><pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 
 <context-param> 
 <param-name>contextConfigLocation</param-name> 
 <param-value>classpath:applicationContext.xml</param-value> 
 </context-param> 
 <listener> 
 <listener-class> 
 org.springframework.web.context.ContextLoaderListener 
 </listener-class> 
 </listener> 
 <servlet> 
 <servlet-name>viewspace</servlet-name> 
 <servlet-class> 
 org.springframework.web.servlet.DispatcherServlet 
 </servlet-class> 
 </servlet> 
 <servlet-mapping> 
 <servlet-name>viewspace</servlet-name> 
 <url-pattern>/</url-pattern> 
 </servlet-mapping> 
 <!-- 支持传输中文字符 --> 
 <filter> 
 <filter-name>characterEncodingFilter</filter-name> 
 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
 <init-param> 
 <param-name>encoding</param-name> 
 <param-value>UTF-8</param-value> 
 </init-param> 
 <init-param> 
 <param-name>forceEncoding</param-name> 
 <param-value>true</param-value> 
 </init-param> 
 </filter> 
 <filter-mapping> 
 <filter-name>characterEncodingFilter</filter-name> 
 <url-pattern>/*</url-pattern> 
 </filter-mapping> 
</web-app></pre><p></p> 
<p><br> 
</p>

接下来是重点,在Controller中,使用如下方式接受前台穿回来的文件。<br>

其中需要注意的是,如果前端html的input标签中使用了multiple属性,则表示标签支持上传多个图片,则controller的参数列表中,文件的类型使用MultipartFile[],反之,如果没有使用multiple属性,表示上传的是一张图片,则controller使用MultipartFile类型接收。

输出“存储成功”的提示信息,修改后的名称用于给hiden标签复制,hiden标签的内容会在之后随表单中其他信息一起提交到服务端,通过hiden标签,我们就可以知道与表单关联的图片被存储在什么地方。<br> 
<br> 
<p></p> 
<p>最后,图片上传完成后还需要提交表单,这里使用SpringMVC实现一个表单接收功能。这里名为address的参数,存储的就是图片的存储路径。</p> 
<p></p><pre name="code" class="java"> @RequestMapping(value="/form") 
 public String submitForm(HttpServletRequest request){ 
 String sid = request.getParameter("name"); 
 String address = request.getParameter("address"); 
 
 if(sid != null && submiter != null && faultTime != null && message != null && address != null){ 
 if(formDataSaveService.saveForm(sid, submiter, message, address, faultTime)){ 
 return "ac"; 
 } 
 } 
 return "error"; 
 }</pre><br>

方法二 前台切割上传(留着后面补充)<p></p>

<p><br> 
</p> 
<link rel="stylesheet" href="http://static.jb51.net/public/res-min/markdown_views.css?v=1.0"> 
  </pre>

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

Ajax请求二进制流进行处理(ajax异步下载文件)

基于CORS实现WebApi Ajax 跨域请求解决方法

Django框架如何使用ajax的post方法(图文教程)

热心网友 时间:2022-05-15 03:15

convert转化的类是 作为参数,或者返回值才需要转换!

如果你转换的对象是Hibernate的实体类,那么你的creator应该是hibernate3
不然会出错的

如果是一般的类,就写上bean

<convert converter="bean" match="com.dwr.*">(可以使用通配符)

在方法公开上,选择你的创建方式不是new 而是spring
<create creator="spring" javascript="jsname" >
<param name="beanName" value="springbeanname"/>
jsname是js中使用的名字
sprignbeanname是spring中bean的名字

beanName这个一定不能写错!这个是dwr一个类内部的参数

热心网友 时间:2022-05-15 04:33

像你掉java方法一样!带参数进去!

热心网友 时间:2022-05-15 06:08

看dwr帮助文档吧
http://wenku.baidu.com/view/d0b061ce0508763231121202.html
dwr在jsp页面js接受的对象就可以通过classname["par"]解析
似乎回答的不对,你用js封装个你要传的对象然后把js对象穿进去应该就行了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
小米平板6Max没有网络怎么办 ...wifi和4G网络我都试过都现实吗没有网络。刚买的是正品没有刷机_百度... 2023年淘宝双11招商规则 淘宝国庆狂欢季招商规则及玩法 淘宝年货买不停招商规则 淘宝超来电活动招商规则 ZIP转换成RAR怎么转换? 衢州醉根艺品有限公司怎么样? 徐谷青主要业绩 徐谷青人物介绍 买错了流量可以退款吗 民间的鬼神传说都是迷信吗?的确有好多人亲身经历过鬼神类的事件啊 玩火尿炕、屋内不能打伞,那些迷信说法有没有科学道理? 洋葱的5种好处,吃洋葱,有什么讲究? 有传统迷信的说法吗? 迷信上的说法鬼压身怎么回事求知道的人解释下 好听的英文名,还要比较特别有个性的,最好是有关于花的,含义也特别的,我是水瓶座的。。 在厂工作18年,社保只买了77个月可以申请补缴社保费吗? 青海省临活救业人员2018年社保能补交吗 求个性 好听的英文名 帮我取个好听有个性的英文名吧~~ 为什么2018年社保现在让补交 下岗零活就业漏保的 ,自己2018到2020交社保了 以前的可以补交吗? 墙上抹的腻子粉会掉白灰,有什么办法解决吗? U盘无法做启动盘 我刚买了个8G金士顿U盘,想做成启动盘,可是怎么都做不了 是不是有的U盘是无法制作成启动盘的? 电脑开机后鼠标动不了怎样杀毒 鼠标不能动怎样杀毒 创维E8O电视怎么更新系统? 选错了流量包,是否可以退?? 用南瓜可以做什么零食? 充错流量可以退吗 H罩的应该怎样穿衣服 杯罩大小 正在丰胸的H罩杯是否需要穿调整型文胸? 男人一般喜欢女人什么罩杯 h罩杯因该穿啥样子的衣服 H罩杯教我的事儿怎么样 我的长安汽车,15年买的,行驶了三万多公里,现在车门胶条出现了生锈痕迹,怎么办? 工作中遇到的问题怎么写 C语言中,10的X次方怎么输? 老板要求员工写工作上遇到的问题该怎么写 在C语言中大于10的100次方的数要怎样输出 车险一般有哪些? 切菜手法有哪些 word 页图设置成100%怎么弄 高考化学实验:溴碘的提取的实验需要掌握哪些知识点 东方财富通大盘分时均线怎么调 通达信软件分时图没有均线(黄色线)请问高手怎幺调出