从java脚本调用java方法

从java脚本调用java方法,java,javascript,jetty,Java,Javascript,Jetty,我正在尝试使用 用于托管服务器的嵌入式jetty, 还有一个简单的html代码,带有java脚本来显示主页面,因为页面不是静态的,这取决于我需要调用java代码的条件。示例html代码如下所示: <body> <script type="text/javascript"> function myfunction(frm) { var opt=frm.option.value; alert("option is"+frm.option.value); //

我正在尝试使用

用于托管服务器的嵌入式jetty, 还有一个简单的html代码,带有java脚本来显示主页面,因为页面不是静态的,这取决于我需要调用java代码的条件。示例html代码如下所示:

 <body>
<script type="text/javascript">
 function myfunction(frm)
{
  var opt=frm.option.value;
  alert("option is"+frm.option.value);
   // call a java method depending on the value of opt
  frm.option.value="";
 }
</script>
    <h1 style="text-align: center;">Agent Management Interface</h1>
    <ol>

    </ol>
    <form name="management_form">
            Enter Option: <input type="text" id="optiontb" name="option">
            <input type="button" onclick="myfunction(this.form)" value="submit">
    </form>
</body>
</html>

您正在寻找的技术是AJAX。由于JavaScript是客户端代码,Java是在服务器上运行的代码,因此向服务器或从服务器获取数据的唯一方法是向服务器发出HTTP请求以请求数据

以下是一个来自以下方面的示例:


//这是向服务器发出请求的函数
函数makeRequest(url){
var-httpRequest;
如果(window.XMLHttpRequest){//Mozilla,Safari。。。
httpRequest=新的XMLHttpRequest();
}如果(window.ActiveXObject){//IE
试一试{
httpRequest=新的ActiveXObject(“Msxml2.XMLHTTP”);
} 
捕获(e){
试一试{
httpRequest=新的ActiveXObject(“Microsoft.XMLHTTP”);
} 
捕获(e){}
}
}
如果(!httpRequest){
警报(“放弃:(无法创建XMLHTTP实例”);
返回false;
}
//在这里,我们将onreadystatechange事件设置为调用“alertContents”
//当响应返回时调用。这是一个“回调”函数。
httpRequest.onreadystatechange=alertContents;
httpRequest.open('GET',url);
//这将启动发送操作
httpRequest.send();
}
//这是回调处理程序
函数alertContents(){
if(httpRequest.readyState==4){
if(httpRequest.status==200){
//因为来自Jetty服务器的响应是Hello World
//警报应使用该标记触发
警报(httpRequest.responseText);
}否则{
警报(“请求有问题”);
}
}
}
//这是您的函数,带有makeRequest调用。
函数myfunction(frm)
{
var opt=frm.option.value;
警报(“选项为”+frm.选项值);
//根据opt的值调用java方法
frm.option.value=“”;
//使用您的数据在此处调用makerequest
makeRequest('/senddata?value='+frm.option.value);
}
虽然上面的代码允许您从浏览器发出HTTP请求,但您需要在Java应用程序中使用servlet来接收请求、处理请求并将响应返回到浏览器

,您可以使用它来检查HTTP请求、处理它并返回响应。我稍微修改了示例以提取一个查询参数,您可以通过AJAX请求传入该参数:

public class HelloHandler extends AbstractHandler
{
    public void handle(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response) 
        throws IOException, ServletException
    {
        // the value passed in from the client side
        String value = request.getParameter("value");

        // do stuff with that here

        // return a response
        response.setContentType("text/html;charset=utf-8");
        response.setStatus(HttpServletResponse.SC_OK);
        baseRequest.setHandled(true);

        // this gets sent back down to the client-side and is alerted
        response.getWriter().println("<h1>Hello World</h1>");
    }
}
公共类HelloHandler扩展了AbstractHandler
{
公共无效句柄(字符串目标、请求baseRequest、HttpServletRequest请求、HttpServletResponse响应)
抛出IOException、ServletException
{
//从客户端传入的值
字符串值=request.getParameter(“值”);
//在这里做点什么
//回复
setContentType(“text/html;charset=utf-8”);
response.setStatus(HttpServletResponse.SC_OK);
baseRequest.setHandled(true);
//这会被发送回客户端并发出警报
response.getWriter().println(“Hello World”);
}
}

不能在Javascript中调用Java方法

Java在服务器端呈现,javascript在客户端呈现(主要是web浏览器)

两者都不了解对方


您所能做的最好的事情就是通过链接、表单提交或AJAX调用任何JSP或servlet或任何适用的东西,这些东西依次为您调用特定的Java方法。

1.实际上,您可以从客户端的javascript调用Java*2.Java可以是客户端语言(applet)。javascript可以是服务器语言(node.js)*我很确定@linuxeasy指的是OPs问题中的上下文:)即“使用小程序不是一个选项”。@AndrewThompson-谢谢!我已经连续做了好几个星期了!我的目标是在6月1日之前实现:)@jmort非常感谢,但这段代码似乎对我不起作用。我将用搜索结果编辑问题。当你说它不起作用时,发生了什么?另外,如果有堆栈跟踪,你能把它们也包括进来吗?@jmort253-oops很抱歉,我忘了提到发生了什么,localhost:8080加载了文本和按钮,当我键入say 1并单击submit按钮时,我在网页上看不到任何更改,但在eclipse控制台中只看到日志消息。ok。调试101。首先,确保您正在处理程序中执行一些将打印到日志的操作<代码>System.out.println(“你好,世界!!!”是一种非常快速的方法。其次,检查Firebug或Chrome调试器中的NET选项卡并查看服务器响应,查看它是否包含服务器在
response.getWriter.println()中返回的Hello world。换句话说,您现在需要通过找出断开连接的位置来缩小问题的范围。@jmort253是的,我对它进行了调试,发现问题也在于处理程序集中包含的新DefaultHandler(),我假设有一些优先级分配给处理程序,它们以特定的优先级执行。一旦我去掉了这些优先级,现在就可以正常工作了。关于chrome调试器和Firebug的提示非常方便,非常好听!)和调试器,请继续探索这些。当你继续与他们合作时,他们将成为你非常忠实的朋友;)祝你好运
System.setProperty("org.eclipse.jetty.util.log.DEBUG","true"); 
    Server server = new Server(8080);
    ResourceHandler resource_handler = new ResourceHandler();
    resource_handler.setDirectoriesListed(true);
    resource_handler.setResourceBase(args.length == 2?args[1]:".");
    resource_handler.setWelcomeFiles(new String[]{ "index.html" });
    System.out.println("serving " + resource_handler.getBaseResource());

    ContextHandler context0 = new ContextHandler();
    context0.setContextPath("/senddata");
    Handler handler0=new HelloHandler();
    context0.setHandler(handler0);

    ContextHandlerCollection contexts = new ContextHandlerCollection();
    contexts.setHandlers(new Handler[]{context0});

    HandlerCollection handlersc = new HandlerCollection();
    handlersc.setHandlers(new Handler[]{resource_handler,new DefaultHandler(), contexts});
    server.setHandler(handlersc);
    server.start();
    server.join();
 <script type="text/javascript">

  // this is the function that will make the request to the server
  function makeRequest(url) {
    var httpRequest;

    if (window.XMLHttpRequest) { // Mozilla, Safari, ...
      httpRequest = new XMLHttpRequest();
    } else if (window.ActiveXObject) { // IE
      try {
        httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
      } 
      catch (e) {
        try {
          httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
        } 
        catch (e) {}
      }
    }

    if (!httpRequest) {
      alert('Giving up :( Cannot create an XMLHTTP instance');
      return false;
    }

    // here we set the onreadystatechange event to invoke "alertContents"
     // this is called when the response returns. This is a "callback" function.

    httpRequest.onreadystatechange = alertContents;
    httpRequest.open('GET', url);

    // this starts the send operation
    httpRequest.send();
  }

  // here is the callback handler
  function alertContents() {
    if (httpRequest.readyState === 4) {
      if (httpRequest.status === 200) {

        // since the response from the Jetty server is <h1>Hello World</h1>
         // the alert should fire with that markup
        alert(httpRequest.responseText);

    } else {
      alert('There was a problem with the request.');
    }
  }
}

// this is your function, with the makeRequest call. 
function myfunction(frm)
{
    var opt=frm.option.value;
    alert("option is"+frm.option.value);
    // call a java method depending on the value of opt
    frm.option.value="";

    // call makerequest here with your data
    makeRequest('/senddata?value=' + frm.option.value); 
}

</script>
public class HelloHandler extends AbstractHandler
{
    public void handle(String target,Request baseRequest,HttpServletRequest request,HttpServletResponse response) 
        throws IOException, ServletException
    {
        // the value passed in from the client side
        String value = request.getParameter("value");

        // do stuff with that here

        // return a response
        response.setContentType("text/html;charset=utf-8");
        response.setStatus(HttpServletResponse.SC_OK);
        baseRequest.setHandled(true);

        // this gets sent back down to the client-side and is alerted
        response.getWriter().println("<h1>Hello World</h1>");
    }
}