在現有SSH項目中提供REST方式的WebService

        在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項目,打開瀏覽器,在地址欄中輸入,其效果圖:

 

相關文章
相關標籤/搜索