在现有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等。 ??????? 还有一点就是APP风靡众生的今天,那么API的开放就更是迫在眉睫,所波逐流,我们采用REST方式提供一次服务试试 ??????? SSH项目目前已成为作坊开发的主流框架,在现有系统中怎样向外提供REST方式的服务呢? ????????Step1: <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: <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> ???????? 这样一来,你原来的struts岂不是要过滤你现在的rest服务,那么可以采取重写原来struts的filterStrutsPrepareAndExecuteFilter,使其不拦截“/restful/*”的请求,代码如下 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为 <filter-name>struts2</filter-name> <filter-class> ????com.cdthgk.project.base.action.MyStrutsFilter ????<!--org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter--> </filter-class> ?????????Step3: <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: 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: @Autowired private?EmployerService?employerService; ???????在TODO ②处加入你的接口调用???????? employerService.getEmployer(id); ??????????Step6: ???????? ?此时,你可启动你原来的SSH项目,打开浏览器,在地址栏中输入,其效果图: ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |