现在的位置: 首页 > 综合 > 正文

spring mvc

2013年08月07日 ⁄ 综合 ⁄ 共 7246字 ⁄ 字号 评论关闭
文章目录

spring mvc流程

springmvc框架模型:

 

1. HTTP请求
2. DispatcherServlet接收请求,根据请求信息按照某种机制找到请求对应的处理器handler
3. DispatcherServlet将请求的处理工作委托给具体的处理器(Handler)来处理请求,行相应的业务逻辑。
4.handler处理后返回一个ModelAndView给DispatcherServlet,ModelAndView包含了视图逻辑名和渲染视图时需要用到的模型数据对象
5. DispatcherServlet通过调用ViewResolver来完成视图解析的工作,得到视图
6.给视图中渲染model数据
7.返回响应

HelloWorld

1.在web.xml中配置DispatcherServlet

web.xml

<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>dispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/dispatcherServlet-servlet.xml</param-value>
		</init-param>
	</servlet>

	<servlet-mapping>
		<servlet-name>dispatcherServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

从上面可以看出 DispatcherServlet是默认的servlet,在容器启动时候就实例化了
DispatcherServlet对应的配置文件是/WEB-INF/dispatcherServlet-servlet.xml

2.写DispatcherServlet所使用的配置文件>/WEB-INF/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" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-2.5.xsd">
	<context:component-scan base-package="com.auscend.controller" />
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver"
		p:prefix="/" 
		p:suffix=".jsp" />
</beans>

前缀和后缀是用来加载视图的名字前后的 

2.编写处理请求的控制器handler,控制器返回一个ModelAndView对象

package com.auscend.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.auscend.domain.User;
@Controller
@RequestMapping("/user")
public class UserController {
	@RequestMapping(value = "/add")
	public ModelAndView add(User user) {
		user.setId(1L);
		ModelAndView mav = new ModelAndView();
		mav.setViewName("success");
		mav.addObject("user", user);
		return mav;
	}
}

4.写返回给客户端的页面

/success.jsp

	<h3>add success!</h3>
  	id:${user.id}<br/> 
  	username:${user.userName }<br/>
  	password:${user.password }<br/>

5.写发出请求的页面

/input.jsp

<form action="${pageContext.request.contextPath }/user/add" method="post">
  	username:<input type="text" name="userName"/><br/>
  	password:<input type="password" name="password"/><br/>
  	<input type="submit" value="submit"/>
</form>

DispatcherServlet使用的配置文件的位置以及内容

假如dispatcherServlet对应的servlet-name是hello

如果不配置这个文件的位置,也就是不配置上面的contextConfigLocation,默认会在WEB-INF下找hello-servlet.xml

如果在dispatcherServlet中配置了namespace属性(例如叫 namesp ),默认会在WEB-INF下找namesp.xml

如果配置了contextConfigLocation,就加载contextConfigLocation写的xml,contextConfigLocation的值可以是多个如:classpath:a.xml,classpath:b.xml

 

配置文件中写什么东西,看看DispatcherServlet源代码就知道了

/**
	 * Initialize the strategy objects that this servlet uses.
	 * <p>May be overridden in subclasses in order to initialize further strategy objects.
	 */
	protected void initStrategies(ApplicationContext context) {
		initMultipartResolver(context);
		initLocaleResolver(context);
		initThemeResolver(context);
		initHandlerMappings(context);
		initHandlerAdapters(context);
		initHandlerExceptionResolvers(context);
		initRequestToViewNameTranslator(context);
		initViewResolvers(context);
		initFlashMapManager(context);
	}

initMultipartResolver(context);  init多部分请求解释器也就是上传文件的解析器

initLocaleResolver(context); 初始化本地化解析器

initThemeResolver(context)

;initHandlerMappings(context);

initHandlerAdapters(context);i

nitHandlerExceptionResolvers(context);

initRequestToViewNameTranslator(context);

initViewResolvers(context);

initFlashMapManager(context);

上面这些大部分spring已经提供了默认值,在org.springframework.web.servlet类路径下有一个DispatcherServlet.properties文件,文件中定义了默认的组件,如果我们配置了自己选择的组件,就不使用这些组件了

initMultipartResolver会查找bean name为multipartResolver 类型为 MultipartResolver 的bean 作为上传文件的解析器,没有默认的配置,如果需要我们可以自己配一个,不能配置多个,如下:

<!-- 文件上传 --> 
	<bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
          p:defaultEncoding="UTF-8"
          p:maxUploadSize="5000000"
          p:uploadTempDir="upload/temp"/> 

