今天看看 petportal 这个例子。
首先我们得明白什么是 portal, portlet.
关于什么是 portlet,可以参考这个文档:
http://www.blogjava.net/ericwang/archive/2005/12/05/22626.html
关于spring 中的portlet MVC 的使用,可以参考这个:
http://www.redsaga.com/spring_ref/2.0/html/portlet.html
好,那么先来看看 web.xml .
这里,spring 用的配置文件是 /WEB-INF/context/common.xml 。
出现的位置和名字都和之前的不一样了。
这里的 servlet 用的是 spring 的 ViewRendererServlet。
那么,接下来先看看 common.xml 吧。
这三个配置再熟悉不过了,一个属性读取的配置,一个国际化的配置,还有一个是 service bean 的配置(这个
配置竟然放到了最前面)
配置了一个 viewResolver.
关于 ParameterMappingInterceptor 的解释是这样的:
[quote]
Portlet包也带一个名为ParameterMappingInterceptor 的具体拦截器,它可以和ParameterHandlerMapping 以及
PortletModeParameterHandlerMapping一起使用。 这个拦截器可以把用来控制映射的参数从ActionRequest 带到
随后的RenderRequest,这能够确保 RenderRequest映射到和 ActionRequest相同的处理器。
这些都是在 preHandle方法里完成的,所以在你的处理器里仍然可以改变决定 RenderRequest映射的参数值。
注意这个拦截器会调用ActionResponse 的setRenderParameter方法,这意味着在使用它的时候, 不能在处理器
里调用sendRedirect。如果确实需要重定向, 可以手工地把映射参数向前传,或者另写一个拦截器来处理。
[/quote]
“defaultExceptionHandlerTemplate” 是定义了一个exception 的处理。
portlet 应用还必须有一个 portlet.xml, 里面配置了各种 portlet, 看看这个文件里有什么。
看来这个 portlet 还得使用 welcome-portlet.xml。 看看去吧!
这定义了一个 controller.
定义了 url 的处理,使用的controller 就是上面定义的。
其他的 portlet 的配置文件就不看了。
下面看看代码。
从代码看来,和 普通的MVC基本一样,也是用了 SimpleFormController, Controller 等类,
有的还使用了 GenericPortlet 类。
不过,这里的 SimpleFormController, Controller 虽然名字和之前看过的一样,但其实不一样,因为他们
都是 org.springframework.web.portlet.mvc 下的类。
这种命名方式,虽然在名字上保持了与普通的MVC一样,但是毕竟他们是不同的东西,值得商榷。
首先我们得明白什么是 portal, portlet.
关于什么是 portlet,可以参考这个文档:
http://www.blogjava.net/ericwang/archive/2005/12/05/22626.html
关于spring 中的portlet MVC 的使用,可以参考这个:
http://www.redsaga.com/spring_ref/2.0/html/portlet.html
好,那么先来看看 web.xml .
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/context/common.xml</param-value>
</context-param>
这里,spring 用的配置文件是 /WEB-INF/context/common.xml 。
出现的位置和名字都和之前的不一样了。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>view-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.ViewRendererServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>view-servlet</servlet-name>
<url-pattern>/WEB-INF/servlet/view</url-pattern>
</servlet-mapping>
这里的 servlet 用的是 spring 的 ViewRendererServlet。
那么,接下来先看看 common.xml 吧。
<bean id="petService" class="org.springframework.samples.petportal.service.PetServiceImpl">
<property name="initPets" value="${pets.initPets}"/>
</bean>
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="WEB-INF/pets.properties"/>
</bean>
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>
<value>messages</value>
</list>
</property>
</bean>
这三个配置再熟悉不过了,一个属性读取的配置,一个国际化的配置,还有一个是 service bean 的配置(这个
配置竟然放到了最前面)
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
配置了一个 viewResolver.
<!-- This interceptor forwards the mapping request parameter from an ActionRequest to be used as a render parameter. -->
<bean id="parameterMappingInterceptor" class="org.springframework.web.portlet.handler.ParameterMappingInterceptor"/>
<!-- Abstract Default ExceptionHandler -->
<bean id="defaultExceptionHandlerTemplate" class="org.springframework.web.portlet.handler.SimpleMappingExceptionResolver" abstract="true">
<property name="defaultErrorView" value="error"/>
<property name="exceptionMappings">
<props>
<prop key="javax.portlet.PortletSecurityException">unauthorized</prop>
<prop key="javax.portlet.UnavailableException">unavailable</prop>
</props>
</property>
</bean>
关于 ParameterMappingInterceptor 的解释是这样的:
[quote]
Portlet包也带一个名为ParameterMappingInterceptor 的具体拦截器,它可以和ParameterHandlerMapping 以及
PortletModeParameterHandlerMapping一起使用。 这个拦截器可以把用来控制映射的参数从ActionRequest 带到
随后的RenderRequest,这能够确保 RenderRequest映射到和 ActionRequest相同的处理器。
这些都是在 preHandle方法里完成的,所以在你的处理器里仍然可以改变决定 RenderRequest映射的参数值。
注意这个拦截器会调用ActionResponse 的setRenderParameter方法,这意味着在使用它的时候, 不能在处理器
里调用sendRedirect。如果确实需要重定向, 可以手工地把映射参数向前传,或者另写一个拦截器来处理。
[/quote]
“defaultExceptionHandlerTemplate” 是定义了一个exception 的处理。
portlet 应用还必须有一个 portlet.xml, 里面配置了各种 portlet, 看看这个文件里有什么。
<portlet>
<portlet-name>welcome</portlet-name>
<portlet-class>org.springframework.web.portlet.DispatcherPortlet</portlet-class>
<init-param>
<name>contextConfigLocation</name>
<value>/WEB-INF/context/welcome-portlet.xml</value>
</init-param>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>view</portlet-mode>
</supports>
<portlet-info>
<title>Welcome</title>
</portlet-info>
</portlet>
。。。 省略
看来这个 portlet 还得使用 welcome-portlet.xml。 看看去吧!
<bean id="welcomePortlet" class="org.springframework.web.portlet.mvc.PortletWrappingController">
<property name="portletClass">
<value>org.springframework.samples.petportal.portlet.WelcomePortlet</value>
</property>
<property name="useSharedPortletConfig">
<value>false</value>
</property>
<property name="portletName">
<value>wrapped-welcome</value>
</property>
<property name="initParameters">
<props>
<prop key="dog">Poodle</prop>
<prop key="cat">Calico</prop>
<prop key="bird">Macaw</prop>
</props>
</property>
</bean>
这定义了一个 controller.
<bean id="portletModeHandlerMapping" class="org.springframework.web.portlet.handler.PortletModeHandlerMapping">
<property name="portletModeMap">
<map>
<entry key="view" value-ref="welcomePortlet"/>
</map>
</property>
</bean>
定义了 url 的处理,使用的controller 就是上面定义的。
其他的 portlet 的配置文件就不看了。
下面看看代码。
从代码看来,和 普通的MVC基本一样,也是用了 SimpleFormController, Controller 等类,
有的还使用了 GenericPortlet 类。
不过,这里的 SimpleFormController, Controller 虽然名字和之前看过的一样,但其实不一样,因为他们
都是 org.springframework.web.portlet.mvc 下的类。
这种命名方式,虽然在名字上保持了与普通的MVC一样,但是毕竟他们是不同的东西,值得商榷。