spring的portlet改进(二)支持CURD标注的groovy充当controller

糖葫芦娃哈哈 2010-01-06

spring的portlet改进(二)支持CURD标注的groovy充当controller

既然在普通的servlet的controller里面,我们已经实现了标注的groovycontroller

理论上来说,也可以实现portlet的controller里面也支持groovy的annotation。

1、easygroovyplugin的改进

下面需要对我们的easygroovyplugin做一下重构和改进,不仅要支持servlet的controller,也同时要支持portlet的controller。

以前的easygroovyplugin里面的proxy类是ProxyAwareAnnotationMethodHandlerAdapter集成自

org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;这个基类

来自于servlet.mvc里面的,整个proxy类内容如下:

packagecom.sillycat.easygroovyplugin.servlet.proxy;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importorg.springframework.aop.TargetSource;

importorg.springframework.aop.framework.Advised;

importorg.springframework.web.servlet.ModelAndView;

importorg.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter;

publicclassProxyAwareAnnotationMethodHandlerAdapterextends

AnnotationMethodHandlerAdapter{

@Override

publicModelAndViewhandle(HttpServletRequestrequest,

HttpServletResponseresponse,Objecthandler)throwsException{

handler=unwrapHandler(handler);

returnsuper.handle(request,response,handler);

}

@Override

publicbooleansupports(Objecthandler){

handler=unwrapHandler(handler);

returnsuper.supports(handler);

}

privateObjectunwrapHandler(Objecthandler){

if(handlerinstanceofAdvised){

try{

TargetSourcetargetSource=((Advised)handler)

.getTargetSource();

returntargetSource.getTarget();

}catch(Exceptionx){

thrownewRuntimeException(x);

}

}else{

returnhandler;

}

}

}

其实portlet.mvc包里面的东东和servlet.mvc的东东其实是很类似的,所以我参考上面的类,写了

packagecom.sillycat.easygroovyplugin.portlet.proxy;

importjavax.portlet.PortletRequest;

importjavax.portlet.PortletResponse;

importorg.springframework.aop.TargetSource;

importorg.springframework.aop.framework.Advised;

importorg.springframework.web.portlet.ModelAndView;

importorg.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter;

publicclassProxyAwareAnnotationMethodHandlerAdapterextends

AnnotationMethodHandlerAdapter{

publicModelAndViewdoHandle(PortletRequestrequest,

PortletResponseresponse,Objecthandler)throwsException{

handler=unwrapHandler(handler);

returnsuper.doHandle(request,response,handler);

}

@Override

publicbooleansupports(Objecthandler){

handler=unwrapHandler(handler);

returnsuper.supports(handler);

}

privateObjectunwrapHandler(Objecthandler){

if(handlerinstanceofAdvised){

try{

TargetSourcetargetSource=((Advised)handler)

.getTargetSource();

returntargetSource.getTarget();

}catch(Exceptionx){

thrownewRuntimeException(x);

}

}else{

returnhandler;

}

}

}

主要的区别就是继承的基类不同了,portlet的是:

org.springframework.web.portlet.mvc.annotation.AnnotationMethodHandlerAdapter;

2、easyportlet的配置修改

applicationContext-easyportlet.xml的修改如下:

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"

xmlns:util="http://www.springframework.org/schema/util"xmlns:lang="http://www.springframework.org/schema/lang"

xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context"

xmlns:groovy="http://www.sillycat.com/schema/groovy"

xsi:schemaLocation="

http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd

http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util-2.5.xsd

http://www.springframework.org/schema/langhttp://www.springframework.org/schema/lang/spring-lang-2.5.xsd

http://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-2.5.xsd

http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd

http://www.sillycat.com/schema/groovyhttp://www.sillycat.com/schema/groovy/groovy.xsd">

<beanid="propertyConfigurer"

class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"

lazy-init="false">

<propertyname="locations">

<list>

<value>classpath*:easyportlet.properties

</value>

</list>

</property>

</bean>

<context:component-scanbase-package="com.sillycat.easyportlet.web"/>

<beanid="viewResolver"

class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<propertyname="viewClass"

value="org.springframework.web.servlet.view.JstlView"/>

<propertyname="prefix"value="/WEB-INF/portlets/easyportlet/"/>

<propertyname="suffix"value=".jsp"/>

</bean>

<!--DefaultExceptionHandler-->

