Weitere ähnliche Inhalte Ähnlich wie Training: Day Four - Struts, Tiles, Renders and Faces (20) Kürzlich hochgeladen (20) Training: Day Four - Struts, Tiles, Renders and Faces4. Struts
Control Layer
● open-source web application framework
● uses and extends the Java Servlet API
● model–view–controller (MVC) architecture
● version 1.2.7
● http://struts.apache.org/release/1.2.x/
11. Struts @ Fenix
Action
fenix.ist.utl.pt/publico/executionCourse.do?method=marks&executionCourseID=1610612925705
ExecutionCourseDA.java
public ActionForward marks(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
final String executionCourseOID = request.getParameter("executionCourseID");
final ExecutionCourse executionCourse = FenixFramework.getDomainObject(executionCourseOID);
Map<> attendsMap = getAttendsMap(executionCourse);
request.setAttribute("executionCourse", executionCourse);
request.setAttribute("attendsMap", attendsMap);
request.setAttribute("dont-cache-pages-in-search-engines", Boolean.TRUE);
return mapping.findForward("execution-course-marks");
}
● Parameters
○ get values on query string
● Attributes
○ get or set state on request
14. Struts
Presentation Layer
● Tiles
○ templating system
○ create a common look and feel for a web application
○ create reusable view components
○ bridge to JSPs
○ module aware
● tiles-<module>-definitions.xml
○ template definitions
● tiles-<module>-pages-definitions.xml
○ fill in the template
15. Struts @ Fenix
Forwards
ExecutionCourseDA.java
public ActionForward marks(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
final String executionCourseOID = request.getParameter("executionCourseID"
);
final ExecutionCourse executionCourse = FenixFramework.
getDomainObject(executionCourseOID);
Map<> attendsMap = getAttendsMap(executionCourse);
request
.setAttribute("executionCourse" executionCourse);
,
request
.setAttribute("attendsMap", attendsMap);
request
.setAttribute("dont-cache-pages-in-search-engines" Boolean.TRUE);
,
return mapping.findForward("execution-course-marks"
);
}
16. Struts @ Fenix
Forwards
ExecutionCourseDA.java
public ActionForward marks(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
final String executionCourseOID = request.getParameter("executionCourseID
");
final ExecutionCourse executionCourse = FenixFramework.
getDomainObject(executionCourseOID);
Map<> attendsMap = getAttendsMap(executionCourse);
request
.setAttribute("executionCourse" executionCourse);
,
request
.setAttribute("attendsMap", attendsMap);
request
.setAttribute("dont-cache-pages-in-search-engines" Boolean.TRUE);
,
return mapping.findForward("execution-course-marks");
}
● What is mapping.findForward(..) ?
17. Struts @ Fenix
Forwards
ExecutionCourseDA.java
public ActionForward marks(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
final String executionCourseOID = request.getParameter("executionCourseID
");
final ExecutionCourse executionCourse = FenixFramework.
getDomainObject(executionCourseOID);
Map<> attendsMap = getAttendsMap(executionCourse);
request
.setAttribute("executionCourse" executionCourse);
,
request
.setAttribute("attendsMap", attendsMap);
request
.setAttribute("dont-cache-pages-in-search-engines" Boolean.TRUE);
,
return mapping.findForward("execution-course-marks");
}
● Forwards annotation (what you should use)
@Forwards({ @Forward(name = "execution-course-marks", path = "/publico/executionCourse/marks.jsp") })
public class ExecutionCourseDA extends FenixDispatchAction { … }
●
●
name - forward name
path - logic name for tiles
18. Struts @ Fenix
Forwards (Deprecated)
ExecutionCourseDA.java
public ActionForward marks(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
final String executionCourseOID = request.getParameter("executionCourseID
");
final ExecutionCourse executionCourse = FenixFramework.
getDomainObject(executionCourseOID);
Map<> attendsMap = getAttendsMap(executionCourse);
request
.setAttribute("executionCourse" executionCourse);
,
request
.setAttribute("attendsMap", attendsMap);
request
.setAttribute("dont-cache-pages-in-search-engines" Boolean.TRUE);
,
return mapping.findForward("execution-course-marks");
}
● struts-publico.xml
<action type="n.s.f.p.A.p.ExecutionCourseDA" parameter="method" path="/executionCourse"
>
<forward path=
"execution-course-marks" name="execution-course-marks"></forward>
…………………………………………………
</action>
●
●
name - forward name
path - logic name for tiles
19. Struts @ Fenix
Forwards (Deprecated)
● tiles-public-definitions.xml
<definition name=
"execution-course-marks" extends="definition.public.executionCourse">
<put name="body" value="/publico/executionCourse/marks.jsp" >
/
</definition>
● tiles-public-pages-definitions.xml
<definition name=
"definition.public.executionCourse" page="/layout/istLayout.jsp">
<put name="title" value="/commons/functionalities/courseTitle.jsp"/>
<put name="hideLanguage" value="true"/>
<put name="symbols_row" value="/publico/degreeSite/symbolsRow.jsp" />
<put name="profile_navigation" value="/publico/degreeSite/profileNavigation.jsp"/>
<put name="main_navigation" value="/publico/executionCourse/mainNavigation.jsp"/>
<put name="body_header" value="/publico/executionCourse/executionCourseHeader.jsp"/>
<put name="body" value="/commons/blank.jsp" />
<put name="footer" value="/publico/degreeSite/footer.jsp" />
<put name="rss" value="/messaging/announcements/rssHeader.jsp">
/
<put name="keywords" value="/messaging/announcements/keywordsHeader.jsp">
/
</definition>
● istLayout.jsp
<tiles:insert attribute=
"body" ignore="true"/>
<tiles:insert attribute=
"footer" ignore="true"/>
20. JSPs
● JavaServer Pages (JSP)
● create dynamically generated web pages
based on HTML
● HTML with behaviour
DEMO
publico/executionCourse/marks.jsp
21. JSPs
without renderers
● publico/executionCourse/marks.jsp
<logic:iterate id="evaluation" name="executionCourse property="orderedAssociatedEvaluations
"
">
● ExecutionCourseDA.java
public ActionForward marks(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
final String executionCourseOID = request.getParameter("executionCourseID"
);
final ExecutionCourse executionCourse = FenixFramework.
getDomainObject(executionCourseOID);
Map<Attends, Map<Evaluation, Mark>> attendsMap = getAttendsMap(executionCourse);
request
.setAttribute("executionCourse" executionCourse);
,
request
.setAttribute("attendsMap", attendsMap);
request
.setAttribute("dont-cache-pages-in-search-engines" Boolean.TRUE);
,
return mapping.findForward("execution-course-marks"
);
}
22. JSPs
without renderers
● publico/executionCourse/marks.jsp
<logic:iterate id="evaluation" name="executionCourse" property="orderedAssociatedEvaluations">
● ExecutionCourseDA.java
public ActionForward marks(ActionMapping mapping, ActionForm form, HttpServletRequest request,
HttpServletResponse response) {
final String executionCourseOID = request.getParameter("executionCourseID"
);
final ExecutionCourse executionCourse = FenixFramework.
getDomainObject(executionCourseOID);
Map<Attends, Map<Evaluation, Mark>> attendsMap = getAttendsMap(executionCourse);
request
.setAttribute("executionCourse", executionCourse);
request
.setAttribute("attendsMap", attendsMap);
request
.setAttribute("dont-cache-pages-in-search-engines" Boolean.TRUE);
,
return mapping.findForward("execution-course-marks"
);
}
●
●
name - get from request attribute or parameter with that name
property - get property from object
○
●
●
executionCourse .getOrderedAssociatedEvaluations ()
uses Java Bean conventions
id - defines bean in jsp scope
23. JSPs
without renderers
● simple bean example
<h3><bean:write name=
"executionCourse" property="name"></h3>
●
executionCourse.getName()
● Tag libs
○
○
○
○
<bean:*>
<logic:*>
<html:*>
http://struts.apache.org/release/1.2.x/userGuide/
24. JSPs
Renderers
● integration with domain model and fenixframework
● our taglib <fr:*>
○ fr:view - display domain objects
○ fr:create - create domain objects
○ fr:edit - edit domain objects
● renderers-config.xml
○ All renderers definitions
25. JSPs
Renderers
● What is a renderer ?
○ java class used to produce HTML
○ Properties
■ layout
●
logical name for renderer definition
■ mode
●
●
input
output
■ class
●
rendered type
○ String
○ ExecutionCourse
○ int
■ properties
●
render specific properties
26. JSPs
renderers-config.xml
● output renderer
<renderer type=
"java.util.Collection" layout="contact-list" class="n.s.f.p.r.ContactListRenderer"
>
<property name=
"bundle" value="APPLICATION_RESOURCES"
/>
<property name=
"defaultLabel" value="label.partyContacts.defaultContact" >
/
</renderer>
● input renderer
<renderer mode=
"input" type="j.u.Collection" layout="option-select" class="p.i.fr.InputCheckBoxListRenderer"
>
<property name=
"eachClasses" value="dinline" />
</renderer>
27. JSPs
Renderers
● manageApplications.jsp
<fr:view name="appsOwned" schema="oauthapps.view.apps"
>
<fr:layout name="tabular">
<fr:property name="classes" value="tstyle4 thcenter thcenter"
/>
<fr:property name="columnClasses" value="tdcenter, tdcenter, ..."
/>
</fr:layout>
</fr:view>
● renderers-config.xml
<renderer type="java.util.Collection" layout="tabular" class="p.i.f.r.CollectionRenderer"
>
<property name="groupLinks" value="true"/>
<property name="linkGroupSeparator" value=", "/>
</renderer>
28. JSPs
Renderers
● manageApplications.jsp
<fr:view name="appsOwned" schema="oauthapps.view.apps"
>
<fr:layout name="tabular">
<fr:property name="classes" value="tstyle4 thcenter thcenter"
/>
<fr:property name="columnClasses" value="tdcenter, tdcenter, ..."
/>
</fr:layout>
</fr:view>
● renderers-config.xml
<renderer type="java.util.Collection" layout="tabular" class="p.i.f.r.CollectionRenderer"
>
<property name="groupLinks" value="true"/>
<property name="linkGroupSeparator" value=", "/>
</renderer>
33. Renderers
(reusable) Schemas
● Schemas
<fr:view name="appsOwned" schema="oauthapps.view.apps">
<fr:layout name="tabular">
<fr:property name="classes" value="tstyle4 thcenter thcenter"
/>
<fr:property name="columnClasses" value="tdcenter, tdcenter, ..."
/>
</fr:layout>
</fr:view>
●
specify how object’s slots are rendered
●
schemas-config.xml
●
*-schemas.xml
○
logical separation
34. Renderers
(reusable) Schemas
●
personnelSection-schemas.xml
<schema name="oauthapps.view.apps" type="net.sourceforge.fenixedu.domain.ExternalApplication"
bundle="APPLICATION_RESOURCES"
>
<slot name="name" key="oauthapps.label.app.name" />
<slot name="description" layout="longText" key="oauthapps.label.app.description"
/>
<slot name="scopes" layout="flowLayout">
<property name=
"eachLayout" value="values"></property>
<property name=
"eachSchema" value="oauthapps.view.scope.name"
></property>
<property name=
"htmlSeparator" value=", "></property>
</slot>
<slot name="siteUrl" key="oauthapps.label.app.site.url" />
</schema>
●
●
●
name
○ unique identifier
type
○ schema target type
slot
○ object slot to render
35. Renderers
(inline) Schemas
<fr:view name="appsOwned" schema="oauthapps.view.apps"
>
<fr:layout name="tabular">
<fr:property name="classes" value="tstyle4 thcenter thcenter"
/>
<fr:property name="columnClasses" value="tdcenter, tdcenter, ..."
/>
</fr:layout>
</fr:view>
36. Renderers
(inline) Schemas
<fr:view name="appsOwned">
<fr:schema type="net.sourceforge.fenixedu.domain.ExternalApplication"bundle="APPLICATION_RESOURCES"
>
<fr:slot name="name" key="oauthapps.label.app.name" />
<fr:slot name="description" layout="longText" key="oauthapps.label.app.description"
/>
<fr:slot name="scopes" layout="flowLayout">
<fr:property name="eachLayout" value="values"></property>
<fr:property name="eachSchema" value="oauthapps.view.scope.name"
></property>
<fr:property name="htmlSeparator" value=", "></property>
</fr:slot>
<fr:slot name="siteUrl" key="oauthapps.label.app.site.url" />
</fr:schema>
<fr:layout name="tabular">
<fr:property name="classes" value="tstyle4 thcenter thcenter"
/>
<fr:property name="columnClasses" value="tdcenter, tdcenter, ..."
/>
</fr:layout>
</fr:view>
37. Resource Bundles
<fr:view name="appsOwned">
<fr:schema type="net.sourceforge.fenixedu.domain.ExternalApplication"bundle="APPLICATION_RESOURCES">
<fr:slot name="name" key="oauthapps.label.app.name" />
<fr:slot name="description" layout="longText" key="oauthapps.label.app.description"
/>
<fr:slot name="scopes" layout="flowLayout">
<fr:property name="eachLayout" value="values"></property>
<fr:property name="eachSchema" value="oauthapps.view.scope.name"
></property>
<fr:property name="htmlSeparator" value=", "></property>
</fr:slot>
<fr:slot name="siteUrl" key="oauthapps.label.app.site.url" />
</fr:schema>
<fr:layout name="tabular">
<fr:property name="classes" value="tstyle4 thcenter thcenter"
/>
<fr:property name="columnClasses" value="tdcenter, tdcenter, ..."
/>
</fr:layout>
</fr:view>
●
src/main/resources/resources/ApplicationResources_pt.properties
○ oauthapps.label.app.name
="Nome Aplicação"
●
src/main/resources/resources/ApplicationResources_en.properties
○ oauthapps.label.app.name
="Application Name"
38. JavaServer Faces
● JavaServer Faces
○ version 1.1
● component-based user interfaces for web
apps
● servlet mapping *.faces
● faces-config.xml
41. Golden Rules
● don’t create stuff in struts-*.xml
○ use annotations
■ @Mapping
■ @Forwards
●
@Forward
● renderers-config.xml
○
read-only (unless you are going to create a new renderer)
● read renderers docs
○
Administrador > Frameworks > Renderers > Exemplos Renderers
● install resource bundle editor
○
https://fenix-ashes.ist.utl.pt/fenixWiki/I18NConventions