3

我在集成项目上工作了一段时间,主要是构建和集成服务。现在我开始了一个自己的学习项目,从头开始构建一个应用程序,而我目前在编写 Web UI 时遇到了困难。我用作框架spring 框架,我希望在第一阶段使用 spring web mvc 作为 UI 技术。尽管如此,我还是打算使用 REST 控制器,因为我想在我的自我训练的下一步中公开一个可能被移动客户端使用的 API。所以这个问题真的:

如何将 Web MVC 前端绑定到后面的 RESTful 控制器?

谢谢!

4

2 回答 2

1

这里有一个关于如何做到这一点的很棒的教程。在不涉及 xml 等细节的情况下进行总结,您需要配置 Spring 中内置的调度程序 servlet 以响应某些 url 集,例如/webapp/*。这将导致所有以“/webapp/”开头的请求都被转发到调度程序 servlet。

然后你像这样配置你的控制器类

@Controller
@RequestMapping("/users")
public class UsersController{

  @RequestMapping("/users/{id}")
  public String getUser(@PathVariable("id")String userId, Model model){

  //get the user, etc etc etc

  //return a string that points to the appropriate jsp page
  }
}

Spring 可以处理其余部分。在本例中,您将用户 ID 指定为 URL 的一部分。您还可以执行各种操作,例如处理帖子、获取等。您可以创建任意数量的控制器和处理程序方法。在这种情况下,它将响应 URL“/webapp/users/someuserid”。

于 2013-05-30T04:31:13.977 回答
1

您的 REST 控制器是 mvc 控制器,当然还有很多替代方法可以让它们返回 json 或 xml。这里有两种选择:

轻巧简单

像往常一样写控制器。让他们返回无效。将 HttpServletResponse 作为 in 参数。使用 json/xml 序列化程序来序列化您的结果并将输出写入响应。控制器不会转发到视图。

例如,您可以使用http://flexjson.sourceforge.net/序列化为 json。

一个例子:

@RequestMapping(value = "item/{someId}", method = RequestMethod.GET)
public void getItemById(HttpServletResponse response,
                        @PathVariable("someId") Long itemId) throws IOException {
    ... your code here, get the Item by the id ...
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    JSONSerializer serializer = new JSONSerializer();
    serializer.exclude("*.class"); //reduce clutter in your output as you see fit
    serializer.serialize(objectToSerialize, response.getWriter());
}

当然,输出到 json 可以用其他方法存储起来。这种方法很容易实现,并且不难理解和使用。

更复杂

使用https://jersey.java.net/。这不是“自己动手”,而是一个完整的框架。跟着这些步骤:

  1. 编写包含要输出的模型的 XSD 文件
  2. 让 jersey 生成反映该模型的类文件。这成为您可以阅读的 java 源代码。
  3. 使用球衣注释编写控制器并返回生成的模型对象(或多或少)。

XSD

这个 XSD

<xsd:element name="customerBonus" type="customerBonus"/>
<xsd:complexType name="customerBonus">
    <xsd:sequence>
        <xsd:element name="bonusAmount" type="xsd:long"/>
        <xsd:element name="bonusValidTo" type="xsd:date"/>
        <xsd:element name="upcomingBonusAmount" type="xsd:long"/>
    </xsd:sequence>
</xsd:complexType>

成为这个 java 代码(为简洁起见不完整):

@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "customerBonus", propOrder = { "bonusAmount", "bonusValidTo", "upcomingBonusAmount" }) 公共类 CustomerBonus {

protected long bonusAmount;
@XmlElement(required = true)
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar bonusValidTo;
protected long upcomingBonusAmount;

/**
 * Gets the value of the bonusAmount property.
 * 
 */
public long getBonusAmount() {
    return bonusAmount;
}

/**
 * Sets the value of the bonusAmount property.
 * 
 */
public void setBonusAmount(long value) {
    this.bonusAmount = value;
}

启用 jersey servlet:

<servlet>
    <servlet-name>Jersey Spring Web Application</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey Spring Web Application</servlet-name>
    <url-pattern>/yourstarturl/*</url-pattern>
</servlet-mapping>

典型控制器:

@Path("cart") //base url for service
@Component
@Scope("request")
public class CartAndOrderResource extends AbstractResursResource {

    @GET
    @Produces({MediaType.APPLICATION_JSON}) //also xml possible here
    @Path("{cartId}") //added to base url, final url = cart/{cartId}
    public JAXBElement<Cart> getCart(@PathParam("cartId") String cartId) {
        return new ObjectFactory().createCart(cartService.getCart(cartId));
    }
}
于 2013-05-30T08:46:07.037 回答