隨筆-4  評(píng)論-14  文章-0  trackbacks-0
            2008年4月2日
           

          一、新建項(xiàng)目
          先在eclipse中新建一個(gè)maven項(xiàng)目,如下圖:

          填寫id、version等,點(diǎn)finish。項(xiàng)目就建好了。下面是項(xiàng)目建好之后的樣子:

          二、配置環(huán)境

          1、添加依賴包

          選中項(xiàng)目,右鍵——Maven2——Add Dependency,如下圖:

          打開(kāi)添加依賴包界面后添加包:struts2.0.11、spring2.0.6、hibernate-annotations3.2、hibernate-entitymanager3.2、hibernate3.2、servlet2.4、javax-persistence、mysql-connector-java5.0.4、spring-aop2.0.6、aspectjweaver1.5.3、struts2-spring-plugin2.0.11、junit、spring-mock2.0.6。

          2、配置web.xml文件

          在WEB-INF下新建文件web.xml
          輸入如下內(nèi)容:

          <?xml version="1.0" encoding="UTF-8"?>
          <web-app id="WebApp_9" version="2.4"
          xmlns="http://java.sun.com/xml/ns/j2ee"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
          <display-name>Struts 2</display-name>
          <filter>
          <filter-name>struts2</filter-name>
          <filter-class>
          org.apache.struts2.dispatcher.FilterDispatcher
          </filter-class>
          </filter>
          <filter-mapping>
          <filter-name>struts2</filter-name>
          <url-pattern>/*</url-pattern>
          </filter-mapping>
          <welcome-file-list>
          <welcome-file>index.html</welcome-file>
          </welcome-file-list>
          </web-app>

          用過(guò)struts1.x的人會(huì)發(fā)現(xiàn)這里沒(méi)有了servlet,而是一個(gè)filter,是的,這是struts2和struts1的一個(gè)不同之處。

          在src/main/resource下新建文件struts.xml,這里是和struts1.x不一樣的地方。
          輸入如下內(nèi)容:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE struts PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
          "http://struts.apache.org/dtds/struts-2.0.dtd">
          <struts>
          <constant name="struts.devMode" value="true" />
          <package name="Struts2_MESSAGE" extends="struts-default"
          namespace="/message">
          </package>
          </struts>

          簡(jiǎn)單解釋一下,constant的作用是自定義一些struts2的屬性,在struts2的包里帶了一個(gè)struts.properties文件,里邊設(shè)定了很多默認(rèn)的struts2的運(yùn)行參數(shù),但是這些有時(shí)候是需要改變一下的,因此就提供了constant來(lái)覆蓋struts.properties中屬性。而package的作用可以簡(jiǎn)單的看做把應(yīng)用分模塊。package有個(gè)屬性叫namespace,上面我們配置為/message,假設(shè)這個(gè)package中還有一個(gè)名叫hello的action,那么我們?cè)L問(wèn)這個(gè)action的url就是:http://域名/message.hello.action。

          本文的示例程序是一個(gè)簡(jiǎn)單的留言添刪改查,所以取名叫message。

          3、配置spring

          在WEB-INF下新建文件applicationContext.xml,輸入如下內(nèi)容:

          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:aop="http://www.springframework.org/schema/aop"
          xmlns:tx="http://www.springframework.org/schema/tx"
          xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
          http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
          </beans>

          在web.xml文件中加入如下內(nèi)容:

          <listener>
          <listener-class>
          org.springframework.web.context.ContextLoaderListener
          </listener-class>
          </listener>

           用過(guò)spring的人應(yīng)該知道這個(gè)listener的作用是啟動(dòng)spring容器。

          4、配置jpa和spring的jpa支持

          在src/main/resource下新建文件夾META-INF,然后在這個(gè)文件夾中新建文件persistence.xml,輸入如下內(nèi)容:

          <?xml version="1.0" encoding="utf-8"?>
          <persistence xmlns="http://java.sun.com/xml/ns/persistence"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
          http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
          version="1.0">
          <persistence-unit name="app-unit"
          transaction-type="RESOURCE_LOCAL">
          </persistence-unit>
          </persistence>

          可能有人會(huì)發(fā)現(xiàn),怎么jpa的配置文件只有這么點(diǎn)了,這其實(shí)是因?yàn)槲覀冇玫膕pring的jpa支持,數(shù)據(jù)庫(kù)配置信息都放到spring的配置文件里了,后面就會(huì)看到。

          然后打開(kāi)前面新建的文件applicationContext.xml,在beans節(jié)點(diǎn)內(nèi)添加如下內(nèi)容:

          <bean
          class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
          <bean id="transactionManager"
          class="org.springframework.orm.jpa.JpaTransactionManager">
          <property name="entityManagerFactory"
          ref="entityManagerFactory" />
          </bean>
          <bean id="dataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          <property name="driverClassName" value="com.mysql.jdbc.Driver" />
          <property name="url"
          value="jdbc:mysql://localhost/message?createDatabaseIfNotExist=true" />
          <property name="username" value="root" />
          <property name="password" value="123" />
          </bean>
          <bean id="entityManagerFactory"
          class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
          <property name="dataSource" ref="dataSource" />
          <property name="jpaVendorAdapter">
          <bean
          class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
          <property name="database" value="MYSQL" />
          <property name="generateDdl" value="false" />
          <property name="showSql" value="true" />
          </bean>
          </property>
          </bean>

          看,數(shù)據(jù)庫(kù)配置信息出現(xiàn)了

          這里的username和password需要根據(jù)你的實(shí)際情況修改。

          5、集成struts2和spring

          打開(kāi)struts.xml文件,添加如下內(nèi)容:

          <constant name="struts.objectFactory" value="spring" />
          <constant name="struts.objectFactory.spring.autoWire" value="type" />

           到這里,配置基本完成。

          三、新建域模型

          我們先創(chuàng)建一個(gè)域模型Message,包括name、title、ip、content、inputTime等字段,代碼如下:

          package com.struts.sample.domain;
          import java.util.Date;
          import javax.persistence.Entity;
          import javax.persistence.GeneratedValue;
          import javax.persistence.GenerationType;
          import javax.persistence.Id;
          @Entity
          public class Message {
          @Id
          @GeneratedValue(strategy = GenerationType.TABLE)
          private Long id;
          private String name;
          private String title;
          private String ip;
          private String content;
          private Date inputTime;
          getter and setter...
          }

          @Entity是jpa的注解,表示這個(gè)類與一個(gè)表對(duì)應(yīng),如果沒(méi)有知名表明,那么就和message這個(gè)表對(duì)應(yīng),系統(tǒng)啟動(dòng)是jpa會(huì)自動(dòng)創(chuàng)建這個(gè)表。
          @Id也是jpa注解,標(biāo)識(shí)這個(gè)字段是主鍵。
          @GeneratedValue(strategy = GenerationType.TABLE)是指定一個(gè)主鍵生成策略。

          四、Service層的實(shí)現(xiàn)

          接口就不帖出來(lái)了,直接把實(shí)現(xiàn)類寫出來(lái)。

          package com.struts.sample.service;
          import java.util.List;
          import javax.persistence.EntityManager;
          import javax.persistence.PersistenceContext;
          import javax.persistence.Query;
          import com.struts.sample.domain.Message;
          public class MessageServiceImpl implements MessageService {
          @PersistenceContext EntityManager em;
          public void setEm(EntityManager em) {
          this.em = em;
          }
          public List<Message> find(final String queryString, final int rowStartIdx, final int rowCount,
          final Object... values){
          Query query = em.createQuery(queryString);
          if (values != null)
          for (int i = 0; i < values.length; i++)
          query.setParameter(i + 1, values[i]);
          if(rowStartIdx>0){
          query.setFirstResult(rowCount);
          }
          if(rowCount>0){
          query.setMaxResults(rowCount);
          }
          return query.getResultList();
          }
          public void save(Message msg){
          this.em.persist(msg);
          }
          public void del(Long id){
          this.em.remove(this.get(id));
          }
          public Message get(Long id){
          return this.em.find(Message.class, id);
          }
          public void update(Message msg){
          this.em.merge(msg);
          }
          public Message getBy(String field, Object value) {
          String queryString = "select msg from Message msg where msg."+field+"=:value";
          Query query = this.em.createQuery(queryString).setParameter("value", value);
          List<Message> msgs = query.getResultList();
          if(msgs.size()>1){
          throw new java.lang.IllegalStateException(
          "worning  --more than one object find!!");
          }else if(msgs.size()==1){
          return msgs.get(0);
          }else{
          return null;
          }
          }
          }

          注意這一句@PersistenceContext EntityManager em;容器啟動(dòng)的時(shí)候會(huì)去創(chuàng)建messageService,創(chuàng)建的時(shí)候會(huì)發(fā)現(xiàn)這個(gè)注解:@PersistenceContext,然后容器會(huì)把EntityManager注入到這里。
          接下來(lái)我們需要讓spring知道我們有這樣一個(gè)bean需要它來(lái)加載。打開(kāi)配置文件applicationContext.xml,加上如下內(nèi)容:

          <bean id="messageService" class="com.struts.sample.service.MessageServiceImpl" />

          現(xiàn)在我們來(lái)寫測(cè)試用例,spring為我們測(cè)試jpa提供了一個(gè)基類:org.springframework.test.jpa.AbstractJpaTests。
          首先,我們?cè)趕rc/test/resource目錄下新建一個(gè)文件applicationContext.xml,內(nèi)容與src/main/resource/applicationContext.xml的內(nèi)容一樣。
          接下來(lái)我們寫一個(gè)測(cè)試用例AbstractJpaTests ,代碼如下:

          package com.struts.sample.service;
          import java.util.Date;
          import org.springframework.test.jpa.AbstractJpaTests;
          import com.struts.sample.domain.Message;
          public class MessageServiceImplTest extends AbstractJpaTests {
          @Override
          protected String[] getConfigLocations() {
          return new String[]{"classpath:applicationContext.xml"};
          }
          private MessageService service;
          public void setService(MessageService service) {
          this.service = service;
          }
          public void testSave(){
          Message msg = new Message();
          msg.setContent("xxxxxxxxxxxxxxxxx");
          msg.setName("tianyi");
          msg.setInputTime(new Date());
          msg.setTitle("www.easyjf.com");
          msg.setIp("123.123.132.123");
          service.save(msg);
          assertNotNull(msg.getId());
          Message msg2 = service.getBy("name", "tianyi");
          assertNotNull(msg);
          }
          }

          運(yùn)行這個(gè)測(cè)試程序,當(dāng)你看到綠色的條條,說(shuō)明你測(cè)試成功了。

          五、Action層的實(shí)現(xiàn)

          Service層已經(jīng)實(shí)現(xiàn)并測(cè)試通過(guò),接下來(lái)我們?cè)搶慉ction了。Struts2支持POJO的action,不需要繼承或者實(shí)現(xiàn)任何類或者接口,可以很方便的測(cè)試。這個(gè)例子中我們就采用POJO式的action。代碼如下:

          package com.struts.sample.action;
          import java.util.ArrayList;
          import java.util.Date;
          import java.util.List;
          import com.struts.sample.domain.Message;
          import com.struts.sample.service.MessageService;
          public class MessageAction {
          private Message message;
          private Long id;
          private MessageService service;
          private List<Message> msgs = new ArrayList<Message>();
          private Integer pages = 0;
          private Integer pageSize = 0;
          public List<Message> getMsgs() {
          return msgs;
          }
          public void setMsgs(List<Message> msgs) {
          this.msgs = msgs;
          }
          public Long getId() {
          return id;
          }
          public void setId(Long id) {
          this.id = id;
          }
          public Integer getPages() {
          return pages;
          }
          public void setPages(Integer pages) {
          this.pages = pages;
          }
          public Integer getPageSize() {
          return pageSize;
          }
          public void setPageSize(Integer pageSize) {
          this.pageSize = pageSize;
          }
          public Message getMessage() {
          return message;
          }
          public void setMessage(Message message) {
          this.message = message;
          }
          public String List(){
          this.msgs = this.service.find("select msg from Message msg", pages, pageSize, null);
          return "success";
          }
          public String Save(){
          message.setInputTime(new Date());
          if(message.getId()!=null){
          this.service.update(message);
          }else{
          this.service.save(message);
          }
          return this.List();
          }
          public String Del(){
          if(id==null){
          return "error";
          }else{
          this.service.del(id);
          }
          return this.List();
          }
          public String Edit(){
          if(id==null){
          return "error";
          }else{
          this.message = this.service.get(id);
          }
          return "success";
          }
          public void setService(MessageService service) {
          this.service = service;
          }
          }

          代碼很簡(jiǎn)單,但是卻實(shí)現(xiàn)了添刪改查的功能,struts2確實(shí)比struts1好用多了。Struts2中可以將一個(gè)POJO作為action,就像上面的action。在用戶訪問(wèn)到這個(gè)action的時(shí)候struts2會(huì)根據(jù)前臺(tái)提交進(jìn)來(lái)的數(shù)據(jù)自動(dòng)將必要的字段進(jìn)行注入。
          以save為例,當(dāng)我們?cè)L問(wèn)到這個(gè)方法的時(shí)候,前臺(tái)表單域會(huì)有message.title、message.name、message.content等變量,struts2會(huì)根據(jù)這些前臺(tái)變量的名字將他們注入到MessageAction中的message中。而如果我們是執(zhí)行的修改操作,那么前臺(tái)還會(huì)傳遞一個(gè)id到服務(wù)端,struts2又會(huì)自動(dòng)將這個(gè)值注入到id中。
          需要注意的是,如果你希望某個(gè)字段被注入,那么你應(yīng)該提供一個(gè)setter,如果你同時(shí)希望這個(gè)字段能在頁(yè)面中被訪問(wèn),那么你還應(yīng)該為它提供一個(gè)getter。

          接下來(lái)我們來(lái)配置struts2,前面我們只是將struts2運(yùn)行所需的環(huán)境配置起來(lái)了,現(xiàn)在我們需要配置新添加的Action。
          打開(kāi)struts.xml文件,在package節(jié)點(diǎn)中添加如下內(nèi)容:

          <action name="message_*" class="com.struts.sample.action.MessageAction" method="{1}">
          <result>List.jsp</result>
          </action>

          這個(gè)配置文件大家可能有點(diǎn)不明白,怎么還有“*”、“{1}”這種東西?,F(xiàn)在我簡(jiǎn)單解釋一下。struts2的action配置中支持通配符,message_*大家應(yīng)該能明白,“*”就代表任意的東西,訪問(wèn)的時(shí)候可以用message_aaa、message_bbb等,這些請(qǐng)求都會(huì)被交給MessageAction來(lái)處理,但是會(huì)不會(huì)有正確的結(jié)果還要看后面的method="{1}"這個(gè)東西。method屬性使得一個(gè)action中的一個(gè)方法就可以處理一個(gè)請(qǐng)求,這意味著我們不需要寫大量的action,而可以把一些相關(guān)的處理放到一個(gè)action中?,F(xiàn)在我們來(lái)說(shuō)說(shuō)這個(gè)“{1}”,實(shí)際上“{1}”是代表前面name中的通配符的位置,struts會(huì)將第一個(gè)“*”代表的那一串字符串截取下來(lái),作為method的值。在這個(gè)例子中,假設(shè)我們用message_aaa.action來(lái)訪問(wèn)的話,那么struts會(huì)調(diào)用MessageAction的aaa方法。struts2的這種通配符可以支持多個(gè),如果有兩個(gè),那么"{1}"就代表第一個(gè)"*"所匹配的字符串,"{2}"就代表第二個(gè)"*"匹配的字符串,以此類推。

          后臺(tái)的東西到這里就差不多了,剩下的就是頁(yè)面了。

          六、頁(yè)面

          是一個(gè)很簡(jiǎn)單的示例,只有一個(gè)個(gè)頁(yè)面。在webapp目錄下新建目錄message,在message目錄下新建文件List.jsp,輸入如下內(nèi)容:

          <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
          <%@ taglib prefix="s" uri="/struts-tags" %>
          <html xmlns="http://www.w3.org/1999/xhtml">
          <head>
          <title>message</title>
          </head>
          <body>
          <s:iterator value="msgs">
          <table style="border:1px solid #cccccc; margin-top:10px;" width="700">
          <tr>
          <td>標(biāo)題:<s:property value="title" /></td>
          <td>發(fā)表時(shí)間:<s:property value="inputTime" /></td>
          </tr>
          <tr>
          <td colspan="2" height="100" style="padding:10px;">留言內(nèi)容:
          <div style="border:1px dotted #dddddd">
          <p>  <s:property value="content" /></p>
          </div></td>
          </tr>
          <tr>
          <td>作者:<s:property value="name" /></td>
          <td>操作:<a href='<s:url action="message_Edit">
          <s:param name="id" value="id" /></s:url>'>Edit</a>
          <a href='<s:url action="message_Del">
          <s:param name="id" value="id" /></s:url>'>
          Delete
          </a></td>
          </tr>
          </table>
          <hl/>
          </s:iterator>
          <s:form action="message_Save" >
          <s:hidden name="message.id" />
          <s:textfield name="message.title" label="標(biāo)題" />
          <s:textarea name="message.content" label="內(nèi)容" />
          <s:textfield name="message.name" label="作者" />
          <s:submit label="提交" />
          </s:form>
          </body>
          </html>

          到這里基本完工了,我們運(yùn)行一下,看看結(jié)果。
          打開(kāi)瀏覽器輸入http://localhost:8080/message/message_List.action,居然是錯(cuò)誤界面,錯(cuò)誤信息如下:

          這是為什么呢,原來(lái)我們沒(méi)有為service配置事務(wù)。打開(kāi)applicationContext.xml,添加如下內(nèi)容:

          <aop:config>
          <aop:advisor
          pointcut="execution(* com.struts.sample.service.*.*(..))"
          advice-ref="txAdvice" />
          </aop:config>
          <tx:advice id="txAdvice">
          <tx:attributes>
          <tx:method name="insert*" />
          <tx:method name="update*" />
          <tx:method name="*" propagation="REQUIRED"/>
          </tx:attributes>
          </tx:advice>

          運(yùn)行試試,應(yīng)該沒(méi)有問(wèn)題了吧!運(yùn)行界面如下:

           

           們添加一條記錄看看,我隨便填了一條,點(diǎn)submit:

          這里,我們的第一個(gè)示例就宣告完成了,如果有什么錯(cuò)誤,還請(qǐng)大家指正。

          源碼下載:struts-sample.rar

          本文為原創(chuàng),同時(shí)在easyjf官方博客發(fā)表:http://www.easyjf.com/blog/html/20080402/1474562.html。歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)保留出處。

          posted @ 2008-04-02 10:44 天 一 閱讀(3150) | 評(píng)論 (6)編輯 收藏
            2008年1月11日
               摘要: EasyJWeb的Ajax綜合示例應(yīng)用于1月10號(hào)上線,這是團(tuán)隊(duì)2008年第一次源代碼發(fā)布。該示例包括ExtJS集成、遠(yuǎn)程腳本調(diào)、Ajax表單提交等多種實(shí)例,基于EJS構(gòu)架開(kāi)發(fā),持久層使用JPA及泛型DAO、業(yè)務(wù)邏輯層使用Spring2進(jìn)行Bean的管理,表示層使用EasyJWeb的MVC及ExtJS等實(shí)現(xiàn),示例演示了一般應(yīng)用開(kāi)發(fā)中的幾種Ajax應(yīng)用方式,歡迎大家下載交流。  閱讀全文
          posted @ 2008-01-11 10:55 天 一 閱讀(1433) | 評(píng)論 (7)編輯 收藏
            2008年1月7日
               摘要: 這是easyjf去年做的一個(gè)基于Ajax的網(wǎng)上聊天室示例應(yīng)用,該系統(tǒng)涉及到多線程、支持多聊天室、支持聊天室管理、用戶管理、聊天日志記錄等多個(gè)功能。由于這個(gè)系統(tǒng)是很早以前做的,很多地方存在不足,這周末心情好,把這個(gè)應(yīng)用翻了出來(lái),把系統(tǒng)進(jìn)行了重新調(diào)整,使用EJS(EasyJWeb+JPA+Spring)構(gòu)架,使用EasyJWeb的自動(dòng)代碼生成及ajax支持等功能開(kāi)發(fā)。在此推薦給對(duì)于JPA、Spring2、EasyJWeb及Ajax技術(shù)感興趣的朋友們,歡迎一起交流。
            閱讀全文
          posted @ 2008-01-07 17:23 天 一 閱讀(1327) | 評(píng)論 (1)編輯 收藏
            2007年12月28日
          EasyJWeb中提供了一些注解,可以給開(kāi)發(fā)帶來(lái)很多方便。這些注解包括有數(shù)據(jù)驗(yàn)證用的@FormPO、@Validator等;IOC注入用的@Inject、@InjectDisable等;action配置用的@Action等。
          今天我們來(lái)說(shuō)說(shuō)action配置時(shí)要用的注解@Action,使用這些注解可以大量減少配置文件的編寫。
          首先,我們來(lái)看看不使用這些注解的時(shí)候是怎么做的,以一個(gè)hello world程序?yàn)槔?br /> 首先是action:
          public class HelloAction extends AbstractCmdAction
          {
              
          private IHelloService servie;

              
          public IHelloService setService(IHelloService service){
                  
          this.service = service;
              }


              
          public Page doHello(WebForm form, Module module){
                  System.out.println(service.sayHello());
                  
          return null;
              }

          }

          service:
          public interface IHelloService{
              String sayHello();
          }

          service實(shí)現(xiàn):
          public class HelloServiceImpl implements IHelloService
          {
              
          public String sayHello(){
                  
          return "hello";
              }

          }

          如果要使這個(gè)程序正常運(yùn)行,我們還需要配置service和action,easyjweb中默認(rèn)集成spring,service是在spring的配置文件中配置:
              <bean id="helloService"    class="com.hello.service.impl.HelloServiceImpl">
              
          </bean>

          現(xiàn)在來(lái)配置action,在easyjweb的配置文件中這樣配置:
                  <module name="hello" path="/hello" form="" scope="request"
                      action
          ="com.hello.mvc.HelloAction" defaultPage="list"
                      inject
          ="byType">

                  
          </module>
          這里說(shuō)說(shuō)這個(gè)inject="byType",這樣配置之后在HelloAction中的屬性會(huì)自動(dòng)根據(jù)類型來(lái)注入。inject還有byName等屬性,意思就是根據(jù)名字來(lái)注入。如果這里不加這個(gè)inject,那么配置文件就應(yīng)該是這樣寫:
                  <module name="hello" path="/hello" form="" scope="request"
                      action
          ="com.hello.mvc.HelloAction" defaultPage="list"
                      inject
          ="byType">
               
          <property name="service" ref="helloService" />
                  
          </module>
          property的name屬性對(duì)應(yīng)HelloAction中的service,名字要保持一致。ref對(duì)應(yīng)上面在spring中配置的helloService的id。
          到這里,這個(gè)程序就可以運(yùn)行了。
          一個(gè)簡(jiǎn)單的hello程序就用了這么多配置文件,這讓人難以忍受?,F(xiàn)在我們就來(lái)說(shuō)說(shuō)怎么使用EasyJWeb的注解來(lái)簡(jiǎn)化配置。
          我們修改一下HelloAction的代碼,給這個(gè)類加上一個(gè)@Action注解:
          @Action(path="hello")
          public class HelloAction extends AbstractCmdAction
          {
              
          private IHelloService servie;

              
          public IHelloService setService(IHelloService service){
                  
          this.service = service;
              }


              
          public Page doHello(WebForm form, Module module){
                  System.out.println(service.sayHello());
                  
          return null;
              }

          }

          這樣一來(lái),我們就不需要easyjweb中配置的module了,當(dāng)使用hello.ejf訪問(wèn)的時(shí)候框架會(huì)自動(dòng)把請(qǐng)求交給HelloAction處理。
          現(xiàn)在來(lái)簡(jiǎn)單介紹一下@Action這個(gè)注解。
          @Action的各個(gè)屬性說(shuō)明如下:
          name用來(lái)指Action的名稱,也是在容器中的Bean名稱,我們一般不使用這個(gè)屬性。
          path用來(lái)指定模塊的path值,也即所映射的url,如果不設(shè)值該值將會(huì)按照缺省的方式處理。
          alias用來(lái)指定這個(gè)模塊的path別名,也就是可以使用其它的一個(gè)或多個(gè)名稱來(lái)訪問(wèn)這個(gè)模塊。
          inject用來(lái)指定Action中所有業(yè)務(wù)組件注入方式,默認(rèn)值為按類型注入。如果為byName則表示按名稱注入,auto表示自動(dòng)按名稱或類別注入,none則表示不注入。
          disInject用來(lái)標(biāo)識(shí)不自動(dòng)注入的屬性。
          autoInject用來(lái)標(biāo)識(shí)允許自動(dòng)注入的屬性。
          autoToken表示該模塊是否需要開(kāi)取自動(dòng)防重復(fù)提交功能;
          validate表示該模塊是否開(kāi)取自動(dòng)驗(yàn)證功能,默認(rèn)情況不開(kāi)啟自動(dòng)驗(yàn)證;
          view表示該模板的視圖存放子目錄。
          scope用來(lái)指定這個(gè)Action在容器中的創(chuàng)建方式及生命周期,默認(rèn)值為request,表示每次請(qǐng)求創(chuàng)建一次該對(duì)象,若為session則表示個(gè)用戶會(huì)話創(chuàng)建一個(gè)對(duì)象,若為singleton表示整個(gè)容器中只創(chuàng)建一次該實(shí)例。
          messageResource表示多國(guó)語(yǔ)言屬性文件的存放子目錄。
          通常我們只用到path、view、inject這幾個(gè)屬性,由于inject的默認(rèn)值為"AutoJnjectByType",是最常用的,因此通常也不需要顯式指定這個(gè)屬性值。而disInject是用來(lái)標(biāo)識(shí)不允許注入的屬性的,當(dāng)我們的action出現(xiàn)了一些不需要注入的屬性時(shí),如logger,我們就需要使用這個(gè)屬性來(lái)指定哪些是不需要注入的。autoToken則是標(biāo)識(shí)是否開(kāi)啟防重復(fù)提交功能的。

          posted @ 2007-12-28 13:36 天 一 閱讀(1208) | 評(píng)論 (0)編輯 收藏
          僅列出標(biāo)題  
          主站蜘蛛池模板: 永新县| 海口市| 六盘水市| 安图县| 台南市| 三门县| 湟源县| 留坝县| 勐海县| 米林县| 工布江达县| 凤阳县| 龙海市| 郴州市| 葫芦岛市| 温宿县| 临朐县| 铜山县| 南郑县| 乳山市| 沙河市| 凤翔县| 北安市| 贵港市| 江源县| 鹤山市| 迁安市| 鹤峰县| 定结县| 五寨县| 南昌市| 洛扎县| 游戏| 浮梁县| 孟州市| 资溪县| 勃利县| 平谷区| 子洲县| 泸溪县| 闽清县|