在B/S系統氾濫的今天,信息共享、系統集成,相信你們對這些名稱確定不會陌生,在企業大量分散的信息系統中怎樣提供數據共享、將個系統集成到一塊兒、從而提升工做效率,做爲信息系統建設者們無疑都會想到提供web service,但做爲初次體驗者,對於不少概念確定共有不少困惑,尤爲是看到各個OpenAPI的不一樣提供方式時,更加疑惑,如google map api採用了AJAX方式,經過javascript提供API,而淘寶TOP則採用直接的HTTP+XML請求方式,最使人疑惑的是教材上講的WSDL、UDDI從沒有在這些API中出現過,若是你仔細查找資料了的話,在一些天氣API中也仍是有用到的。其實WebService原來有兩種方式,一是SOAP協議方式,在這種方式下須要WSDL,UDDI等,第二種方式是REST方式,這種方式根本不須要WSDL,UDDI等。
在SOA的基礎技術實現方式中WebService佔據了很重要的地位,一般咱們提到WebService第一想法就是SOAP消息在各類傳輸協議上交互。近幾年REST的思想伴隨着SOA逐漸被你們接受,同時各大網站不斷開放API提供給開發者,也激起了REST風格WebService的熱潮,而且REST方式如今看來是更加流行。
javascript
還有一點就是APP風靡衆生的今天,那麼API的開放就更是迫在眉睫,所波逐流,咱們採用REST方式提供一次服務試試 html
SSH項目目前已成爲做坊開發的主流框架,在現有系統中怎樣向外提供REST方式的服務呢?
首先既然是SSH集成的項目,裏面既然已經有了Spring,咱們不妨就採用Spring構建Rest服務 java
Step1:
在原來的web.xml中關於struts的filter後添加一個servlet,使其支持spring的mvc,代碼以下: web
<servlet> <servlet-name>rest</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/rest-servlet.xml</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>rest</servlet-name> <url-pattern>/restful/*</url-pattern> </servlet-mapping>
Step2:
此時你可能發現一個問題,你原來的web.xml中配置的關於struts2的filter處理的是 spring
<filter-name>struts2</filter-name> <url-pattern>/*</url-pattern>
這樣一來,你原來的struts豈不是要過濾你如今的rest服務,那麼能夠採起重寫原來struts的filterStrutsPrepareAndExecuteFilter,使其不攔截「/restful/*」的請求,代碼以下 apache
public class MyStrutsFilter extends StrutsPrepareAndExecuteFilter { private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(MyStrutsFilter.class); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String path = req.getRequestURI(); if(path.contains("/restful/")) { log.debug("跳過struts"); chain.doFilter(request, response); } else { log.debug("進入struts"); super.doFilter(request, response, chain); } } }
同時更改web.xml中的原來struts的filter爲 api
<filter-name>struts2</filter-name> <filter-class> com.cdthgk.project.base.action.MyStrutsFilter <!--org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter--> </filter-class>
Step3:
在Step1還有一個關於spring的rest-servlet.xml文件,其代碼以下 瀏覽器
<description>Spring MVC for Restful</description> <!--檢測註解--> <context:component-scan base-package="com.cdthgk.management.rest" /> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <!-- 註冊視圖解析器,說白了就是根據返回值指定到某個頁面 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/"></property><!--頁面文件的路徑,在根目錄下--> </bean>
Step4:
接下來咱們就能夠碼咱們的java代碼了,使其提供rest方式的服務,其餘不解釋,實例代碼以下 restful
package com.cdthgk.management.rest; import java.io.OutputStreamWriter; import java.io.PrintWriter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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; @Controller @RequestMapping("/testREST") public class RestFulWSAction { // TODO ① @RequestMapping(value="/getEmployer/{id}/{name}", method=RequestMethod.GET) public void get(HttpServletRequest request, HttpServletResponse response, @PathVariable String id, @PathVariable String name) { StringBuilder msg = new StringBuilder(); // TODO ② msg.append("{\"msg\":\"").append(name).append("——這是你剛纔傳入的第二個參數\"}"); printData(response, msg); } private void printData(HttpServletResponse response, StringBuilder msg) { try { response.setContentType("text/html;charset=utf-8"); response.setCharacterEncoding("UTF-8"); PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), "UTF-8")); out.println(msg); out.close(); } catch (Exception e) { e.printStackTrace(); } } }
Step5:
咱們的業務不可能就是這樣簡單的處理,確定還有複雜的邏輯處理、數據操做,那麼你仍然可使用原來的service
在上一步的代碼中只需注入原來的service便可,其完整實例以下:
在上面的代碼中TODO ①處加入,這就是你將注入的service mvc
@Autowired private EmployerService employerService;
在TODO ②處加入你的接口調用
employerService.getEmployer(id);
Step6:
此時,你可啓動你原來的SSH項目,打開瀏覽器,在地址欄中輸入,其效果圖: