Weitere Ă€hnliche Inhalte Ăhnlich wie Spring vs. Java EE QConSP 2012 (20) KĂŒrzlich hochgeladen (20) Spring vs. Java EE QConSP 20127. JAVA EE
PLATFORM
âą lutador experiente
âą mudou a tĂĄtica no Java EE 5
âą ganhou conïŹança: CDI
âą perdeu peso para ser ĂĄgil
âą quer lutar na nuvem
Patrocinado por: Oracle, Red Hat, IBM and
other
QCONSP #3 THE CHALLENGER
9. THE SPRING
FRAMEWORK
âą sem derrota desde 2004
âą nocauteou o J2EE
âą luta em qualquer container
âą golpes fortes com POJOs
âą sabe explorar bem seu oponente
Patrocinado por: Spring Source
QCONSP #3 THE CHAMPION
12. PrincĂpio UFC
(princĂpio hollywood)
âDonât fight us, we fight you!â
QCONSP #3 ROUND #1
16. IoC / DI
Spring JavaEE
@Controller @Named
@Scope(ârequestâ) @RequestScoped
public class ContatoBean { public class ContatoBean {
@Autowired //@Inject @Inject
private ContatoDAO dao; private ContatoDAO dao;
QCONSP #3 ROUND #1
18. PersistĂȘncia
Spring JavaEE
@Repository @Stateless
public class ContatoDAO { public class ContatoDAO {
@PersistenceContext @PersistenceContext
private EntityManager manager; private EntityManager manager;
persistence.xml
definição datasource
QCONSP #3 ROUND #2
20. PersistĂȘncia
@Repository
Spring @Stateless
JavaEE
public class ContatoDAO { public class ContatoDAO {
@Autowired @Resource
private JdbcTemplate template; private DataSource ds;
public void salva(Contato c){
public void salva(Contato c) { try {
template.update( Connection con = ds.getConn..();
"insert ... values (?, ?)", PreparedStatement ps =
c.nome(), c.idade()); con.prepareStatement(âinsert ..â);
} ps.setString(1, c.nome());
} ps.setString(1, c.idade());
ps.execute();
ps.close();
}catch(..){} ...
QCONSP #3 ROUND #2
24. Transação e Exceção
Spring JavaEE
@Transactional(...) @TransactionAttribute(...)
@Repository @Stateless
public class ContatoDAO { public class ContatoDAO {
@PersistenceContext @PersistenceContext
private EntityManager manager; private EntityManager manager;
<bean id=âxxxTransactionManagerâ ejb-jar.xml
.../>
QCONSP #3 ROUND #3
26. Transação e Exceção
Spring JavaEE
@Transaction(rollbackFor= @ApplicationException(rollback=true)
DaoException.class) public class DaoException
public class ContatoController{ extends Exception{}
âąHandlerExceptionResolver âą<error-page>
âąAOP Proxies âąfiltros ou interceptadores
QCONSP #3 ROUND #3
29. Web-Peso leve
@Controller
Spring @Named
JavaEE
@Transactional @RequestScoped
public class ContatoController { public class ContatoMB {
@Autowired private Contato contato;
private ContatoDAO dao; private List<Contato> contatos;
@RequestMapping("/adicionar") @Inject
public ModelAndView adicionar(Contato c){ private ContatoDAO dao;
dao.salva(c);
ModelAndView mv = new ModelAndView("ok"); public void salvar(){
mv.addObject("contatos", dao.lista); dao.salva(contato);
return mav; zeraForm();
} }
QCONSP #3 ROUND #4
31. Web-Peso pesado
Spring JavaEE
public class EncodingPostProcessor public class UtilMB {
implements BeanPostProcessor {
public String reset() {
public Object postProcessBeforeInitialzation FacesContext context =
(Object bean, String name) FacesContext.getCurrentInstance();
throws BeansException Application application =
{if(bean instanceof context.getApplication();
AnnotationMethodHandlerAdapter) { ViewHandler viewHandler =
application.getViewHandler();
HttpMessageConverter<?>[] convs = UIViewRoot viewRoot =
((AnnotationMethodHandlerAdapter) viewHandler.createView(context,
bean).getMessageConverters(); context.getViewRoot().getViewId());
context.setViewRoot(viewRoot);
for (HttpMessageConverter<?> conv : convs) { return "success";
}
if(conv instanceof }
StringHttpMessageConverter) {
((StringHttpMessageConverter) conv)
.setSupportedMediaTypes(Arrays
.asList(new MediaType("text", "
Charset.forName("UTF-)
}
QCONSP #3 ROUND #4
32. Web
Action-based vs. Component-based
QCONSP #3 ROUND #4
34. Web-Service - SOAP
Spring JavaEE
@WebService @WebService
public class ContatosWS extends public class ContatosWS{
SpringBeanAutowiringSupport{
@Inject
@Autowired ContatoDAO dao;
private ContatoDAO dao;
public List<Contato> listaDeContatos(){
public List<Contato> listaDeContatos() { return dao.lista();
if(dao==null{ }
processInjectionBasedOnCurrentContext(this);
} }
...;
}
}
QCONSP #3 ROUND #5
36. Web-Service - REST
@Controller
Spring @Path("/")
JavaEE
public class ContatoResource { public class ContatoResource {
@Autowired @Inject
private ContatoDAO dao; private ContatoDAO dao;
@RequestMapping( @GET
value = "/contatos/{id}", @Path("/contatos/{id}")
produces={"application/json"}, @Produces({"application/json"})
method=RequestMethod.GET) public Contato load(@PathParam("id")
@ResponseBody Long id){
public Contato load(@PathVariable("id") return dao.busca(id);
Long id) { }
return dao.busca(id); }
}
}
QCONSP #3 ROUND #5
38. Mensageria
JavaEE - JMS
InitialContext ic = new InitialContext();
ConnectionFactory cf = (ConnectionFactory)ic.lookup("Factory");
Connection con = cf.createConnection(..);
Session session = con.createSession(false,AUTO_ACKNOWLEDGE);
TextMessage msg = session.createTextMessage("oi jms");
Queue queue = (Queue)ic.lookup("jms/queue/loja");
QueueSender sender = session.createSender(queue);
sender.send(textMessage);
con.close();
QCONSP #3 ROUND #6
39. Mensageria
JavaEE - JMS
InitialContext ic = new InitialContext();
ConnectionFactory cf = (ConnectionFactory)ic.lookup("Factory");
Connection con = cf.createConnection(..);
Session session = con.createSession(false,AUTO_ACKNOWLEDGE);
TextMessage msg = session.createTextMessage("oi jms");
Queue queue = (Queue)ic.lookup("jms/queue/loja");
QueueSender sender = session.createSender(queue);
sender.send(textMessage);
con.close();
QCONSP #3 ROUND #6
40. Mensageria
Spring - JMSTemplate
@Autowired JmsTemplate template;
@Autowired Queue queue;
public void enviaMensagem() {
this.template.send(queue, new MessageCreator() {
public Message createMessage(Session s) throws JMSException {
return session.createTextMessage("oi jms");
}
});
}
QCONSP #3 ROUND #6
41. Mensageria
Spring - JMSTemplate
@Autowired JmsTemplate template;
@Autowired Queue queue;
public void enviaMensagem() {
this.template.send(queue, new MessageCreator() {
public Message createMessage(Session s) throws JMSException {
return session.createTextMessage("oi jms");
}
});
}
QCONSP #3 ROUND #6
43. Mensageria
Spring Integration
QCONSP #3 ROUND #6
45. Segurança
JavaEE - JAAS
<security-constraint> @RolesAllowed({"cliente"})
<web-resource-collection> public void salva(Contato contato){
<url-pattern>/adiciona.jsf</url-pattern> //...
</web-resource-collection> }
<auth-constraint>
<role-name>*</role-name> @PermitAll, @DenyAll ...
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>v
<form-login-config>
<form-login-page>/login.jsf
</form-login-page>
</form-login-config>
</login-config>
<security-role>
<role-name>*</role-name>
</security-role>
QCONSP #3 ROUND #7
46. Segurança
JavaEE - JAAS
<security-constraint> @RolesAllowed({"cliente"})
<web-resource-collection> public void salva(Contato contato){
<url-pattern>/adiciona.jsf</url-pattern> //...
</web-resource-collection> }
<auth-constraint>
<role-name>*</role-name> @PermitAll, @DenyAll ...
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>v
<form-login-config>
<form-login-page>/login.jsf
</form-login-page>
</form-login-config>
</login-config>
<security-role>
<role-name>*</role-name>
</security-role>
QCONSP #3 ROUND #7
48. Segurança
Spring Security
<sec:authentication-manager> @Secured({"cliente"})
<sec:authentication-provider public void salva(Contato contato){
user-service-ref="userDAO" /> //...
</sec:authentication-manager> }
<sec:http auto-config="true">
<sec:intercept-url <sec:authorize access="hasRole('cliente')">
pattern="/contatos.spring" um jsp restrito
access="ROLE_USER" /> </sec:authorize>
<sec:form-login
login-page="/login-form.spring"
default-target-url="/contatos.spring"
login-processing-url="/login" />
<sec:logout logout-url="/logout"
logout-success-url="/login-form.spring"/>
</sec:http>
QCONSP #3 ROUND #7
55. Extras
âWe will create new projects
where no good solution exists.â
SpringSource
QCONSP #3 ROUND #9
62. Especifição
vs
Implementação
âStandards are for standardizing,
and not innovating.â
Ed Burns (LĂder JSF-Spec )
QCONSP #3 ROUND #10
64. Especifição
vs
Implementação
"Stick to the standard when you can,
leave the standards when you need."
Antonio Goncalves (JCP Expert Member)
QCONSP #3 ROUND #10
Hinweis der Redaktion \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n