目标:实现如下的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
<?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工具: