靈魂-放水

          為學日益,為道日損。

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            296 Posts :: 10 Stories :: 274 Comments :: 0 Trackbacks

          ?struts2 的demo 中的employee層可以清晰的暫時struts希望給開發者帶來的架構

          --------------------------

          EmployeeAction <-- AbstractCRUDAction (web 層)
          ?? ^
          ?? |
          EmployeeDao <-- AbstractDao <-- Dao (Domain 層,demo中也作為service存在于spring容器中)
          ?? ^
          ?? |
          Employee <--IDEntity

          --------------------------

          struts.xml 配置

          ??? <package name="skill" extends="default" namespace="/skill">
          ??????? <default-interceptor-ref name="crudStack"/>

          ??????? <action name="list" class="org.apache.struts2.showcase.action.SkillAction" method="list">
          ??????????? <result>/empmanager/listSkills.jsp</result>
          ??????????? <interceptor-ref name="basicStack"/>
          ??????? </action>
          ??????? <action name="edit" class="org.apache.struts2.showcase.action.SkillAction">
          ??????????? <result>/empmanager/editSkill.jsp</result>
          ??????????? <interceptor-ref name="params" />
          ??????????? <interceptor-ref name="basicStack"/>
          ??????? </action>
          ??????? <action name="save" class="org.apache.struts2.showcase.action.SkillAction" method="save">
          ??????????? <result name="input">/empmanager/editSkill.jsp</result>
          ??????????? <result type="redirect">edit.action?skillName=${currentSkill.name}</result>
          ??????? </action>
          ??????? <action name="delete" class="org.apache.struts2.showcase.action.SkillAction" method="delete">
          ??????????? <result name="error">/empmanager/editSkill.jsp</result>
          ??????????? <result type="redirect">edit.action?skillName=${currentSkill.name}</result>? 這里展現了struts2具有良好的url特性,比起ww的crud!edit讓人舒服多了
          ??????? </action>
          ??? </package>

          ??? <package name="employee" extends="default" namespace="/employee">
          ??????? <default-interceptor-ref name="crudStack"/>

          ??????? <action name="list" class="org.apache.struts2.showcase.action.EmployeeAction" method="list">
          ??????????? <result>/empmanager/listEmployees.jsp</result>
          ??????????? <interceptor-ref name="basicStack"/>
          ??????? </action>
          ??????? <action name="edit-*" class="org.apache.struts2.showcase.action.EmployeeAction">
          ???????? <param name="empId">{1}</param>
          ??????????? <result>/empmanager/editEmployee.jsp</result>
          ??????????? <interceptor-ref name="crudStack"><param name="validation.excludeMethods">execute</param></interceptor-ref>
          ??????? </action>
          ??????? <action name="save" class="org.apache.struts2.showcase.action.EmployeeAction" method="save">
          ??????????? <result name="input">/empmanager/editEmployee.jsp</result>
          ??????????? <result type="redirect">edit-${currentEmployee.empId}.action</result>
          ??????? </action>
          ??????? <action name="delete" class="org.apache.struts2.showcase.action.EmployeeAction" method="delete">
          ??????????? <result name="error">/empmanager/editEmployee.jsp</result>
          ??????????? <result type="redirect">edit-${currentEmployee.empId}.action</result>
          ??????? </action>
          ??? </package>
          ???
          -----------------------------
          每一個action有自己的properties文件,非常便于管理和代碼生成,
          當然也有一個全局的globalMessages.properties來存放一些save,delete這些都一樣的字符
          employee=Employee
          employee.firstName=First Name
          employee.lastName=Last Name
          employee.description=Description

          employee.id.required=Id is required
          employee.lastName.required=Last Name is required
          employee.birthDate.required=Birthdate is required
          employee.backtolist=Back to Employee List

          每個action自己的validation
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "<validators>
          ??? <!-- Field-Validator Syntax -->
          ??? <field name="currentEmployee.empId">
          ??????? <field-validator type="required">
          ??????????? <message key="employee.id.required"/>
          ??????? </field-validator>
          ??? </field>
          ??? <field name="currentEmployee.lastName">
          ??????? <field-validator type="requiredstring">
          ??????????? <param name="trim">true</param>
          ??????????? <message key="employee.lastName.required"/>
          ??????? </field-validator>
          ??? </field>
          ??? <field name="currentEmployee.birthDate">
          ??????? <field-validator type="required">
          ??????????? <message key="employee.birthDate.required"/>
          ??????? </field-validator>
          ??? </field>
          </validators>

          --------------------------------
          DAO是spring的bean,spring默認作為struts2的業務組件容器
          在struts.properties中struts.objectFactory = spring

          由于這里是autowire,Autowiring means to look for objects defined in Spring with the same name as your object property
          所以action中所有用到IoC的地方,都會自動注入(因為action本質也是bean,下面會講到)

          <beans default-autowire="byName"> wire有四種方法:name, type, auto, constructor

          ??? <bean id="skillDao" class="org.apache.struts2.showcase.dao.SkillDao"/>
          ??? <bean id="employeeDao" class="org.apache.struts2.showcase.dao.EmployeeDao"/>
          ???
          ----------------------------------
          struts2中的每一個action,也就是struts.xml里面聲明的action,最終都將作為spring中的一個bean完成請求。
          如果你不做額外的設定,struts2會自動生成這個bean。
          如果你有特殊的需要,還可以在applicationContext.xml自己聲明這個bean
          你必須根據需要來決定是否再次聲明
          struts.xml
          <!DOCTYPE struts PUBLIC
          ??? "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
          ??? "
          <struts>
          ??? <include file="struts-default.xml"/>

          ??? <package name="default" extends="struts-default">
          ??????? <action name="foo" class="com.acme.Foo">? 這個foo,在applicationConext.xml中沒有聲明,struts會自動生成一個bean
          ??????????? <result>foo.ftl</result>
          ??????? </action>
          ??? </package>

          ??? <package name="secure" namespace="/secure" extends="default">
          ??????? <action name="bar" class="bar">?????????? 這個foo,在applicationConext.xml中聲明了,struts會使用下面配置
          ??????????? <result>bar.ftl</result>
          ??????? </action>
          ??? </package>
          </struts>

          applicationConext.xml
          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "
          <beans default-autowire="autodetect">
          ??? <bean id="bar" class="com.my.BarClass" singleton="false"/>
          ??? ...
          </beans>

          -------------------------
          無縫集成ajax
          只要聲明了theme="ajax",該標簽控件的操作就被轉換成ajax,請求發送到AjaxRemoteForm
          Configured Editor configuration:
          <s:form id="form2" action="AjaxRemoteForm" method="post">
          ??? <s:textarea id="editor2" name="data" theme="ajax" cols="50" rows="10" value="Test Data 2">
          ??????? <s:param name="editorControls">textGroup;|;justifyGroup;|;listGroup;|;indentGroup</s:param>
          ??? </s:textarea>
          ??? <s:submit value="Submit"/>
          </s:form>


          ------------------------
          集成了多種模板
          jsp,velocity,freemaker


          ------------------------

          struts2 繼承了ww2的優良傳統,并且擯棄了ww2的一些缺陷,也可以看成是對ww2的一次重購。
          無疑是目前最主流,最強大的MVC框架了。

          它實現了和spring的完美結合

          集成了ajax(dojo+dwr)

          其插件支持jasperreports,jfreechart

          主站蜘蛛池模板: 博乐市| 二连浩特市| 贺兰县| 南汇区| 兴和县| 沅陵县| 浏阳市| 正安县| 新余市| 钟山县| 博白县| 江油市| 九龙坡区| 剑河县| 安阳市| 乳山市| 邹城市| 启东市| 平定县| 澎湖县| 舞阳县| 八宿县| 永州市| 祁门县| 读书| 威信县| 西乌珠穆沁旗| 和顺县| 塔河县| 罗山县| 璧山县| 紫金县| 保亭| 南皮县| 德江县| 疏勒县| 师宗县| 桃园县| 淮阳县| 罗源县| 红安县|