Java 尝试遵循MVC模式
我正在尝试使用MVC模式构建我的第一个JavaSwing应用程序。但是我不太喜欢它。尤其不是关于如何编写代码。我在这个网站和其他网站上读了很多关于MVC的文章。 这是我读到的关于MVC的内容之一: 我对开发相当陌生,希望从一开始就使用最佳实践 我认为我对MVC模式的理解是,你有一个控制器、一个模型和一个视图。控制器从视图中获取输入。然后控制器要求模型改变它的状态。从模型中获取状态,并执行它需要对输入执行的所有操作,如将其存储到数据库或使用从数据库中获取的内容更改视图Java 尝试遵循MVC模式,java,swing,model-view-controller,Java,Swing,Model View Controller,我正在尝试使用MVC模式构建我的第一个JavaSwing应用程序。但是我不太喜欢它。尤其不是关于如何编写代码。我在这个网站和其他网站上读了很多关于MVC的文章。 这是我读到的关于MVC的内容之一: 我对开发相当陌生,希望从一开始就使用最佳实践 我认为我对MVC模式的理解是,你有一个控制器、一个模型和一个视图。控制器从视图中获取输入。然后控制器要求模型改变它的状态。从模型中获取状态,并执行它需要对输入执行的所有操作,如将其存储到数据库或使用从数据库中获取的内容更改视图 public clas
public class MainWindowActionListenerAddMVCVIEW implements ActionListener {
WolffAddressManagerMVCMODEL model = new WolffAddressManagerMVCMODEL();
WolffAddressManagerMVCController controller = new WolffAddressManagerMVCController(model);
public MainWindowActionListenerAddMVCVIEW(JTextField fName, JTextField lName, JTextField eAddress, JTextField streetName, JTextField houseNumber, JTextField add, JTextField zCode, JTextField cityName) {
this.model.setJTextfiedFirstName(fName);
this.model.setJTextFieldLastName(lName);
this.model.setJTextFieldEmailAddress(eAddress);
this.model.setJTextFieldStreet(streetName);
this.model.setJTextFieldHouseNumber(houseNumber);
this.model.setJTextFieldAdditive(add);
this.model.setJTexFieldZipCode(zCode);
this.model.setJTextFieldCity(cityName);
}
@Override
public void actionPerformed(ActionEvent e) {
model.setFirstName(model.getJTextFieldFirstName().getText());
model.setLastName(model.getJTextFieldLastName().getText());
model.setEmailAddress(model.getJTextFieldEmailAddress().getText());
model.setStreet(model.getJTextFieldStreet().getText());
model.setNumber(model.getJTextFieldHouseNumber().getText());
model.setAdditive(model.getJTextfieldAdditive().getText());
model.setZipCode(model.getJTextFieldZipCode().getText());
model.setCity(model.getJTextFieldCity().getText());
try {
controller.saveAddressToDataBase(this);
} catch (Exception ex) {
Logger.getLogger(MainWindowActionListenerAddMVCVIEW.class.getName()).log(Level.SEVERE, null, ex);
}
例如,如果单击“添加地址”按钮,它将从视图中的文本字段获取输入。控制器更新模型,并将从视图中获取的数据保存到数据库中。如果单击“search Addres”按钮,它将从视图中的文本字段中获取输入,搜索数据库,如果它返回数据,它将更新模型并将其输出到视图中
如果我认为了解MVC是正确的,我该如何编写代码
有没有可能用我到目前为止的代码来解释它
如何将数据从视图获取到控制器和模型
这是我目前的代码:
视图JFrame
查看ActionListener
模型
控制器
公共类WolfFadDressManagerMVCC控制器{
公共管理器模型控制器模型;
公共主窗口ActionListener MVCView控制器ActionListener;
公共文件管理器vcjframeview控制器jframe;
私有连接connect=null;
私人最终报表=空;
private PreparedStatement PreparedStatement=null;
私有ResultSet ResultSet=null;
public ArrayList queryResultSet=new ArrayList();
public void saveAddressToDataBase(MainWindowActionListenerMVCVIEW控制器)引发异常{
试一试{
Class.forName(“com.mysql.jdbc.Driver”);
connect=DriverManager.getConnection(“jdbc:mysql://localhost/dev?“+”user=root&password=password”);
preparedStatement=connect.prepareStatement(“从dev.addresses中选择电子邮件,其中电子邮件='”+控制器.emailAddress.getText()+”);
resultSet=preparedStatement.executeQuery();
if(resultSet.next()){
JOptionPane.showMessageDialog(null,“电子邮件已存在”,“信息框:“+”错误”,JOptionPane.INFORMATION\u消息);
}否则{
preparedStatement=connect.prepareStatement(“插入到开发地址(名字、姓氏、电子邮件、街道、门牌号、地址、邮编、城市)值(?,,,,,,,,,?)”;
preparedStatement.setString(1,controller.firstName.getText());
preparedStatement.setString(2,controller.lastName.getText());
preparedStatement.setString(3,controller.emailAddress.getText());
setString(4,controller.street.getText());
preparedStatement.setString(5,controller.number.getText());
preparedStatement.setString(6,controller.addition.getText());
setString(7,controller.zipCode.getText());
setString(8,controller.city.getText());
preparedStatement.executeUpdate();
}
}catch(ClassNotFoundException | SQLException | HeadlessException e){
投掷e;
}最后{
close();
}
}
public void searchAddress(字符串emailAddress)引发异常{
试一试{
Class.forName(“com.mysql.jdbc.Driver”);
//设置与数据库的连接
connect=DriverManager.getConnection(“jdbc:mysql://localhost/dev?“+”user=root&password=fiat128slc“;
preparedStatement=connect.prepareStatement(“从电子邮件地址中选择*”+“电子邮件地址+”);
resultSet=preparedStatement.executeQuery();
if(resultSet.isBeforeFirst()){
while(resultSet.next()){
添加(resultSet.getString(“firstname”);
添加(resultSet.getString(“lastname”);
添加(resultSet.getString(“电子邮件”);
添加(resultSet.getString(“street”);
添加(resultSet.getString(“housenumber”);
添加(resultSet.getString(“additve”);
添加(resultSet.getString(“zipcode”);
添加(resultSet.getString(“城市”);
}
}否则{
JOptionPane.showMessageDialog(null,“电子邮件不存在”,“信息框:”+“错误”,JOptionPane.INFORMATION\u消息);
}
}catch(ClassNotFoundException | SQLException | HeadlessException e){
投掷e;
}最后{
close();
}
}
我编辑了我的最后一个答案。我认为我的思路是正确的。在我的MVC项目中使用getter和setter。我现在有了一个负责查询的类
控制器
public class MainWindowActionListenerMVCVIEW implements ActionListener {
public JTextField firstName, lastName, emailAddress, street, number, additive, zipCode, city, searchEmailAdress, removeEmailAddress;
public MainWindowActionListenerMVCVIEW(JTextField fName, JTextField lName, JTextField eAddress, JTextField streetName, JTextField houseNumber, JTextField add, JTextField zCode, JTextField cityName, JTextField searchEAdress, JTextField removeEAddress) {
this.firstName = fName;
this.lastName = lName;
this.emailAddress = eAddress;
this.street = streetName;
this.number = houseNumber;
this.additive = add;
this.zipCode = zCode;
this.city = cityName;
this.searchEmailAdress = searchEAdress;
this.removeEmailAddress = removeEAddress;
}
@Override
public void actionPerformed(ActionEvent e) {
firstName.getText();
lastName.getText();
emailAddress.getText();
street.getText();
number.getText();
additive.getText();
zipCode.getText();
city.getText();
searchEmailAdress.getText();
removeEmailAddress.getText();
System.out.println("test" + " " + firstName.getText()); // I put this in just te see if the *ActionListener* works
}
}
public class WolffAddressManagerMVCMODEL {
public String firstName;
public String lastName;
public String emailAddress;
public String street;
public String number;
public String additive;
public String zipCode;
public String city;
}
public class WolffAddressManagerMVCController {
public WolffAddressManagerMVCMODEL controllerModel;
public MainWindowActionListenerMVCVIEW controllerActionListener;
public WolffAddressManagerMVCJFrameVIEW controllerJFrame;
private Connection connect = null;
private final Statement statement = null;
private PreparedStatement preparedStatement = null;
private ResultSet resultSet = null;
public ArrayList<String> queryResultSet = new ArrayList();
public void saveAddressToDataBase(MainWindowActionListenerMVCVIEW controller) throws Exception {
try {
Class.forName("com.mysql.jdbc.Driver");
connect = DriverManager.getConnection("jdbc:mysql://localhost/dev?" + "user=root&password=password");
preparedStatement = connect.prepareStatement("SELECT email FROM dev.addresses WHERE email= '" + controller.emailAddress.getText() + "'");
resultSet = preparedStatement.executeQuery();
if(resultSet.next()) {
JOptionPane.showMessageDialog(null, "Email already exist", "InfoBox: " + "Error", JOptionPane.INFORMATION_MESSAGE);
} else {
preparedStatement = connect.prepareStatement("INSERT INTO dev.addresses (firstname, lastname, email, street, housenumber, additve, zipcode, city) VALUES(?, ?, ?, ?, ?, ?, ?, ?)");
preparedStatement.setString(1, controller.firstName.getText());
preparedStatement.setString(2, controller.lastName.getText());
preparedStatement.setString(3, controller.emailAddress.getText());
preparedStatement.setString(4, controller.street.getText());
preparedStatement.setString(5, controller.number.getText());
preparedStatement.setString(6, controller.additive.getText());
preparedStatement.setString(7, controller.zipCode.getText());
preparedStatement.setString(8, controller.city.getText());
preparedStatement.executeUpdate();
}
} catch (ClassNotFoundException | SQLException | HeadlessException e) {
throw e;
} finally {
close();
}
}
public void searchAddress(String emailAddress) throws Exception {
try {
Class.forName("com.mysql.jdbc.Driver");
// Setup the connection with the DB
connect = DriverManager.getConnection("jdbc:mysql://localhost/dev?" + "user=root&password=fiat128slc");
preparedStatement = connect.prepareStatement("SELECT * FROM dev.addresses WHERE email= '" + emailAddress + "'");
resultSet = preparedStatement.executeQuery();
if(resultSet.isBeforeFirst()) {
while(resultSet.next()) {
queryResultSet.add(resultSet.getString("firstname"));
queryResultSet.add(resultSet.getString("lastname"));
queryResultSet.add(resultSet.getString("email"));
queryResultSet.add(resultSet.getString("street"));
queryResultSet.add(resultSet.getString("housenumber"));
queryResultSet.add(resultSet.getString("additve"));
queryResultSet.add(resultSet.getString("zipcode"));
queryResultSet.add(resultSet.getString("city"));
}
} else {
JOptionPane.showMessageDialog(null, "Email doesn't exist", "InfoBox: " + "Error", JOptionPane.INFORMATION_MESSAGE);
}
} catch (ClassNotFoundException | SQLException | HeadlessException e) {
throw e;
} finally {
close();
}
}
public class WolffAddressManagerMVCController {
private final WolffAddressManagerMVCMODEL model;
private final WolffAddressManagerQueriesMVCSERVICES query;
public WolffAddressManagerMVCController(WolffAddressManagerMVCMODEL model) {
this.query = new WolffAddressManagerQueriesMVCSERVICES();
this.model = model;
}
public void buildView() throws Exception {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(WolffAddressManagerMVCJFrameVIEW.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new WolffAddressManagerMVCJFrameVIEW().setVisible(true);
}
});
}
public void buildView2() throws Exception {
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(WolffAddressManagerMVCUpdateJFrameVIEW.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new WolffAddressManagerMVCUpdateJFrameVIEW().setVisible(true);
}
});
}
public void addCredentials(WolffAddressManagerMVCJFrameVIEW view , WolffAddressManagerMVCMODEL model) throws Exception {
if(model.getEmailAddress().equals(model.getReTypeEmailAddress())) {
if(query.saveAddressToDataBase(view, model) == true) {
showCredentials(view);
}
else {
view.setTextArea(view.getTextArea() + "EMAIL ALREADY EXISTS\n\n");
}
} else {
JOptionPane.showMessageDialog(null, "Emailaddresses are not the same", "InfoBox: " + "Error", JOptionPane.INFORMATION_MESSAGE);
}
}
private void showCredentials(WolffAddressManagerMVCJFrameVIEW view) throws Exception {
DefaultListModel<String> jList = new DefaultListModel();
JList<String> list = new JList(jList);
model.setSearchResultArray(searchCredentials(model));
for(int i = 0; i < model.getSearchResultArray().size(); i++) {
jList.addElement(model.getSearchResultArray().get(i));
}
list.setModel(jList);
int size = list.getModel().getSize();
StringBuilder credentials = new StringBuilder();
for(int i = 0; i < size; i++) {
credentials.append(list.getModel().getElementAt(i)).append("\n");
}
view.setTextArea(view.getTextArea() + credentials.toString()+ "CREDENTIALS ADDED\n\n");
}
public void removeCredentials() throws Exception {
query.removeAddress(model.getEmailAddress());
}
public ArrayList<String> searchCredentials(WolffAddressManagerMVCMODEL model) throws Exception {
return query.searchAddress(model.getEmailAddress());
}
public void showSearchResult(WolffAddressManagerMVCJFrameVIEW view, WolffAddressManagerMVCMODEL model) {
DefaultListModel<String> jList = new DefaultListModel();
JList<String> list = new JList(jList);
try {
model.setSearchResultArray(searchCredentials(model));
} catch (Exception e) {
Logger.getLogger(MainWindowActionListenerSearchMVCVIEW.class.getName()).log(Level.SEVERE, null, e);
}
for(int i = 0; i < model.getSearchResultArray().size(); i++) {
jList.addElement(model.getSearchResultArray().get(i));
}
list.setModel(jList);
int size = list.getModel().getSize();
StringBuilder credentials = new StringBuilder();
for(int i = 0; i < size; i++) {
credentials.append(list.getModel().getElementAt(i)).append("\n");
}
view.setTextArea(view.getTextArea() + credentials.toString());
}
private void showUpdateResult(WolffAddressManagerMVCUpdateJFrameVIEW view, WolffAddressManagerMVCMODEL model) {
DefaultListModel<String> jList = new DefaultListModel();
JList<String> list = new JList(jList);
try {
model.getUpdateResultArray();
} catch (Exception e) {
Logger.getLogger(MainWindowActionListenerSearchMVCVIEW.class.getName()).log(Level.SEVERE, null, e);
}
for(int i = 0; i < model.getUpdateResultArray().size(); i++) {
jList.addElement(model.getUpdateResultArray().get(i));
}
list.setModel(jList);
int size = list.getModel().getSize();
StringBuilder credentials = new StringBuilder();
for(int i = 0; i < size; i++) {
credentials.append(list.getModel().getElementAt(i)).append("\n");
}
view.setTextArea(credentials.toString());
}
public void updateCredentials(WolffAddressManagerMVCUpdateJFrameVIEW view,WolffAddressManagerMVCMODEL model) throws Exception {
if(query.updateAddress(view, model) == true) {
showUpdateResult(view,model);
}
}
}
public class WolffAddressManagerMVCMODEL {
private String updateEmailAddress;
private String companyName;
private String firstName;
private String lastName;
private String emailAddress;
private String reTypeEmailAddress;
private String street;
private String number;
private String additive;
private String zipCode;
private String city;
private JTextField jTextFieldUpdateEmailAddress;
private JTextField jTextFieldCompanyName;
private JTextField jTextFieldFirstName;
private JTextField jTextFieldLastName;
private JTextField jTextFieldEmailAddress;
private JTextField jTextFieldReTypeEmailAddress;
private JTextField jTextFieldStreetName;
private JTextField jTextFieldHouseNumber;
private JTextField jTextFieldAdditive;
private JTextField jTextFieldZipCode;
private JTextField jTextFieldCityName;
private JTextField jTextFieldSearchEmailAddress;
private JTextField jTextFieldRemoveEmailAddress;
private ArrayList<String> searchResultArray = null;
private ArrayList<String> updateResultArray = null;
public String getUpdateEmailAddress() {
return updateEmailAddress;
}
public void setUpdateEmailAddress(String updateEmailAddress) {
this.updateEmailAddress = updateEmailAddress;
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmailAddress() {
return emailAddress;
}
public void setEmailAddress(String emailAddress) {
this.emailAddress = emailAddress;
}
public String getReTypeEmailAddress() {
return reTypeEmailAddress;
}
public void setReTypeEmailAddress(String reTypeEmailAddress) {
this.reTypeEmailAddress = reTypeEmailAddress;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getAdditive() {
return additive;
}
public void setAdditive(String additive) {
this.additive = additive;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public JTextField getJTextFieldUpdateEmailAddress() {
return jTextFieldUpdateEmailAddress;
}
public void setJTextFieldUpdateEmailAddress(JTextField updateEmailAddress) {
this.jTextFieldUpdateEmailAddress = updateEmailAddress;
}
public JTextField getJTextFieldCompanyName() {
return jTextFieldCompanyName;
}
public void setJTextFieldCompanyName(JTextField companyName) {
this.jTextFieldCompanyName = companyName;
}
public JTextField getJTextFieldFirstName() {
return jTextFieldFirstName;
}
public void setJTextFieldFirstName(JTextField fName) {
this.jTextFieldFirstName = fName;
}
public JTextField getJTextFieldLastName() {
return jTextFieldLastName;
}
public void setJTextFieldLastName(JTextField lastName) {
this.jTextFieldLastName = lastName;
}
public JTextField getJTextFieldEmailAddress() {
return jTextFieldEmailAddress;
}
public void setJTextFieldEmailAddress(JTextField emailAddress) {
this.jTextFieldEmailAddress = emailAddress;
}
public JTextField getJTextFieldReTypeEmailAddress() {
return jTextFieldReTypeEmailAddress;
}
public void setJTextFieldReTypeEmailAddress( JTextField reTypeEmailAddress) {
this.jTextFieldReTypeEmailAddress = reTypeEmailAddress;
}
public JTextField getJTextFieldStreet() {
return jTextFieldStreetName;
}
public void setJTextFieldStreet(JTextField streetName) {
this.jTextFieldStreetName = streetName;
}
public JTextField getJTextFieldHouseNumber() {
return jTextFieldHouseNumber;
}
public void setJTextFieldHouseNumber(JTextField houseNumber) {
this.jTextFieldHouseNumber = houseNumber;
}
public JTextField getJTextfieldAdditive() {
return jTextFieldAdditive;
}
public void setJTextFieldAdditive(JTextField additive) {
this.jTextFieldAdditive = additive;
}
public JTextField getJTextFieldZipCode() {
return jTextFieldZipCode;
}
public void setJTexFieldZipCode(JTextField zipCode) {
this.jTextFieldZipCode = zipCode;
}
public JTextField getJTextFieldCity() {
return jTextFieldCityName;
}
public void setJTextFieldCity(JTextField cityName){
this.jTextFieldCityName = cityName;
}
public JTextField getJTextFieldSearchEmailAddress(){
return jTextFieldSearchEmailAddress;
}
public void setJTextFieldSearchEmailAddress(JTextField searchEmailAddress) {
this.jTextFieldSearchEmailAddress = searchEmailAddress;
}
public JTextField getJTextFieldRemoveEmailAddress(){
return jTextFieldRemoveEmailAddress;
}
public void setJTextFieldRemoveEmailAddress(JTextField removeEAddress){
this.jTextFieldRemoveEmailAddress = removeEAddress;
}
public ArrayList<String> getSearchResultArray() {
return searchResultArray;
}
public void setSearchResultArray(ArrayList searchResultArray) {
this.searchResultArray = searchResultArray;
}
public ArrayList<String> getUpdateResultArray() {
return updateResultArray;
}
public void setUpdateResultArray(ArrayList searchResultArray) {
this.updateResultArray = searchResultArray;
}
}
public class MainWindowActionListenerAddMVCVIEW implements ActionListener {
WolffAddressManagerMVCMODEL model = new WolffAddressManagerMVCMODEL();
WolffAddressManagerMVCController controller = new WolffAddressManagerMVCController(model);
public MainWindowActionListenerAddMVCVIEW(JTextField fName, JTextField lName, JTextField eAddress, JTextField streetName, JTextField houseNumber, JTextField add, JTextField zCode, JTextField cityName) {
this.model.setJTextfiedFirstName(fName);
this.model.setJTextFieldLastName(lName);
this.model.setJTextFieldEmailAddress(eAddress);
this.model.setJTextFieldStreet(streetName);
this.model.setJTextFieldHouseNumber(houseNumber);
this.model.setJTextFieldAdditive(add);
this.model.setJTexFieldZipCode(zCode);
this.model.setJTextFieldCity(cityName);
}
@Override
public void actionPerformed(ActionEvent e) {
model.setFirstName(model.getJTextFieldFirstName().getText());
model.setLastName(model.getJTextFieldLastName().getText());
model.setEmailAddress(model.getJTextFieldEmailAddress().getText());
model.setStreet(model.getJTextFieldStreet().getText());
model.setNumber(model.getJTextFieldHouseNumber().getText());
model.setAdditive(model.getJTextfieldAdditive().getText());
model.setZipCode(model.getJTextFieldZipCode().getText());
model.setCity(model.getJTextFieldCity().getText());
try {
controller.saveAddressToDataBase(this);
} catch (Exception ex) {
Logger.getLogger(MainWindowActionListenerAddMVCVIEW.class.getName()).log(Level.SEVERE, null, ex);
}