• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Вопросы по Jave.

  • Автор темы Dymytry
  • Дата начала
L

LuMee

Какие варианты?
1)HashMap<ArrayList<Object>, TransportObject> где ArrayList<Object> заполняется как имя класса+параметр1+....
2)формировать int key, но зачем тогда делать спецкласс? Можно в самом TransportObject сделать int getTransportKey() = class index * 1000 + first param * 100 etc и получить таким образом int ключ.
Вариант с ключом рассмотреть можно, но это не очень ООПно, да и алгоритм расчета этого ключа может оказаться очень запутанным, чтобы значения для разных объектов случайно не совпали.
Можно сделать финт ушами: использовать сами эти классы вместо TransportObject. Для этого надо для всех ваших классов переопределить equals() (и hashCode(), само собой), чтобы эти методы учитывали нужные поля (специфичные для каждого класса) и собственно классы. Поиск получится наподобие такого:
Код:
// ищем красные трехколесные автомобили
Car car = new Car(3, "Red");
ArrayList<Object> cars = hashMap.get(car);
 
D

Dymytry

LuMee, спасибо!

---

Граждане! Все заглянувшие в тему ответьте, пожалуйста.

Мне нужно составить какой-то план по изучению J2EE. Я просто не знаю с чего начать, с какой книги.

Посмотрел Sun руководство - большое, слышал там много воды.
Посмотрел Буди Курнявана, программирование Web-приложений на языке Java - но она вроде как старая.
Идеалом было бы руководство по созданию реально работающего сайта с реляционной БД. Я нашел вот такое руководство по созданию инет-магазина: , пока не знаю смогу ли я разобраться т.к. имею опыт только JavaSE.
Была еще философия J2EE Эккеля, но она наверное уже устарела.

С другой стороны, наверное есть вещи которые описаны в книгах, а учить уже не надо. Слышал, например, что в основном в книгах говорят про некий EJB2, а он уже не актуален.

Отсюда вопросы:
(1) есть ли какая подходящая для моих целей единая книга (можно на английском)?
(2) можете составить ArrayList технологий которые входят в современное понимание "я знаю J2EE"?
(3) какие технологии учить не стоит, или ознакомиться поверхностно?
 
L

LuMee

1. Лично мне прямо вот единой книги не попадалось, много там все-таки технологий разных входит в J2EE
2. В первую очередь, EJB, ознакомиться с которыми можно, в частности, по книге . Затем уже можно переходить к освоению Web-технологий: JSP/Servlet (для начала), JSF (впоследствии) и т.п. В ходе изучения этих вещей, полагаю, станет ясно, что еще нужно знать/уметь.
3. А вот тут все зависит от того, чем придется заниматься по жизни. Те же EJB 2.0, которые вроде как устарели, во многих организациях все еще в ходу.
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Я бы не стал фокусироваться только JEE. Связка Spring/Hibernate весьма востребована.

И изменяемы объекты в качестве ключа для Map надо использовать очень осторожно. Такой подход может стать истоником хитрых багов
 
D

Dymytry

Товарищи, а объясните пожалуйста что не так с моим вторым в жизни сервлетом.

Я сделал все по книжке: HTML файл с кнопкой submit и <form method=”POST” action=”SelectBeer.do”> внутри этой формы, замэпил сервлет на это SelectBeer.do, написал сам сервлет:
Код:
public class BeerSelect extends HttpServlet {

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String c = request.getParameter("color");
PrintWriter out = response.getWriter();
out.println("the param is " + c);
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String c = request.getParameter("color");
PrintWriter out = response.getWriter();
out.println("the param is " + c);
}
}

(На всякий случай добавил в doGet то же самое) В итоге:

- при нажатии submit получаю
type Status report
message /ServletExample/%C3%A2%E2%82%AC%C2%9DSelectBeer.do%C3%A2%E2%82%AC%C2%9D
description The requested resource (/ServletExample/%C3%A2%E2%82%AC%C2%9DSelectBeer.do%C3%A2%E2%82%AC%C2%9D) is not available.


причем адресная строка выглядит так: http://localhost:8084/ServletExample/%C3%A2%E2%82%AC%C2%9DSelectBeer.do%C3%A2%E2%82%AC%C2%9D?%E2%80%9Dcolor%E2%80%9D=%E2%80%9Dlight%E2%80%9D, только вместо того что видите вы там неадекватные кавычки и сомнительные символы. Что-то надо сделать с кодировкой при отправке Post?


