前台通过JS请求后台的几种方法

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函数

// myFileFileName属性用来封装上传文件的文件名
public String myFileFileName;
// myFileContentType属性用来封装上传文件的类型
public String myFileContentType;
// myFile属性用来封装上传的文件
public File myFile;
public void UploadFile() throws IOException{
    //基于myFile创建一个文件输入流
    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;
    //读取myFile文件输出到toFile文件中
    while ((length = is.read(buffer)) > 0) {
        os.write(buffer, 0, length);
    }
    //关闭输入流
    is.close();
    //关闭输出流
    os.close();
}

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; iIndex < 100; iIndex++) {
            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.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>

后台对应的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">
//websocket
    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>

后台对应的整个类

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);
            }
        }
    }

}
  • 23
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据引用和引用的内容,我们可以确定前台后台的访问路径分别为127.0.0.1。如果前台js后台无法找到相应的方法,可能是以下几个原因导致的: 1. 前台js找不到方法:如果前台js无法找到方法,可能是路径错误或者方法名错误导致的。请检查前台js代码中方法的命名和路径是否正确。 2. 后台找不到方法:如果后台无法找到方法,可能是路径错误或后台没有定义该方法导致的。请检查后台代码中方法的路径和命名是否与访问路径匹配。 3. 网络连接问题:如果前台后台都无法找到方法,可能是由于网络连接问题导致的。请确保网络连接正常,并重新访问相应的路径。 总结来说,要解决前台js后台找不到方法的问题,需要仔细检查代码中的路径和方法名是否正确,并确保网络连接正常。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [fcdh:非常导航是一个纯静态由html,css和js文件构成...本地用web服务器就可以保留自己的网址或上传到服务器端](https://download.csdn.net/download/weixin_42104181/15380071)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [struts2前台后台参数的交互,jsp到java,java到jsp,java到javascript](https://blog.csdn.net/weixin_33933221/article/details/114896436)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值