SpringMVC
在MVC层次结构中,SpringMVC是一个集合了View、Model和Controller层的框架。之前工作的单位中使用的SSH框架组合,Struct负责Controller,负责控制前台Http请求的接收、转发、过滤等,Spring负责后台类的创建注入等管理,Hibernate负责数据持久化。而现在,SpringMVC接管了Struct和Spring的工作,Hibernate的工作也可以由mybatis来接收,当然这是另外的话题了。
为工程添加上springMVC框架的方法是,写在web.xml中。
代码1 <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/11.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
在SpringMVC中,View是一些模板文件,扩展名为vm,此类文件和传统html、css文件无任何区别,所有前端代码均可有效运行。vm文件的springmvc配置如下,很容易根据配置看出它的意义所在。
代码2 <bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> <property name="resourceLoaderPath"> <value>/WEB-INF/views/,/WEB-INF/test/,/WEB-INF/view/test/</value> </property> <property name="configLocation"> <value>classpath:velocity.properties</value> </property> </bean> <bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver"> <property name="toolboxConfigLocation" value="/WEB-INF/test1.xml" /> <property name="suffix" value=".vm" /> <property name="contentType" value="text/html;charset=UTF-8" /> </bean>
前后端的交互是通过在vm中调用Controller中的方法来进行的,可以通过注解@RequestMapping为每一个Controller及其内部的方法指定一个路径,那么vm中的请求就是两者路径的拼接。
代码3 //类的注解 @Controller @RequestMapping("/t/mv") public class UserMobileVerifyController //方法注解,GET方法(restful风格) @RequestMapping(value = "/m", method=RequestMethod.GET) @ResponseBody public boolean v(HttpServletRequest request, Model model){ //方法注解,POST方法(restful风格) @RequestMapping(value = "/l", method=RequestMethod.POST) @ResponseBody public String s(@RequestBody LoginCodeReqBean loginCodeReqBean, Model model){
如果请求上图的v,那么就使用“ip:port/t/mv/m”,同理,如果请求sendLogincode,那么就使用“ip:port/t/mv/l”。
因为上面用到了注解,所以当然要在配置文件里加上(需要解释一下@Responsebody这个注解,如果加上了,那么返回结果所见即所得,即返回的是1,前端拿到的也就是1;而去掉这个注解,这个方法就是在控制跳转了,譬如返回的是404,那么前端会跳转到404.vm【这部分的原理是在上面的vm配置里面】。在没有注解的情况下,得到结果的方法是将数据写在model中,譬如:model.addAttribute("v",2),那么在前端vm中在script文件中“$!v”即可得到2的这个结果):
代码4 //简洁,但不够灵活 <mvc:annotation-driven /> //等同于上句话,控制的更加精细 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" > <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> </list> </property> </bean> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> </list> </property> </bean>
需要解释下的是 messageConverters的配置,如果注意代码3中的s方法就可以看到,参数里面有个类LoginCodeReqBean,但其实前台传入的只是一个json字符串,是messageConverters配置的转换类将json字符串转换为了类LoginCodeReqBean。可以看到messageConverters是个list,所以可以配置多个转换类,一种转换失败则会尝试使用下一个。