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,所以可以配置多个转换类,一种转换失败则会尝试使用下一个。

相关推荐