Профессиональная разработка интернет приложений

Программирование на Java, PHP, Flash…

Maven

MAVEN_OPTS=” -Xmx1024m -XX:MaxPermSize=512m “

Zend Framework

В PHP тоже есть mvc…

Java + Ajax = DWR.

Если вам необходимо использовать в своем java-приложении Ajax, попробуйте DWR – Direct Web Remoting. Эта библиотека позволяет обращаться к серверным java-классам и javascript. Существует множество способов подключения DWR. Мне больше нравитсья работать с аннотациями. Для этого в web.xml необходимо включить следующий код:[xml]

<servlet>
  <description>DWR controller servlet</description>
  <servlet-name>DWR controller servlet</servlet-name>
  <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class>
  <init-param>
    <param-name>classes</param-name>
    <param-value>
      com.example.RemoteFunctions,
      com.example.RemoteBean
    </param-value>
  </init-param>
</servlet>

[/xml]

Scala + maven

mvn org.apache.maven.plugins:maven-archetype-plugin:1.0-alpha-7:create \
-DarchetypeGroupId=org.scala-tools.archetypes \
-DarchetypeArtifactId=scala-archetype-simple \
-DarchetypeVersion=1.1 \
-DremoteRepositories=http://scala-tools.org/repo-releases \
-DgroupId=ru.vaniashev.web -DartifactId=Test

Spring авторизация

Для авторизации в Spring в большинстве случаев используется фреймворк Spring Security. Соответствующие компоненты вы можете включить в проект с помощью плагина m2eclipse.

Для того, чтобы Spring Security обрабатывал запросы, в web.xml необходимо включить соответствующий фильтр:

	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>
			org.springframework.web.filter.DelegatingFilterProxy
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

Для того, чтобы можно было выполнять конфигурацию Spring Security, в dispatcher-servlet необходимо добавить просторанство имен “xmlns:security=”http://www.springframework.org/schema/security”" и в xsi:schemaLocation добавить строки “http://www.springframework.org/schema/security” и “http://www.springframework.org/schema/security/spring-security-2.0.2.xsd”.

Hibernate. Постраничный выбор данных.

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

setMaxResult(), setFirstResult

Посмотреть возможные варианты выбора и сравнить их по скорости

Приложение на Struts с нуля

Struts – это среда, облегчающая разработчику создание приложений соответствующих шаблону MVC.

Сначала необходимо включить Struts в приложение. Для этого, в web.xml необходимо внести следующие строки:

  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>
      org.apache.struts2.dispatcher.FilterDispatcher
    </filter-class>
    <init-param>
      <param-name>actionPackages</param-name>
      <param-value>ru.vaniashev.actions</param-value>
    </init-param>
  </filter>

В этом случае, при старте приложения, запросы будут отправляться FilterDispatcher, который будет выполнять действия, находящиеся в модуле ru.vaniashev.actions.

Аутентификация с помощью Spring Security

Для того, чтобы использовать Spring Security, необходимо чтобы каждый запрос проходил через его фильтр. Для этого фильтр необходимо прописать в web.xml:

<filter>
    <filter-name>filterChainProxy</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
  <filter-name>filterChainProxy</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

Этот фильтр должен быть описан в контексте приложения. Убедитесь, что в пространство имен xml документа, описывающего контекст приложения были включены следующее пространство имен и schema locations:

xmlns:security="http://www.springframework.org/schema/security"
http://www.springframework.org/schema/security 

http://www.springframework.org/schema/security/spring-security-2.0.4.xsd
<bean id="filterChainProxy"
        class="org.springframework.security.util.FilterChainProxy">
  <security:filter-chain-map path-type="ant">
    <security:filter-chain pattern="/**" filters="authenticationProcessingFilter"/>
  </security:filter-chain-map>
</bean>

В цепочке фильтров, описантолько один фильтр – authenticationProcessingFilter, отвечающий за аутентификацию пользователя с помощью html формы:

<bean id="authenticationProcessingFilter" class="org.springframework.security.ui.webapp.AuthenticationProcessingFilter">
    <property name="authenticationManager" ref="authenticationManager" />
    <property name="authenticationFailureUrl" value="/login.jsp?login_error=1" />
    <property name="defaultTargetUrl" value="/" />
    <property name="filterProcessesUrl" value="/j_spring_security_check" />
  </bean>

Для работы этого фильтра, его необходимо связать с authenticationManager, также описанным в контексте приложения:

  <bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager">
    <property name="providers">
      <list>
        <ref local="daoAuthenticationProvider" />
      </list>
    </property>
    <property name="sessionController" ref="concurrentSessionController" />
  </bean>

<bean id="daoAuthenticationProvider"
    class="org.springframework.security.providers.dao.DaoAuthenticationProvider">
  <property name="userDetailsService" ref="userDetailsService"/>
  <property name="userCache" ref="userCache"/>
</bean>

<bean id="concurrentSessionController"
    class="org.springframework.security.concurrent.ConcurrentSessionControllerImpl">
  <property name="maximumSessions" value="1"/>
  <property name="sessionRegistry">
    <bean class="org.springframework.security.concurrent.SessionRegistryImpl"/>
  </property>
</bean>

Включить зависимость Spring Security в проект можно с помощью добавления в pom.xml следующих строк:

<dependency>
	<groupId>org.springframework.security</groupId>
	<artifactId>spring-security-core</artifactId>
	<version>2.0.0</version>
</dependency>

Seam Conversations

Замечательной возможностью Jboss Seam – является управление “разговорами”. По русски это звучит странно, поэтому лучше буду использовать заморское слово – conversation. Для управления conversations, в Seam предусмотренно несколько инструментов:

  1. Управление с помощью аннотирования методов действий
  2. Управление с помощью тегов в файлах описания страниц
  3. Управление с помощью специализированных тегов ссылок и кнопок

Для рассмотрения вышеперечисленных вариантов управления conversations, давайте напишем небольшое приложение, содержащее мастер, состоящий из нескольких страниц.

Для этого, создадим каркас приложения Seam, и реализуем мастер с использованием всех вариантов. На первой странице разместим поле ввода для названия статьи. На второй странице – поле ввода для текста статьи, а на третьей странице – подтверждение создания новой статьи.

Управление conversations с помощью аннотаций:

Модульное тестирование во Flex

Важной составляющей качественного проекта является наличие модульных тестов. Во flex, по сравнению с java достаточно мало возможностей для написание модульных тестов. Причем сама архитектура Flex, основанная на событиях, затрудняет их написание. Одним из фреймворков разработки тестов для Flex приложений является FlexUnit. В этой статье я расскажу об основах работы с ним.

Для начала давайте создадим проект, который мы будем тестировать. Предположим, это будет простое приложение с полем ввода и кнопкой, по нажатию на которую, число в поле ввода будет умножаться само на себя. Результат будет записываться в то же поле ввода.

Код приложения состоит из двух файлов:

FUTest.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
		layout="absolute" 
		width="190" height="40" 
		xmlns:local="*">
	<local:Calculator id="calc"/>
	<mx:Button x="98" y="10" 
		label="Посчитать" 
		click="value.text = calc.process(Number(value.text)).toString()"/>
	<mx:TextInput x="10" y="10" width="80" 
		id="value" text="значение"/>
</mx:Application>

Calculator.as:

package
{
	public class Calculator
	{
		public function Calculator()
		{
		}
		public function process(value:Number):Number{
			if (isNaN(value)){
				return -1;
			}
			return value * value;
		}
	}
}

Работающее приложение выглядит так:

FlexUnit Test

FlexUnit Test

Теперь напишем модульный тест для класса Calculator. Модульные тесты мы будем создавать в новом проекте, в который подключим код ранее созданного нами.

Создаем в том же рабочем пространстве FlexBuilder новый проект. Скачиваем архив с библиотекой и документацией. Разархивируем его.