Java на стороне сервера. Сервлеты и JSP Server-side Java: Servlets & JSP Задачи сервлета Чтение явных данных, передаваемых с клиента (данные форм) Чтение неявных данных (заголовки протокола HTTP) Генерация результата Отправка клиенту явных данных в виде HTML Отправка неявных данных (статусы протокола HTTP и заголовки) Вывод простого HTTP-ответа HTTP-ответ в виде HTML Жизненный цикл сервлета init service Вызывается сервером для каждого запроса в новом потоке; в свою очередь передает вызов в doGet, doPost и др. Этот метод переопределять не следует. doGet, doPost, doXxx Выполняется при загрузке сервлета (1 раз; не вызывается для каждого запроса) Обрабатывает HTTP-запросы GET, POST и др. Для задания функциональности сервлета следует переопределить эти методы destroy Вызывается при уничтожении экземпляра класса сервлета Точно не вызывается после каждого запроса Обработка данных форм: HTML-форма Чтение параметров Чтение параметров -- результат Извлечение заголовков запроса (1) public class ShowRequestHeaders extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { out.println (docType + "<HTML>\n" + "<HEAD><TITLE>"+title+"</TITLE></HEAD>\n"+ "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<H1 ALIGN=\"CENTER\">" + title + "</H1>\n" + "<B>Request Method: </B>" + request.getMethod() + "<BR>\n" + "<B>Request URI: </B>" + request.getRequestURI()+ "<BR>\n" + "<B>Request Protocol: </B>" + request.getProtocol() + "<BR><BR>\n" + Извлечение заголовков запроса (2) "<TABLE BORDER=1 ALIGN=\"CENTER\">\n" + "<TR BGCOLOR=\"#FFAD00\">\n" + "<TH>Header Name<TH>Header Value"); Enumeration<String> headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); out.println("<TR><TD>" + headerName); out.println(" <TD>"+request.getHeader(headerName)); } } out.println("</TABLE>\n</BODY></HTML>"); /** Since this servlet is for debugging, have it * handle GET and POST identically. */ } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } Задание заголовков ответа response.setHeader(String headerName, String headerValue) response.setDateHeader(String name, long millisecs) response.setIntHeader(String name, int headerValue) setContentType MIME setContentLength addCookie sendRedirect Отслеживание сеанса (1) public class ShowSession extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); HttpSession session = request.getSession(); String heading; Integer accessCount = (Integer)session.getAttribute("accessCount"); if (accessCount == null) { accessCount = new Integer(0); heading = "Welcome, Newcomer"; } else { heading = "Welcome Back"; accessCount = new Integer(accessCount.intValue() + 1); } session.setAttribute("accessCount", accessCount); Отслеживание сеанса (2) PrintWriter out = response.getWriter(); … out.println (docType + "<HTML>\n" + "<HEAD><TITLE>" + title + "</TITLE></HEAD>\n" + "<BODY BGCOLOR=\"#FDF5E6\">\n" + "<CENTER>\n" + "<H1>" + heading + "</H1>\n" + "<H2>Information on Your Session:</H2>\n" + "<TABLE BORDER=1>\n" + "<TR BGCOLOR=\"#FFAD00\">\n" + " <TH>Info Type<TH>Value\n" + … " <TD>Number of Previous Accesses\n" + " <TD>" + accessCount + "\n" + "</TABLE>\n" + "</CENTER></BODY></HTML>"); Основной синтаксис JSP HTML Text Выражения <H1>Blah</H1> Эквивалентно out.print("<H1>Blah</H1>"); <%= expression %> Эквивалентно out.print(expression) Скрипты <% code %> Примеры выражений <BODY> <H2>JSP Expressions</H2> <UL> <LI>Current time: <%= new java.util.Date() %> <LI>Server: <%= application.getServerInfo() %> <LI>Session ID: <%= session.getId() %> <LI>The <CODE>testParam</CODE> form parameter: <%= request.getParameter("testParam") %> </UL> </BODY></HTML> Предопределенные переменные request response Класс Writer, поток вывода session Класс HttpServletResponse (второй параметр в вызове service/doGet) out Класс HttpServletRequest (первый параметр в вызове service/doGet) Класс HttpSession – сеанс пользователя application Класс ServletContex для хранения общих данных в приложении Чтение 3х параметров (пример для сравнения с сервлетами) Класс, который будет задействован в JSP package num; import java.util.*; public class NumberGuessBean { int answer; boolean success; String hint; int numGuesses; public NumberGuessBean() { reset(); } Метод setGuess public void setGuess(String guess) { numGuesses++; int g; try { g = Integer.parseInt(guess); } catch (NumberFormatException e) { g = -1; } if (g == answer) { success = true; } else if (g == -1) { hint = "a number next time"; } else if (g < answer) { hint = "higher"; } else if (g > answer) { hint = "lower"; } } Остальные методы public boolean getSuccess() { return success; } public String getHint() { return "" + hint; } public int getNumGuesses() { return numGuesses; } public void reset() { answer = Math.abs(new Random().nextInt() % 100) + 1; success = false; numGuesses = 0; } } JSP, в которой задействован класс (1) <%@ page import = "num.NumberGuessBean" %> <jsp:useBean id="numguess" class="num.NumberGuessBean" scope="session"/> <jsp:setProperty name="numguess" property="*"/> <html> <head><title>Number Guess</title></head> <body bgcolor="white"> <font size=4> <% if (numguess.getSuccess()) { %> Congratulations! You got it. And after just <%= numguess.getNumGuesses() %> tries.<p> <% numguess.reset(); %> Care to <a href="numguess.jsp">try again</a>? JSP, в которой задействован класс (2) <% } else if (numguess.getNumGuesses() == 0) { %> Welcome to the Number Guess game.<p> I'm thinking of a number between 1 and 100.<p> <form method=get> What's your guess? <input type=text name=guess> <input type=submit value="Submit"> </form> JSP, в которой задействован класс (3) <% } else { %> Good guess, but nope. Try <b><%= numguess.getHint() %></b>. You have made <%= numguess.getNumGuesses() %> guesses.<p> I'm thinking of a number between 1 and 100.<p> <form method=get> What's your guess? <input type=text name=guess> <input type=submit value="Submit"> </form> <% } %> </font> </body> </html>