ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>视频一区二区精品,亚洲欧美一区二区三区在线播放,麻豆精品视频在线观看免费http://www.aygfsteel.com/chinajox/category/4111.html我们爱JAVAzh-cnTue, 27 Feb 2007 14:13:30 GMTTue, 27 Feb 2007 14:13:30 GMT60[Struts]处理表单中å€égØ“½Iºçš„æ—¥æœŸ¾cÕdž‹å­—段 转自《博客园》八˜q›åˆ¶ http://www.aygfsteel.com/chinajox/articles/16885.htmlJAVA牛棚JAVA牛棚Wed, 26 Oct 2005 08:01:00 GMThttp://www.aygfsteel.com/chinajox/articles/16885.htmlhttp://www.aygfsteel.com/chinajox/comments/16885.htmlhttp://www.aygfsteel.com/chinajox/articles/16885.html#Feedback0http://www.aygfsteel.com/chinajox/comments/commentRss/16885.htmlhttp://www.aygfsteel.com/chinajox/services/trackbacks/16885.html 作者:tendre
在示范中心项目中åQŒæˆ‘们把ActionForm中日期类型的字段指定为String¾cÕdž‹åQŒè€Œåœ¨å¯¹åº”çš„JavaBeanä¸­æŒ‡å®šäØ“java.sql.Date¾cÕdž‹ã€‚当用户提交表单的时候,在Action里ä‹É用BeanUtils.copyProperties()æ–ÒŽ³•从ActionForm构造JavaBean对象åQˆè¯¦è§åˆ©ç”¨BeanUtils在对象间复制属性)。这个方法在大部分时候都很好åQŒä½†æœ‰ä¸€ä¸ªé—®é¢˜ï¼Œž®±æ˜¯å½“用æˆäh²¡æœ‰å¡«å†™æ—¥æœŸç±»åž‹å­—ŒD‰|—¶åQˆè€Œè¯¥å­—段òq‰™žå¿…å¡«åQ‰ï¼Œvalidator不会提出警告åQŒè€Œåœ¨copyProperties()时会报类型è{换异常,原因是这时ActionForm中的该字ŒD늚„值是½Iºå­—½W¦ä¸²åQ?"åQ‰ï¼Œè´Ÿè´£å­—符串向Date转换的SqlDateConverter¾c»è°ƒç”¨Date.valueOf("")æ–ÒŽ³•åQŒæ˜¾ç„?"是无法è{æ¢äØ“æ—¥æœŸçš„ï¼Œæ‰€ä»¥ä¼šæŠ›å‡ºå¼‚å¸¸ã€?BR>
通过查看代码和资料,我发现这个问题的解决æ–ÒŽ³•其实非常½Ž€å•。只要把带缺省值参数的SqlDateConverter重新注册一下,覆盖原有的注册信息就可以了,˜q™ä¸ªæ³¨å†Œè¯­å¥ä¸€èˆ¬æ˜¯å†™åœ¨¾pȝ»Ÿåˆè¯•化的地方åQŒå¯¹äºŽStruts应用½E‹åºåQŒå½“然做在PlugIn里最方便。代码如下:


package etc;

import javax.servlet.ServletException;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.SqlDateConverter;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;

public class ConverterPlugIn implements PlugIn{

    public void init(ActionServlet servlet, ModuleConfig config) throws ServletException {
        ConvertUtils.register(new SqlDateConverter(null),java.sql.Date.class);
    }

    public void destroy() {
        ConvertUtils.deregister();
    }
}

注意SqlDateConverter的构造方法是带有参数null的,˜q™è¡¨½Cºé‡åˆîC¸èƒ½è§£æžçš„字符串就˜q”回½Iºå€¹{€‚而deregister()æ–ÒŽ³•的作用是恢复ConvertUtilsçš„ç¼ºçœæ³¨å†Œè¡¨ã€‚äØ“äº†ä‹É˜q™ä¸ªPlugIn起作用,要在struts-config.xml里增加一句话åQ?BR>
<plug-in className="etc.ConverterPlugIn" />
日期字段往往会给我们的开发带来麻烦,其实在Struts应用½E‹åºé‡Œï¼Œåªè¦æŠŠè¿™äº›è{换类搞熟了,æ€Õd¯ä»¥æ‰¾åˆ°å¾ˆæ–¹ä¾¿çš„办法。常见的问题˜q˜æœ‰å¦‚何指定日期输入格式åQŒæ€Žæ ·å¤„理java.util.Dateçš„è{换,½{‰ç­‰åQŒåœ¨˜q™ä¸ªé“¾æŽ¥é‡Œæœ‰è§£å†³˜q™äº›é—®é¢˜çš„æ–¹æ³•,道理都是一æ ïLš„ã€?/FONT>

]]>
Java框架研究——JSF与Struts的异å?[转自赛èé_¾|‘] http://www.aygfsteel.com/chinajox/articles/16884.htmlJAVA牛棚JAVA牛棚Wed, 26 Oct 2005 07:58:00 GMThttp://www.aygfsteel.com/chinajox/articles/16884.htmlhttp://www.aygfsteel.com/chinajox/comments/16884.htmlhttp://www.aygfsteel.com/chinajox/articles/16884.html#Feedback0http://www.aygfsteel.com/chinajox/comments/commentRss/16884.htmlhttp://www.aygfsteel.com/chinajox/services/trackbacks/16884.html作者:RKIND

Strutså’ŒJSF/Tapestry都属于表现层框架åQŒè¿™ä¸¤ç§åˆ†å±žä¸åŒæ€§è´¨çš„æ¡†æžÓž¼ŒåŽè€…是一¿Uäº‹ä»‰™©±åŠ¨åž‹çš„ç»„ä»¶æ¨¡åž‹ï¼Œè€ŒStruts只是单纯的MVC模式框架åQŒè€å¤–æ€ÀL˜¯æ€¥å¼åÆD¯´äº‹äšg驱动型就比MVC模式框架好,何以见得åQŒæˆ‘们下面进行详¾l†åˆ†æžæ¯”较一下到底是怎么回事åQ?/FONT>

首先事äšg是指从客æˆïL«¯™åµé¢åQˆæµè§ˆå™¨åQ‰ç”±ç”¨æˆ·æ“ä½œè§¦å‘的事ä»Óž¼ŒStruts使用Action来接受浏览器表单提交的事ä»Óž¼Œ˜q™é‡Œä½¿ç”¨äº†Command模式åQŒæ¯ä¸ªç‘ô承Action的子¾c»éƒ½å¿…须实现一个方法executeã€?/FONT>

在Struts中,实际是一个表单Form对应一个Action¾c?或DispatchAction)åQŒæ¢ä¸€å¥è¯è¯ß_¼šåœ¨Struts中实际是一个表单只能对应一个事ä»Óž¼ŒStruts˜q™ç§äº‹äšg方式¿UîCØ“application eventåQŒapplication eventå’ŒComponent event相比是一¿Uç²—¾_’度的事件ã€?/FONT>

Struts重要的表单对象ActionForm是一¿Uå¯¹è±¡ï¼Œå®ƒä»£è¡¨äº†ä¸€¿Uåº”用,˜q™ä¸ªå¯¹è±¡ä¸­è‡³ž®‘包含几个字ŒDµï¼Œ˜q™äº›å­—段是Jsp™åµé¢è¡¨å•中的input字段åQŒå› ä¸ÞZ¸€ä¸ªè¡¨å•对应一个事ä»Óž¼Œæ‰€ä»¥ï¼Œå½“我们需要将事äšg¾_’度¾l†åŒ–到表单中˜q™äº›å­—段æ—Óž¼Œä¹Ÿå°±æ˜¯è¯´åQŒä¸€ä¸ªå­—ŒDµå¯¹åº”一个事件时åQŒå•¾U¯ä‹É用Strutsž®×ƒ¸å¤ªå¯èƒ½ï¼Œå½“然通过¾l“合JavaScript也是可以转弯实现的ã€?/FONT>

而这¿Uæƒ…况ä‹É用JSFž®±å¯ä»¥æ–¹ä¾¿å®žçŽ?
 

<h:inputText id="userId" value="#{login.userId}">
<f:valueChangeListener type="logindemo.UserLoginChanged" />
</h:inputText>
 

 

#{login.userId}表示从名为loginçš„JavaBeançš„getUserId获得的结果,˜q™ä¸ªåŠŸèƒ½ä½¿ç”¨struts也可以实玎ͼŒname="login" property="userId"

关键是第二行åQŒè¿™é‡Œè¡¨½Cºå¦‚æžœuserIdçš„å€¼æ”¹å˜åÆˆä¸”ç¡®å®šæäº¤åŽåQŒå°†è§¦å‘调用¾c»UserLoginChangedçš„processValueChanged(...)æ–ÒŽ³•ã€?

JSF可以为组件提供两¿Uäº‹ä»Óž¼šValue Changedå’?Action. 前者我们已¾låœ¨ä¸ŠèŠ‚è§è¯†˜q‡ç”¨å¤„,后者就相当于struts中表单提交Action机制åQŒå®ƒçš„JSF写法如下åQ?


<h:commandButton id="login" commandName="login">
<f:actionListener type=”logindemo.LoginActionListener�/>
</h:commandButton>
 

从代码可以看出,˜q™ä¸¤¿Uäº‹ä»¶æ˜¯é€šè¿‡Listerner˜q™æ ·è§‚察者模式脓在具体组件字ŒDµä¸Šçš„,而Struts此类事äšg是原始的一¿Uè¡¨å•提交Submit触发机制。如果说前者比较语­a€åŒ–(¾~–程语言习惯做法¾cÖM¼¼Swing¾~–程åQ‰ï¼›åŽè€…是属于WEBåŒ–ï¼Œå› äØ“å®ƒæ˜¯æ¥è‡ªHtml表单åQŒå¦‚果你èµäh­¥æ˜¯ä»ŽPerl/PHP开始,反而容易接受Struts˜q™ç§é£Žæ ¼ã€?/FONT>

基本配置

Strutså’ŒJSF都是一¿Uæ¡†æžÓž¼ŒJSF必须需要两¿UåŒ…JSF核心包、JSTL包(标签库)åQŒæ­¤å¤–,JSF˜q˜å°†ä½¿ç”¨åˆ°Apache™å¹ç›®çš„一些commons包,˜q™äº›Apache包只要部¾|²åœ¨ä½ çš„æœåŠ¡å™¨ä¸­æ—¢å¯ã€?/FONT>

JSF包下载地址åQ?/FONT>http://java.sun.com/j2ee/javaserverfaces/download.html选择其中Reference Implementationã€?/FONT>

JSTL包下载在http://jakarta.apache.org/site/downloads /downloads_taglibs-standard.cgi

所以,从JSF的驱动包¾l„成看,其开源基因也占据很大的比重,JSF是一个SUNä¼™ä¼´ä»¬å·¥ä¸šæ ‡å‡†å’Œå¼€æºä¹‹é—´çš„ä¸€ä¸ªæØœè¡€å„ѝ€?
 

上述两个地址下蝲的jaråˆåÆˆåœ¨ä¸€èµ·å°±æ˜¯JSF所需要的全部驱动包了。与Strutsçš„é©±åŠ¨åŒ…ä¸€æ øP¼Œ˜q™äº›é©±åŠ¨åŒ…å¿…™åÖM½äºŽWeb™å¹ç›®çš„WEB-INF/libåQŒå’ŒStruts一æ ïLš„æ˜¯ä¹Ÿå¿…须在web.xml中有如下配置åQ?/FONT>


<web-app>
  <servlet>
  <servlet-name>Faces Servlet</servlet-name>
  <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  <servlet-name>Faces Servlet</servlet-name>
  <url-pattern>*.faces</url-pattern>
  </servlet-mapping>
    </web-app>
 

 

˜q™é‡Œå’ŒStrutsçš„web.xmlé…ç½®ä½•å…¶ç›æ€¼¼åQŒç®€ç›´ä¸€æ¨¡ä¸€æ —÷€?

正如Strutsçš„struts-config.xmlä¸€æ øP¼ŒJSF也有¾cÖM¼¼çš„faces-config.xml配置文äšgåQ?


<faces-config>
  <navigation-rule>
  <from-view-id>/index.jsp</from-view-id>
  <navigation-case>
   <from-outcome>login</from-outcome>
  <to-view-id>/welcome.jsp</to-view-id>
  </navigation-case>
  </navigation-rule>
  <managed-bean>
  <managed-bean-name>user</managed-bean-name>
  <managed-bean-class>com.corejsf.UserBean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
  </managed-bean>
    </faces-config>
 

在Struts-config.xml中有ActionForm Action以及Jsp之间的流½E‹å…³¾p»ï¼Œåœ¨faces-config.xml中,也有˜q™æ ·çš„æµ½E‹ï¼Œæˆ‘们具体解释一下NavigationåQ?/FONT>

在index.jsp中有一个事ä»Óž¼š

 

 

<h:commandButton label="Login" action="login" />
 

 

Action的值必™åÕdŒ¹é…form-outcomeå€û|¼Œä¸Šè¿°Navigation配置表示åQšå¦‚果在index.jsp中有一个login事äšgåQŒé‚£ä¹ˆäº‹ä»¶è§¦å‘后下一个页面将是welcome.jsp

JSF有一个独立的事äšg发生和页面导航的‹¹ç¨‹å®‰æŽ’åQŒè¿™ä¸ªæ€èµ\比struts要非常清晰ã€?

managed-bean¾cÖM¼¼Strutsçš„ActionFormåQŒæ­£å¦‚可以在struts-config.xml中定义ActionFormçš„scopeä¸€æ øP¼Œ˜q™é‡Œä¹Ÿå®šä¹‰äº†managed-beançš„scope为sessionã€?

ä½†æ˜¯å¦‚æžœä½ åªä»¥äØ“JSFçš„managed-beanž®Þp¿™ç‚¹åŠŸèƒ½å°±é”™äº†åQŒJSF融入了新的Ioc模式/依赖性注ž®„等技术ã€?
 
 

对于Userbean˜q™æ ·ä¸€ä¸ªmanaged-beanåQŒå…¶ä»£ç å¦‚下åQ?


public class UserBean {
  private String name;
  private String password;

  // PROPERTY: name
  public String getName() { return name; }
  public void setName(String newValue) { name = newValue; }

  // PROPERTY: password
  public String getPassword() { return password; }
  public void setPassword(String newValue) { password = newValue; }
    }

    <managed-bean>
  <managed-bean-name>user</managed-bean-name>
  <managed-bean-class>com.corejsf.UserBean</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>

  <managed-property>
  <property-name>name</property-name>
  <value>me</value>
  </managed-property>

  <managed-property>
  <property-name>password</property-name>
  <value>secret</value>
  </managed-property>
    </managed-bean>
 

faces-config.xml˜q™æ®µé…ç½®å…¶å®žæ˜¯å°†"me"赋值给nameåQŒå°†secret赋值给passwordåQŒè¿™æ˜¯é‡‡å–Ioc模式中的Setter注射方式ã€?/FONT>

Backing Beans

对于一个web formåQŒæˆ‘们可以ä‹É用一个bean包含其涉及的所有组ä»Óž¼Œ˜q™ä¸ªbeanž®Þq§°ä¸ºBacking BeanåQ?Backing Bean的优ç‚ÒŽ˜¯åQšä¸€ä¸ªå•个类可以ž®è£…相关一¾pÕdˆ—功能的数据和逻辑ã€?/FONT>

说白了,ž®±æ˜¯ä¸€ä¸ªJavabean里包含其他JavabeanåQŒäº’相调用,属于Facade模式或Adapter模式ã€?/FONT>

对于一个Backing Beans来说åQŒå…¶ä¸­åŒ…含了几个managed-beanåQŒmanaged-bean一定是有scope的,那么˜q™å…¶ä¸­çš„几个managed-beans如何配置它们的scope呢?


<managed-bean>
  ...
  <managed-property>
  <property-name>visit</property-name>
  <value>#{sessionScope.visit}</value>
  </managed-property>
 

 

˜q™é‡Œé…ç½®äº†ä¸€ä¸ªBacking Beans中有一个setVisitæ–ÒŽ³•åQŒå°†˜q™ä¸ªvisit赋å€égØ“session中的visitåQŒè¿™æ ·ä»¥åŽåœ¨½E‹åºä¸­æˆ‘们只½Ž¡è®¿é—®visit对象åQŒä»Žä¸­èŽ·å–æˆ‘ä»¬å¸Œæœ›çš„æ•°æ®åQˆå¦‚用户登陆注册信息åQ‰ï¼Œè€Œvisit是保存在session˜q˜æ˜¯application或request只需要配¾|®æ—¢å¯ã€?

UI界面

JSFå’ŒStrutsä¸€æ øP¼Œé™¤äº†JavaBeans¾cÖM¹‹å¤–,˜q˜æœ‰™åµé¢è¡¨çŽ°å…ƒç´ åQŒéƒ½æ˜¯æ˜¯ä½¿ç”¨æ ‡ç­¾å®Œæˆçš„,Struts也提供了struts-faces.tld标签库向JSF˜q‡æ¸¡ã€?

使用Struts标签库编½E‹å¤æ‚页面时åQŒä¸€ä¸ªæœ€å¤§é—®é¢˜æ˜¯ä¼šå¤§é‡ä‹É用logic标签åQŒè¿™ä¸ªlogic如同if语句åQŒä¸€æ—¦å†™èµäh¥åQŒæžçš„JSP™åµé¢è±¡ä¿„¾|—æ–¯æ–¹å—ä¸€æ øP¼Œä½†æ˜¯ä½¿ç”¨JSF标签ž®Þq®€‹zä¼˜¾ŸŽï¼š


<jia:navigatorItem name="inbox" label="InBox"
  icon="/images/inbox.gif"
  action="inbox"
  disabled="#{!authenticationBean.inboxAuthorized}"/>
 

 

如果authenticationBean中inboxAuthorized˜q”回是假åQŒé‚£ä¹ˆè¿™ä¸€è¡Œæ ‡½{‘Ö°±ä¸ç”¨æ˜„¡¤ºåQŒå¤šòq²å‡€åˆ©çƒ¦åQ?

先写到这里,我会¾l§ç®‹å¯¹JSF深入比较下去åQŒå¦‚果研½I¶è¿‡Jdon框架的ähåQŒå¯èƒ½ä¼šå‘现åQŒJdon框架的jdonframework.xml中service配置和managed-bean一样都使用了依赖注ž®„,看来对Javabean的依赖注ž®„å·²¾lè¿…é€Ÿåœ°æˆäØ“ä¸€¿Uæ–°æŠ€æœ¯è±¡å¾ï¼Œå¦‚果你还不了解Ioc模式åQŒèµ¶ç´§è¡¥è¯¾ã€?
 



]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ººÊÙÏØ| ÄÏ¿µÊÐ| ÉÛ¶«ÏØ| ¸ÊÈªÏØ| ÕżҽçÊÐ| ½ðËþÏØ| ÉÏÈÄÊÐ| ÓñÉ½ÏØ| µ¾³ÇÏØ| Ò˾ýÏØ| ¿ËÀ­ÂêÒÀÊÐ| ×ÊÐËÊÐ| µÃÈÙÏØ| ÐÞÎäÏØ| º×±ÚÊÐ| °¢°Í¸ÂÆì| ÂÌ´ºÏØ| »ñ¼ÎÏØ| ¸»½õÊÐ| °ÍÑåÄ×¶ûÊÐ| ÍòÈ«ÏØ| ²ÔÏªÏØ| Áú´¨ÏØ| ½»³ÇÏØ| ÆÕÀ¼ÏØ| Êæ³ÇÏØ| ¶¨Î÷ÊÐ| ÆÕÀ¼µêÊÐ| °×Ë®ÏØ| ÏçÄþÏØ| Öз½ÏØ| ½­ÒõÊÐ| ¿ª·âÏØ| ¹ÅÀËÏØ| ӥ̶ÊÐ| ¾Å½­ÊÐ| ÉØ¹ØÊÐ| Íþº£ÊÐ| ÌìµÈÏØ| ÉäºéÏØ| èµÉ½ÏØ|