Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓà Spring 3 À´´´½¨ RESTful Web Services
 
×÷ÕߣºYi Ming Huang£¬Dong Fei Wu »ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2015-3-17
  2764  次浏览      32
 

ÔÚ Java? ÖУ¬Äú¿ÉÒÔʹÓÃÒÔϼ¸ÖÖ·½·¨À´´´½¨ RESTful Web Service£ºÊ¹Óà JSR 311£¨311£©¼°Æä²Î¿¼ÊµÏÖ Jersey¡¢Ê¹Óà Restlet ¿ò¼ÜºÍ´ÓÍ·¿ªÊ¼¿ª·¢¡£Spring ÊÇÁ÷ÐÐµÄ Java EE Ó¦Óÿª·¢¿ò¼Ü£¬ÏÖÔÚËüµÄ MVC ²ãÒ²Ö§³Ö REST ÁË¡£±¾ÎĽ«½éÉÜʹÓà Spring ¿ª·¢ RESTful Web Services µÄ·½·¨¡£¶ÁÕß½«Á˽âÈçºÎʹÓà Spring API ºÍ×¢ÊÍÀ´¿ª·¢ RESTful Web Services£¬ÒÔ¼° Spring ÊÇÈçºÎ½«Õâ¸öÐÂÌØÐÔÕûºÏµ½ËüµÄ¿ò¼ÜÖеġ£

ÒýÑÔ

Roy Fielding ÊÇ HTTP 1.0 ºÍ 1.1 ±ê×¼µÄÖ÷Òª×÷ÕßÖ®Ò»£¬2000 Ä꣬ËûÔÚËûµÄ²©Ê¿ÂÛÎÄÖÐÊ×´ÎÌá³öÁË REST¡£

ͨ¹ý REST ·ç¸ñÌåϵ¼Ü¹¹£¬ÇëÇóºÍÏìÓ¦¶¼ÊÇ»ùÓÚ×ÊÔ´±íʾµÄ´«ÊäÀ´¹¹½¨µÄ¡£×ÊÔ´ÊÇͨ¹ýÈ«¾Ö ID À´±êʶµÄ£¬ÕâЩ ID Ò»°ãʹÓõÄÊÇÒ»¸öͳһ×ÊÔ´±êʶ·û£¨URI£©¡£¿Í»§¶ËÓ¦ÓÃʹÓà HTTP ·½·¨£¨È磬GET¡¢POST¡¢PUT »ò DELETE£©À´²Ù×÷Ò»¸ö»ò¶à¸ö×ÊÔ´¡£Í¨³££¬GET ÊÇÓÃÓÚ»ñÈ¡»òÁгöÒ»¸ö»ò¶à¸ö×ÊÔ´£¬POST ÓÃÓÚ´´½¨£¬PUT ÓÃÓÚ¸üлòÌæ»»£¬¶ø DELETE ÔòÓÃÓÚɾ³ý×ÊÔ´¡£

ÀýÈ磬GET http://host/context/employees/12345 ½«»ñÈ¡ ID Ϊ 12345 µÄÔ±¹¤µÄ±íʾ¡£Õâ¸öÏìÓ¦±íʾ¿ÉÒÔÊǰüº¬ÏêϸµÄÔ±¹¤ÐÅÏ¢µÄ XML »ò ATOM£¬»òÕßÊǾßÓиüºÃ UI µÄ JSP/HTML Ò³Ãæ¡£Äú¿´µ½ÄÄÖÖ±íʾ·½Ê½È¡¾öÓÚ·þÎñÆ÷¶ËʵÏÖºÍÄúµÄ¿Í»§¶ËÇëÇóµÄ MIME ÀàÐÍ¡£

RESTful Web Service ÊÇÒ»¸öʹÓà HTTP ºÍ REST Ô­ÀíʵÏÖµÄ Web Service¡£Í¨³££¬Ò»¸ö RESTful Web Service ½«¶¨Òå»ù±¾×ÊÔ´ URI¡¢ËüËùÖ§³ÖµÄ±íʾ/ÏìÓ¦ MIME£¬ÒÔ¼°ËüËùÖ§³ÖµÄ²Ù×÷¡£

