Java 如何在SpringMVC中完成模型部分?
我正在用SpringMVC解决一个辅导问题,和另一个队友一起实习。我不熟悉Spring(这就是我学习Spring的原因) 我们第一次编写的代码没有任何框架支持,是纯手工编写的MVC 我们使用的是Spring2.5和集成的Hibernate,使用的是Autowire、控制器、存储库注释等。。 我对视图部分还不感兴趣。因此我们链接到数据库,但模型仍然是旧模型,类似于: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
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
,才能实现此功能。不清楚您在问什么。在春天,没有“正确的做法”,任何一件事都有十几种方法。请解释一下你想用这个模型做什么,就像你想让控制器工作一样。你想问什么还不清楚。在春天,没有“正确的做法”,任何一件事都有十几种方法。李,请解释一下你想用这个型号做什么