1. 程式人生 > >springmvc搭建返回json格式的restful api

springmvc搭建返回json格式的restful api

目標:實現如下的restful api,返回格式為json

/blog/100 HTTP GET =>  得到id = 100的blog
/blog/100 HTTP DELETE => 刪除 id = 100的blog
/blog/100 HTTP PUT =>  更新id = 100的blog
/blog   HTTP POST =>  新增blog

用到的jar包:


主要程式碼:

web應用配置檔案

web.xml 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>

	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

springmvc配置檔案,注意配置stringConverter和jsonConverter

springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">
	<bean id="stringConverter"
		class="org.springframework.http.converter.StringHttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>text/plain;charset=UTF-8</value>
			</list>
		</property>
	</bean>
	<bean id="jsonConverter"
		class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>

	<bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="stringConverter" />
				<ref bean="jsonConverter" />
			</list>
		</property>
	</bean>
	<bean id="jspViewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass"
			value="org.springframework.web.servlet.view.JstlView" />
		<property name="prefix" value="/" />
		<property name="suffix" value=".jsp" />
	</bean>
	<context:component-scan base-package="com.ihefe.controller" />
</beans>

記錄日誌,使用log4j

log4j.properties

### set log levels ### 
log4j.rootLogger = info , Console , D
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=INFO
log4j.logger.java.sql.Statement=INFO
log4j.logger.java.sql.PreparedStatement=INFO
#output2file
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender 
log4j.appender.D.File = D:/logs/log-restful.log 
log4j.appender.D.Append = true 
log4j.appender.D.Threshold = INFO ## è¾åºinfo级å«ä»¥ä¸çæ¥å¿ 
log4j.appender.D.layout = org.apache.log4j.PatternLayout 
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n 

控制器,定義請求引數,方法,返回格式json

BlogController.java

package com.ihefe.controller;

import net.sf.json.JSONObject;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.ihefe.model.Blog;


@Controller
public class BlogController {
	/** 日誌例項 */
	private static final Logger logger = Logger.getLogger(BlogController.class);

	@RequestMapping(value = "/index", produces = "text/plain;charset=UTF-8")
	public @ResponseBody String hello() {
		return "hello";
	}

	@RequestMapping(value = "/say/{msg}", produces = "application/json;charset=UTF-8")
	public @ResponseBody String say(@PathVariable(value = "msg") String msg) {
		return "{\"msg\":\"you say:'" + msg + "'\"}";
	}

	@RequestMapping(value = "/blog/{id:\\d+}", method = RequestMethod.GET)
	public @ResponseBody Blog getBlog(@PathVariable("id") int id) {
		logger.info("獲取部落格id=" + id);
		Blog blog = new Blog();
		blog.setTitle("部落格標題");
		blog.setBrief("部落格概要");
		blog.setContent("部落格內容");
		blog.setId(id);
		return blog;
	}

	@RequestMapping(value = "/blog/{id:\\d+}", method = RequestMethod.DELETE)
	public @ResponseBody Object deleteBlog(@PathVariable("id") int id) {
		logger.info("刪除部落格資訊id=" + id);
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("msg", "刪除部落格成功");
		return jsonObject;
	}

	@RequestMapping(value = "/blog", method = RequestMethod.POST)
	public @ResponseBody Object addBlog(Blog blog) {
		logger.info("新增部落格成功id=" + blog.getId());
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("msg", "新增部落格成功");
		return jsonObject;
	}

	@RequestMapping(value = "/blog/{id:\\d+}", method = RequestMethod.PUT)
	public @ResponseBody Object updateBlog(Blog blog) {
		logger.info("更新部落格id=" + blog.getId());
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("msg", "更新部落格成功");
		return jsonObject;
	}

}

部落格實體類
Blog.java

package com.ihefe.model;

public class Blog {
	private int id;
	private String title;
	private String brief;
	private String content;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getBrief() {
		return brief;
	}

	public void setBrief(String brief) {
		this.brief = brief;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	@Override
	public String toString() {
		return "Blog [id=" + id + ", title=" + title + ", brief=" + brief
				+ ", content=" + content + "]";
	}

	public Blog() {
		super();
		// TODO Auto-generated constructor stub
	}
}

測試,使用火狐httprequester工具: