使 Spring MVC tags 支持多 model |
(2008年08月19日)发表于JavaEye博客 |
|
作者: SSailYang 链接: http://ssailyang.javaeye.com/blog/230163 发表时间: 2008年08月19日 声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任! 问题解释:用过 Spring MVC tags 的朋友都知道,要想将 表单元素的 value 与 相应的 bean 属性对应,需要在 <form:form> 里设置 commandName,spring mvc 会根据这个值在 requestContext 或 sessionContext 里面查找相应的 model,但是这样会是每个 <form:form> 表单只能使用一个 model,这降低了使用的灵活性。
其实导致这一问题的原因是 spring mvc 根据 form tag 中 path 属性查找 bean 及其属性的算法。
在 spring mvc 的 AbstractDataBoundFormElementTag.java (名字真长)中的 getBindStatus 方法中有这么一句: String pathToUse = (nestedPath != null ? nestedPath + getPath() : getPath()); 其中的 nestedPath 默认为 "command.",就是默认的 commandName 加上一个点。如果设置了 commandName,nestedPath 的值就是相应的 commandName 加上一个点。而 path 的指就是相应 tag 中的 path 属性(像 input、select 等 tag 都是继承了这个 tag)。所以如果 nestedPath 不为空的话 pathToUse 就是 commandName.path。之后 spring mvc 就会根据 pathToUse 的值将 tag 的 value 和相应的 bean 的属性进行绑定。知道这一点我想你就知道如何是 spring mvc tag 支持多 model 了。
具体怎么做这里就不说了。懒了,呵呵。 本文的讨论也很精彩,浏览讨论>> JavaEye推荐 |
| 阅读全文... |
本站相关内容: |
|
Spring MVCWe have been looking at this framework for an intranet site… it led to my realisation that Java really made things pretty difficult to display international character sets… but that was an earlier post. I followed most of the instructions in developing a Spring Framework MVC, though I didn’t create a JDBC based persistence layer. We’ll be using hibernate; and we’ll probably be operating around (or over) a web services layer. Rant: We use eclipse as a Java IDE - which also seems to generate al
spring mvc首先来配置一下DispatcherServlet:spring mvc和大部分mvc框架一样,底层也是依赖servlet api的,所以spring mvc的请求处理也是从一个servlet开始,这个servlet就是DispatcherServlet. 一下是在web.xml中DispatcherServlet的配置:
<servlet>
<description>spring mvc DispatcherServlet</description>
<display-name>spring mvc</display-name>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- ***** servlet-mapping ***** -->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!-- ***** 处理所有的.htm请求 ***** -->
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
根据servlet-name的配置,我们还要在/WEB-INF/目录下面建一个*-servlet.xml的配置文件,在这里我们的文件名就是DispatcherServlet-servlet.xml. 以后关于spring mvc的配置信息就将在这个xml里进行. 下面说一下DispatcherServlet对一个请求的处理过程:
这里先后涉及几个对象: 1:Handler Mapping 映射控制器,负责将url映射成对应的Controller. 2:Controller spring 的控制器,相当于servlet或struts 的action,负责主要的业 务处理,并返回一个ModelAndView给DispatcherServlet. 3:ModelAndView 包含着一个页面文件(jsp和html等)的逻辑视图名, 4:ViewResoler 视图解析器,根据ModelAndView提供的视图对象,查找对应的视图文件,并把他响应给客户. 在获得请求以后,DispatcherServlet首先会查询Handler Mapping对象(一个或多个). Handler Mapping的主要工作是将请求的url映射成对应的Controller对象. 接着,DispatcherServlet根据Handler Mapping对象找到的结果,把请求分发给对应的Controller对象来处理,Controller负责处理具体的业务逻辑,并返回一个带有下一个页面信息的ModelView对象,最后ViewResoler 对象根据ModelAndView的信息查找对应的视图页面,并响应给用户. 为了完成以上的过程,必须在DispatcherServlet-servlet.xml中配置所有相关的组件,大体的配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
<!-- ***** 映射处理器 handler mapping *****-->
<!-- 映射处理器的主要作用是将请求的url映射成对应的Controller -->
<!-- spring 提供了多个handler mapping 的实现,在这里可以配置一个或多个映射处理器,如果配置多个映射处理器,则需要配置order属性来指定他们的顺序,order的值越小,优先权越高 ,这里只用BeanNameUrlHandlerMapping来做示例 -->
<bean id="beanNameUrlMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="order"><value>1</value></property>
</bean>
<!-- ***** 视图解析器 ****** -->
<!-- 视图解析器 负责根据ModelAndView提供的视图信息查找对应的视图页面(.jsp或.html等)-->
<!-- 根据这里的配置,我们把视图文件都放在/WEB-INF/jsp/目录下,ModelView对象会提供该目录下的一个文件名,视图解析器会根据改文件名在/WEB-INF/jsp/目录下查找对应的文件,并把发返回给DispatcherServlet,DispatcherServlet再把他响应给客户 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<!-- ***** 控制器 **** -->
<!-- 控制器 不多说了 把他当servlet或action就行了-->
<bean name="/register.htm" class="spring.controller.Register">
</bean>
<bean name="/newuser.htm" class="spring.controller.Newuser">
</bean>
</beans>
spring mvc的笔记先到这里,以后找时间再吧几个映射控制器和视图解析器,以及一些常用的controller抄上来吧 已有 0 人发表留言,猛击->> 这里<<-参与讨论 JavaEye推荐
Spring and Spring MVC in ProductionJava™ Software Development Videos and Tutorials Directory (32 reads) This session presents an in depth discussion of a real world production application using Spring. The presentation will cover the business reasons for the application, how the application architecture was designed, packaged and deployed. The technologies discussed will include Spring, Hibernate, Spring MVC, FreeMarker, DWR, jQuery and many more. Attendees will learn production tips and [...]
偶遇Spring MVC个人认为Spring其核心是其IOC和AOP方面,对其SpirngMVC框架并怎么关注,我看好的是JSF,简单易懂。但最近由于工作上需要,所以有需要对SpringMVC做个了解学习,因此,本次对SpirngMVC的相遇纯属偶遇....SpingMVC的架构其实也很简单,它通过一个共通的入门DispatcherServlet来接收所有的request,接下来根据request要求的页面通过handler转送给Controller处理,处理结果返回View给用户,因此对SpringMVC来说,其核心为DispatcherServlet。 DispatcherServlet作为一扇门,我们要使用这个门,首先得安装上这个门,安装在哪呢?没错,就安装在web.xml这个大屋子,象其他servlet一样, 描述servlet的名字和类,再给他一个mapping描述对应映射的网页。在下例中, 我们给DispatcherServlet的起名为 SpringMVCDemo, 并让container知道所有.do结尾的request都丟给dispatcher。
<
servlet
>
门安装好了之后,我们需要定义门能打开的范围,在哪定义呢?就在门的上面贴上一张“入门指导”,介绍从哪方面(hello.do)进门需要使用何种交通方式(springmvcController)进去,并定义该交通方式。
< servlet-name > SpringMVCDemo </ servlet-name > < servlet-class > org.springframework.web.servlet.DispatcherServlet </ servlet-class > < load-on-startup > 1 </ load-on-startup > </ servlet > < servlet-mapping > < servlet-name > SpringMVCDemo </ servlet-name > < url-pattern > *.do </ url-pattern > </ servlet-mapping >
<
bean
id
="urlMapping"
接下来该渲染一下页面了,下面为渲染所有以
WEB-INF/pages/
开头, 并以. jsp结尾的页面。
class ="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" > < property name ="mappings" > < props > < prop key ="/hello.do" > springmvcController </ prop > </ props > </ property > </ bean > <!-- SpringmvcController --> < bean id ="springmvcController" class ="org.improviser.webapp.controller.SpringmvcController" > </ bean >
<!--
ViewSolver
-->
上面提到的SpringmvcController, 现在该作个定义了,该类需要实现Controller 接口。 < bean id ="viewResolver" class ="org.springframework.web.servlet.view.InternalResourceViewResolver" > < property name ="viewClass" > < value > org.springframework.web.servlet.view.JstlView </ value > </ property > < property name ="prefix" > < value > /WEB-INF/pages/ </ value > </ property > < property name ="suffix" > < value > .jsp </ value > </ property > </ bean > public class SpringmvcController implements Controller { 编写jsp 测试页面。 /** Logger for this class and subclasses */ protected final Log logger = LogFactory.getLog(getClass()); public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map model = new HashMap(); String str = " 即兴诗人 " ; logger.info( " returning hello view with " + currTime); model.put( " coldice " , str); return new ModelAndView( " hello " , " message " , model); } < html > 现在对以上内容作个总结,正如上面所叙述,SpringMVC框架的处理过程机制如下图所示,接收请求页面,通过DispatcherServlet映射到相应规则处理,并找到相应的控制器,结果控制器处理后返回相应的页面最后返回给用户。 < head > < title > Spring Application </ title > </ head > < body > < h1 > < br /> Hello < c:out value ="${message.coldice}" /></br> Spring MVC 测试成功! </ h1 > </ body > </ html > improviser 2007-11-04 10:44 发表评论
Spring MVC, JstlView and exposeContextBeansAsAttributesDid you know that Spring MVC's JstlView has a exposeContextBeansAsAttributes property you can use to expose all your Spring beans to JSTL? I didn't. To configure it, you configure your viewResolver as follows:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="exposeContextBeansAsAttributes" value="true"/>
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
After doing this, any Spring bean can get referenced in JSTL with:
${beanId.getterMethodWithoutTheGetPrefix}
If you're using Spring 2.5a annotations and <context:component-scan>, you'll need to specify a "value" attribute on your annotations in order to reference them in JSTL. For example:
@Controller(value = "beanId")
@RequestMapping("/foo.html")
public class MyController extends SimpleFormController
...
@Component(value="testClass")
public class TestClass {
Pretty cool stuff. It'd be a lot more useful if you could call methods with parameters. Hopefully JUEL will solve that problem. JSTL's functions work, but I'd rather write ${foo.method('arg')} rather than ${taglib:callMethod(foo, 'method', 'arg')}. |
互联网相关内容: |
| Spring MVC (2008年06月27日) |
| spring mvc (2009年06月16日) |
| Spring and Spring MVC in Production (2009年05月19日) |
| 偶遇Spring MVC (2007年11月04日) |
| Spring MVC, JstlView and exposeContextBeansAsAttributes (2007年12月06日) |
| Manage configuration with Spring MVC (2008年02月05日) |
| Spring MVC Testing with Annotations (2008年02月13日) |




