<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    靈魂-放水

    為學日益,為道日損。

    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

    主站蜘蛛池模板: 在线电影你懂的亚洲| 国产亚洲一区区二区在线| 成年人免费的视频| 黄+色+性+人免费| 亚洲综合在线成人一区| 亚洲精品久久无码| 成人国产网站v片免费观看 | 国产成人综合亚洲亚洲国产第一页| 亚洲乱码无码永久不卡在线| 亚洲成人在线免费观看| 香港经典a毛片免费观看看| 香蕉免费在线视频| 无码国产精品一区二区免费式直播| 国产免费牲交视频| 亚洲AV日韩AV天堂久久| 亚洲日韩AV一区二区三区四区| 巨胸喷奶水视频www免费视频| 在线看片无码永久免费视频| 国产精品亚洲二区在线观看| 亚洲日本久久久午夜精品| 国产精品福利片免费看 | 一二三四在线观看免费高清中文在线观看| 日韩精品一区二区亚洲AV观看| 香港经典a毛片免费观看看| 亚洲午夜无码AV毛片久久| 中文字幕在线视频免费| 亚洲AV日韩精品久久久久久久| 日本成年免费网站| 久久亚洲精品11p| 成人在线免费看片| 国产成人人综合亚洲欧美丁香花| 免费观看无遮挡www的小视频| 国产成人精品久久亚洲| 暖暖在线视频免费视频| 亚洲精品成人在线| 亚洲熟妇无码一区二区三区| 五月亭亭免费高清在线| 亚洲性无码一区二区三区| 亚洲乱码中文字幕手机在线 | 亚洲免费在线视频观看| 亚洲国产精品18久久久久久|