1.1通过设置form action的路径请求后台方法
在Structs框架下的一个上传文件的例子,前台html页面部分代码:
<form action="Test!UploadFile.action" enctype="multipart/form-data" method="post"> 用户名:<input type="text" name="username" > 文件名:<input type="file" name="myFile"> <input type="submit" value="提交" class="file" /></form>
后台对应的Java函数
public String myFileFileName;public String myFileContentType;public File myFile;public void UploadFile() throws IOException{ InputStream is = new FileInputStream(myFile); String uploadPath = ServletActionContext.getServletContext().getRealPath("/Upload"); File tmpFile = new File(uploadPath); if (!tmpFile.exists()) { tmpFile.mkdir(); } File toFile = new File(uploadPath, myFileFileName); OutputStream os = new FileOutputStream(toFile); byte[] buffer = new byte[1024]; int length = 0; while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); } is.close(); os.close();}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
1.2通过改变带有路径属性的元素得路径
前台html页面部分代码:
<img id="imgCode" src="toCode" onclick="ChangeCode()" style="padding-top:8px"/><script type="text/javascript"> function ChangeCode() { var img = document.getElementById("imgCode"); img.src = 'Test!getCode.action?time='+new Date().getTime(); }</script>
后台对应的java方法
//生成验证码private static Font VALIDATECODE_FONT = new Font("Times New Roman ",Font.PLAIN, 21)public void getCode() { response.setHeader("Pragma", "No-cache") response.setHeader("Cache-Control", "no-cache") response.setDateHeader("Expires", 0) response.setContentType("image/jpeg") // 在内存中创建图象 BufferedImage image = new BufferedImage(80, 30,BufferedImage.TYPE_INT_RGB) // 获取图形上下文 Graphics g = image.getGraphics() // 设定背景色 g.setColor(Color.white) g.fillRect(0, 0, 80, 30) // 画边框 g.setColor(Color.blue) g.drawRect(0, 0, 80 - 1, 30 - 1) Long validate = new Long(10000 + Math.round((Math.random() * 90000))) String validateCode = validate.toString() // 将认证码显示到图象中 g.setColor(Color.black) g.setFont(VALIDATECODE_FONT) g.drawString(validateCode.toString(), 10, 22) // 随机产生88个干扰点,使图象中的认证码不易被其它程序探测到 Random random = new Random() for (int iIndex = 0 int x = random.nextInt(80) int y = random.nextInt(30) g.drawLine(x, y, x, y) } // 图象生效 g.dispose() try { // 输出图象到页面 ServletOutputStream sos = response.getOutputStream() ImageIO.write(image, "jpeg", sos) sos.close() } catch (Exception e) { } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
1.3使用Ajax(异步JavaScript和XML)请求后台方法
前台html页面部分代码:
$.ajax({ async : false, cache : false, timeout: 1000, url: 'Test!sendDate.action?time='+new Date().getTime(), type: "post", data:{"username":"1","userpass":2,"validate":3}, success: function(data){ }, error:function(XMLHttpRequest, textStatus, errorThrown){ alert(XMLHttpRequest.status); alert(XMLHttpRequest.readyState); alert(textStatus); } });
1.4使用Service sent Event
前台html页面部分代码:
<div align="center"><table> <tr> <td><input type="button" value="Server" onclick="ServerSent()"></td> <td><input id="ConnectInfor" type="text" value="服务器推送事件"></td> <td><input id="pushData" type="text" value="服务器推送事件"></td> <td><input id="errorData" type="text" value="服务器推送事件"></td> </tr></table></div><script type="text/javascript">function ServerSent() { if (typeof (EventSource) !== "undefined") { try{ var source = new EventSource("Test_SSE!ServicePush.action"); source.onopen = function(event) { document.getElementById("ConnectInfor").value = "链接成功"+this.readyState; }; source.onmessage = function(event) { document.getElementById("pushData").value = event.data+"/"+this.readyState; }; source.onerror = function(event) { document.getElementById("errorData").value = "发生错误"+this.readyState; } }catch(err){ alert('出错啦,错误信息:'+err.message); } } else { document.getElementById("ConnectInfor").innerHTML = "抱歉,你的浏览器不支持 server-sent 事件..."; } }</script>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
后台对应的java方法
public void ServicePush(){ long str = System.currentTimeMillis(); backMessage(str+"");}public void backMessage(String str){ try { response.setContentType("text/event-stream"); response.setCharacterEncoding("UTF-8"); PrintWriter pw = response.getWriter(); pw.write("data: "+ str +"\n\n"); pw.close(); } catch (IOException e) { e.printStackTrace(); }}
1.5使用WebSocket
前台对应html部分代码:
<div align="center"> <table> <tr> <td><input type="button" value="退出" onclick="Chat.socket.onclose()"></td> <td><input type="button" value="连接" onclick="Chat.socket.onopen()"></td> <td><input type="button" value="WebSocket" onclick="Chat.socket.sendMessage()"></td> <td><input id="chat" type="text" value="服务器推送事件"></td> </tr> </table> <div id="console"></div> </div><script type="text/javascript"> var Chat = {}; Chat.socket = null; Chat.connect = (function(host) { if ('WebSocket' in window) { Chat.socket = new WebSocket(host); } else if ('MozWebSocket' in window) { Chat.socket = new MozWebSocket(host); } else { Console.log('错误:您的浏览器不支持WebSocket'); return; } Chat.socket.onopen = function() { Console.log('提示: 您已经进入了聊天室'); document.getElementById('chat').onkeydown = function(event) { if (event.keyCode == 13) { Chat.sendMessage(); } }; }; Chat.socket.onclose = function() { document.getElementById('chat').onkeydown = null; Console.log('提示: 您退出了聊天室'); }; Chat.socket.onmessage = function(message) { Console.log(message.data); }; }); Chat.initialize = function() { if (window.location.protocol == 'http:') { Chat.connect('ws://localhost:8080/ShowDate/WebSocket'); } else { Chat.connect('ws://localhost:8080/ShowDate/WebSocket'); } }; Chat.sendMessage = (function() { var message = document.getElementById('chat').value; if (message != '') { Chat.socket.send(message); document.getElementById('chat').value = ''; } }); var Console = {}; Console.log = (function(message) { var console = document.getElementById('console'); var p = document.createElement('p'); p.style.wordWrap = 'break-word'; p.innerHTML = message; console.appendChild(p); while (console.childNodes.length > 25) { console.removeChild(console.firstChild); } console.scrollTop = console.scrollHeight; }); Chat.initialize();</script>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
后台对应的整个类
import java.io.IOException;import java.util.Set;import java.util.concurrent.CopyOnWriteArraySet;import java.util.concurrent.atomic.AtomicInteger;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;@ServerEndpoint("/WebSocket")public class WebSocket { private static final String GUEST_PREFIX = "用户"; private static final AtomicInteger connectionIds = new AtomicInteger(0); private static final Set<WebSocket> connections = new CopyOnWriteArraySet<>(); private final String nickname; private Session session; public WebSocket() { nickname = GUEST_PREFIX + connectionIds.getAndIncrement(); } @OnOpen public void start(Session session) { this.session = session; connections.add(this); String message = String.format("%s %s", nickname, "加入了聊天室"); broadcast(message); } @OnClose public void end() { connections.remove(this); String message = String.format("%s %s", nickname, "已经断开连接"); broadcast(message); } @OnMessage public void incoming(String message) { broadcast(message); } @OnError public void onError(Throwable t) throws Throwable { System.out.println("聊天错误: " + t.toString()); } private static void broadcast(String msg) { for (WebSocket client : connections) { try { synchronized (client) { client.session.getBasicRemote().sendText(msg); } } catch (IOException e) { System.out.println("聊天错误: 未能发送消息到客户端"); connections.remove(client); try { client.session.close(); } catch (IOException e1) { } String message = String.format("%s %s", client.nickname, "已经断开连接"); broadcast(message); } } }
}
总结:目前js请求后台数据的几种方式有
1.form表单提交
2.ajax请求
3.jsonp请求
4.EventSource(HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新。)
5.WebSocket(HTML5一种新的协议,浏览器与服务器全双工通信)
6.iframe的postMessage(貌似然并卵)
其中jsonp和WebSocket支持跨域,form表单可以跨域提交,但是得不到返回值。ajax不支持跨域。EventSource似乎也支持跨域
后续或许会不断补充方法
0 0