±¾ÎĽ«½éÉÜÈçºÎʹÓà Spring ´´½¨ Java ʵÏֵķþÎñÆ÷¶Ë RESTful Web Services¡£Õâ¸öÀý×Ó½«Ê¹ÓÃä¯ÀÀÆ÷¡¢curl ºÍ Firefox ²å¼þ RESTClient ×÷Ϊ·¢³öÇëÇóµÄ¿Í»§¶Ë¡£Äú¿ÉÒÔ ÏÂÔØ ±¾ÎÄËùʹÓõÄÔ´´úÂë¡£

±¾Îļٶ¨ÄúÊÇÊìϤ REST »ù±¾ÖªÊ¶µÄ¡£²Î¿¼×ÊÁÏ ÖÐÓиü¶à¹ØÓÚ REST µÄÐÅÏ¢¡£

Spring 3 µÄ REST Ö§³Ö

ÔÚ Spring ¿ò¼ÜÖ§³Ö REST ֮ǰ£¬ÈËÃÇ»áʹÓÃÆäËû¼¸ÖÖʵÏÖ¼¼ÊõÀ´´´½¨ Java µÄ RESTful Web Services£¬Èç Restlet¡¢RestEasy ºÍ Jersey¡£Jersey ÊÇÆäÖÐ×îÖµµÃ×¢ÒâµÄ£¬ËüÊÇ JAX-RS£¨JSR 311£©µÄ²Î¿¼ÊµÏÖ¡£²Î¿¼×ÊÁÏ ÖÐÓиü¶à¹ØÓÚ JSR 311 ºÍ Jersey µÄÐÅÏ¢¡£

Spring ÊÇÒ»¸öµÃµ½¹ã·ºÓ¦ÓÃµÄ Java EE ¿ò¼Ü£¬ËüÔÚ°æ±¾ 3 ÒÔºó¾ÍÔö¼ÓÁË RESTful Web Services ¿ª·¢µÄÖ§³Ö¡£ËäÈ»£¬¶Ô REST µÄÖ§³Ö²¢²»ÊÇ JAX-RS µÄÒ»ÖÖʵÏÖ£¬µ«ÊÇËü¾ßÓбȱê×¼¶¨Òå¸ü¶àµÄÌØÐÔ¡£REST Ö§³Ö±»ÎÞ·ìÕûºÏµ½ Spring µÄ MVC ²ã£¬Ëü¿ÉÒÔºÜÈÝÒ×Ó¦Óõ½Ê¹Óà Spring ¹¹½¨µÄÓ¦ÓÃÖС£

Spring REST Ö§³ÖµÄÖ÷ÒªÌØÐÔ°üÀ¨£º

×¢ÊÍ£¬Èç @RequestMapping ºÍ @PathVariable£¬Ö§³Ö×ÊÔ´±êʶºÍ URL Ó³Éä

ContentNegotiatingViewResolver Ö§³ÖΪ²»Í¬µÄ MIME/ÄÚÈÝÀàÐÍʹÓò»Í¬µÄ±íʾ·½Ê½

ʹÓÃÏàËÆµÄ±à³ÌÄ£ÐÍÎÞ·ìµØÕûºÏµ½Ô­Ê¼µÄ MVC ²ã

´´½¨Ò»¸öʾÀý RESTful Web Service

±¾½ÚÖеÄÀý×Ó½«ÑÝʾ Spring 3 »·¾³µÄ´´½¨¹ý³Ì£¬²¢´´½¨Ò»¸ö¿ÉÒÔ²¿Êðµ½ Tomcat ÖÐµÄ ¡°Hello World¡± Ó¦Óá£È»ºóÎÒÃÇÔÙÍê³ÉÒ»¸ö¸ü¸´ÔÓµÄÓ¦ÓÃÀ´Á˽â Spring 3 REST Ö§³ÖµÄÖØÒª¸ÅÄÈç¶àÖÖ MIME ÀàÐͱíʾ֧³ÖºÍ JAXB Ö§³Ö¡£ÁíÍ⣬±¾ÎÄ»¹Ê¹ÓÃһЩ´úÂëÆ¬¶ÏÀ´°ïÖúÀí½âÕâЩ¸ÅÄî¡£Äú¿ÉÒÔ ÏÂÔØ ±¾ÎĵÄËùÓÐʾÀý´úÂë¡£

±¾Îļٶ¨ÄúÒѾ­ÊìϤ Spring ¿ò¼ÜºÍ Spring MVC¡£

