Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> jsf + ajax, вызовы в архитектуре 
V
    Опции темы
polosatij
  Дата 28.3.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 3
Всего: 8



не могу понять как построена архитектура ajax + jsf в таких фраймворках как icefaces или seam. 
помогите разобраться с вызовами в архитектуре.. а именно.. представим, есть некая страница, которая реализует ajax + jsf, как пример:

Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
          xmlns:ice="http://www.icesoft.com/icefaces/component"
      xmlns:s="http://jboss.com/products/seam/taglib">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <title>JBoss Suites: Seam Framework</title>
    <link href="css/screen.css" rel="stylesheet" type="text/css" />
</head>
<body id="pgHome">
<div id="document">
    <div id="header">
        <div id="title"><img src="img/hdr.title.gif" alt="JBoss Suites: seam framework demo"/></div>
    </div>
    <div id="container">
        <div id="sidebar">            
            <h1>Integrated multi-layer validation</h1>
            <p>
                Robust applications need data validation in several different places. Seam integrates Hibernate Validator,
                a set of annotations for expressing data model constraints in your domain model classes. Then, these 
                constraints are applied almost completely transparently at three levels of the application: by Seam when 
                the user first enters data, by EJB before persisting data to the database, and, if you use Hibernate to 
                generate your database schema, by the database constraints themselves. Multi-layer validation hardens
                your application and protects your data. Even better, it's self-documenting, and easy to change when
                your business rules change.
            </p>
            <p>
               <a href="#" onclick="window.open('exp/registerExp.html','exp','width=752,height=500,scrollbars=yes');">
                  What happens when I register?
               </a>
            </p>
        </div>
        <div id="content">
            <div class="section">
                <h1>Register</h1>
            </div>
            <div class="section">
                
                <h:form id="register">
                <fieldset>
                
                       <s:validateAll>

                        <f:facet name="aroundInvalidField">
                           <s:span styleClass="errors"/>
                        </f:facet>
            
                        <div id="undiv" class="entry">
                            <div class="label"><h:outputLabel for="username">Username:</h:outputLabel></div>
                            <div class="input">
                                <s:decorate>
                                    <ice:inputText id="username" value="#{user.username}" required="true" partialSubmit="true" >
                                    </ice:inputText>
                                    <br/>
                                    <s:message/>
                                </s:decorate>
                            </div>
                        </div>
                        
                        <div id="rndiv" class="entry">
                            <div class="label"><h:outputLabel for="name">Real Name:</h:outputLabel></div>
                            <div class="input">
                                <s:decorate>
                                    <ice:inputText id="name" value="#{user.name}" required="true" partialSubmit="true">
                                    </ice:inputText>
                                    <br/>
                                    <s:message/>
                                </s:decorate>
                            </div>
                        </div>
                        
                        <div id="pw1div" class="entry">
                            <div class="label"><h:outputLabel for="password">Password:</h:outputLabel></div>
                            <div class="input">
                                <s:decorate>
                                    <ice:inputSecret id="password" value="#{user.password}" redisplay="true" required="true" partialSubmit="true" />
                                    <br/>
                                    <h:message for="password"/>
                                </s:decorate>
                            </div>
                        </div>
                        
                        <div id="pw2div" class="entry">
                            <div class="label"><h:outputLabel for="verify">Verify Password:</h:outputLabel></div>
                            <div class="input">
                                <s:decorate>
                                    <ice:inputSecret id="verify" value="#{register.verify}" redisplay="true" required="true" partialSubmit="true"/>
                                    <br/>
                                    <h:message for="verify"/>
                                </s:decorate>
                            </div>
                        </div>

                    </s:validateAll>
                    
                    <div class="entry errors">
                        <h:messages globalOnly="true"/>
                    </div>
                    
                    <div class="entry">
                        <div class="label"> </div>
                        <div class="input">
                            <h:commandButton id="register" value="Register" action="#{register.register}" styleClass="button"/> 
                            <s:link id="cancel" value="Cancel" action="login" linkStyle="button" buttonClass="button"/>
                        </div>
                    </div>
                    
                </fieldset>
                </h:form>
                
            </div>            
        </div>
    </div>
    <div id="footer">Created with JBoss EJB 3.0, Seam, MyFaces, and Facelets</div>
</div>
</body>
</html>




при вызове клиентом данной страницы получаем следующее:

Код

