zoukankan      html  css  js  c++  java
  • Spring MVC 学习第一篇

    很好的MVC 参考blog:http://jinnianshilongnian.iteye.com/blog/1752171

    MVC:

      概念:是一种设计模式,并没有引入新的技术,只是把我们开发的结构组织的更加合理,使展示与模型分离、
      业务逻辑调用、展示逻辑与流程控制逻辑分离。
      分述:
        Model(模型):数据模型,提供要展示和执久化的数据,包含数据和行为,通常可认为是领域模型或是JavaBean.
    View(视图):负责数据的呈现,渲染页面,与客户端交换。
    Controller(控制器):负责接收请求并处理,把处理后的结果 返回给View .

     Spring mvc 是用java 实现的基于 MVC 设计思想的三层框构。

     第一个示例:
           第一步:添加spring mvc 的依赖名,可以把spring-framework-3.2.2-distspring-framework-3.2.2libs 都放入,在加上spring 需要的 JSTL 的包(jstl.jar,standard.jar) 还有一个 是志包(commons-logging-1.1.1.jar)

         第二步: 配置spring mvc 的统一入口。在web.xml 中配置。

     <?xml version="1.0" encoding="UTF-8"?>
    		<web-app version="2.5" 
    			xmlns="http://java.sun.com/xml/ns/javaee" 
    			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    			xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    			http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    			<servlet>
    				<servlet-name>chapter2</servlet-name>
    				<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    				<!-- 默认的条件是在/WEB-INF/查找servlet-name-servlet.xml文件,示例中就是chapter2-servlet.xml -->
    				<!-- 如果要改为其他的文件名称,要使用系统中定义的几个常量contextConfigLocation,且applicationContext-*.xml 一定要放到classpath 下-->
    				<init-param>
    					<description>spring mvc file</description>
    					<param-name>contextConfigLocation</param-name>
    					<param-value>classpath:applicationContext-*.xml</param-value>
    				</init-param>
    				<load-on-startup>1</load-on-startup>
    			</servlet>
    			<servlet-mapping>
    				<servlet-name>chapter2</servlet-name>
    				<url-pattern>/</url-pattern>
    			</servlet-mapping>
    		  <welcome-file-list>
    			<welcome-file>index.jsp</welcome-file>
    		  </welcome-file-list>
    		</web-app>

     第二步:配置applicationContext-mvc.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"
    		xsi:schemaLocation="http://www.springframework.org/schema/beans
    			http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    		<!-- HandlerMapping -->   
    		<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>   
    			
    		<!-- HandlerAdapter -->   
    		<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 
    
    		<bean name="/hello" class="com.soliu.controller.HelloWorldController"/>  
    
    
    		<!-- ViewResolver -->   
    		<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">   
    			<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>   
    			<property name="prefix" value="/WEB-INF/jsp/"/>   
    			<property name="suffix" value=".jsp"/>   
    		</bean>  
    		 
    	 </beans>

     说明:BeanNameUrlHandlerMapping 是把请求的URL 与 Bean 的name 相映射,请求url 如/hello 就会与 <bean name="/hello" class"..."/> 相对应
          SimpleControllerHandlerAdapter 只要实现org.springframework.web.servlet.mvc.Controller; 都可以成为一个处理器。
      InternalResourceViewResolver 是处理视图和数据结果的映射。
        viewClass:表示页面中需要使用JSTL标签库。
    prefix:前缀 数据的结果 需要在/WEB-INF/jsp/ 下
    suffix:后缀 页面使用 xxx.jsp 为展示视图,可以支持 freemarker、Velocity 等技术。


     第三步:编写处理器HelloWorldController

    		package com.soliu.controller;
    
    		import javax.servlet.http.HttpServletRequest;
    		import javax.servlet.http.HttpServletResponse;
    		import org.springframework.web.servlet.ModelAndView;
    		import org.springframework.web.servlet.mvc.Controller;
    		public class HelloWorldController implements Controller{
    			public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse resp) throws Exception {
    				  ModelAndView model = new ModelAndView();
    				  model.addObject("message", "hello world spring mvc");
    				  model.setViewName("hello");
    				return model;
    			}
    
    		}



    说明:实现org.springframework.web.servlet.mvc.Controller ,重写handleRequest() 方法,返回一个ModelAndView。
          把这个Controller 配置到 applicationContext-mvc.xml 中
      <bean name="/hello" class="com.soliu.controller.HelloWorldController"/>  
    第四步:在/WEB-INF/下添加一个jsp的包,并编写一个hello.jsp

     <%@ page language="java" contentType="text/html; charset=UTF-8"
    		pageEncoding="UTF-8"%>
    	<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    	<html>
    		<head>
    			<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    			<title>Hello World</title>
    		</head>
    		<body>
    			${message}
    		</body>
    	</html>



     前台访问地址:http://localhost:8080/chapert2/hello
     
     第五步:启动服务,请求地址:
     
        Spring MVC 工作原理:
       1、  首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
    2、  DispatcherServlet——>HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
    3、  DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
    4、  HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
    5、  ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
    6、  View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
    7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。


      DispatcherServlet 的原码分析:
    	 DispatcherServlet extends FrameworkServlet,FrameworkServlet extends HttpServletBean,HttpServletBean extends HttpServlet
    	 	implements EnvironmentCapable, EnvironmentAware
    	     DispatcherServlet 是一个实现了 HttpServlet 的servlet ,上下文服务 就是	的servlet 的上下文。
    		 public DispatcherServlet(WebApplicationContext webApplicationContext) {
    		   super(webApplicationContext);
    	     }
    	   	/**
    		 * Name of the class path resource (relative to the DispatcherServlet class)
    		 * that defines DispatcherServlet's default strategy names.
    		 */
    		private static final String DEFAULT_STRATEGIES_PATH = "DispatcherServlet.properties";
    		private static final Properties defaultStrategies;
    
    		static {
    			// Load default strategy implementations from properties file.
    			// This is currently strictly internal and not meant to be customized
    			// by application developers.
    			try {
    				ClassPathResource resource = new ClassPathResource(DEFAULT_STRATEGIES_PATH, DispatcherServlet.class);
    				defaultStrategies = PropertiesLoaderUtils.loadProperties(resource);
    			}
    			catch (IOException ex) {
    				throw new IllegalStateException("Could not load 'DispatcherServlet.properties': " + ex.getMessage());
    			}
    		}
    		DispatcherServlet.properties 部分内容如下:
    			org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
    			org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
    
    			org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,
    			org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,
    			org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
    		
    	    DispathcerServlet 默认的情况下会加载DispatcherServlet.properties 在初始化HandlerMapping 和 HandlerAdapter 。
    		所以 我们在applicationContext-mvc.xml  可以不配置如下内容,
    			<!-- HandlerMapping -->   
    			<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>   
    				
    			<!-- HandlerAdapter -->   
    			<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 
    	
    	/**
    	 * 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);
    	}
    		initHandlerMappings(context); // 会使用策略模式取默认的  HanderMapping
    		initHandlerAdapters(context); // 会使用策略模式取默认的  HanderAdapter	 
    	 
    	 
    	 当页面 提交中文时,需要 对所有的页面进行 UTF-8 编码,首先,页面 得是 UTF-8 的编码。
    	 <filter>   
    	    <filter-name>CharacterEncodingFilter</filter-name>   
    	    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>   
    	    <init-param>   
    	        <param-name>encoding</param-name>   
    	        <param-value>UTF-8</param-value>   
    	    </init-param>   
    	</filter>   
    	<filter-mapping>   
    	    <filter-name>CharacterEncodingFilter</filter-name>   
    	    <url-pattern>/*</url-pattern>   
    	</filter-mapping>  
    	 


  • 相关阅读:
    windows设置文件夹显示缩略图
    windows合并文件夹窗口
    crm高速开发之Entity
    在Eclipse中搭建Dagger和Dagger2使用环境
    CCEditBox/CCEditBoxImpl
    failed to sync branch You might need to open a shell and debug the state of this repo.
    五个方法:让站点用心服务于每一位客户
    Mobile first! Wijmo 5 + Ionic Framework之:Hello World!
    ST Nucleo mbed套件开发 一 MBED环境使用 以Nucleo-F401为例 (二)
    关于Windows通过远程桌面訪问Ubuntu
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218267.html
Copyright © 2011-2022 走看看