2013-02-12 72 views
0

我想註冊一個HttpServlet,它將接收參數(並不在意它是否通過POST或GET,儘管POST首選顯然)。非常簡單,只是延伸這到底是怎麼描述:在OSGi中註冊servlet接收參數

http://www.javaworld.com/javaworld/jw-06-2008/jw-06-osgi3.html?page=3

在這裏:

http://www.peterfriese.de/osgi-servlets-a-happy-marriage/

我沒有使用仍然聲明註冊,首先要看到它的工作,然後我會做其他的事情。打電話時

產生疑問:

httpService.registerServlet("/helloworld", new RestServlet(), null, null); 

不知道如何告訴HttpService的服務器將接受PARAMS。此外,每次servlet註冊時是否必須使用new()創建HttpServlet,或者是否可以針對不同的別名重複使用它們?我問,因爲也許可以在別名參數中使用一些通配符,然後讓HttpServlet對象處理HttpRequest中的任何內容......?

歡迎任何幫助/建議/想法!

問候, 亞歷

回答

0

我不知道很多關於OSGi,但在我看來,更純的servlet問題。我看了一下你提供的鏈接,希望我能幫助你。

首先,我認爲你不需要告訴HttpService它會接受params。當你使用servlets時,你可以簡單地提取請求參數:

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 
    req.getParameter(paramName); // get a request parameter 
} 

其次,我想你可以使用同一個Servlet的多個「別名」。這看起來像是一種映射到我的servlet:您可以對同一個servlet使用多個映射(/helloworld/helloxyz等)。

+0

好的,假設我想在doGet方法中構建一些帶有一些GET參數的URL鏈接的HTML代碼,如/hellowordl?message=whatever...how應該在註冊HttpServlet時處理這個問題嗎?因爲如果我這樣做,那麼它似乎無法識別「?」後面的內容,因此不會調用RestServlet.doGet方法... – AlejandroVK 2013-02-12 23:35:50

+0

沒關係,我只是意識到我在doGet中生成的HTML代碼有一個錯字。 。它似乎現在工作,謝謝:) – AlejandroVK 2013-02-12 23:57:25

2
  • 如果忽略servlet init,則可以使用同一個servlet註冊多次。
  • 如果你想看到所有,只需註冊/
  • 白板是一個更容易和更好的方法。

Http Service將找到最長的路徑並調用該servlet。所以/是一個後備。

實例的Hello World servlet的不白板:

@Component 
public class Hello extends HttpServlet { 
    public void doGet(HttpServletRequest rq, HttpServletResponse rsp) throws IOException { 
    rsp.getWriter().write(("Hello World " + rq.getParameter("name")).getBytes()); 
    } 

    @Reference 
    void setHttp(HttpService http) { http.registerService("/hello", null, null); } 
} 

例如,現在有白板:

@Component(provide=Servlet.class, properties="alias=/hello") 
public class Hello extends HttpServlet { 
    public void doGet(HttpServletRequest rq, HttpServletResponse rsp) throws IOException { 
    rsp.getWriter().write(("Hello World " + rq.getParameter("name")).getBytes()); 
    } 

}

這樣的事情是很容易在bndtools一起玩。使用DS創建一個小型項目,然後使用Web控制檯創建一個bndrun文件。不會後悔的。

+0

你好彼得,謝謝你的詳細答案,但我有點失落...什麼是bndtools和DS?我是這個Servlet中的新手thingy ...如果我構造一個帶有別名/你好的URL?param = foo ...這個工作嗎?在我的情況下,到目前爲止它沒有,因此,我不知道如何註冊Servlet,因此它能夠處理GET參數... – AlejandroVK 2013-02-12 23:39:51

+0

這聽起來像你在基本級別上感到困惑。當你瀏覽到http:// localhost:8080/hello時,別名=/hello使servlet被調用,它返回'Hello World null'。如果瀏覽到http:// localhost:8080/hello?name ='Peter',servlet將收到'name'參數,並返回'Hello World Peter'。 – 2013-02-13 08:13:27

+0

bndtools是基於Eclipse的OSGi的IDE,請參閱http://bndtools.org DS是Declarative Services,如果沒有OSGi,那麼您將無法生活。有關DS和bndtools的介紹,請參閱http://bndtools.org/tutorial.html。 – 2013-02-13 08:16:31