毕业几年来,一直在公司的WF框架上修修补补,做的大多都是业务,发现好久没接触过Spring了,当年的春天是否 涛声依旧呢??Spring的是一个优秀的框架,说其实一个框架,不如说其是一个容器,一个完美容纳百川的容器。在J2EE开发的春天里,一个基于Spring的MVC框架–Spring MVC应运而生。想当年恰逢毕业的时候,Spring+Struts+Hibernate框架的组合相当火热,大家都争相学习。。当然本人也是其中一枚。真正到了公司,发现很多公司并没有用这三个框架,相反Spring MVC的应用到是十分广泛。其出自Spring之手,当然也是和 Spring框架最最无缝结合的一个了。
下面,闲话少说,开始写代码吧。。。。(脱离不了程序猿的命^_^)
1、开始,用eclipse建一个Web工程,或者 Maven 工程。
2、添加 必需 的jar 包
3、修改web.xml添加拦截器,把所有的请求统一交给 org.springframework.web.servlet.DispatcherServlet 来处理。
1 2 3 4 5 6 7 8 9 10 11 12 |
<servlet> <servlet-name>viewspace</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>viewspace</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> |
4、根据 servlet-name,还得在web.xml 的同一目录里建一个 {servlet-name}-servlet.xml 的文件(先贴上文件内容后面在解释)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
<?xml version="1.0" encoding="UTF-8" ?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> <!-- 扫描web包,应用Spring的注解 --> <context:component-scan base-package="com.corp.chimera.web" /> <!-- HandlerMapping --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <!-- HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> <bean id="defaultAnnotationHandlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <!-- ViewResolver 配置视图解析器,将ModelAndView及字符串解析为具体的页面 --> <!-- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/views/"/> <property name="suffix" value=".jsp"/> </bean> --> <bean class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="/views/" /> <property name="configLocation" value="classpath:common/velocity.properties" /> </bean> <bean class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.velocity.VelocityView" /> <property name="suffix" value=".html" /> </bean> <bean name="/index" class="com.corp.chimera.web.controllers.IndexController" /> </beans> |
5、下面开始写代码了,首先是 Controller,作为MVC的 view层,是最直接和用户交互的,也是最外面的一层。Controller这里有两种写法,一种是基于配置的,一种是基于注解的。
首先说下基于配置的,这个好像是Spring 很早的版本之前的功能,所有的url都必须在配置文件里配置一下。配置其使用的HandlerMapping和HandlerAdapter以及,改URL对应的Controller类。
并且该Controller类必须实现(implements)org.springframework.web.servlet.mvc.Controller 并 重写 其 ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception的方法。
首先看配置文件:viewspace-servlet.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<!-- HandlerMapping --> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /> <!-- HandlerAdapter --> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/views/"/> <property name="suffix" value=".jsp"/> </bean> <bean name="/index" class="com.corp.chimera.web.controllers.IndexController" /> |
Controller类:IndexController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
package com.corp.chimera.web.controllers; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; /** * 基于配置的 Controller,Spring最原始的 用法 * 必须实现 org.springframework.web.servlet.mvc.Controller 并 重写 handleRequest 方法。 * 需要在 xxx-servlet.xml 里进行配置:<bean name="/index" class="com.corp.chimera.web.controllers.IndexController" /> * 并且对于HandlerMapping 需要使用 org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping * HandlerAdapter 需要配置 org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter * * @author kevin * */ public class IndexController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception { // 1、收集参数、验证参数 // 2、绑定参数到命令对象 // 3、将命令对象传入业务对象进行业务处理 // 4、选择下一个页面 ModelAndView mv = new ModelAndView(); // 添加模型数据 可以是任意的POJO对象 mv.addObject("message", "I am liuzk"); // 设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面 mv.setViewName("index"); return mv; } } |
这样 启动tomcat 就可以 访问了。。。 其HandlerMapping映射使用的是 BeanNameUrlHandlerMapping 和 SimpleControllerHandlerAdapter 并且使用 JSTLView 作为 ViewResolver视图解析器。。
这样写的一个缺点就是:
所有的url都得需要在文件里做配置。当系统庞大页面多的时候,这种效率上以及代码可读性上都大打折扣。于是,基于注解的方法就来了。。。
基于注解的实现:
1 2 3 4 5 6 7 8 9 10 |
<bean id="defaultAnnotationHandlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <bean id="annotationMethodHandlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <!-- ViewResolver 配置视图解析器,将ModelAndView及字符串解析为具体的页面 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> <property name="prefix" value="/views/"/> <property name="suffix" value=".jsp"/> </bean> |
Controller类:ListController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
package com.corp.chimera.web.controllers; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; /** * 基于注解的 Controller * 和 基于配置的Controller 不同的是,靠注解就可以实现所有Url,相比之下,基于注解的Controller 更方便,灵活 * 无需实现 和 继承任何类,只需要 @Controller 既可以标记该类位Controller * @RequestMapping 注解 实现对于url的 path 进行注册 * * 但是使用前仍然需要配置 Spring 的配置文件: * HandlerMapping 使用的是 org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping * HandlerAdapter 需要指定 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter * * @author kevin * */ @Controller @RequestMapping(value = "/list") public class ListController{ @RequestMapping(value="/index") public ModelAndView listIndex(HttpServletRequest request, HttpServletResponse response) throws Exception { // 1、收集参数、验证参数 // 2、绑定参数到命令对象 // 3、将命令对象传入业务对象进行业务处理 // 4、选择下一个页面 ModelAndView mv = new ModelAndView(); // 添加模型数据 可以是任意的POJO对象 mv.addObject("message", "This is a Spring Constraint with annotation.<br/> @Controller <br/>@RequestMapping"); // 设置逻辑视图名,视图解析器会根据该名字解析到具体的视图页面 mv.setViewName("list"); return mv; } } |
看上面方式:一个@Controller 一个 @RequestMapping 两个注解解决了所有的配置,但是 前提呢,是 在配置文件里配置 使用 DefaultAnnotationHandlerMapping 和 AnnotationMethodHandlerAdapter 作为 url映射控制器。
当然以上这两种方式在一个系统里也是可以一块是用的,具体 看你心情咯。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
文章到此还没结束吗,真的还没结束。。
细心的童鞋发现了,我在viewspace-servlet.xml配置的图形解析器,并不是 JstlView而是换成 VelocityView 。。这是因为本人用了好几年Velocity了,不太习惯原声的Jstl。。虽然语法上相当无几,所以还是研究了下,把他改成了VelocityView。
下面共享下方法:其实很简单,就是更换了配置信息,ViewResolver 使用 org.springframework.web.servlet.view.velocity.VelocityConfigurer ,并且 viewClass 使用 org.springframework.web.servlet.view.velocity.VelocityView,,在此之前,还得加个配置文件 velocity.properties 放在了 classpath:common/velocity.properties 目录下。
详细代码如下:
velocity.properties文件:
1 2 3 4 5 6 7 8 9 |
#encoding input.encoding =UTF-8 output.encoding=UTF-8 contentType=text/html;charset=UTF-8 #autoreload when vm changed file.resource.loader.cache=false file.resource.loader.modificationCheckInterval =1 velocimacro.library.autoreload=false |
viewspace-servlet.xml文件:
1 2 3 4 5 6 7 8 9 10 11 |
<bean class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath" value="/views/" /> <property name="configLocation" value="classpath:common/velocity.properties" /> </bean> <bean class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.velocity.VelocityView" /> <property name="suffix" value=".html" /> </bean> |
好的,。到此结束了,这次真的结束了。