【问题标题】:How to write a Spring web MVC 3 application in a RESTful way?如何以 RESTful 方式编写 Spring Web MVC 3 应用程序?
【发布时间】:2013-05-30 04:15:49
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: spring rest spring-mvc


    【解决方案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 = { “奖金金额”, "bonusValidTo", “即将到来的奖金金额” }) 公共类 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));
        }
    }
    

    【讨论】:

      【解决方案2】:

      有一个很棒的教程 here 关于如何做到这一点。在不涉及 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”。

      【讨论】:

      • jsp 可以包含 json-code,并且有 taglibs 用于在 jsp 中编写 json-code(或 xml)(我在一个项目中使用过这个)。但通常最好使用将您的 java 对象转换为 json 或 xml 的序列化程序。
      猜你喜欢
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 2011-07-14
      • 1970-01-01
      • 2017-02-24
      • 2014-05-21
      相关资源
      最近更新 更多