Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SpringMVC中完成模型部分?_Java_Spring_Spring Mvc - Fatal编程技术网

Java 如何在SpringMVC中完成模型部分?

Java 如何在SpringMVC中完成模型部分?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在用SpringMVC解决一个辅导问题,和另一个队友一起实习。我不熟悉Spring(这就是我学习Spring的原因) 我们第一次编写的代码没有任何框架支持,是纯手工编写的MVC 我们使用的是Spring2.5和集成的Hibernate,使用的是Autowire、控制器、存储库注释等。。 我对视图部分还不感兴趣。因此我们链接到数据库,但模型仍然是旧模型,类似于: public class Client { private String name; private String bankA

我正在用SpringMVC解决一个辅导问题,和另一个队友一起实习。我不熟悉Spring(这就是我学习Spring的原因)

我们第一次编写的代码没有任何框架支持,是纯手工编写的MVC

我们使用的是Spring2.5和集成的Hibernate,使用的是Autowire、控制器、存储库注释等。。 我对视图部分还不感兴趣。因此我们链接到数据库,但模型仍然是旧模型,类似于:

public class Client {

 private String name;
 private String bankAccount;

 public String getName() {
  return name;
 }

 public String getBankAccount() {
  return bankAccount;
 }

 public Client(String name, String bankAccount) {
  this.name = name;
  this.bankAccount = bankAccount;
 }
}
作为Spring2.5MVC中的“M”部分,该模型是如何正确实现的? 我在考虑自动布线、构造函数注入和保持不变

我只是想不起如何在框架中正确地完成这项工作。任何帮助都将不胜感激,谢谢。

您的“老”机型看起来基于POJO,这是Spring MVC的核心。在大多数情况下,您可以将模型对象或视图特定格式副本(DTO/值对象)添加到Spring模型对象(美化的hashmap)中,并直接在视图中访问它们

不需要特殊的类或其他位

在不变性、注入等方面——这是对象设计的问题,如果它们表示不应更改的对象/值(例如货币、日期等),则应用正常的不变性规则——通常,您的一个Spring服务类会创建它们作为工厂或存储库

这有助于澄清问题吗?

您的“旧”模型看起来基于POJO,这是Spring MVC的核心。在大多数情况下,您可以将模型对象或视图特定格式副本(DTO/值对象)添加到Spring模型对象(美化的hashmap)中,并直接在视图中访问它们

不需要特殊的类或其他位

在不变性、注入等方面——这是对象设计的问题,如果它们表示不应更改的对象/值(例如货币、日期等),则应用正常的不变性规则——通常,您的一个Spring服务类会创建它们作为工厂或存储库


这有助于澄清问题吗?

基本上,您的模型是从控制器向视图传递信息的一种方式,因此您的模型对象实际上与它的方式一样好,不需要进行任何更改。要在模型中使用框架,您将执行以下操作:

<h1>Name : ${client.name}</h1>
<h2>Account Number : ${client.account}</h2>
您的控制器:

@RequestMapping(value="/client/view")
public String viewClientPage(Model m) {

   Client c = new Client( "Jeffrey", "123456" );
   m.addAttribute( "client", c );
   return "[name of a client using view goes here]";

}
然后,您将有一个视图,它可以执行以下操作:

<h1>Name : ${client.name}</h1>
<h2>Account Number : ${client.account}</h2>
Name:${client.Name}
帐号:${client.Account}

对于您的模型(您的模型已经这样做了),需要记住的一点是,对于希望通过表达式语言
${client.name}
映射到
client.getName()
的属性,您将需要getter,您不能执行类似
${client.getAccount(2)}的操作
要获得他们拥有的第三个帐户

基本上,您的模型是从控制器向视图传递信息的一种方式,因此您的模型对象实际上与它的方式一样好,无需进行任何更改。要在模型中使用框架,您将执行以下操作:

<h1>Name : ${client.name}</h1>
<h2>Account Number : ${client.account}</h2>
您的控制器:

@RequestMapping(value="/client/view")
public String viewClientPage(Model m) {

   Client c = new Client( "Jeffrey", "123456" );
   m.addAttribute( "client", c );
   return "[name of a client using view goes here]";

}
然后,您将有一个视图,它可以执行以下操作:

<h1>Name : ${client.name}</h1>
<h2>Account Number : ${client.account}</h2>
Name:${client.Name}
帐号:${client.Account}
对于您的模型(您的模型已经这样做了),需要记住的一点是,对于希望通过表达式语言
${client.name}
映射到
client.getName()
的属性,您将需要getter,您不能执行类似
${client.getAccount(2)}的操作
获取他们拥有的第三个帐户

配置要持久化的模型 如果它们确实应该在那里持久化,您很可能会使用JPA/Hibernate和一些注释来实现这一点:

@Entity @Table(name="person")
public class Person extends AbstractEntity {

  private long id;
  private String email;

  @Id
  @Column(name="id")
  public long getId() { return this.id; }

  @Column(name="email")  
  public String getEmail() { return this.email; }

  // also setters, but they don't need annotations
}
请注意,您可以通过遵循约定来避免某些注释,但您可能希望在学习过程中避免这种情况,因为它可能很难工作,并且会出现难以追踪的神秘错误;打赌从Spring开始

非持久化模型 除了不需要DB注释外,其他设计都是类似的。我建议将它们放在另一个包中,以明确您的模型的用途。根据您正在解决的问题,您可能没有这些问题

使该视图可用 最简单的方法是将控制器方法设置为以下形式:

@RequestMapping(value="/person/{id}")
public ModelAndView handleRequest(@PathVariable long personId) {
    Person p = findPerson(id);
    return new ModelAndView("view name goes here")
      .addAttribute(p); // bean is automatically named "person"
}
要实现此功能,必须在
dispatcher servlet.xml
中配置
DefaultAnnotationHandlerMapping
,才能实现此功能。

配置要持久化的模型 如果它们确实应该在那里持久化,您很可能会使用JPA/Hibernate和一些注释来实现这一点:

@Entity @Table(name="person")
public class Person extends AbstractEntity {

  private long id;
  private String email;

  @Id
  @Column(name="id")
  public long getId() { return this.id; }

  @Column(name="email")  
  public String getEmail() { return this.email; }

  // also setters, but they don't need annotations
}
请注意,您可以通过遵循约定来避免某些注释,但您可能希望在学习过程中避免这种情况,因为它可能很难工作,并且会出现难以追踪的神秘错误;打赌从Spring开始

非持久化模型 除了不需要DB注释外,其他设计都是类似的。我建议将它们放在另一个包中,以明确您的模型的用途。根据您正在解决的问题,您可能没有这些问题

使该视图可用 最简单的方法是将控制器方法设置为以下形式:

@RequestMapping(value="/person/{id}")
public ModelAndView handleRequest(@PathVariable long personId) {
    Person p = findPerson(id);
    return new ModelAndView("view name goes here")
      .addAttribute(p); // bean is automatically named "person"
}

要实现此功能,您必须在
dispatcher servlet.xml
中配置
DefaultAnnotationHandlerMapping
,才能实现此功能。

不清楚您在问什么。在春天,没有“正确的做法”,任何一件事都有十几种方法。请解释一下你想用这个模型做什么,就像你想让控制器工作一样。你想问什么还不清楚。在春天,没有“正确的做法”,任何一件事都有十几种方法。李,请解释一下你想用这个型号做什么