2010-02-15 38 views
8

Bạn có thể gọi một servlet có liên kết không? Ví dụ:Bạn có thể gọi một servlet có liên kết không?

<a href="/servletName">link text</a> 

Và có thể chuyển tham số cho đối tượng yêu cầu bằng cách thêm chúng vào chuỗi truy vấn.

Nếu không, tôi đã thấy loại điều:

RequestDispatcher dispatcher = getServletContext().getRequestDispatcher(/MyServlet); 
dispatcher.include(request,response); 

Nhưng làm thế nào tôi sẽ kích hoạt này? Ví dụ nếu nó là mã JavaScript tôi có thể đặt nó trong một hàm jQuery, hoặc nếu đây là một servlet, tôi sẽ đặt nó vào một phương thức.

Nhưng làm cách nào để gọi mã này từ bên trong JSP. Theo như tôi biết bạn không thể gọi mã Java với các sự kiện JavaScript.

Trả lời

11
<a href="servletUrl?param=value">click</a> 

hoàn toàn hợp pháp và sẽ hoạt động.

Điều đó sẽ làm cho các phương pháp doGet(..) của servlet được gọi, và bạn có thể nhận được các thông số sử dụng request.getParameter("param")

+2

... sẽ gọi cụ thể là 'doGet()'. – BalusC

+0

Nó dường như không hoạt động trong IE nhưng nó có trong Firefox – Ankur

+2

@Ankur: Điều này chắc chắn không phải là trình duyệt độc lập. Sự cố có thể nằm trong mã HTML/JS hoặc trang được lưu trong bộ nhớ cache trong trình duyệt (nhấn Ctrl + F5 hoặc khởi động lại). – BalusC

2

Có lẽ đây là những gì bạn đang sau:

<jsp:include page="/MyServlet"> 
    <jsp:param name="param" value="value"/> 
</jsp:include> 
10

Chỉ cần để xóa một quan niệm sai lầm :

Theo tôi biết bạn không thể gọi mã Java bằng sự kiện Javascript.

Bạn hoàn toàn có thể gọi mã Java bằng mã JavaScript (và sự kiện). Để đạt được điều này, bạn chỉ cần cho phép JavaScript gửi một yêu cầu HTTP đầy đủ tới phía máy chủ. Về cơ bản có 3 cách cho việc này.

  1. Cách thứ nhất là mô phỏng lời gọi của liên kết/nút/biểu mẫu hiện có. Ví dụ.

    <a id="linkId" href="http://www.google.com/search?q=balusc">Link</a> 
    
    <script type="text/javascript"> 
        document.getElementById('linkId').click(); 
    </script> 
    

    <form id="formId" action="http://www.google.com/search"> 
        <input type="text" id="inputId" name="q"> 
    </form> 
    
    <script type="text/javascript"> 
        document.getElementById('inputId').value = 'balusc'; 
        document.getElementById('formId').submit(); 
    </script> 
    
  2. Cách thứ hai là sử dụng window.location bắn một yêu cầu GET đồng bằng. Ví dụ:

    <script type="text/javascript"> 
        var search = 'balusc'; 
        window.location = 'http://www.google.com/search?q=' + search; 
    </script> 
    
  3. Cách thứ ba là sử dụng đối tượng XMLHttpRequest để kích hoạt yêu cầu không đồng bộ và xử lý kết quả. Kỹ thuật này là ý tưởng cơ sở của "Ajax". Dưới đây là ví dụ tương thích với Firefox:

    <script type="text/javascript"> 
        function getUrl(search) { 
         var xhr = new XMLHttpRequest(); 
         xhr.onreadystatechange = function() { 
          if (xhr.readyState == 4) { 
           var responseJson = eval('(' + xhr.responseText + ')'); 
           var url = responseJson.responseData.results[0].unescapedUrl; 
           var link = document.getElementById('linkId'); 
           link.href = link.firstChild.nodeValue = url; 
           link.onclick = null; 
          } 
         } 
         var google = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=' 
         xhr.open('GET', google + search, true); 
         xhr.send(null); 
        } 
    </script> 
    
    <p>My homepage is located at: <a id="linkId" href="#" onclick="getUrl('balusc')">click me!</a></p> 
    

    Điều này có thể được viết lại theo cách ngắn hơn và crossbrowser tương thích với jQuery.

Chỉ cần thay thế http://www.google.com/search bằng servlet của riêng bạn để có các ví dụ trên làm việc trong môi trường của bạn.

Để biết thêm thông tin cơ bản, bạn có thể tìm thấy this article hữu ích.

+0

Cảm ơn tất cả mã – Ankur

+2

Để làm rõ thêm quan niệm sai lầm - bạn không thể 'gọi Java từ javascript', nhưng bạn có thể gọi một URL mà cuối cùng dẫn đến mã Java đang được thực thi. Sự khác biệt là tinh tế, nhưng quan trọng là phải hiểu. – belugabob

Các vấn đề liên quan