- 浏览: 676764 次
- 性别:
- 来自: 珠海
-
文章分类
最新评论
-
qq826928141:
longxing898 写道请教:使用jtds连接sql 20 ...
rapid-framework v3.9新版本发布 -
qq826928141:
美味人间 写道大哥,这个代码生成器怎么无法获取表和列的备注信息 ...
rapid-framework v3.9新版本发布 -
walle1027:
能发一下的测试代码吗?
rabbitmq性能测试 -
在世界的中心呼喚愛:
好东西,我就是参考这个!!!
iBatis3基于方言(Dialect)的分页 -
暂不存在:
怎么将{key}中的值替换掉
rapid系列:发布一款动态构造sql的工具: XsqlBuilder
由于下一版本的rapid-framwork需要集成spring RESTful URL,所以研究了一下怎么搭建. 并碰到了一下问题。
springmvc 3.0 中增加 RESTful URL功能,构造出类似javaeye现在的URL。 rest介绍 , 这里还有struts2 rest构造的一篇文章: 使用 Struts 2 开发 RESTful 服务
简单例子如下,比如如下URL
/blog/1 HTTP GET => 得到id = 1的blog /blog/1 HTTP DELETE => 删除 id = 1的blog /blog/1 HTTP PUT => 更新id = 1的blog /blog HTTP POST => 新增BLOG
以下详细解一下spring rest使用.
首先,我们带着如下三个问题查看本文。
1. 如何在java构造没有扩展名的RESTful url,如 /forms/1,而不是 /forms/1.do
2. 由于我们要构造没有扩展名的url本来是处理静态资源的容器映射的,现在被我们的spring占用了,冲突怎么解决?
3. 浏览器的form标签不支持提交delete,put请求,如何曲线解决?
springmvc rest 实现
springmvc的resturl是通过@RequestMapping 及@PathVariable annotation提供的,通过如@RequestMapping(value="/blog/{id}",method=RequestMethod.DELETE)即可处理/blog/1 的delete请求.
@RequestMapping(value="/blog/{id}",method=RequestMethod.DELETE) public ModelAndView delete(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) { blogManager.removeById(id); return new ModelAndView(LIST_ACTION); }
@RequestMapping @PathVariable如果URL中带参数,则配合使用,如
@RequestMapping(value="/blog/{blogId}/message/{msgId}",method=RequestMethod.DELETE) public ModelAndView delete(@PathVariable("blogId") Long blogId,@PathVariable("msgId") Long msgId,HttpServletRequest request,HttpServletResponse response) { }
spring rest配置指南
1. springmvc web.xml配置
<!-- 该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/目录,如原来访问 http://localhost/foo.css ,现在http://localhost/static/foo.css --> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/static/*</url-pattern> </servlet-mapping> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <!-- URL重写filter,用于将访问静态资源http://localhost/foo.css 转为http://localhost/static/foo.css --> <filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> <init-param> <param-name>confReloadCheckInterval</param-name> <param-value>60</param-value> </init-param> <init-param> <param-name>logLevel</param-name> <param-value>DEBUG</param-value> </init-param> </filter> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 覆盖default servlet的/, springmvc servlet将处理原来处理静态资源的映射 --> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!-- 浏览器不支持put,delete等method,由该filter将/blog?_method=delete转换为标准的http delete方法 --> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <servlet-name>springmvc</servlet-name> </filter-mapping>
2. webapp/WEB-INF/springmvc-servlet.xml配置,使用如下两个class激活@RequestMapping annotation
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
完整配置
<beans default-autowire="byName" > <!-- 自动搜索@Controller标注的类 --> <context:component-scan base-package="com.**.controller"/> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> <!-- Default ViewResolver --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/pages"/> <property name="suffix" value=".jsp"></property> </bean> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" p:basename="i18n/messages"/> <!-- Mapping exception to the handler view --> <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- to /commons/error.jsp --> <property name="defaultErrorView" value="/commons/error"/> <property name="exceptionMappings"> <props> </props> </property> </bean> </beans>
3. Controller编写
/** * @RequestMapping("/userinfo") 具有层次关系,方法级的将在类一级@RequestMapping之一, * 如下面示例, 访问方法级别的@RequestMapping("/new"),则URL为 /userinfo/new */ @Controller @RequestMapping("/userinfo") public class UserInfoController extends BaseSpringController{ //默认多列排序,example: username desc,createTime asc protected static final String DEFAULT_SORT_COLUMNS = null; private UserInfoManager userInfoManager; private final String LIST_ACTION = "redirect:/userinfo"; /** * 通过spring自动注入 **/ public void setUserInfoManager(UserInfoManager manager) { this.userInfoManager = manager; } /** 列表 */ @RequestMapping public ModelAndView index(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) { PageRequest<Map> pageRequest = newPageRequest(request,DEFAULT_SORT_COLUMNS); //pageRequest.getFilters(); //add custom filters Page page = this.userInfoManager.findByPageRequest(pageRequest); savePage(page,pageRequest,request); return new ModelAndView("/userinfo/list","userInfo",userInfo); } /** 进入新增 */ @RequestMapping(value="/new") public ModelAndView _new(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception { return new ModelAndView("/userinfo/new","userInfo",userInfo); } /** 显示 */ @RequestMapping(value="/{id}") public ModelAndView show(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception { UserInfo userInfo = (UserInfo)userInfoManager.getById(id); return new ModelAndView("/userinfo/show","userInfo",userInfo); } /** 编辑 */ @RequestMapping(value="/{id}/edit") public ModelAndView edit(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception { UserInfo userInfo = (UserInfo)userInfoManager.getById(id); return new ModelAndView("/userinfo/edit","userInfo",userInfo); } /** 保存新增 */ @RequestMapping(method=RequestMethod.POST) public ModelAndView create(HttpServletRequest request,HttpServletResponse response,UserInfo userInfo) throws Exception { userInfoManager.save(userInfo); return new ModelAndView(LIST_ACTION); } /** 保存更新 */ @RequestMapping(value="/{id}",method=RequestMethod.PUT) public ModelAndView update(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) throws Exception { UserInfo userInfo = (UserInfo)userInfoManager.getById(id); bind(request,userInfo); userInfoManager.update(userInfo); return new ModelAndView(LIST_ACTION); } /** 删除 */ @RequestMapping(value="/{id}",method=RequestMethod.DELETE) public ModelAndView delete(@PathVariable Long id,HttpServletRequest request,HttpServletResponse response) { userInfoManager.removeById(id); return new ModelAndView(LIST_ACTION); } /** 批量删除 */ @RequestMapping(method=RequestMethod.DELETE) public ModelAndView batchDelete(@RequestParam("items") Long[] items,HttpServletRequest request,HttpServletResponse response) { for(int i = 0; i < items.length; i++) { userInfoManager.removeById(items[i]); } return new ModelAndView(LIST_ACTION); } }
上面是rapid-framework 新版本生成器生成的代码,以后也将应用此规则,rest url中增删改查等基本方法与Controller的方法映射规则
/userinfo => index() /userinfo/new => _new() /userinfo/{id} => show() /userinfo/{id}/edit => edit() /userinfo POST => create() /userinfo/{id} PUT => update() /userinfo/{id} DELETE => delete() /userinfo DELETE => batchDelete()
注(不使用 /userinfo/add => add() 方法是由于add这个方法会被maxthon浏览器当做广告链接过滤掉,因为包含ad字符)
4. jsp 编写
<form:form action="${ctx}/userinfo/${userInfo.userId}" method="put"> </form:form>
生成的html内容如下, 生成一个hidden的_method=put,并于web.xml中的HiddenHttpMethodFilter配合使用,在服务端将post请求改为put请求
<form id="userInfo" action="/springmvc_rest_demo/userinfo/2" method="post"> <input type="hidden" name="_method" value="put"/> </form>
另外一种方法是你可以使用ajax发送put,delete请求.
5. 静态资源的URL重写
如上我们描述,现因为将default servlet映射至/static/的子目录,现我们访问静态资源将会带一个/static/前缀.
如 /foo.gif, 现在访问该文件将是 /static/foo.gif.
那如何避免这个前缀呢,那就是应用URL rewrite,现我们使用 http://tuckey.org/urlrewrite/, 重写规则如下
<urlrewrite> <!-- 访问jsp及jspx将不rewrite url,其它.js,.css,.gif等将重写,如 /foo.gif => /static/foo.gif --> <rule> <condition operator="notequal" next="and" type="request-uri">.*.jsp</condition> <condition operator="notequal" next="and" type="request-uri">.*.jspx</condition> <from>^(/.*\..*)$</from> <to>/static$1</to> </rule> </urlrewrite>
另笔者专门写了一个 RestUrlRewriteFilter来做同样的事件,以后会随着rapid-framework一起发布. 比这个更加轻量级.
并且该代码已经贡献给spring,不知会不会在下一版本发布
在线DEMO地址: http://demo.rapid-framework.org.cn:8080/springmvc_rest_demo/userinfo
评论
userInfo/{userId}/{name}/{mobile}/{email}
如果某个字段空了,前后变成双斜杠,这样会报错,该怎么办?填个默认值上去?
2个filter而已,你做过大型应用吗?
6.0.32访问静态文件都是404.
我在我本本上 系统为 winxp sp3上的http://localhost:8086/asd/styles/global.css路径是正常的 我通过firebug也可以看得到文件内容
我在我的台式机 一个服务器虚拟出来的一个虚拟机上 操作系统为windows server 2008.相同的发布包运行 访问http://localhost:8086/asd/styles/global.css 却报404错误 firebug查看也一样
彻底无语 晕 。这是怎么回事啊。除了操作系统不一样.其他都一样,但是后者居然访问不到静态资源。。。。。。。郁闷
为什么 我的css还是通过正常路径访问呢
http://localhost:8086/asd/styles/global.css
而不用加static?确实没明白 麻烦楼主解释下 谢谢
像<!-- Pages -->
<definition name="/userinfo/show" extends="standard-layout">
<put-attribute name="title" value="UserInfo Search" />
<put-attribute name="body" value="/WEB-INF/controllers/userinfo/detials.jsp" />
</definition>
那么/userinfo/show之后的参数会带过去吗?
貌似还以为是spring提供该功能。
不过大家可以参考一下。都是为了实现同一个功能。
我觉得让springmvc的 DispatcherServlet不要映射指定url就可以了
现有的的语法是
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
增加
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>notmap</param-name>
<param-value>/image/**,/css/**,....</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
改写DispatcherServlet不要映射着几个url就可以了。
个人才疏学浅,个人觉得按照楼主添加static前缀比较的绕,反正我是没看懂~,不过你这样的notmap 配制方法也不行,这样配置我也尝试过了,不行~
呵呵,不好意思,我太笨,后来寻思一解决方法,我QQ:273040644,可以加我一起交流哈
我试了也没成功 - -|||
这样倒是可以
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
我觉得让springmvc的 DispatcherServlet不要映射指定url就可以了
现有的的语法是
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
增加
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>notmap</param-name>
<param-value>/image/**,/css/**,....</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
改写DispatcherServlet不要映射着几个url就可以了。
个人才疏学浅,个人觉得按照楼主添加static前缀比较的绕,反正我是没看懂~,不过你这样的notmap 配制方法也不行,这样配置我也尝试过了,不行~
呵呵,不好意思,我太笨,后来寻思一解决方法,我QQ:273040644,可以加我一起交流哈
我觉得让springmvc的 DispatcherServlet不要映射指定url就可以了
现有的的语法是
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
增加
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>notmap</param-name>
<param-value>/image/**,/css/**,....</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
改写DispatcherServlet不要映射着几个url就可以了。
我觉得让springmvc的 DispatcherServlet不要映射指定url就可以了
现有的的语法是
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
增加
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>notmap</param-name>
<param-value>/image/**,/css/**,....</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
改写DispatcherServlet不要映射着几个url就可以了。
我试着这么改的,怎么不行呢,请教一下,具体怎么配的呢
我觉得让springmvc的 DispatcherServlet不要映射指定url就可以了
现有的的语法是
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
增加
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>notmap</param-name>
<param-value>/image/**,/css/**,....</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
改写DispatcherServlet不要映射着几个url就可以了。
这个跟你要不要使用nginx处理静态资源完全没有关系,你完全可以使用nginx拦截掉静态资源的处理请求。
相关推荐
在IT行业中,Spring框架是Java企业级应用开发的首选,而Spring MVC是Spring框架的一个重要...文档`spring_3.0_应用springmvc_构造RESTful_URL_详细讲解.docx`应该包含了更详尽的步骤和示例,帮助读者深入理解这一主题。
在本文中,我们将深入探讨如何在Spring 3.0中应用Spring MVC来构建RESTful URL,以实现更加优雅和功能强大的Web服务。REST(Representational State Transfer)是一种架构风格,用于构建基于HTTP协议的Web服务,它...
其资源中包括三个文档,仅供学习与参考。 1.spring3mvc真正入门资料 2.spring3.0MVC注解(附实例) 3.spring_3.0_应用springmvc_构造RESTful_URL_详细讲解
scratch少儿编程逻辑思维游戏源码-超级马力欧兄弟.zip
scratch少儿编程逻辑思维游戏源码-城堡躲避.zip
内容概要:本文探讨了基于气动力学的导弹姿态控制技术,并详细介绍了其MATLAB仿真方法。文章首先阐述了气动力学的基本概念以及其在导弹设计中的重要性,随后讲解了导弹姿态控制系统的构成,包括传感器、控制器和执行器的功能。接下来,重点介绍了如何利用MATLAB进行导弹飞行过程和姿态控制的仿真,包括建立导弹模型、设定环境参数、编写仿真代码等步骤。最后,通过仿真展示了气动力学在提升导弹飞行稳定性、机动性和作战效能方面的重要作用,并对未来的研究方向进行了展望。 适合人群:航空航天工程领域的研究人员、导弹系统设计师、从事飞行器控制研究的专业人士。 使用场景及目标:适用于希望深入了解导弹姿态控制原理及其仿真的专业人士,旨在提高导弹飞行性能和作战能力。 其他说明:文中提供的MATLAB代码仅为简化的示例,实际应用时需考虑更多复杂的因素和算法。
scratch少儿编程逻辑思维游戏源码-电镀盒子.zip
内容概要:本文详细介绍了DSP28335与STM32F407在电源逆变系统中的锁相环(PLL)程序应用。首先概述了锁相环的基本概念及其在逆变系统中的重要性,然后深入探讨了DSP28335锁相环程序的特点和功能,如正弦波锁定、频率和相位跟踪、全桥逆变等功能。接着阐述了具体的实现步骤,包括系统配置、PLL算法选择、滤波器设计、正弦波生成与输出,最后进行了性能分析,强调了该程序在提高系统性能、稳定性和效率方面的优势。 适合人群:从事电力电子、嵌入式系统开发的技术人员,特别是对锁相环和逆变系统感兴趣的工程师。 使用场景及目标:适用于需要深入了解锁相环在电源逆变系统中应用的研发人员,旨在帮助他们掌握PLL的工作原理、实现方法及其优化技巧,以提高逆变系统的性能和可靠性。 其他说明:文中提供的技术细节和实现方法有助于读者更好地理解和应用锁相环技术,特别是在高频、高精度的逆变场合。
scratch少儿编程逻辑思维游戏源码-Shape Smasher.zip
少儿编程scratch项目源代码文件案例素材-审美乌托邦.zip
少儿编程scratch项目源代码文件案例素材-潜水艇.zip
scratch少儿编程逻辑思维游戏源码-3D忍者.zip
内容概要:本文介绍了基于EMD-ARMA的组合风光出力预测方法,详细阐述了经验模态分解(EMD)和自回归移动平均(ARMA)模型的应用步骤。首先,通过EMD将原始发电数据分解为多个本征模态函数(IMF),然后用ARMA模型对各IMF分量进行建模和预测,最后将预测结果叠加重构,获得最终的风光功率预测值。文中还提供了简化的Python代码示例,帮助读者理解和实现该方法。 适合人群:从事新能源研究和技术开发的专业人士,尤其是对风光发电预测感兴趣的科研人员和工程师。 使用场景及目标:适用于需要提高风光发电预测精度的项目,旨在通过先进的数学模型优化电力调度和资源配置。 其他说明:本文提供的代码示例仅用于教学目的,实际应用中需根据具体情况调整和完善。此外,建议在实践中参考更多专业文献和寻求专家意见以确保预测模型的准确性和可靠性。
scratch少儿编程逻辑思维游戏源码-宝石消消乐.zip
少儿编程scratch项目源代码文件案例素材-染色奔跑.zip
内容概要:本文详细介绍了使用Comsol仿真软件绘制超构表面光子晶体动量空间拓扑荷识别图的方法。首先简述了超构表面光子晶体的基本概念及其重要性,然后逐步讲解了如何在Comsol中建立模型、设置仿真参数并运行仿真,最终生成动量空间拓扑荷识别图。文中还附有简单代码示例,帮助读者更好地理解整个流程。最后对所学内容进行了总结,并展望了未来的研究方向。 适合人群:对光学、物理学以及仿真软件感兴趣的科研人员和技术爱好者。 使用场景及目标:适用于希望深入了解光子在超构表面光子晶体中传播特性的研究人员,旨在提高他们对该领域的认识水平,促进相关科学研究的发展。 阅读建议:由于涉及较多专业术语和复杂概念,在阅读时建议先掌握基本理论知识,并结合实际案例进行练习,以便更好地消化吸收文中内容。
内容概要:本文介绍了一种结合卷积神经网络(CNN)、长短时记忆网络(LSTM)以及SE注意力机制的混合模型用于时序数据分类预测的方法,并提供了具体的MATLAB实现方法。文中详细解释了模型的工作流程,从卷积层的空间特征提取开始,经过SE注意力模块对特征进行加权处理,再到LSTM层的时间序列建模,最终完成分类任务。此外,还讨论了一些优化技巧,如数据预处理、动态学习率设置、特征压缩等,以提高模型性能。 适合人群:有一定机器学习基础的研究人员和技术开发者,特别是那些从事医疗健康、工业监控等领域时序数据分析工作的专业人士。 使用场景及目标:适用于需要高效处理复杂时序数据的应用场合,如医疗诊断、工业设备状态监测等。主要目的是为了改善传统单一模型在特征利用方面的局限性,提供一种更加精准有效的解决方案。 其他说明:文中提供的代码片段可以直接应用于实际项目中,只需根据具体情况调整参数配置和数据格式。同时提醒使用者关注数据预处理步骤,确保输入数据的质量和一致性对于获得良好结果至关重要。
scratch少儿编程逻辑思维游戏源码-超级摇摆小猫.zip
scratch少儿编程逻辑思维游戏源码-奔跑吧!糖豆人.zip