Hello World£ºÊ¹Óà Spring 3 REST Ö§³Ö

Òª´´½¨Õâ¸öÀý×ÓËùʹÓõĿª·¢»·¾³£¬ÄúÐèÒª£º

IDE£ºEclipse IDE for JEE (v3.4+)

Java SE5 ÒÔÉÏ

Web ÈÝÆ÷£ºApache Tomcat 6.0£¨Jetty »òÆäËûÈÝÆ÷Ò²¿É£©

Spring 3 ¿ò¼Ü£¨v3.0.3 ÊDZ¾ÎıàдʱµÄ×îа汾£©

ÆäËû³ÌÐò¿â£ºJAXB 2¡¢JSTL¡¢commons-logging

ÔÚ Eclipse Öд´½¨Ò»¸ö Web Ó¦Óã¬È»ºóÉèÖà Tomcat 6 ×÷ΪËüµÄÔËÐл·¾³¡£È»ºó£¬ÄúÐèÒªÉèÖà web.xml ÎļþÀ´¼¤»î Spring WebApplicationContext¡£Õâ¸öÀý×Ó½« Spring bean ÅäÖ÷ֳÉÁ½¸öÎļþ£ºrest-servlet.xml °üº¬Óë MVC/REST ÓйصÄÅäÖã¬rest-context.xml °üº¬·þÎñ¼¶±ðµÄÅäÖã¨ÈçÊý¾ÝÔ´ beans£©¡£Çåµ¥ 1 ÏÔʾÁË web.xml ÖÐµÄ Spring ÅäÖõIJ¿·Ö¡£

Çåµ¥ 1. ÔÚ web.xml Ö줻î Spring WebApplicationContext

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/rest-context.xml
</param-value>
</context-param>

<!-- This listener will load other application context file in addition to
rest-servlet.xml -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

<servlet>
<servlet-name>rest</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>

ÔÚ rest-servlet.xml ÎļþÖд´½¨ Spring MVC µÄÏà¹ØÅäÖã¨Controller¡¢View¡¢View Resolver£©¡£Çåµ¥ 2 ÏÔʾÁËÆäÖÐ×îÖØÒªµÄ²¿·Ö¡£

Çåµ¥ 2. ÔÚ rest-servlet.xml ÎļþÖд´½¨ Spring MVC ÅäÖÃ

<context:component-scan base-package="dw.spring3.rest.controller" />

<!--To enable @RequestMapping process on type level and method level-->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

<!--Use JAXB OXM marshaller to marshall/unmarshall following class-->
<bean id="jaxbMarshaller"
class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>dw.spring3.rest.bean.Employee</value>
<value>dw.spring3.rest.bean.EmployeeList</value>
</list>
</property>
</bean>

<bean id="employees" class=
"org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg ref="jaxbMarshaller" />
</bean>

<bean id="viewResolver" class=
"org.springframework.web.servlet.view.BeanNameViewResolver" />

ÉÏÃæµÄ´úÂëÖУº

Component-scan

ÆôÓöԴøÓÐ Spring ×¢Ê͵ÄÀà½øÐÐ×Ô¶¯É¨Ãè

ÔÚʵ¼ùÖУ¬Ëü½«¼ì²é¿ØÖÆÆ÷ÀàÖÐËù¶¨ÒåµÄ @Controller ×¢ÊÍ¡£

DefaultAnnotationHanlderMappings ºÍ AnnotationMethodHandlerAdapter

ʹÓà @ReqeustMapping ×¢Ê͵ÄÀà»òº¯ÊýµÄ beans ÓÉ Spring ´¦Àí

Õâ¸ö×¢Êͽ«ÔÚÏÂÒ»½Ú½øÐÐÏêϸ½éÉÜ¡£

Jaxb2Mashaller

¶¨ÒåʹÓà JAXB 2 ½øÐжÔÏó XML Ó³É䣨OXM£©µÄ±à×éÆ÷£¨marshaller£©ºÍ½â×éÆ÷£¨unmarshaller

MashallingView

¶¨ÒåÒ»¸öʹÓà Jaxb2Mashaller µÄ XML ±íʾ view

BeanNameViewResolver

