先是一个简单的eclipse的工程目录结构,

简单介绍我自己写的methodnameresolver和urlhandlermapping
pathmethodnameresolver,根据url取得调用multiaction的方法名称,比如/user/useradd.action,就可以调用到id为user的类的useradd的方法来处理action
package com.zgc.test.multiaction; import javax.servlet.http.httpservletrequest; import org.springframework.web.servlet.mvc.multiaction.methodnameresolver; import org.springframework.web.servlet.mvc.multiaction.nosuchrequesthandlingmethodexception; public class pathmethodnameresolver implements methodnameresolver { public string gethandlermethodname(httpservletrequest request) throws nosuchrequesthandlingmethodexception { string uri=request.getrequesturi(); int begin = uri.lastindexof(’/’); if (begin == -1) { begin = 0; } else { begin++; } int end; if (uri.indexof(";") != -1) { end = uri.indexof(";"); } else if (uri.indexof("?") != -1) { end = uri.indexof("?"); } else { end = uri.length(); } string filename = uri.substring(begin, end); if (filename.indexof(".") != -1) { filename = filename.substring(0, filename.lastindexof(".")); } return filename; } }
dynamicurlhandlermapping,考虑到有的时候有特殊需求,所以就最后一个来指定方法,前面的来构成beanname,如/admin/user/viewuser.action,就可以查找到adminuser这个id的类,然后调用viewuser这个方法。用到了lazy load而不是一开始就把所有的bean都放到工厂,有利于服务的启动速度(最近老是觉得这个烦),也可以不实例化一辈子都用不到的类(这种类可以删除了)
package com.zgc.test.multiaction; import org.apache.commons.lang.stringutils; import org.springframework.web.servlet.handler.abstracturlhandlermapping; public class dynamicurlhandlermapping extends abstracturlhandlermapping { protected object lookuphandler(string urlpath) { object handler = super.lookuphandler(urlpath); if (handler == null) { string[] paths=urlpath.split("/"); string beanname=""; for(int i=0;i<paths.length-1;i++){ beanname+=stringutils.capitalize( paths[i]); } registerhandler(urlpath,stringutils.uncapitalize(beanname)); handler=super.lookuphandler(urlpath); } return handler; } }
用到了一个简单的方法去viewname,我喜欢约定多于配置,于是有这么一个helper类
package com.zgc.test.multiaction; public class methodnameviewname { public static string getviewname(){ stacktraceelement[] elements = (new throwable()).getstacktrace(); return elements[1].getmethodname(); } }
再接着就是实现类了,很简单,示例吗
package com.zgc.test.multiaction; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import org.springframework.web.servlet.modelandview; import org.springframework.web.servlet.mvc.multiaction.multiactioncontroller; public class channelmanager extends multiactioncontroller { public modelandview channellist(httpservletrequest request,httpservletresponse response){ return new modelandview(methodnameviewname.getviewname(),"message","channellist"); } public modelandview channeladd(httpservletrequest request,httpservletresponse response){ return new modelandview(methodnameviewname.getviewname(),"message","channeladd"); } }
还有就是配置文件,因为autowire了,变得很简单
<?xml version="1.0" encoding="utf-8"?> <!doctype beans public "-//spring//dtd bean//en" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans default-autowire="byname" default-lazy-init="false" default-dependency-check="none"> <bean id="viewresolver" class="org.springframework.web.servlet.view.internalresourceviewresolver"> <property name="prefix"><value>/web-inf/view/</value></property> <property name="suffix"><value>.jsp</value></property> </bean> <bean id="handlermapping" class="com.zgc.test.multiaction.dynamicurlhandlermapping"> </bean> <bean id="methodnameresolver" class="com.zgc.test.multiaction.pathmethodnameresolver"/> <bean id="user" class="com.zgc.test.multiaction.usermanager"> </bean> <bean id="channel" class="com.zgc.test.multiaction.channelmanager"> </bean> </beans>
jsp很简单就是标识一下不同的页面,就不做展示了。启动之后就可以通过http://server:port/beanname/methodname.action,来访问了
|