Поиск по этому блогу

четверг, 22 января 2015 г.

JavaScript + JSP + Redirect

Из JS приложения (клиентская часть приложения написана на JS, а серверная на Java и технологиях Google App Engine) необходимо разлогинить пользователя, который залогинился через аккаунт Google. Для этого необходимо создать jsp файл и в нем подключить классы для работы с авторизацией пользователя


  • com.google.appengine.api.users.UserServiceFactory
  • com.google.appengine.api.users.UserService
  • com.google.appengine.api.utils.SystemProperty


Код  в JS файле

Код, который перекинет пользователя на logout.jsp
location.assign("/logout.jsp")

Получим UserService и создадим переменную url, на которую будем перекидывать пользователя который разлогинился. Проверяем, если мы уже задеплоили проект на сервер Google (SystemProperty.Environment.Value.Production), тогда url получает значение - имя приложения на сервере. Если же мы запустили проект локально, то ссылка и останется localhost:8888. После того как определились со значением переменной url, редиректим пользователя по этой ссылке.
response.sendRedirect(us.createLogoutURL(url + "/login.jsp?force"));

Файл logout.jsp

<%@ page import="com.google.appengine.api.users.UserServiceFactory"%>
<%@ page import="com.google.appengine.api.users.UserService"%>
<%@ page import="com.google.appengine.api.utils.SystemProperty"%>
<%
 UserService us = UserServiceFactory.getUserService();
 String url = "http://localhost:8888";
 if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) {
   if (SystemProperty.applicationId.get().contains("production")) {
     url = "https://production-version-of-app.com";
   } else {
     url = "https://" + SystemProperty.applicationId.get() + ".appspot.com";
   }
 }
        response.sendRedirect(us.createLogoutURL(url + "/login.jsp?force"));
 return;
%>

Java DecimalFormat как показывать необходимое количество нулей

Класс DecimalFormat  предназначен для форматирования десятичных чисел. С его помощью можно настроить сколько знаков после запятой нужно показывать. Иногда необходимо показывать и последние нули в десятичной части числа. Например задано условие показывать всегда 5 чисел после запятой, даже если это нули.

123.45678 должно  показываться как 123.45678
123.45 должно показываться как 123.45000

Правило

DecimalFormat df = new DecimalFormat("#.#####");

Этот формат (Символ "#") будет показывать символ на позиции, только если это не ноль.
Число 123.456 будет показано как 123.456

DecimalFormat df = new DecimalFormat("#.00000");

Этот формат (Символ "0") будет показывать символ на позиции всегда даже если это ноль.
Число 123.456 будет показано как 123.45600

double num = 123.456;
 
DecimalFormat df = new DecimalFormat("#.00000");
 
System.out.println(df.format(num));
 
df = new DecimalFormat("#.######");
 
System.out.println(df.format(num));



понедельник, 19 января 2015 г.

Java оператор instanceof

Оператор instanceof предназначен для того, чтобы определять от какого класса произошел объект. Он может быть нужен в тех случаях, когда мы не знаем точно, объект какого класса к нам вернется и необходимо проверить к какому классу относится полученный объект и в зависимости от этого уже действовать дальше. А также, если какой то объект может содержать другие объекты разных классов, но наследников одного предка, у каждого из которых есть различные методы, которые нам необходимо вызывать.

Рассмотрим пример с GWT. Допустим мы в панель класса SimplePanel добавляем в зависимости от условия либо объект созданного нами класса ListDropDownWidget, либо объект класса Anchor. Оба этих объекта являются виджетами.

SimplePanel panel = new SimplePanel();
if (question.getQuestionType() == QuestionType.CHECKBOXES)
  ListDropdownWidget dropdown = new ListDropdownWidget();
  panel.setWidget(dropdown);
} else {
  String title = "Title";
  Anchor a = new Anchor(title);
  panel.add(a);
}

Теперь нам необходимо перевести содержимое этой панели в состояние readOnly. Для этого нужно получить виджет, который содержится в панели. А в панели может содержаться 2 типа виджетов, как было сказано выше. Поэтому после того, как мы получаем виджет, который содержался в панели, необходимо определить к какому классу он относится. Вот здесь и используется опреатор instanceof. Если содержащийся в панели виджет является объектом класса ListDropdownWidget, то приводим полученный виджет к этому классу и вызываем соответствующий метод. По такой же логике действуем, если виджет является объектом класса Anchor.

public void setReadOnly(boolean readOnly) {
  Widget widget = panel.getWidget(); 
  if (null != widget) { 
    if (widget instanceof ListDropdownWidget) {
      ListDropdownWidget dropdown = ListDropdownWidget widget;
      dropdown.setReadonly(readOnly); 
    } else if (widget instanceof Anchor) {
      Anchor a = (Anchor) widget;
      a.setEnabled(!readOnly);
    }
  }
}

воскресенье, 18 января 2015 г.

CSS. 2 column div layout: right column with fixed width, left fluid

Необходимо создать layout из двух div элементов, стоящих друг за другом  - как два столбца одной таблицы. Причем необходимо чтобы один столбец был фиксированной ширины, а другой изменялся в зависимости от размеров окна и занимал все оставшееся место.


Создадим разметку в HTML

<div class="container">
    <div class="right">
        right content fixed width
    </div>
    <div class="left">
        left content flexible width
    </div>
</div>

У нас есть родительский элемент - div с классом container и два дочерних div элемента с классами right и left.

Это просто два div элемента, где второй лежит под первым, теперь чтобы добиться заданных условий необходимо описать классы CSS для div-элементов.

Сделаем правый div с фиксированной шириной, а левый с изменяемой.
Также важно заметить что хоть правый div в конечном итоге будет располагаться вторым, в исходном HTML коде он должен находиться первым.

Для того чтобы выровнять div элемент по правому краю и зафиксировать его ширину сделаем следующее - зададим ему ширину свойством width и выровняем по правому краю свойством float. 

.right {
    width: 180px;
    float: right;
    background: #aafed6;
}

Для наглядности зададим цвет фона для этого div элемента.

Теперь сделаем левый div изменяемым и независимым от правого. Для того, чтобы при изменении размеров экрана этот div не обтекал соседний а оставался в своих границах добавим свойства width: auto и overflow: hidden.  

.left {
    background: #e8f6fe;
    width: auto;
    overflow: hidden;
}​​

Также добавим свойства overflow: hidden и height (может быть auto) к div элементу, который является контейнером.

.container {
   height: auto;
   overflow: hidden;
}


Заключение


Если правый div имеет свойства float и width, и если левый div не имеет width и float, то левый будет гибким