ʹÓÃÓû§Ö¸¶¨µÄ bean Ãû³Æ¶¨ÒåÒ»¸öÊÓͼ½âÎöÆ÷

±¾Àý½«Ê¹ÓÃÃûΪ ¡°employees¡± µÄ MarshallingView¡£

ÕâÑù¾ÍÍê³ÉÁË Spring µÄÏà¹ØÅäÖá£ÏÂÒ»²½ÊDZàдһ¸ö¿ØÖÆÆ÷À´´¦ÀíÓû§ÇëÇó¡£Çåµ¥ 3 ÏÔʾµÄÊÇ¿ØÖÆÆ÷Àà¡£

Çåµ¥ 3. dw.spring3.rest.controller.EmployeeController

@Controller
publicclass EmployeeController {
@RequestMapping(method=RequestMethod.GET, value="/employee/{id}")
public ModelAndView getEmployee(@PathVariable String id) {
Employee e = employeeDS.get(Long.parseLong(id));
returnnew ModelAndView(XML_VIEW_NAME, "object", e);
}
}

@RequestMapping ×¢ÊÍÊÇ Spring REST ÌØÐԵĹؼüËùÔÚ¡£ËüÖ¸¶¨Ëù×¢Ê͵ķ½·¨½«´¦ÀíÄĸö HTTP ·½·¨£¨RequestMethod.GET£©ºÍÄĸö URI£¨/employee/{id}£©¡£×¢Ò⣺

¶ÔÓÚ {id} ռλ·û£¬Ê¹Óà @PathVariable ×¢ÊÍ¿ÉÒÔ½« {} ÄÚµÄÖµ×¢Èëµ½º¯ÊýµÄ²ÎÊý¡£

XML_VIEW_NAME Ϊ employees£¬ÕâÊÇ rest-servlet.xml Öж¨ÒåµÄÊÓͼÃû³Æ¡£

employeeDS ÊÇÒ»¸ö»ùÓÚÄÚ´æµÄÊý¾ÝÔ´£¬ËüµÄʵÏÖÒѾ­³¬³ö±¾ÎÄд×÷·¶Î§¡£

½« Web Ó¦Ó÷¢²¼µ½ÄúµÄ Tomcat ÉÏ¡£Õâʱ£¬Äú¿ÉÒÔ´ò¿ªä¯ÀÀÆ÷£¬È»ºóÊäÈë http://<host>:<port>/<appcontext>/service/employee/1¡£ä¯ÀÀÆ÷¾Í»áÏÔʾһ¸ö ID Ϊ 1 µÄÔ±¹¤ÐÅÏ¢µÄ XML ÊÓͼ¡£

Çë¼ÌÐøÔĶÁÒÔÁ˽â¸ü¶à¹ØÓÚ Spring REST Ö§³ÖµÄÌØÐÔ¡£

·½·¨

×ÊÔ´²Ù×÷ÊÇͨ¹ý HTTP ·½·¨ÊµÏֵģ¬Èç GET¡¢POST¡¢PUT ºÍ DELETE¡£ÄúÔÚÇ°ÃæÒѾ­Á˽âÁËÈçºÎʹÓà GET ·½·¨²éѯԱ¹¤ÐÅÏ¢¡£ÏÖÔÚÎÒÃǽ«½éÉÜ POST¡¢PUT ºÍ DELETE¡£

ͨ¹ýʹÓà @RequestMapping ×¢Ê͵ŦÄÜ£¬´¦Àí²»Í¬·½·¨µÄ´úÂëÊǷdz£ÏàËÆµÄ¡£Çåµ¥ 4 ÏÔʾÁË EmployeeController µÄ´úÂëÆ¬¶Ï¡£

Çåµ¥ 4. dw.spring3.rest.controller.EmployeeController

@RequestMapping(method=RequestMethod.POST, value="/employee")
public ModelAndView addEmployee(@RequestBody String body) {
Source source = new StreamSource(new StringReader(body));
Employee e = (Employee) jaxb2Mashaller.unmarshal(source);
employeeDS.add(e);
returnnew ModelAndView(XML_VIEW_NAME, "object", e);
}

@RequestMapping(method=RequestMethod.PUT, value="/employee/{id}")
public ModelAndView updateEmployee(@RequestBody String body) {
Source source = new StreamSource(new StringReader(body));
Employee e = (Employee) jaxb2Mashaller.unmarshal(source);
employeeDS.update(e);
returnnew ModelAndView(XML_VIEW_NAME, "object", e);
}

@RequestMapping(method=RequestMethod.DELETE, value="/employee/{id}")
public ModelAndView removeEmployee(@PathVariable String id) {
employeeDS.remove(Long.parseLong(id));
List<Employee> employees = employeeDS.getAll();
EmployeeList list = new EmployeeList(employees);
returnnew ModelAndView(XML_VIEW_NAME, "employees", list);
}

ÔÚÉÏÃæµÄ´úÂëÖУº

RequestMethod.<Method> µÄֵȷ¶¨Ëù×¢Ê͵ĺ¯ÊýÓ¦¸Ã´¦ÀíÄĸö HTTP ·½·¨¡£

ͨ¹ý @RequestBody£¬HTTP ÇëÇóµÄÖ÷ÌåÄÚÈÝ¿ÉÒÔ×÷Ϊһ¸ö²ÎÊý×¢Èë¡£

ÔÚ±¾ÀýÖУ¬Ö÷ÌåÄÚÈÝÊDZíʾԱ¹¤ÐÅÏ¢µÄ XML Êý¾Ý¡£ÎÒÃÇʹÓà JAXB 2 À´½« XML ½â×éΪ Java Bean£¬È»ºó½«Ëü´æ´¢¡£Ò»¸öʾÀýÇëÇóÖ÷Ìå¿ÉÒÔÊÇ£º

<employee><id>3</id><name>guest</name></employee>

ÆäËû¿ÉÒÔ×¢Èëµ½º¯Êý²ÎÊýµÄÓÐÓõÄ×¢ÊÍÓÐ @PathVariable¡¢@RequestParm µÈµÈ¡£Spring ÎĵµÓÐÍêÕûÁбíµÄ×¢ÊÍ£¨¼û ²Î¿¼×ÊÁÏ£©¡£

×ÊÔ´¼¯ºÏ

ͨ³££¬Äú»¹ÐèÒª²Ù×÷ÅúÁ¿µÄ×ÊÔ´¡£ÀýÈ磬Äú¿ÉÄÜÏ£Íû»ñÈ¡ËùÓÐÔ±¹¤µÄÐÅÏ¢¶ø²»Ö»ÊÇÒ»¸öÔ±¹¤µÄÐÅÏ¢¡£Äú¿ÉÒÔ²ÉÈ¡ÀàËÆÓÚ֮ǰÇé¿öµÄ·½·¨ÊµÏÖ£»ÄúËùÐèÒª×öµÄÐ޸ľÍÊǽ« URI ´Ó /employee ÐÞ¸Ä³É /employees¡£Ô±¹¤µÄ¸´ÊýÐÎʽÄܹ»ÕýÈ··´Ó³ÅúÁ¿µÄÓïÒå¡£Çåµ¥ 5 ÏÔʾÁËÕâÖÖʵÏÖ·½·¨¡£

Çåµ¥ 5. EmployeeController µÄ getAllEmployees

@RequestMapping(method=RequestMethod.GET, value="/employees")
public ModelAndView getEmployees() {
List<Employee> employees = employeeDS.getAll();
EmployeeList list = new EmployeeList(employees);
returnnew ModelAndView(XML_VIEW_NAME, "employees", list);
}

ÄúÐèҪΪ Employee ¼¯ºÏÉùÃ÷Ò»¸ö°ü×°Àà¡£Õâ¸ö°ü×°ÀàÊÇ JAXB 2 ËùÐèÒªµÄ£¬ÒòΪËüÎÞ·¨ÕýÈ·µØ±à×é java.util.List Àà¡£Çåµ¥ 6 ÏÔʾÁË EmployeeList Àà¡£

Çåµ¥ 6. dw.spring3.rest.bean.EmployeeList

@XmlRootElement(name="employees")
publicclass EmployeeList {
privateint count;
private List<Employee> employees;

public EmployeeList() {}

public EmployeeList(List<Employee> employees) {
this.employees = employees;
this.count = employees.size();
}

publicint getCount() {
return count;
}
publicvoid setCount(int count) {
this.count = count;
}

@XmlElement(name="employee")
public List<Employee> getEmployees() {
return employees;
}
publicvoid setEmployees(List<Employee> employees) {
this.employees = employees;
}

}

