בםייד
Про сервлеты
Полгода назад после очередного перерыва на обучалки с других сайтов, и первой программы, которую я написал себе по работе на Java FX, мне попалась задача
попотел и решилось, но очень уж мне хотелось наконец-то добраться до сервлетов. И снова я отложил в сторону задачки – стал рыскать в поиске правильных настроек сервлета, где его писать, как запускать, и как написанные 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, выбор платформы для приложения, и я загрузил его!
Затем из-за того, что там приложение запускается из корня адреса моего приложения, пришлось сделать четыре версии, которые по той же кнопочке Upload and Deploy легко было загружать и выгружать, и в итоге вот такая версия моего ответа на кроссворд висит по адресу http://default-environment-mtdxacy9a3.elasticbeanstalk.com/webcrossword
Теперь по реализации.
Берём папочку с солюшном, или сам файл, но тогда надо указать его правильный паккадж, или создать в нетбинсе паккадж с полным путём
В папочке lib пара скачанных файлов, чтобы в JSP использовать конструкцию

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)
*/
И в общем-то ничего особенного- немного подумал,

<%@ 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
Тренируемся дальше .
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
בבקשה. ( бэвакаша)
бэвакаша
Мой гугл только это нашел.