- а через get (http://localhost:8084/ServletExample/SelectBeer.do?color=gray) - все работает

Tomcat 6.0.20 через NetBeans.
 
L

LuMee

Хорошо бы увидеть полный код странички, с которой сервлет запрашивается, и содержимое web.xml.
 
D

Dymytry

Вопрос снят, это из-за дурацких кавычек которые я скопировал из книжки...
 
D

Dymytry

Итак, я реализовал свое супер хранилище объектов с составным ключом, нужна критика. Напомню что мне нужно было:
Есть набор объектов-потомков одного родителя.
Объекты различаются по:
- собственно классу
- набору параметров с которым был запущен конструктор
Например:
Транспортные Средства: Автомобиль(Колесо = 4, цвет = белый); Мотоцикл(колесо=2, коляска = true); Телега(); Автомобиль(Колесо=6, цвет=зеленый);
Надо все это где-то хранить так, чтобы по параметрам {Класс, paramList} можно было найти. Но paramlist разный для каждого класса, и перечислить заранее все варианты параметров нельзя.


Я решил делать через создание спец-класса-ключа, по которому можно извлекать объекты из HashMap:

Код:
public class ComplexKeyExample {

class ItemKey {
String iName;
Object[] iParams;

ItemKey(String iname, Object... params) {
iName = iname;
iParams = params;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((iName == null) ? 0 : iName.hashCode());
result = prime * result + Arrays.hashCode(iParams);
return result;
}

@Override
public boolean equals(Object obj) {

if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ItemKey other = (ItemKey) obj;
if (iName == null) {
if (other.iName != null)
return false;
} else if (!iName.equals(other.iName))
return false;
if (!Arrays.equals(iParams, other.iParams))
return false;
return true;	
}				
}

abstract class Item {
ItemKey key;

ItemKey getKey() {
return key;
}
}

class ItemA extends Item{

String iName;

ItemA(int param1, int param2) {	
iName = "ItemA";
key = new ItemKey(iName, new Object[] {param1, param2});
}
}

class ItemB extends Item {

String iName;

ItemB(String param1) {	
iName = "ItemB";
key = new ItemKey(iName, new Object[] {param1});
}
}

void runExample() {

//init		
HashMap<ItemKey, Item> itemsMap = new HashMap<ItemKey, Item>();		

Item item = new ItemA(5, 7);
ItemKey key = item.getKey();
itemsMap.put(key, item);

item = new ItemA(5, 9);
key = item.getKey();
itemsMap.put(key, item);

item = new ItemB("wow-item");
key = item.getKey();
itemsMap.put(key, item);

//my task is to be able to get Item objects from hashmap by the key provided

//now I want to get the item I need
key = new ItemKey("ItemA", new Object[] {35, 7});
item = itemsMap.get(key);

if (item == null) {
System.out.println("map size: " + itemsMap.size() + ", key not found");
} else {
System.out.println("map size: " + itemsMap.size() + ", item found by key");
}

//prints not found

key = new ItemKey("ItemB", new Object[] {"wow-item"});
item = itemsMap.get(key);

if (item == null) {
System.out.println("map size: " + itemsMap.size() + ", key not found");
} else {
System.out.println("map size: " + itemsMap.size() + ", item found by key");
}

//prints found

}
}

Вроде работает. Есть предложения, подводные камни? HashCode & Equals я не менял, оставил так как их переопределяет Eclipse.
 
D

Dymytry

Товарищи, помогите если можете с таким вопросом.

Я обращаюсь из явы к com-интерфейсу с использованием jawin. Дни бытия текли алмазными ручьями, пока мне не понадобилось задать параметр (который на той стороне является double) равным null. Я пробовал и нули, и отрицательные цифры, и джавовский null, и пустые строки - COM-сторона это не понимает и не считает параметр не заданным. То есть я не могу задать его равным null. А у меня из набора параметров хоть один ДОЛЖЕН быть null.

У меня вопрос такой: может ли мне чем-то помочь JNI? Все что я о нем знаю -
Цитата:
The Java Native Interface (JNI) is a programming framework that allows Java code running in a Java Virtual Machine (JVM) to call and to be called[1] by native applications (programs specific to a hardware and operating system platform) and libraries written in other languages, such as C, C++ and assembly.
.

Можно ли из него как-то выполнять ту же самую задачу - запускать метод в com-интерфейсе сторонней программы?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!