ÄÚÈÝЭÉÌ

REST ·þÎñµÄÁíÒ»¸ö³£ÓÃÌØÐÔÊÇËüÃÇÄܹ»¸ù¾ÝÇëÇó²úÉú²»Í¬µÄ±íʾ¡£ÀýÈ磬Èç¹û¿Í»§¶ËÇëÇóËùÓÐÔ±¹¤µÄ HTML/text ±íʾ·½Ê½£¬ÄÇô·þÎñÆ÷¾ÍÓ¦¸ÃΪÓû§²úÉúÒ»¸ö·ûºÏÓï·¨¹æÔòµÄ HTML Ò³Ãæ¡£Èç¹û¿Í»§¶ËÇëÇóµÄÊÇÔ±¹¤µÄ application/XML ±íʾ·½Ê½£¬ÄÇô·þÎñÆ÷¾ÍÓ¦¸Ã²úÉúÒ»¸ö XML ½á¹û¡£ÆäËûÊÜ»¶Ó­µÄ±íʾ·½Ê½»¹ÓÐ ATOM ºÍ PDF¡£

Spring 3 ÒýÈëÁËÒ»¸öÃûΪ ContentNegotiatingViewResolver µÄÐÂÊÓͼ½âÎöÆ÷¡£Ëü¿ÉÒÔ¸ù¾ÝÇëÇóµÄÄÚÈÝÀàÐÍ£¨ÇëÇóÍ·ÖÐµÄ Accept ÊôÐÔ£©»ò URI ºó׺À´Çл»ÊÓͼ½âÎöÆ÷¡£ÏÂÃæµÄÀý×ÓʹÓà ContentNegotiatingViewResolver À´ÊµÏÖ¶àÖÖ±íʾ·½Ê½µÄÖ§³Ö¡£

ÔÚ rest-servlet.xml ÎļþÖУ¬ÓÃ×¢ÊÍÈ¥µôÔ­À´¶¨ÒåµÄ viewResolver¡£¶øÊ¹Óà ContentNegotiatingViewResolver À´Ìæ´úËü£¬Èç Çåµ¥ 7 Ëùʾ¡£

Çåµ¥ 7. ¶¨ÒåÄÚÈÝЭÉÌ

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
<property name="mediaTypes">
<map>
<entry key="xml" value="application/xml"/>
<entry key="html" value="text/html"/>
</map>
</property>
<property name="viewResolvers">
<list>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value=
"org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</list>
</property>
</bean>

Õâ¸ö¶¨ÒåÏÔʾÁË´¦ÀíÁ½ÖÖÇëÇóÄÚÈݵÄÖ§³Ö£ºapplication/xml ºÍ text/html¡£Õâ¶Î´úÂëÒ²¶¨ÒåÁËÁ½¸öÊÓͼ½âÎöÆ÷£ºÆäÖÐ BeanNameViewResolver ÊǸºÔð´¦Àí application/xml µÄ£¬¶øÁíÒ»¸ö UrlBasedViewResolver Ôò¸ºÔð´¦Àí text/html¡£

ÔÚʵ¼ùÖУ¬µ±ÄúÔÚä¯ÀÀÆ÷ÉÏÊäÈë http://<host>:<port>/<appcontext>/service/employees£¬ÄÇôËü¾Í»áÇëÇó text/html ÐÎʽµÄËùÓÐÔ±¹¤ÐÅÏ¢¡£È»ºó UrlBasedViewResolver »á½øÐнâÎö£¬¶ø Spring ½«»áÑ¡Ôñ /WEB-INF/jsp/employees.jsp ×÷Ϊ·µ»ØµÄÊÓͼ¡£µ±ÄúÌí¼ÓÇëÇóÍ· Accept:application/xml ²¢ÔÙ·¢ÆðÇëÇóʱ£¬ÄÇô BeanNameViewResolver ¾Í»á½øÐнâÎö¡£Èç Çåµ¥ 5 ÖеĴúÂ룬Ëü½«Ê¹ÓÃÒ»¸öÃûΪ employees µÄÊÓͼÀ´±íʾ£¬Ëü¾ÍÊÇËù¶¨ÒåµÄ JAXB 2 ±à×éÆ÷ÊÓͼ¡£

