Académique Documents
Professionnel Documents
Culture Documents
Semestre : 1 2 X
Session : Principale X
Unité d’enseignement : Architecture N-tiers ………………………………………
Modules : Famework Spring - Architecture N-tiers .NET - Architecture Orientée Service « SOA »
Classe(s) : 4INFOB
Nombre de questions : 42 questions
[Spring Boot - Spring Core - Spring Data JPA - Spring MVC REST - Log4J -AOP – JSF]
Toutes les questions sont à réponse unique.
A. 3
B. 4
C. 5
D. 6
- Les identifiants sont auto-générés avec la stratégie
«IDENTITY».
1/6
2 : Compléter QI.2. (/1pt) 3 : Compléter QI.3. (/1pt)
@Entity
public class Candidat implements Serializable {
@Entity
@Id
public class Examen implements Serializable
@GeneratedValue(strategy=GenerationType.IDENTITY)
{ @Id
private int idCd;
@GeneratedValue(strategy=GenerationType.IDENT
ITY)
private String login;
private int idEx;
private String pwd;
@Temporal(TemporalType.DATE)
private int budgetFormations;
private Date dateExamen;
@Enumerated(EnumType.STRING)
@ QI.2. ….
neToMany(mappedBy="candidat")
List
O <Examen> examens; Type type;
} @ManyToOne
}
QI.3. Candidat
…. candidat;
A. @OneToMany(mappedBy="candidat")
A. private List <Candidat> candidats;
B. @ManyToOne(mappedBy="candidat")
B. private Candidat candidat;
C. @OneToMany
C. a et b sont possibles
D. @ManyToOne
D. Aucune réponse
4 : Les services sont les suivants. Tous les services sont exposés avec Spring REST MVC.
Compléter QI.4. (/1pt)
public interface ICandidatService {
@RestController
public class RestControlCandidat
{ @Autowired
ICandidatService icandidatservice;
@Autowired
IExamService iexamenservice;
@Autowired
ISeanceDeFormation iseanceformation;
// http://localhost:8083/affecterExamenACandidat/1/1
QI.4.@PutMapping
…. (value = "/affecterExamenACandidat/{idcdt}/{idex}")
public void affecterExamenACandidat(@PathVariable("idcdt")int cdId,
@PathVariable("idex")int exId) {
icandidatservice.affecterExamenACandidat(cdId, exId);}}
2/6
A. @PostMapping
B. @PutMapping
C. @GetMapping
D. @DeleteMapping
5 : Service : Nous allons affecter une séance de formation, pour laquelle on a des places disponibles,
au candidat Ali selon le type de son examen et à une date antérieure à sa date d’examen. Après
affectation, nous allons mettre jour les places disponibles et le budget du candidat.
En premier lieu, nous avons besoin de chercher la formation correspondante. Compléter QI.5. (/1pt)
@Repository
public interface CandidatRepository extends CrudRepository<Candidat, Integer> {
@Repository
public interface CandidatRepository extends CrudRepository<Candidat, Integer> {
3/6
7 : Authentification (login.xhtml): Le formulaire accepte un login login.xhtml
et un mot de passe, affiche un message d’erreur en cas d’une <h:form id="form">
éventuelle erreur d’identification et oriente l’utilisateur vers son <b>Connexion</b>
espace. <h:panelGrid columns="2">
<h:outputText value="Login" />
<h:inputText
value="#{candidatController
QI.7 .login}" />
<h:outputText value="Mot de passe" />
<h:inputSecret
value="#{candidatController
QI.7 .pwd}" />
<h:commandButton id="btn" value="Connexion"
Espace Utilisateur (welcome.xhtml) : Après authentification, action="#{candidatController
QI.7 .dologin}" />
l’utilisateur peut visualiser ses formations. Il peut aussi refuser une <h:message for="btn"/>
formation. L’accès à cette page est sécurisé en utilisant un filtre </h:panelGrid>
d’authentification. </h:form>
A. candidatController
B. iControllerCandidatImpl
C. IControllerCandidatImpl
D. Réponses b et c
8 : Voici une partie du code de
welcome.xhtml. Compléter QI.8. (/1pt)
<h:panelGroup>
<h:form>
Étant donné ce Controller, compléter QI.7. (/1pt)
<h:outputText value="Bonjour #{candidatCo }"
/>
@Scope(value = "session") <b>Bienvenue à ton espace.</b>
@ELBeanName(value = "candidatController") <b>Voici tes formations planifiées. </b>
@Join(path = "/", to = "/login.jsf") <br />
@Controller <h:dataTable value="#{candidatController.
public class IControllerCandidatImpl { listerFormations(1)}" var="sf">
@Autowired <h:column>
ICandidatService icandidatservice; <f:facet name="header">
<h:outputText value="Date" />
private String login;
</f:facet>
private String pwd;
<h:outputText value="#{sf.dateSeance
QI.8 }"/>
private Candidat candidat; </h:column>
private Boolean loggedIn; ……….
</h:dataTable>
public String dologin()
{ String navigateTo = "null"; <h:commandLink value="Déconnexion" action=
candidat=icandidatservice.getCandidatBy "#{candidatController .doLogout()}" />
LoginAndPassword(login, pwd); </h:form>
if (candidat != null ) { </h:panelGroup>
navigateTo = "/welcome.xhtml?faces-redirect=true";
loggedIn = true; } return navigateTo; } }
A. Formation.dateSeance
B. sf.dateSeance
C. candidatController.dateSeance
D. Aucune réponse
4/6
9 : Nous avons ajouté un filtre d’authentification à notre application. Compléter QI.9. (/1pt)
public class LoginFilter implements Filter {
{chain.doFilter(request, }
QI.9
response);
else
{ hresponse.sendRedirect(hrequest.getContextPath()
+"/");
}}
}
B. request.doFilter(request, response);
C. response.doFilter(request, response);
D. chain.doFilter(request, response);
10 : Nous avons ajouté à notre projet un aspect qui calcule et affiche dans les logs le temps d’exécution
de chaque méthode des services. Compléter QI.10 (/1pt).
@Component
@Aspect
public class PerformanceAspect
{ private static final Logger logger =
LogManager.getLogger(PerformanceAspect.class);
QI.10
@Aroun ("execution(* tn.esprit.spring.services.*.*(..))")
public Object profile(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
Object out=pjp.proceed();
long elapsedTime = System.currentTimeMillis() - start;
logger.info("Method execution time: " + elapsedTime + "
milliseconds.");
return out;
}}
A. @Before("execution(* tn.esprit.spring.services.*.*(..))")
5/6
B. @After("execution(* tn.esprit.spring.services.*.*(..))")
C. @Around("execution(* tn.esprit.spring.services.*.*(..))")
D. A et B
C. Le développeur a mis un numéro de port erroné A. Le développeur a oublié de vider le dossier Target
pourl’accès au serveur de données
B. Le développeur a oublié de créer le dossier Target
D. Aucune réponse n’est correcte
C. Le développeur a mis un nom erroné de
sonController
6/6