Ответы пользователя по тегу Java
  • Getter,setter для чего нужны?

    EugeneP2
    @EugeneP2
    Java Dev
    Это одно из соглашений для класса, что бы он мог использоваться как Java Bean

    Свойства класса должны быть доступны через get, set и другие методы (так называемые методы доступа), которые должны подчиняться стандартному соглашению об именах. Это легко позволяет инструментам автоматически определять и обновлять содержание bean’ов.
    .

    + на данном соглашении работают куча различных сериализаторов xml/json, JPA

    + простые приставки к методам get и set сразу говорят для чего эти методы.

    З.Ы.
    По честному, ручное прописывание getter-ов и setter-ов давно всем надоело и избыточно, потому в современных JVM языках, типа Groovy или Scala методы доступа генерируются автоматически компилятором. Для Java есть фреймверк Lombok, он позволяет автоматически генерировать методы доступа к полям.
    Ответ написан
    Комментировать
  • Может ли servlet обрабатывать несколько страниц?

    EugeneP2
    @EugeneP2
    Java Dev
    Используйте паттерн Model-View-Controller.

    Например, у вас есть приложение Контакты.

    Сервлет будет контроллером обрабатывающий различные манипуляции с контактами.
    Для отображения результатов, форм, списков - используйте jsp

    Вот простенький пример контроллера (сервлета), который обрабатывает CRUD операции с контактами
    @WebServlet(urlPatterns = "/contact")
    public class ContactController extends HttpServlet {
    
    	private ContactDao contactDao = new HashMapContactDao();
    	
    	@Override
    	protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		contactDao.removeById(Long.valueOf(req.getParameter("id")));
    		this.doGet(req, resp);
    	}
    
    	@Override
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		List<Contact> contactList = contactDao.findAll();
    		req.setAttribute("contactList", contactList);
    		req.getRequestDispatcher("view/contact.jsp").forward(req, resp);
    	}
    
    	@Override
    	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		
    		Contact newContact = new Contact();
    		newContact.setLastName(req.getParameter("lastName"));
    		newContact.setFirstName(req.getParameter("firstName"));
    		newContact.setPhone(req.getParameter("phone"));
    		
    		this.contactDao.add(newContact);
    
    		this.doGet(req, resp);
    	}
    
    	@Override
    	protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		
    		Contact newContact = new Contact();
    		newContact.setId(Long.valueOf(req.getParameter("id")));
    		newContact.setLastName(req.getParameter("lastName"));
    		newContact.setFirstName(req.getParameter("firstName"));
    		newContact.setPhone(req.getParameter("phone"));
    
    		this.contactDao.update(newContact);
    		
    		super.doPut(req, resp);
    	}
    }


    Отображение (view) контактов view/contact.jsp
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
    	pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Список контактов</title>
    <style type="text/css">
    table {
    	border-collapse: collapse;
    }
    
    table, td, th {
    	border: 1px solid black;
    }
    </style>
    </head>
    <body>
    
    	<h1>Список контактов</h1>
    
    	<form method="post">
    		<fieldset>
    			<legend>Новый контакт</legend>
    			<p>
    				<label>Фамилия: <input type="text" name="lastName" /></label>
    			</p>
    			<p>
    				<label>Имя: <input type="text" name="firstName" /></label>
    			</p>
    			<p>
    				<label>Номер телефона: <input type="text" name="phone" /></label>
    			</p>
    			<p>
    				<button>Создать</button>
    			</p>
    		</fieldset>
    	</form>
    
    	<table style="border: 1px solid black;">
    		<tr>
    			<th>№</th>
    			<th>Фамилия</th>
    			<th>Имя</th>
    			<th>Номер телефона</th>
    		</tr>
    
    
    		<c:if test="${contactList != null}">
    			<c:forEach items="${contactList}" var="c">
    
    				<tr>
    					<td>${c.id}</td>
    					<td>${c.lastName}</td>
    					<td>${c.firstName}</td>
    					<td>${c.phone}</td>
    				</tr>
    
    			</c:forEach>
    		</c:if>
    	</table>
    
    </body>
    </html>


    Модель
    public class Contact {
    
    	private Long id;
    	private String lastName;
    	private String firstName;
    	private String phone;
    
    	public Contact() {
    	}
    
    	public Contact(String lastName, String firstName, String phone) {
    		this.lastName = lastName;
    		this.firstName = firstName;
    		this.phone = phone;
    	}
    
    	public Long getId() {
    		return id;
    	}
    
    	public void setId(Long id) {
    		this.id = id;
    	}
    
    	public String getLastName() {
    		return lastName;
    	}
    
    	public void setLastName(String lastName) {
    		this.lastName = lastName;
    	}
    
    	public String getFirstName() {
    		return firstName;
    	}
    
    	public void setFirstName(String firstName) {
    		this.firstName = firstName;
    	}
    
    	public String getPhone() {
    		return phone;
    	}
    
    	public void setPhone(String phone) {
    		this.phone = phone;
    	}
    
    
    	@Override
    	public String toString() {
    		return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    	}
    }


    А доступ к данным и их манипуляциями мы отделяем слоем DAO (простенькая реализация на основе HashMap). Благодаря интерфейсу, в будущем мы сможем подставить любую реализацию, например хранение контактов в базе данных.

    public class HashMapContactDao implements ContactDao {
    
    	private AtomicLong idCounter = new AtomicLong();
    	private Map<Long, Contact> map = new ConcurrentHashMap<Long, Contact>();
    	
    	@Override
    	public List<Contact> findAll() {
    		return new ArrayList<Contact>(this.map.values());
    	}
    
    	@Override
    	public void removeById(Long id) {
    		this.map.remove(id);
    	}
    
    	@Override
    	public Contact add(Contact contact) {
    		Long newId = this.idCounter.incrementAndGet();
    		contact.setId(newId);
    		this.map.put(newId, contact);
    		return contact;
    	}
    
    	@Override
    	public void update(Contact contact) {
    		this.map.put(contact.getId(), contact);
    	}
    }


    З.Ы.
    Хоть это и "низкий уровень", но с ним разобраться нужно. Потом конечно лучше использовать Spring MVC
    Ответ написан
    3 комментария
  • Какая разница между этими способами ввода?

    EugeneP2
    @EugeneP2
    Java Dev
    Вместе с JDK можно скачать и исходный код стандартных библиотек джавы. В любой IDE, зажав CTRL и кликнув по имени того, или иного класса, можно перейти к его исходному коду и полюбопытствовать, что же там такое происходить...

    В вашем примере мы видим два конструктора, один принимает символьный поток (Reader), а другой - байтовый поток ("сырые" данные) (InputStream).

    Scanner предназначен для удобного чтения текста из потока, т.е. ему нужен символьный поток (Reader). А что он делает с байтовым поток? - правильно, оборачивает его в Reader:) И если зайти в код конструктора, то мы это увидем:
    public Scanner(InputStream source) {
            this(new InputStreamReader(source), WHITESPACE_PATTERN);
        }

    Все просто, в зависимости от доступного вам потока (Reader/InputStream), вы используете соответствующий конструктор Scanner-а. В вашем примере оба варианта делают одно и тоже.

    Библиотека java.io состоит из декораторов (паттерн такой), они как матрешки, вкладывая их один в другой, вы добавляете функционал.

    Байтовы поток, а нужен символьный? - пффф... обвернули его InputStreamReader. Нужна буферизация? - легко, Обвернули в BufferedReader.
    Ответ написан
    1 комментарий
  • Как создать сайт на javaEE?

    EugeneP2
    @EugeneP2
    Java Dev
    Для начала разберитесь с Servlet API, поставьте Tomcat, напишите сервлет. Потом JSP + JSTL
    Ответ написан
    1 комментарий
  • Нужна ли продукция apple для создания приложений на java?

    EugeneP2
    @EugeneP2
    Java Dev
    По-моему в iOS нет джавы. Пишут на ObjectiveC
    Ответ написан
    3 комментария
  • Как на Java массив пикселей записать в иображение?

    EugeneP2
    @EugeneP2
    Java Dev
    public static void main(String[] args) throws IOException {
    		
    		BufferedImage png = ImageIO.read(new File("image.png"));
    		
    		Color color = new Color(0, 0, 0);
    		
    		png.setRGB(2, 2, color.getRGB());
    		
    		ImageIO.write(png, "png", new File("image.png"));
    
    	}
    Ответ написан
    5 комментариев
  • Насколько нужно знать java для Spring Framework? И зачем нужна java EE?

    EugeneP2
    @EugeneP2
    Java Dev
    Нужно знать Java SE + Servlet API (это уже из Java EE).

    Spring дает все те же возможности (IoC и DI, транзакции и.д.) что и Java ЕЕ, только проще в использовании и не нужен сервер приложение (jboss, glassfish), достаточно tomcat или jetty.

    Java EE это набор спецификаций и интерфейсов, который реализуют производители серверов приложений (jboss, glassfish). Spring - как простая альтернатива.
    Ответ написан
    2 комментария
  • Правильно ли я понял как работает вызов метода из ссылки типа родительского класса?

    EugeneP2
    @EugeneP2
    Java Dev
    Это определяет не компилятором, а в рантайме. Это называется динамическое связывание
    Ответ написан
    3 комментария
  • Jsp -> servlet -> jsp, как передать данные?

    EugeneP2
    @EugeneP2
    Java Dev
    Метод doGet должен просто форвордить на jsp, на которой ваша форма, которая отправляет POST запрос, который обрабатывает метод doPost. Результат обработки, вы добавляете в реквест с помощью методов setAttribute.

    setAttribute - метод HttpServletRequest-а специально предназначен для передачи данных между сервлетами/jsp

    Погуглите вот это "java servlet mvc"
    Ответ написан
    Комментировать
  • Tutorial или open source приложение БД на java?

    EugeneP2
    @EugeneP2
    Java Dev
    1. JDBC, SQL
    2. Tomcat, Servlet
    3. JSP, JSTL, html, css
    4. JS, JQuery
    5. spring MVC, spring jdbc
    6. JPA, Hibernate
    Ответ написан
    Комментировать
  • Преобразование BLOB к ArrayList?

    EugeneP2
    @EugeneP2
    Java Dev
    Вот рабочий пример. Одно только условие, класс CabinetSquad должен наследовать Serializable интерфейс.

    List<CabinetSquad> list = new ArrayList<CabinetSquad>(Arrays.asList(
    
    		new CabinetSquad("a", 1), new CabinetSquad("b", 2), new CabinetSquad("c", 3)
    
    		));
    
    		ByteArrayOutputStream bout = new ByteArrayOutputStream();
    
    		ObjectOutputStream ooStream = new ObjectOutputStream(bout);
    		try {
    			ooStream.writeObject(list);
    		} finally {
    			try {
    				ooStream.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		}
    
    		byte[] byteArray = bout.toByteArray();
    
    		// ----------------------------------
    
    		Connection con = dataSource.getConnection();
    		try {
    
    			Statement s = con.createStatement();
    			s.executeUpdate("CREATE TABLE ARRAY_LIST (id int not null primary key, list blob not null)");
    			s.close();
    
    			// -----------------------------
    
    			PreparedStatement p = con.prepareStatement("INSERT INTO ARRAY_LIST VALUES (?,?)");
    			p.setInt(1, 1);
    			p.setBlob(2, new ByteArrayInputStream(byteArray));
    			p.executeUpdate();
    			p.close();
    
    			// ------------------------------------------------
    
    			PreparedStatement p2 = con.prepareStatement("SELECT list FROM ARRAY_LIST WHERE id = ?");
    
    			p2.setInt(1, 1);
    
    			ResultSet rs = p2.executeQuery();
    
    			if (rs.next()) {
    
    				Blob blob = rs.getBlob("list");
    
    				ObjectInputStream objectInputStream = new ObjectInputStream(blob.getBinaryStream());
    				try {
    
    					List<CabinetSquad> recoverList = (List<CabinetSquad>) objectInputStream.readObject();
    
    					for (CabinetSquad sc : recoverList) {
    						System.out.println(sc);
    					}
    
    				} finally {
    					try {
    						objectInputStream.close();
    					} catch (Exception e) {
    						e.printStackTrace();
    					}
    				}
    
    			}
    
    			rs.close();
    			p2.close();
    
    		} finally {
    			try {
    				con.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    Ответ написан
    Комментировать
  • Как устроены списки в Java?

    EugeneP2
    @EugeneP2
    Java Dev
    Метод deleteElement реализован не правильно. Операция '==' сравнивает ссылки на объекты, а не сами объекты.

    Например, если у вас в списке есть объект Node со значением поля data = 10, и вы хотите его удалить

    Node delNode = new Node();
    delNode.data = 10;

    deleteElement(delNode); // ничего не удалится

    потому что ссылка delNode и ссылка в списке ссылаются на разные объекты.
    В джаве для сравнения переопределяют метод equals, в котором реализуют сравнение полей класса.

    Вот так это должно выглядеть
    if (delNode.equals(head)) {
          head = head.next;
          return;
        } else {
          
          for (Node p = head; p != null; p = p.next) {
            if (delNode.equals(p.next)) {
              p.next = delNode.next;
            }		
          }


    Отличие структуры от класса в том, что класс позволяет реализовать наследование, инкапсуляцию и полиморфизм.
    Ответ написан
    7 комментариев
  • Как правильно работать с JSON в JAVA?

    EugeneP2
    @EugeneP2
    Java Dev
    gson от google, проще не бывает )
    google-gson

    Gson gson = new GsonBuilder().create();
    
    String json = gson.toJson(someObject);
    
    SomeObject newso = gson.fromJson(json, SomeObject.class);
    Ответ написан
    3 комментария
  • Где на практике применяется рефлексия? Зачем она может в принципе понадобиться при написании проекта?

    EugeneP2
    @EugeneP2
    Java Dev
    Рефлексия - это инструмент с помощью которого можно узнать всю информацию о классе: имена методов, параметры, поля, аннотации и т.д.
    Эти возможности во всю используются во фреймверках, таких как Spring, Hibernate...
    Различные сериализаторы json/xml
    Ответ написан
    6 комментариев
  • Где на практике и при каких задачах применяется проверка равнозначности объектов?

    EugeneP2
    @EugeneP2
    Java Dev
    В большинстве случаев метод equals + hashCode реализуются, чтоб объект класса корректно хранился в Map и Set коллекциях. Внутренняя реализация коллекций используется эти методы.
    Ответ написан
    Комментировать
  • Где можно проверить свои знания по теории Java?

    EugeneP2
    @EugeneP2
    Java Dev
    Лучший способ - это сходить на тех собеседование в ИТ контору
    Ответ написан
    Комментировать
  • Как работает класс object в этом кода?

    EugeneP2
    @EugeneP2
    Java Dev
    Object clone = x.clone();

    Это клон(копия) объекта класса Date.

    Дальше его нужно привести к типу Date
    Date cloneDate = (Date) clone;

    Почему clone() возвращает Object ? - потому как этот метод наследуется от класса Object, а так как все типы в джаве наследуют класс Object, следовательно clone() должен возвращать общий для всех типов тип - Object

    UPDATE:

    Для начала нужно разобраться, почему же все таки нужно переопределять метод clone(), а не воспользоватся наследуемой нативной реализацией данного метода. Все дело в том, что базовый метод клонирование выполняет только поверхностное копирование. Будут скопированные только значения полей класса. Для примитивных типов (int, byte, char), все будет норм, но если это массивы, коллекции, объекты (например Date), или ваши типы, то будут скопированы только ссылки на них. В итогу клонирования у нас будет два объекта, у которых поля ссылаются на одни и те же поля, и через эти поля можно повлиять на все объекты которые клонировались:

    class TestClone implements Cloneable {
        		
        		private Date date = new Date();
    
    			public Date getDate() {
    				return date;
    			}
    
    			public void setDate(Date date) {
    				this.date = date;
    			}
    
    			@Override
    			protected Object clone() throws CloneNotSupportedException {
    				return super.clone();
    			}
        	}
        	
        	TestClone a = new TestClone();
        	TestClone b = (TestClone) a.clone();
        	System.out.println(a.getDate());
        	System.out.println(b.getDate());
        	b.getDate().setYear(0);
        	System.out.println(a.getDate());
        	System.out.println(b.getDate());
    
    
    
    // Fri Jul 10 23:13:47 EEST 2015
    // Fri Jul 10 23:13:47 EEST 2015
    // изменили один, а поменялось два
    // Tue Jul 10 23:13:47 EET 1900
    // Tue Jul 10 23:13:47 EET 1900


    Такое не пройдет, если будут неизменяемые (immutable) классы, тот же String. У него нет методов для изменения состояния.

    Потому то и нужно переопределять метод clone и выполнять глубокое копирование всех изменяемых объектов на который ссылаются поля (если есть такие).

    class TestClone implements Cloneable {
        		
        		private Date date = new Date();
        		private String s = "string"; // этот не нужно клонировать
        		
    			public Date getDate() {
    				return date;
    			}
    
    			public void setDate(Date date) {
    				this.date = date;
    			}
    
    			@Override
    			protected Object clone() throws CloneNotSupportedException {
    				TestClone clone = (TestClone) super.clone();
    				if (this.date != null) {
    					clone.date = (Date) this.date.clone();
    				}
    				return clone;
    			}
        	}
    
    
    Fri Jul 10 23:25:16 EEST 2015
    Fri Jul 10 23:25:16 EEST 2015
    // теперь это действительно клоны
    Fri Jul 10 23:25:16 EEST 2015
    Tue Jul 10 23:25:16 EET 1900


    Почему JVM само не может выполнить глубокое клонирование? - Потому как JVM не в курсе насколько клонирование должно быть глубоким:) И как правильно нужно копировать поля, со всеми нюансами, которые задумал программист:)

    ИМХО: интерфейс маркер Cloneable обязателен, чтоб можно было понять, переопределен ли метод clone в класса или нет.

    TestClone с = new TestClone();
        	
        	if (с instanceof Cloneable) {
        		System.out.println("ок, меня можно клонировать");
        	}


    PS
    Есть готовое решение от google для глубокого клонирование.
    Отличная статья: Глубокое клонирование в Java без велосипедов
    Ответ написан
    8 комментариев
  • ASUS ZENBOOK UX305 подходит для работы?

    EugeneP2
    @EugeneP2
    Java Dev
    Intel Core M-5Y10

    "Core M-5Y10 способен использовать широкий диапазон рабочих частот, на деле ограниченный доступным охлаждением. Если при нагрузке в течение короткого времени производительность не уступает Core i5-4202Y (Haswell, 11.5 Вт), то при продолжительной нагрузке и отсутствии активного охлаждения нагрев процессора приведет к снижению быстродействия. "

    Смотрите в сторону ноутбуков с процессоров Intel i5 и памятью 8 Гиг
    Ответ написан
    Комментировать
  • Как найти строку в txt файле?

    EugeneP2
    @EugeneP2
    Java Dev
    File file = new File("src/main/resources/textfile.txt");
    
    	Scanner scanner = new Scanner(file);
    	try {
    	    
    	    while(scanner.hasNextLine()) {
    		String line = scanner.nextLine();
    		
    		String[] cols = line.split(" ");
    		
    		if (cols[4].equals("17.08.2015")) {
    		    System.out.println(line);
    		}		
    	    }
    	    
    	} finally {	    
    	    scanner.close();
    	}
    Ответ написан
    1 комментарий