getAllEmployees() µÄ¿ØÖÆÆ÷´úÂë²»ÐèÒªÐ޸ġ£employees.jsp ½«»áʹÓÃÃûΪ employees µÄÄ£ÐͶÔÏóÀ´äÖȾ¡£Çåµ¥ 8 ÏÔʾÁË employees.jsp µÄ´úÂëÆ¬¶Ï¡£

Çåµ¥ 8. /WEB-INF/jsp ÖÐµÄ employees.jsp

<table border=1>
<thead><tr>
<th>ID</th>
<th>Name</th>
<th>Email</th>
</tr></thead>
<c:forEach var="employee" items="${employees.employees}">
<tr>
<td>${employee.id}</td>
<td>${employee.name}</td>
<td>${employee.email}</td>
</tr>
</c:forEach>
</table>

Óë REST ·þÎñͨÐŵĿͻ§¶Ë

ÏÖĿǰΪֹ£¬ÄúÒѾ­¿ª·¢Ò»¸ö¼òµ¥µÄÖ§³Ö¶ÔÔ±¹¤ÐÅÏ¢µÄ CRUD£¨Ôöɾ²é¸Ä£©²Ù×÷µÄ RESTful Web Service¡£½ÓÏÂÀ´ÕâÒ»½Ú½«½éÉÜÈçºÎÓëÕâ¸ö·þÎñ½øÐÐͨÐÅ¡£Äú½«Ê¹Óà curl À´²âÊÔÕâ¸ö REST ·þÎñ¡£

ÄúÒ²¿ÉÒÔʹÓÃÃûΪ RESTClient µÄ Firefox ²å¼þÀ´²âÊÔ REST ·þÎñ¡£ËüºÜÈÝÒ×ʹÓÃÇÒ´øÓÐÁ¼ºÃµÄ UI¡£²Î¿¼×ÊÁÏ ÓйØÓÚËüµÄÏÂÔØÐÅÏ¢¡£

ʹÓà curl

Curl ÊÇÒ»¸öÁ÷ÐеÄÄÜÒÔ HTTP ºÍ HTTPS ЭÒéÏò·þÎñÆ÷·¢ËÍÇëÇóµÄÃüÁîÐй¤¾ß¡£Curl ÊÇ Linux? ºÍ Mac? ÉϵÄÒ»¸öÄÚÖù¤¾ß¡£¶ÔÓÚ Windows? ƽ̨£¬Äú¿ÉÒÔÁíÍâÏÂÔØÕâ¸ö¹¤¾ß£¨¼û ²Î¿¼×ÊÁÏ£©¡£

Òª³õʼ»¯²éѯËùÓÐÔ±¹¤ÐÅÏ¢µÄµÚÒ»¸ö curl ÃüÁÄú¿ÉÒÔÊäÈ룺

curl ¨CHAccept:application/xml 
http://localhost:8080/rest/service/employees

ËüµÄÏìÓ¦½«ÊÇ XML ¸ñʽµÄ£¬²¢ÇÒ°üº¬ËùÓеÄÔ±¹¤ÐÅÏ¢£¬Èçͼ 1 Ëùʾ¡£

ͼ 1. XML ·½Ê½±íʾµÄËùÓÐÔ±¹¤ÐÅÏ¢

°üº¬Ô±¹¤ÐÕÃû¡¢ID ºÍµç×ÓÓʼþµÄ XML Êä³ö

ÄúÒ²¿ÉÒÔÔÚä¯ÀÀÆ÷Éϳ¢ÊÔ·ÃÎÊÏàͬµÄ URL¡£Õâʱ£¬Í·ÐÅÏ¢ÖÐµÄ Accept Ϊ text/html£¬ËùÒÔä¯ÀÀÆ÷»áÏÔʾ employees.jsp Öж¨ÒåµÄÒ»¸ö±í¸ñ¡£Í¼ 2 ÏÔʾµÄÊÇÕâÖÖÇé¿ö¡£

ͼ 2. HTML ·½Ê½±íʾµÄËùÓÐÔ±¹¤ÐÅÏ¢

ÓÐһЩÊý¾ÝÓëͼ 1 Ïàͬ£¬µ«ÊÇÕâЩÊý¾ÝÊÇÏÔʾÔÚ±í¸ñÖеÄ

