如何以RESTful方式编写Spring Web MVC 3应用程序?

时间:2013-05-30 04:15:49

标签: spring rest spring-mvc

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

有关于如何执行此操作的精彩教程here。要总结一下,不要深入了解xml等细节,你需要配置Spring内置的调度程序servlet来响应一些网址,比如说/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”。

答案 1 :(得分: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. 让泽西生成反映此模型的类文件。这将成为您可以阅读的java源代码。
  3. 使用泽西注释编写控制器并返回生成的模型对象(或多或少)。
  4. 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));
        }
    }