<html xmlns="http://www.w3.org/1999/xhtml"><head><meta content="text/html; charset=iso-8859-1" http-equiv="Content-Type"></meta>
<title>JBoss Suites: Seam Framework</title>
<link href="css/screen.css" rel="stylesheet" type="text/css"></link>
<meta content="Rendered by ICEFaces&acirc;„&cent; D2D" name="icefaces"></meta>
<noscript><meta content="0;url=./xmlhttp/javascript-blocked" http-equiv="refresh"></meta></noscript>
<script language="javascript" src="/seam-icefaces/xmlhttp/icefaces-d2d.js"></script></head>
<body id="body"><iframe frameborder="0" id="history-frame" src="/seam-icefaces/xmlhttp/blank.iface" style="z-index: 10000; visibility: hidden; width: 0; height: 0; opacity: 0.22; filter: alpha(opacity=22);"></iframe>
<div id="document"><div id="header"><div id="title"><img alt="JBoss Suites: seam framework demo" src="img/hdr.title.gif"></img></div></div>
<div id="container"><div id="sidebar"><h1>Integrated multi-layer validation</h1>
<p>
                Robust applications need data validation in several different places. Seam integrates Hibernate Validator,
                a set of annotations for expressing data model constraints in your domain model classes. Then, these 
                constraints are applied almost completely transparently at three levels of the application: by Seam when 
                the user first enters data, by EJB before persisting data to the database, and, if you use Hibernate to 
                generate your database schema, by the database constraints themselves. Multi-layer validation hardens
                your application and protects your data. Even better, it's self-documenting, and easy to change when
                your business rules change.</p>

<p><a href="#" onclick="window.open('exp/registerExp.html','exp','width=752,height=500,scrollbars=yes');">
                  What happens when I register?</a></p></div>
<div id="content"><div class="section"><h1>Register</h1></div>
<div class="section"><form action="iceSubmit('register');" context_type="class com.icesoft.faces.context.BridgeFacesContext" enctype="application/x-www-form-urlencoded" id="register" method="post" onsubmit="return false;" style=""><input name="register" type="hidden" value="register"></input>
<input name="icefacesCssUpdates" type="hidden" value=""></input>
<input name="viewNumber" type="hidden" value="1"></input>
<input name="icefacesID" type="hidden" value="0j7A5cxlreaMtXw0tE_yrw"></input>
<fieldset><div class="entry" id="undiv"><div class="label"><label for="register:username" id="register:_id23" style=""></label>
Username:</div>
<div class="input"><input class="iceInputtext" id="register:username" name="register:username" onblur="setFocus('');iceSubmitPartial(form,this,event); return false;" onfocus="setFocus(this.id);" onkeypress="iceSubmit(form,this,event);" style="" type="text" value=""></input>
<br><span id="register:_id28"></span></div></div>
<div class="entry" id="rndiv"><div class="label"><label for="register:name" id="register:_id30" style=""></label>
Real Name:</div>

<div class="input"><input class="iceInputtext" id="register:name" name="register:name" onblur="setFocus('');iceSubmitPartial(form,this,event); return false;" onfocus="setFocus(this.id);" onkeypress="iceSubmit(form,this,event);" style="" type="text"></input>
<br><span id="register:_id35"></span></div></div>
<div class="entry" id="pw1div"><div class="label"><label for="register:password" id="register:_id37" style=""></label>
Password:</div>
<div class="input"><input class="iceInputtext" id="register:password" name="register:password" onblur="setFocus('');iceSubmitPartial(form,this,event); return false;" onfocus="setFocus(this.id);" onkeypress="iceSubmit(form,this,event);" style="" type="password" value=""></input>
<br><span id="register:_id42"></span></div></div>
<div class="entry" id="pw2div"><div class="label"><label for="register:verify" id="register:_id44" style=""></label>
Verify Password:</div>
<div class="input"><input class="iceInputtext" id="register:verify" name="register:verify" onblur="setFocus('');iceSubmitPartial(form,this,event); return false;" onfocus="setFocus(this.id);" onkeypress="iceSubmit(form,this,event);" style="" type="password" value=""></input>
<br><span id="register:_id49"></span></div></div>
<div class="entry errors"><ul id="register:_id51"></ul></div>
<div class="entry"><div class="label"> </div>
<div class="input"><input class="button" id="register:register" name="register:register" onblur="setFocus('');" onclick="iceSubmit(form,this,event);return false;" onfocus="setFocus(this.id);" style="" type="submit" value="Register"></input>
 <a href="/seam-icefaces/register.seam?actionOutcome=login&amp;cid=2" id="register:cancel">Cancel</a></div></div></fieldset>

<input command_link_hidden_field="command_link_hidden_field" name="focus_hidden_field" type="hidden"></input></form></div></div></div>
<div id="footer">Created with JBoss EJB 3.0, Seam, MyFaces, and Facelets</div>
<div>test</div></div>
<script id="dynamic-code" language="javascript"></script></body></html>


при заполнении таких input полей как id="register:password" и переходе на следующее поле сработает onBlur() и данные будут посланы серверу.. например:

Код

partial=true&ice.event.target=register%3Aname&ice.event.captured=register%3Aname&ice.event.type=onblur

&register=&icefacesCssUpdates=&viewNumber=1&icefacesID=0j7A5cxlreaMtXw0tE_yrw&register%3Ausername=polosatij

&register%3Aname=&register%3Apassword=&register%3Averify=&focus_hidden_field=&focus=&icefacesID=0j7A5cxlreaMtXw0tE_yrw

%2C&viewNumber=1%2C&rand=0.0025119876651192863


и вот с этого момента я не понимаю.. во первых, кто получает эти данные? куда именно они передаются?  smile 


есть ещё один файл, исходя из #{user.password} => а именно класс User. здесь данные проверяются на валидность:

Код

//$Id: User.java,v 1.1 2006/11/20 05:19:01 gavin Exp $
package org.jboss.seam.example.booking;

import static org.jboss.seam.ScopeType.SESSION;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;
import org.hibernate.validator.Pattern;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;

@Entity
@Name("user")
@Scope(SESSION)
@Table(name="Customer")
public class User implements Serializable
{
   private String username;
   private String password;
   private String name;
   
   public User(String name, String password, String username, String test)
   {
      this.name = name;
      this.password = password;
      this.username = username;
   }
   
   public User() {}

   @NotNull
   @Length(max=100)
   public String getName()
   {
      return name;
   }
   public void setName(String name)
   {
      this.name = name;
   }
   
   @NotNull
   @Length(min=5, max=15)
   public String getPassword()
   {
      return password;
   }
   public void setPassword(String password)
   {
      this.password = password;
   }
   
   @Id
   @Length(min=5, max=15)
   @Pattern(regex="^\\w*$", message="not a valid username")
   public String getUsername()
   {
      return username;
   }
   public void setUsername(String username)
   {
      this.username = username;
   }
   
   @Override
   public String toString() 
   {
      return "User(" + username + ")";
   }
}




не пойму.. а где промежуточное звено между ajax-ом и самой ява? как именно вызывается класс User и кто его вызывает?  smile 


--------------------
PM   Вверх
polosatij
  Дата 29.3.2007, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 3
Всего: 8





посмотрев:

jsf + ajax sequence diagram

видно, что должен вызываться контролер (сервлет).. однако у icefaces, например, я не вижу контролера-сервлета.. где же маппинг на контроллер?  smile 



--------------------
PM   Вверх
igor0k
Дата 29.3.2007, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 13.3.2007

Репутация: 1
Всего: 1



Цитата(polosatij @ 29.3.2007,  06:05)
посмотрев:

jsf + ajax sequence diagram

видно, что должен вызываться контролер (сервлет).. однако у icefaces, например, я не вижу контролера-сервлета.. где же маппинг на контроллер?  smile

Странно, посмотрев примеры у icefaces, обнаруживаем, как минимум, два сервлета:
Код

    <servlet>
        <servlet-name>Persistent Faces Servlet</servlet-name>
        <servlet-class>com.icesoft.faces.webapp.xmlhttp.PersistentFacesServlet</servlet-class>
        <load-on-startup> 1 </load-on-startup>
    </servlet>

    <servlet>
        <servlet-name>Blocking Servlet</servlet-name>
        <servlet-class>com.icesoft.faces.webapp.xmlhttp.BlockingServlet</servlet-class>
        <load-on-startup> 1 </load-on-startup>
    </servlet>

    <!-- Persistent Faces Servlet Mapping -->
    <servlet-mapping>
        <servlet-name>Persistent Faces Servlet</servlet-name>
        <url-pattern>*.iface</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>Persistent Faces Servlet</servlet-name>
        <url-pattern>/xmlhttp/*</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>Blocking Servlet</servlet-name>
        <url-pattern>/block/*</url-pattern>
    </servlet-mapping>

PM MAIL   Вверх
polosatij
  Дата 29.3.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

Репутация: 3
Всего: 8



да, ты прав  smile  пасиба  smile 

только я не вижу при POST, на какой УРЛ были отосланы данные, это меня как-то смущает.. не вижу я что данные были отосланы на *.iface  smile 


--------------------
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0628 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.