Òª½«Ò»¸öеÄÔ±¹¤ÐÅÏ¢ POST µ½·þÎñÆ÷ÉÏ£¬ÎÒÃÇ¿ÉÒÔʹÓÃÏÂÃæµÄ´úÂë¡£Çåµ¥ 4 ÖÐµÄ addEmployee() ´úÂ뽫»áʹÓÃÇëÇóÌå²¢½«Ëü½â×éΪ Employee ¶ÔÏó¡£

curl -X POST -HContent-type:application/xml --data
"<employee><id>3</id><name>guest</name><email>guest@ibm.com</employee>"
http://localhost:8080/rest/service/employee

ÕâÑù¾ÍÌí¼ÓÁËÒ»¸öеÄÔ±¹¤ÐÅÏ¢¡£Äú¿ÉÒÔʹÓõÚÒ»¸öÀý×ÓÀ´ÑéÖ¤Ô±¹¤ÁÐ±í¡£

PUT ·½·¨ÀàËÆÓÚ POST¡£

curl -X PUT -HContent-type:application/xml --data
"<employee><id>3</id><name>guest3</name><email>guest3@ibm.com</employee>"
http://localhost:8080/rest/service/employee/3

ÉÏÃæµÄ´úÂëÐÞ¸ÄÁË ID Ϊ 3 µÄÔ±¹¤Êý¾Ý¡£

½áÊøÓï

ÏÖÔÚ Spring 3 ÒѾ­ÔÚËüµÄ MVC ²ãÉÏÖ§³Ö REST ÁË£¬Äú¿ÉÒÔʹÓà Spring API ºÍ×¢ÊÍÀ´¿ª·¢ RESTf ul Web Services ÁË¡£±¾ÎĵÄʾÀýÏòÄú½éÉÜÁËÈçºÎʹÓÃһЩÄܹ»°ïÄú¼ò»¯¿ª·¢ Java ·þÎñÆ÷¶Ë RESTful Web Services µÄ Spring 3 µÄÐÂÌØÐÔ¡£

   
2764 ´Îä¯ÀÀ       32
Ïà¹ØÎÄÕÂ

¶àά·½·¨À´¿ª·¢ÓлúµÄÒµÎñÁ÷³Ì¼Ü¹¹
SCA Ó¦ÓóÌÐò¿ª·¢
BPM ºÍ SOA ÐÔÄÜ×î¼Ñʵ¼ù
ʵÏÖÆóÒµ·þÎñ×ÜÏßģʽ
Ïà¹ØÎĵµ

SCA½éÉܼ°Ó¦ÓÃʵÀý
»ùÓÚSOA¼Ü¹¹µÄESBƽ̨£ºInfomagic
SCA¼Ü¹¹
SOAµÄ»ù±¾¸ÅÄî
Ïà¹Ø¿Î³Ì

ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

»ùÓÚSOAµÄ¹¤×÷Á÷£¨WF£©ÕûºÏ
SOA 100ÎÊ - ÎÊÓë´ð
SOAP Ó¦ÓÃģʽ:´¦ÀíÓëÐÔÄÜ
ESB¼Ü¹¹Ö®Æóҵʵʩ°¸Àý
»ùÓÚSOA¼Ü¹¹µÄÆóÒµ¼¯³Éϵͳ
»ùÓÚSOAµÄÌåϵ¼Ü¹¹Éè¼Æ


ÃæÏòÓ¦Óõļܹ¹Éè¼ÆÊµ¼ù
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Èí¼þ¼Ü¹¹Ê¦¡ª¸ß¼¶Êµ¼ù
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
SOAÌåϵ½á¹¹Êµ¼ù


ijµÚÈý·½µç×ÓÖ§¸¶ÆóÒµ SOA¼Ü¹¹Éè¼Æ
ijµç×ÓÆóÒµ SOAÓ¦ÓÃ
ÖйúÒÆ¶¯ SOAÅàѵ
±±¾©´óѧ SOA¼Ü¹¹Éè¼ÆÊµ¼ù
ÓѰÏÕ SOA¼Ü¹¹Éè¼Æ
ÉϺ£ SOA¼Ü¹¹Êµ¼ù
ɽ¶«Òƶ¯Í¨ÐÅ SOAÌåϵ½á¹¹Êµ¼ù