单位是字节,在控制层中只需在处理请求的方法里的参数中注解即可 public String upload(@RequestParam("picture") MultipartFile picture)  那么在方法里处理这个picture就ok,其中picture对应<input type="file" name="picture"/>

 

initLocaleResolver 本地化解析器,查找名为localeResolver类型为LocaleResolver的bean,找不到就使用默认的实现类(AcceptHeaderLocaleResolver) ,只能配置一个,下面介绍:

1.AcceptHeaderLocaleResolver依据请求中的accept-language请求头信息进行解析处理,这个是默认处理器
2.CookieLocaleResolver语言信息保存在cookie中
    <!-- 本地化解析 --> 
 <bean id="localeResolver"
    class="org.springframework.web.servlet.i18n.CookieLocaleResolver"
    p:cookieName="clientLanguage"
    p:cookieMaxAge="100000"
    p:cookiePath="/"
    p:defaultLocale="zh_CN"/>
3.SessionLocaleResolver语言信息保存在session中
 保存语言的属性名是SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME属性,值是Locale对象
4.LocaleChangeInterceptor通过url的参数指定语言
 用户可以通过paramName指定一个参数,比如locale,那么访问时 http://xxx/xxx/xx?locale=en 就表示英文
 

initThemeResolver,查找名为themeResolver类型为LocaleResolver的Bean,找不到就使用默认的实现类(FixedThemeResolver),只能配置一个

 参考:

http://viralpatel.net/blogs/spring-3-mvc-themes-tutorial-example/ 

http://starscream.iteye.com/blog/1075855 

http://www.jpalace.org/docs/tutorials/spring/mvc_22.html

 

initHandlerMappings 处理器映射器 可以配置多个 bean 名字无需指定
1)如果detectAllHandlerMappings属性为true(默认为true),根据类型匹配(HandlerMapping)机制查找上下文及父Spring容器中所有匹配的Bean,将它们作为该类型组件;
2)如果detectAllHandlerMappings属性为false,查找名为handlerMapping类型为HandlerMapping的Bean作为该类型组件;
3)如果通过以上方式都找不到,使用BeanNameUrlHandlerMapping实现类创建创建该类型的组件。

补充:待续

 

initHandlerAdapters处理器适配器 可以配置多个 bean 名字无需指定
1)如果detectAllHandlerAdapters属性为true(默认为true),根据类型匹配(HandlerAdapter)机制查找上下文及父Spring容器中所有匹配的Bean,将它们作为该类型组件;
2)如果detectAllHandlerAdapters属性为false,查找名为handlerAdapter类型为HandlerAdapter的Bean作为该类型组件;
3)如果通过以上方式都找不到,使用DispatcherServlet.properties配置文件中指定的三个实现类分别创建一个适配器,添加到适配器列表中。

补充:待续

 

initHandlerExceptionResolvers处理器异常解析器 可以配置多个 bean 名字无需指定

1)如果detectAllHandlerExceptionResolvers属性为true(默认为true),根据类型匹配(HandlerExceptionResolver)机制查找上下文及父Spring容器中所有匹配的Bean作为该类型组件;
2)如果detectAllHandlerExceptionResolvers属性为false,查找名为handlerExceptionResolver类型为HandlerExceptionResolver的Bean作为该类型组件;
3)如果通过以上方式都找不到,查找DispatcherServlet.properties中定义的默认实现类,不过该文件中没有对应处理器异常解析器的默认实现类(你可以更改属性文件)。

补充:待续

 

initRequestToViewNameTranslator视图名翻译器 只能配置一个
1)查找名为viewNameTranslator类型为RequestToViewNameTranslator的Bean作为该类型组件;
2)如果1)找不到,使用默认的实现类(DefaultRequestToViewNameTranslator)创建该类型的组件。

补充:待续

 

initViewResolvers视图解析器 可以配置多个 bean 名字无需指定
1)如果detectAllViewResolvers属性为true(默认为true),根据类型匹配(ViewResolver)机制查找上下文及父Spring容器中所有匹配的Bean作为该类型组件;
2)如果detectAllViewResolvers属性为false,查找名为viewResolver类型为ViewResolver的Bean作为该类型组件;
3)如果通过以上方式都找不到,通过DispatcherServlet.properties中定义的默认实现类(InternalResourceViewResolver)创建该类型的组件。

补充:待续

 

initFlashMapManager

补充:待续

 

数据绑定

待续

抱歉!评论已关闭.