Boa noite pessoal.
Tenho praticado ultimamente o uso do MVC em java. Estava acostumado a fazer coisas básicas utilizando o framework CakePHP.
Gostaria de saber a opinião de vocês sobre a utilização de “componentes” nas classes controllers.
Por exemplo:
Tenho a classe ServidorController, nela espero a mensagem enviada pelo cliente e este tratamento da conexão gostaria de utilizar uma Thread (Servidor MultiThread).
Não gostaria de implementar ServidorController como Runnable pois ai teria que instanciar a mesma classe na hora da criação de Threads.
Então criarei uma nova classe Runnable que trata o envio e recebimento de mensagens.
Minhas dúvidas são:
1- Posso criar esta classe (a Runnable) como um component e instanciá-la dentro do ServidorController sem estar ferindo o design pattern?
2- Haveria uma melhor maneira de efetuar isso sem utilizar classes internas?
Se fosse o caso de criar uma classe Component iria criar um pacote interno dentro do pacote Controle chamado Componentes.
Quando me refiro a Component trata-se de classes que auxiliam as controladoras como seria no caso do CakePHP.
A classe ServidorController já é uma Thread mas preciso de outras.
Abaixo segue o código do Controller.A parte onde pretendo utilizar uma classe Runnable se encontra no método aceitar Conexões.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Controle;
import Modelo.ServidorModel;
import Visao.ServidorView;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author Yuri
*/
public class ServidorController extends Thread{
private ServidorModel modelo;
private ServidorView visao;
private String configs[] = new String[3];
private ServerSocket conexao;
public boolean flag = false;
public ServidorController(ServidorModel model, ServidorView view){
this.modelo = model;
this.visao = view;
this.visao.addBotaoIniciarListener(new botaoIniciarListener());
this.visao.addBotaoLimparListener(new botaoLimparListener());
this.configs = this.modelo.obterConfiguracoes();
}
//Controle de Thread
@Override
public void run(){
while(true)
{
if(flag){
System.out.println("Server Aberto");
this.aceitarConexoes();
}
}
}
//Manipulação de Sockets
public void aceitarConexoes(){
try {
/* Pretendo colocar o trecho abaixo em uma outra classe que será Runnable */
Socket cliente = this.conexao.accept();
DataInputStream entrada = new DataInputStream(cliente.getInputStream());
String mensagem = entrada.readUTF();
if(mensagem != null)
System.out.println(mensagem);
/* Fim do trecho */
} catch (UnknownHostException ex) {//Excessão host desconhecido
Logger.getLogger(ServidorController.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
if(flag)//Se a conexão deveria funcionar corretamente lança excessões
Logger.getLogger(ServidorController.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void abrirConexao(){
try {
conexao = new ServerSocket(Integer.parseInt(configs[1]));
} catch (IOException ex) {
Logger.getLogger(ServidorController.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void fecharConexao(){
try {
conexao.close();
} catch (IOException ex) {
if (!flag)
Logger.getLogger(ServidorController.class.getName()).log(Level.SEVERE, null, ex);
}
}
//Listeners - Classes Internas
class botaoIniciarListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent evt){
if(visao.getBotaoIniciar().isSelected()){
flag = true;
abrirConexao();
visao.getTextoTerminal().append("Servidor iniciado no ip " + configs[0] + " e porta " + configs[1] + ".\n");
}
else{
flag = false;
fecharConexao();
visao.getTextoTerminal().append("Servido Finalizado...\n");
}
}
}
class botaoLimparListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent evt){
visao.getTextoTerminal().setText(null);
}
}
}
Espero ter demonstrado minha dúvida.
Agradeço desde já.
Att,
Yuri