Java на стороне сервера. Сервлеты и JSP

advertisement
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>
Download