JavaRush /Java блог /Архив info.javarush /Про сервлеты и бесплатный web-сервер с tomcat 8 от компан...
Izhak
22 уровень
Москва

Про сервлеты и бесплатный web-сервер с tomcat 8 от компании с мировым именем

Статья из группы Архив info.javarush
בםייד Про сервлеты Результат Полгода назад после очередного перерыва на обучалки с других сайтов, и первой программы, которую я написал себе по работе на Java FX, мне попалась задача package com.javarush.test.level20.lesson10.bonus03; import java.util.ArrayList; import java.util.List; /* Кроссворд 1. Дан двумерный массив, который содержит буквы английского алфавита в нижнем регистре. 2. Метод detectAllWords должен найти все слова из words в массиве crossword. 3. Элемент(startX, startY) должен соответствовать первой букве слова, элемент(endX, endX) - последней. text - это само слово, располагается между начальным и конечным элементами 4. Все слова есть в массиве. 5. Слова могут быть расположены горизонтально, вертикально и по диагонали как в нормальном, так и в обратном порядке. 6. Метод main не участвует в тестировании */ public class Solution { public static void main(String[] args) { int[][] crossword = new int[][]{ {'f', 'd', 'e', 'r', 'l', 'k'}, {'u', 's', 'a', 'm', 'e', 'o'}, {'l', 'n', 'g', 'r', 'o', 'v'}, {'m', 'l', 'p', 'r', 'r', 'h'}, {'p', 'o', 'e', 'e', 'j', 'j'} }; //detectAllWords(crossword, "home", "same"); /* Ожидаемый результат home - (5, 3) - (2, 0) same - (1, 1) - (4, 1) */ И в общем-то ничего особенного- немного подумал, попотел и решилось, но очень уж мне хотелось наконец-то добраться до сервлетов. И снова я отложил в сторону задачки – стал рыскать в поиске правильных настроек сервлета, где его писать, как запускать, и как написанные Java программы увидеть в интернете- не в консоли идеи– ведь зачем-то нам нужна эта консоль. И вот, после того, как на работе мне потребовалось написать окончательно сложное приложение на JSP с применением знаний Java, я добрался до этого задания и нашёл наконец бесплатный и удобный сервер с поддержкой tomcat, без рекламы и с кучей возможностей (я не программист, но раз уж пока не взяли программистом- внедряю навыки у себе на работе). Этот рассказ о сервлетах не даст вам кода – так как выкладывание правильных решений запрещено, но то, что можно показать и рассказать – я опишу. Итак, к сожалению, я не очень понял, да и не сильно стремился, как запускать в платной версии IntelliJ сервлеты, поэтому поставил NetBeance, и стал оттуда разворачивать проекты. Но проекты на локальном компьютере по localhost:80080 – очень хорошо, но что же делать с выходом в сеть? На 8-ке для того, чтобы твой сайт увидели по 192.168.7.45:8080/test надо ещё отключить пару защитных функций, установить запуск tomcat в автозагрузку, или запускать его самостоятельно, не выключать компьютер и не уносить его с собой. Слишком много условий – да и никому из друзей не похвалишься. Наконец-то сегодня после очередного гугления наткнулся на совет про AWS – а это оказывается давно уже просмотренный мной amazon web services. Но вроде бы там были распределённые вычисления? – думаю-дай-ка попробую. И зарегистрировался. Единственное, что он просит карточку с 1 долларом на счету- не для списания, а для проверки, что ты хоть как-то платёжеспособен, и пары-тройки часов (хотя некоторые сервисы начинают работать сразу же). ПО наивности мне показалось, что надо запустить линукс, скачать через консоль туда tomcat и всё такое- промучится с настройкой dns адреса- но нет – просто нам нужна служба elasticbeanstalk. И хотя поначалу картинка выглядела бесконечно зависшей (кружочек загрузки elasticbeanstalk что-то начинал делать, но потом просто крутился без дела, то после прихода на почту письма Your AWS account is Ready – служба сразу завелась. Появилась кнопочка Upload, выбор платформы для приложения, и я загрузил его! Загрузка AWS Затем из-за того, что там приложение запускается из корня адреса моего приложения, пришлось сделать четыре версии, которые по той же кнопочке Upload and Deploy легко было загружать и выгружать, и в итоге вот такая версия моего ответа на кроссворд висит по адресу http://default-environment-mtdxacy9a3.elasticbeanstalk.com/webcrossword Теперь по реализации. Берём папочку с солюшном, или сам файл, но тогда надо указать его правильный паккадж, или создать в нетбинсе паккадж с полным путём Пути В папочке lib пара скачанных файлов, чтобы в JSP использовать конструкцию <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> WebChar.java – вспомогательный файл, webcrossword.java - сервлет, созданный мастером по щёлчку на папке проекта правой кнопкой. Итак, привожу основной код здесь – все пояснения можно искать в интернете – там много. Web.xml (генерировался автоматически) webcrossword com.javarush.test.level20.lesson10.bonus03.web.webcrossword webcrossword /webcrossword 30 Изменённая часть сервлета webcrossword.java (имя не по соглашению – чтобы не писать аннотацию к вызову сервлета) /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.javarush.test.level20.lesson10.bonus03.web; import com.javarush.test.level20.lesson10.bonus03.Solution; import com.javarush.test.level20.lesson10.bonus03.Solution.Word; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List; /** * * @author Izhak Aliyahu */ public class webcrossword extends HttpServlet { private ServletContext context; Solution solution=new Solution(); public static String realPath=""; public static String contextPath=""; @Override public void init(ServletConfig config) throws ServletException { this.context = config.getServletContext(); contextPath = this.context.getContextPath(); realPath = this.context.getRealPath("/"); //writeTo(contextPath+" "+realPath); } /** * Processes requests for both HTTP GET and POST * methods. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); String userPath = request.getServletPath(); if (userPath.equals("/webcrossword")){ List listOfWords=solution.detectAllWords(solution.crossword, "home", "same"); WebChar.initListOfWords(listOfWords); request.setAttribute("crossword", solution.getCrosswordChar()); request.setAttribute("listOfWords", listOfWords); this.context.getRequestDispatcher("/index.jsp").forward(request, response); } /*try (PrintWriter out = response.getWriter()) { */ /* TODO output your page here. You may use following sample code. */ /*out.println(""); out.println(""); out.println(""); out.println("Servlet webcrossword"); out.println(""); out.println(""); out.println("

Servlet webcrossword at " + request.getContextPath() + "

"); out.println(""); out.println(""); }*/ }
Index.jsp <%-- Document : index.jsp Created on : 02.06.2015, 15:05:09 Author : Izhak Aliyahu --%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@page contentType="text/html" pageEncoding="UTF-8"%> Кроссворд

Вот так располагаются слова

${crosswordLetter.letter}

Вот те самые слова, которые выделены в поле кроссворда
${word}
Файл со стилями crossword.css (хотя, конечно, может и стоило стили пихать прям в html – особенно когда много слов, или хочется сделать, чтобы буквы постепенно меняли цвет – можно в следующих заданиях) /* To change this license header, choose License Headers in Project Properties. To change this template file, choose Tools | Templates and open the template in the editor. */ /* Created on : 02.06.2015, 17:43:59 Author : Izhak Aliyahu */ .word0 { background-color: greenyellow; } .word1 { background-color: blueviolet; } .word2 { background-color: blue; } .no{ background-color: grey; } Файл, в котором определяется структура, из которой мы в JSP вытягиваем параметры – вытягивается то, на что есть геттер. WebChar.java /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.javarush.test.level20.lesson10.bonus03.web; import com.javarush.test.level20.lesson10.bonus03.Solution.Word; import java.util.ArrayList; import java.util.List; /** * * @author Izhak Aliyahu */ public class WebChar { String className="no"; char letter; static List listOfWords=new ArrayList(); public WebChar(char letter, int row, int column) { this.letter = letter; if (listOfWords!=null){ for(int h=0; h listOfWords){ WebChar.listOfWords.clear(); WebChar.listOfWords.addAll(listOfWords); } public String getClassName() { return className; } public char getLetter() { return letter; } } В WebChar используется функция из класса Word .inWord(row, column) – мы проверяем- если слово содержит букву, то закрашиваем (назначаем класс, по которому потом из css файла будет выбран цвет фона буквы) Я так описал эту функцию public boolean inWord(int row, int column){ boolean res=false; if (column>=startX && column <=endX && row>=startY && row<=endY) res=true; if (column<=startX && column >=endX && row>=startY && row<=endY) res=true; if (column>=startX && column <=endX && row<=startY && row>=endY) res=true; if (column<=startX && column >=endX && row<=startY && row>=endY) res=true; if (res){ if (startX!=endX){ if (startY!=endY){ if (!(Math.abs(column-startX)==Math.abs(row-startY) && Math.abs(column-endX)==Math.abs(row-endY))){ res=false; } } } } return res; } И ещё немного поменял класс Solution – вот начало класса public class Solution { public static int[][] crossword = new int[][]{ {'f', 'd', 'e', 'r', 'l', 'k'}, {'u', 's', 'a', 'm', 'e', 'o'}, {'l', 'n', 'g', 'r', 'o', 'v'}, {'m', 'l', 'p', 'r', 'r', 'h'}, {'p', 'o', 'e', 'e', 'j', 'j'} }; public static WebChar[][] getCrosswordChar(){ WebChar[][] crossChar=new WebChar[crossword.length][crossword[0].length]; for (int i=0; i< crossword.length; i++){ for (int j=0; j< crossword[0].length; j++){ crossChar[i][j]=new WebChar((char)crossword[i][j], i, j); } } return crossChar; } А функция public static List detectAllWords(int[][] crossword, String... words) в классе Solution уже полгода меня ждала написанная. Затем почему-то только с выключенным томкатом у меня получилось очистить и собрать проект, после чего из панели управления AWS я спокойно его грузил и перезагружал. Ещё раз адрес сабжа http://default-environment-mtdxacy9a3.elasticbeanstalk.com/webcrossword Тренируемся дальше .
Комментарии (6)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
timurnav Уровень 21
4 июня 2015
thanx, a lot of fun!