<beanid="defaultExceptionHandler"

class="org.springframework.web.portlet.handler.SimpleMappingExceptionResolver">

<propertyname="order"value="10"/>

<propertyname="defaultErrorView"value="error"/>

<propertyname="exceptionMappings">

<props>

<propkey="javax.portlet.UnavailableException">

unavailable

</prop>

<propkey="java.lang.Exception">error</prop>

</props>

</property>

</bean>

<beanclass="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping">

<propertyname="interceptors">

<bean

class="org.springframework.web.portlet.handler.ParameterMappingInterceptor"/>

</property>

</bean>

<beanid="handlerAdapter"

class="com.sillycat.easygroovyplugin.portlet.proxy.ProxyAwareAnnotationMethodHandlerAdapter"/>

<lang:defaultsrefresh-check-delay="5"/>

<groovy:scansource-pattern="/groovy/*.groovy"/>

<beanid="addressManager"

class="com.sillycat.easyportlet.services.impl.AddressManagerImpl"/>

</beans>

配置中没有再配置JAVA的controller了,而是直接在路径上去scangroovy的文件。将原来的controller文件稍作修改,jsp页面的内容没有改变

AddressEditController.groovy文件如下:

packagecom.sillycat.easyportlet.web;

importjava.util.List;

importjavax.portlet.ActionResponse;

importorg.springframework.stereotype.Controller;

importorg.springframework.ui.Model;

importorg.springframework.validation.BindingResult;

importorg.springframework.web.bind.annotation.RequestMapping;

importorg.springframework.web.bind.annotation.RequestParam;

importorg.springframework.beans.factory.annotation.Autowired;

importcom.sillycat.easyportlet.model.Address;

importcom.sillycat.easyportlet.services.AddressManager;

@Controller

@RequestMapping("EDIT")

classAddressEditController{

@Autowired

AddressManageraddressManager

@RequestMapping

//default(action=list)

publicStringlistAddresses(Modelmodel){

List<Address>addresses=addressManager.list()

//List<Address>addresses=null

model.addAttribute("addresses",addresses)

return"addressList"

}

@RequestMapping(params="action=add")

//renderphase

publicStringshowAddressForm(Modelmodel){

Addressaddress=null

address=newAddress()

model.addAttribute("address",address)

return"addressAdd"

}

@RequestMapping(params="action=edit")

//renderphase

publicStringeditAddress(@RequestParam("id")Integerid,Modelmodel){

model.addAttribute("address",addressManager.get(id))

return"addressEdit"

}

@RequestMapping(params="action=save")

//actionphase

publicvoidpopulateAddress(Addressaddress,BindingResultresult,

ActionResponseresponse){

if(address!=null){

if(address.getId()!=null&&address.getId().intValue()!=0){

addressManager.update(address)

}else{

addressManager.create(address)

}

}

response.setRenderParameter("action","list")

}

@RequestMapping(params="action=delete")

publicvoidremoveAddress(@RequestParam("id")Integerid,

ActionResponseresponse){

addressManager.delete(id)

response.setRenderParameter("action","list")

}

}

AddressRedirectController.groovy文件如下:

packagecom.sillycat.easyportlet.web;

importjava.util.List;

importorg.springframework.beans.factory.annotation.Autowired;

importorg.springframework.stereotype.Controller;

importorg.springframework.ui.Model;

importorg.springframework.web.bind.annotation.RequestMapping;

importorg.springframework.web.bind.annotation.RequestParam;

importorg.springframework.beans.factory.annotation.Autowired;

importcom.sillycat.easyportlet.model.Address;

importcom.sillycat.easyportlet.services.AddressManager;

@Controller

@RequestMapping("VIEW")

classAddressRedirectController{

@Autowired

AddressManageraddressManager

@RequestMapping

//defaultrender(action=list)

publicStringlistAddresses(Modelmodel){

List<Address>addresses=addressManager.list()

//List<Address>addresses=null

model.addAttribute("addresses",addresses)

return"addressListView"

}

@RequestMapping(params="action=view")

//renderphase

publicStringviewAddress(@RequestParam("id")Integerid,Modelmodel){

Addressaddress=null

address=addressManager.get(id)

model.addAttribute("address",address)

return"addressView"

}

}

这样我们就将portlet从javacontroller改造成了groovycontroller了。

相关推荐