引入SpringMVC,首先就要在web.xml中配置中配置控制请求转发的servlet——DispatcherServlet,
<servlet>
<servlet-name>Springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
默认会到classpath下寻找名叫Springmvc- servlet.xml的配置文件,并对所有以.do为结尾的请求都可以进行处理,也可以按自己的方式配置的~~就像这样:
<servlet>
<servlet-name>Springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
</servlet>
配置完了这个servlet,Spring就能给你转发请求的,也能识别配置文件,但是还要初始化容器才行啊,呵呵,这就要添加一个监听器了~~
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
这样基本的配置就完成了,呵呵,还会用到的log4j的配置,那些咱先不说,呵呵~~~
那现在呢,Spring转发请求的servlet配置好了,把请求转发到哪里啊,Spring怎么知道根据什么规则来解析url呢,哈哈,现在就需要配置 SpringMVC的核心啦~~
刚才也说了,如果引入 DispatcherServlet的时候没有设定xml的路径,会默认加载ServletName-Servlet.xml。
个人比较倾向于自己配置啦,呵呵~~好吧,现在来看applicationContext.xml中该怎么配置SpringMVC~~
在 Spring容器中配置容器没有先后之分,那咱就按Spring参考手册里的顺序来说~~
先来说控制器,就是MVC中的C,在Spring 中就是Controller,在Spring参考手册中是这么说的:"控制器使得用户可以访问应用所提供的服务。控制器解析用户输入,并将其转换成合理的模型数据,从而可以进一步由视图展示给用户。"
Spring控制器的基础呢,是 org.springframework.mvc.Controller接口,这个接口中定义了一个handRequest方法,这个方法负责处理请求,并返回合适的模型和视图(ModelAndView)。
在开发中,咱们可以继承AbstractController,实现它的 handleRequest方法,来实现属于咱们自己的控制器,呵呵,但是Spring已经有了一些实现,比如 MultiActionController,那功能是很强的啦,咱们现在先不说,呵呵。那现在通过一个Controller,能够处理请求并返回视图了,一般来讲,咱们的Request请求里面会有参数,比如在提交注册的Request中有username、password等参数,咱们在解析的时候可以通过request.getParameter("username")来获取username,通过 request.getParameter("password") 来获取password,然后通过setter方法赋值给你刚new好的User对象,啊,这好古老啊,额,Struts的ActionForm不就能把参数封装到一个对象上去吗?哈哈,Spring也有实现噢~~~这就用到Command Controller啦,一般大家都翻译为命令控制器,我一直觉得不是很恰当,这里就不翻译啦,呵呵~~
Spring实现的Command Controller呢,像是AbstractFormController, AbstractcommandController, SimpleFormController and AbstractWizardFormController都实现了一些基本的功能,一般呢,咱们用SimpleFormController就行了,呵呵,当然了,也能够继承AbstractFormController来实现自己的CommandController,呵呵~~咱们拿 SimpleFormController来说,它有一些属性,commandName,默认是command,commandClass需要咱们自己根据实际写,value呢是要绑定的类的完整名,如果需要对参数进行校验的话,还会用到validator属性,还有默认设为TRUE的 validateOnBing属性,呵呵
那好了,有了控制器咱们可以处理数据,也有逻辑视图了,但是来了请求Spring怎么知道要调用哪个Controller啊,哈,那就要处理器映射了,呵呵,英文名叫handler mapping,在Spring参考手册中是这么写的,“HandlerMapping的基本功能是将请求传递到HandlerExecutionChain上。 首先,这个HandlerExecutionChain必须包含一个能处理该请求的处理器。 其次,这个链也可以包含一系列可以拦截请求的拦截器。 当收到请求时,DispatcherServlet将请求交给处理器映射,让它检查请求并找到一个适当的HandlerExecutionChain。 然后,DispatcherServlet执行定义在链中的处理器和拦截器(interceptor)。”咱们平常用的两个处理器映射是BeanNameUrlHandlerMapping(默认)和 SimpleUrlHandlerMapping。
这个BeanNameUrlHandlerMapping把接收到的http请求映射到bean的名字,比如有个 http://localhost:8080/springmvc/login.do的请求,他就会映射到一个叫login.do的bean上去,呵呵,很强大吧~~
而SimpleUrlHandlerMapping呢,则是可配置的,呵呵~~像是
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/*/account.form=editAccountFormController
/*/editaccount.form=editAccountFormController
</value>
</property>
</bean>
<bean id="editAccountFormController"
class="org.springframework.web.servlet.mvc.SimpleFormController">
…一些属性配置…
</bean>
这样呢,通过在SimpleUrlHandlerMapping中定义各个映射,就可以讲请求映射到Controller啦~~也很强大吧,哈哈,看看那个*号,它支持ant风格的映射噢~~
现在呢,咱们已经知道,当有请求时,DispatcherServlet将请求交给处理器映射来进行一些处理和拦截,完事儿之后呢根据名字或是配置调用Controller来处理请求的数据,并返回一个逻辑视图,对吧,那好,现在问题又来了,该怎么把这个逻辑视图转换到物理视图呢?哈哈,那就要视图解析器ViewResolver啦~~Spring呢,对ViewResolver的实现有很多,对XMl、Excel、PDF、JSP、Velocity、FreeMaker都有支持,现在呢,咱们就先以最普通的
Jsp为例说一下~~配置呢,就系这样子滴:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
如果Controller返回了一个叫做“sample”的ModelAndView,那就能定位到/WEB-INF/jsp/sample.jsp了,很强大吧,呵呵~~
那如果咱们的项目中既有Velocity,又有jsp,这样混合不同的视图时应该怎么办呢?哈哈,咱们可以使用ResourceBundleViewResolver,但是这个呢,貌似配置很麻烦的说,不推荐哈,咱们还可以配置多个视图解析器,这样呢Spring就会挨个进行解析,直到找到合适的视图为止,注意噢,要是没有对应的视图会怎么样呢?InternalResourceViewResolver会返回一个null值,但是别的解析器却不一定呢,所以在使用别的解析器的时候要好好研究下文档了哈~~还有啊,最好把InternalResourceViewResolver放在解析器链配置的最后,因为他就算是找不到视图也会返回null值,那么以后的解析器还会起作用吗?哈哈~~~
哈哈,现在也找到页面了,没问题的话,就应该能正常工作了啊,但是还有一点东西要说,那就是页面之间的重定向,那怎么实现呢?哈,咱们有RedirectView呢!!!如果要执行redirect操作,直接在Controller里return “redirect:ViewName”, UrlBasedViewResolver (以及它的子类) 会知道系统要生成一个HTTP redirect,ViewName就是要重定向的URL,同样,执行forward的话,就用“forward:ViewName”就行啦~~
这样呢,一个基本的SpringMVC配置就完成了,哈,只要理解了这个流程,代码还是很简单的啦~~剩下呢,还有本地化解析器、主题、文件上传、Spring标签等一些内容,呵呵~~~其实那些东东都简单的啦~~
嗯,先写到这里,我再研究研究去了~~~
Spring很强大啊~~
<servlet>
<servlet-name>Springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
默认会到classpath下寻找名叫Springmvc- servlet.xml的配置文件,并对所有以.do为结尾的请求都可以进行处理,也可以按自己的方式配置的~~就像这样:
<servlet>
<servlet-name>Springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</init-param>
</servlet>
配置完了这个servlet,Spring就能给你转发请求的,也能识别配置文件,但是还要初始化容器才行啊,呵呵,这就要添加一个监听器了~~
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
这样基本的配置就完成了,呵呵,还会用到的log4j的配置,那些咱先不说,呵呵~~~
那现在呢,Spring转发请求的servlet配置好了,把请求转发到哪里啊,Spring怎么知道根据什么规则来解析url呢,哈哈,现在就需要配置 SpringMVC的核心啦~~
刚才也说了,如果引入 DispatcherServlet的时候没有设定xml的路径,会默认加载ServletName-Servlet.xml。
个人比较倾向于自己配置啦,呵呵~~好吧,现在来看applicationContext.xml中该怎么配置SpringMVC~~
在 Spring容器中配置容器没有先后之分,那咱就按Spring参考手册里的顺序来说~~
先来说控制器,就是MVC中的C,在Spring 中就是Controller,在Spring参考手册中是这么说的:"控制器使得用户可以访问应用所提供的服务。控制器解析用户输入,并将其转换成合理的模型数据,从而可以进一步由视图展示给用户。"
Spring控制器的基础呢,是 org.springframework.mvc.Controller接口,这个接口中定义了一个handRequest方法,这个方法负责处理请求,并返回合适的模型和视图(ModelAndView)。
在开发中,咱们可以继承AbstractController,实现它的 handleRequest方法,来实现属于咱们自己的控制器,呵呵,但是Spring已经有了一些实现,比如 MultiActionController,那功能是很强的啦,咱们现在先不说,呵呵。那现在通过一个Controller,能够处理请求并返回视图了,一般来讲,咱们的Request请求里面会有参数,比如在提交注册的Request中有username、password等参数,咱们在解析的时候可以通过request.getParameter("username")来获取username,通过 request.getParameter("password") 来获取password,然后通过setter方法赋值给你刚new好的User对象,啊,这好古老啊,额,Struts的ActionForm不就能把参数封装到一个对象上去吗?哈哈,Spring也有实现噢~~~这就用到Command Controller啦,一般大家都翻译为命令控制器,我一直觉得不是很恰当,这里就不翻译啦,呵呵~~
Spring实现的Command Controller呢,像是AbstractFormController, AbstractcommandController, SimpleFormController and AbstractWizardFormController都实现了一些基本的功能,一般呢,咱们用SimpleFormController就行了,呵呵,当然了,也能够继承AbstractFormController来实现自己的CommandController,呵呵~~咱们拿 SimpleFormController来说,它有一些属性,commandName,默认是command,commandClass需要咱们自己根据实际写,value呢是要绑定的类的完整名,如果需要对参数进行校验的话,还会用到validator属性,还有默认设为TRUE的 validateOnBing属性,呵呵
那好了,有了控制器咱们可以处理数据,也有逻辑视图了,但是来了请求Spring怎么知道要调用哪个Controller啊,哈,那就要处理器映射了,呵呵,英文名叫handler mapping,在Spring参考手册中是这么写的,“HandlerMapping的基本功能是将请求传递到HandlerExecutionChain上。 首先,这个HandlerExecutionChain必须包含一个能处理该请求的处理器。 其次,这个链也可以包含一系列可以拦截请求的拦截器。 当收到请求时,DispatcherServlet将请求交给处理器映射,让它检查请求并找到一个适当的HandlerExecutionChain。 然后,DispatcherServlet执行定义在链中的处理器和拦截器(interceptor)。”咱们平常用的两个处理器映射是BeanNameUrlHandlerMapping(默认)和 SimpleUrlHandlerMapping。
这个BeanNameUrlHandlerMapping把接收到的http请求映射到bean的名字,比如有个 http://localhost:8080/springmvc/login.do的请求,他就会映射到一个叫login.do的bean上去,呵呵,很强大吧~~
而SimpleUrlHandlerMapping呢,则是可配置的,呵呵~~像是
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<value>
/*/account.form=editAccountFormController
/*/editaccount.form=editAccountFormController
</value>
</property>
</bean>
<bean id="editAccountFormController"
class="org.springframework.web.servlet.mvc.SimpleFormController">
…一些属性配置…
</bean>
这样呢,通过在SimpleUrlHandlerMapping中定义各个映射,就可以讲请求映射到Controller啦~~也很强大吧,哈哈,看看那个*号,它支持ant风格的映射噢~~
现在呢,咱们已经知道,当有请求时,DispatcherServlet将请求交给处理器映射来进行一些处理和拦截,完事儿之后呢根据名字或是配置调用Controller来处理请求的数据,并返回一个逻辑视图,对吧,那好,现在问题又来了,该怎么把这个逻辑视图转换到物理视图呢?哈哈,那就要视图解析器ViewResolver啦~~Spring呢,对ViewResolver的实现有很多,对XMl、Excel、PDF、JSP、Velocity、FreeMaker都有支持,现在呢,咱们就先以最普通的
Jsp为例说一下~~配置呢,就系这样子滴:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
如果Controller返回了一个叫做“sample”的ModelAndView,那就能定位到/WEB-INF/jsp/sample.jsp了,很强大吧,呵呵~~
那如果咱们的项目中既有Velocity,又有jsp,这样混合不同的视图时应该怎么办呢?哈哈,咱们可以使用ResourceBundleViewResolver,但是这个呢,貌似配置很麻烦的说,不推荐哈,咱们还可以配置多个视图解析器,这样呢Spring就会挨个进行解析,直到找到合适的视图为止,注意噢,要是没有对应的视图会怎么样呢?InternalResourceViewResolver会返回一个null值,但是别的解析器却不一定呢,所以在使用别的解析器的时候要好好研究下文档了哈~~还有啊,最好把InternalResourceViewResolver放在解析器链配置的最后,因为他就算是找不到视图也会返回null值,那么以后的解析器还会起作用吗?哈哈~~~
哈哈,现在也找到页面了,没问题的话,就应该能正常工作了啊,但是还有一点东西要说,那就是页面之间的重定向,那怎么实现呢?哈,咱们有RedirectView呢!!!如果要执行redirect操作,直接在Controller里return “redirect:ViewName”, UrlBasedViewResolver (以及它的子类) 会知道系统要生成一个HTTP redirect,ViewName就是要重定向的URL,同样,执行forward的话,就用“forward:ViewName”就行啦~~
这样呢,一个基本的SpringMVC配置就完成了,哈,只要理解了这个流程,代码还是很简单的啦~~剩下呢,还有本地化解析器、主题、文件上传、Spring标签等一些内容,呵呵~~~其实那些东东都简单的啦~~
嗯,先写到这里,我再研究研究去了~~~
Spring很强大啊~~