?struts2 的demo 中的employee層可以清晰的暫時struts希望給開發(fā)者帶來的架構(gòu)
--------------------------
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>? 這里展現(xiàn)了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文件,非常便于管理和代碼生成,
當(dāng)然也有一個全局的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默認(rèn)作為struts2的業(yè)務(wù)組件容器
在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本質(zhì)也是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完成請求。
如果你不做額外的設(shè)定,struts2會自動生成這個bean。
如果你有特殊的需要,還可以在applicationContext.xml自己聲明這個bean
你必須根據(jù)需要來決定是否再次聲明
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",該標(biāo)簽控件的操作就被轉(zhuǎn)換成ajax,請求發(fā)送到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的優(yōu)良傳統(tǒng),并且擯棄了ww2的一些缺陷,也可以看成是對ww2的一次重購。
無疑是目前最主流,最強大的MVC框架了。
它實現(xiàn)了和spring的完美結(jié)合
集成了ajax(dojo+dwr)
其插件支持jasperreports,jfreechart