spring 2.0 sample 之 petportal

本文详细解析了PetPortal示例项目中Portal与Portlet的工作原理及配置细节,介绍了Spring Portlet MVC的应用,并深入探讨了web.xml与portlet.xml的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天看看 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 .



<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一样,但是毕竟他们是不同的东西,值得商榷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值