Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Servlets by Example Joe Howse 7 June 2011 What is a servlet? ● A servlet is a Java application that receives HTTP requests as input and generates HTTP responses as output. ○ As the name implies, it runs on a server. ○ Dependency: A "servlet container" such as Jetty or Apache Tomcat. ● A servlet is not similar to an applet. ○ An applet's access to server-side files is unprivileged and slow (requiring downloads) because the applet itself runs client-side. ● Let's consider a step-by-step approach to setting up a simple servlet: 1. Get and configure Jetty. 2. Create the necessary directory tree for the servlet. 3. Write a webpage as a front-end. 4. Write a config file. 5. Write, compile and deploy the Java code. 6. Test it! Setting up Jetty ● Follow the instructions at: ○ http://docs.codehaus.org/display/JETTY/Quick+Start ○ At the download step, you want the latest stable version from: ■ http://download.eclipse.org/jetty/ ● On Dalhousie's bluenose server, adapt the instructions as follows: ○ $JETTY_HOME should be some web-accessible folder. ■ ex. ~/public_html/jetty ○ You should choose an unused port number between 4001 and 4030. ■ I am using 4020 right now, so choose something else. ○ Your test servlet can be accessed at: ■ http://bluenose.cs.dal.ca:####/ ■ (Here, #### should be replaced by your port number.) Directory tree $JETTY_HOME/webapps/MyServlet/ index.html WEB-INF/ web.xml classes/MyServlet/ *.class *.java build.sh lib/ *.jar ● A servlet must include: ○ statically linked code (.class) ○ configuration (.xml) ● Optionally, it may include: ○ dynamically linked code (.jar) ○ front-end website scripts (.html, . php, etc.) and content (.jpg, etc.) ● Just for convenience, we are putting our source code (.java) and build script (build.sh) inside the servlet directory tree too. ○ These are not used at run-time. index.html <html><body> <form method="get" action="MyServlet"> <input type="text" id="query" name="query" size="50"/> <input type="submit" value="Submit"/> </form> </body></html> ● Our webpage is an input form that sends to our servlet a get request with a field called query. ● Our servlet is called MyServlet. web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>MyServlet.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/MyServlet</url-pattern> </servlet-mapping> <session-config> <session-timeout>30</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app> ● Our web.xml config file specifies the servlet name, paths, etc. MyServlet.java (1/2) package MyServlet; import import import import import import import java.io.IOException; java.io.PrintWriter; javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse; javax.servlet.ServletConfig; public class MyServlet extends HttpServlet { // Initialize servlet and any back-end model it uses. @Override public void init(ServletConfig config) throws ServletException { super.init(); // Initialize back-end model here. } // Respond to GET request. @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); String query = request.getParameter("query"); out.println("<html><body>Your query was \"" + query + "\"!</body></html>"); } // Continued on next slide. ... MyServlet.java (2/2) // ... Continued from previous slide. // Respond to POST request. @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); // Here, POST is handled the same as GET. } // Return description of servlet. @Override public String getServletInfo() { return "MyServlet is a minimal example, echoing back a query string."; } } ● Our MyServlet.java source file defines the mapping from requests to responses. ● Our simple example could be extended to: ○ Handle errors. ○ Initialize and use an instance of another class as its back-end. build.sh #!/bin/sh # Configuration variable. # The path to Jetty. JETTY_HOME=~/public_html/jetty # Build command. javac -cp $JETTY_HOME/lib/servlet-api-2.5.jar MyServlet.java ● Our build script compiles MyServlet.java and links it with the required library in Jetty. ● Do not forget to set executable permission for the script. ○ chmod +x build.sh Testing MyServlet ● Run the build script! ○ ./build.sh ● Navigate to $JETTY_HOME and run: ○ java -jar start.jar ● Direct your Web browser to: ○ http://bluenose.cs.dal.ca:####/MyServlet ■ (Here, #### should be replaced by your port number.) Summing up ● Writing and deploying a minimal servlet involves just a few steps. ● The complexity is not much greater than scripting solutions, such as: ○ PHP, CherryPy (Python), Ruby on Rails (Ruby) ● A servlet can integrate seamlessly with other back-end Java code.