SpringMVC-1-(简介及HelloWord)
首先我们来看一下servlet的处理请求的方式:
一:SpringMVC简介:
一)SpringMVC中的几个重要组件
1.DispatchServlet:
前端控制器,mvc模式中的c,是整个流程的控制中心,由他来调用其他组件来处理用户的请求,它的存在降低了组件之间的耦合性(组件可以随意的替换和自定义),
接受所有的请求(配置成 / 不包含jsp)
2.HandlerMapping:
解析请求格式,判断具体要去调用哪个Controller,他回去提取请求地址中的一些字段这个字段就是我的controller名字(比如:localhost:8080/hello,提取到hello)
有多种映射方式:配置文件方式,实现接口方式,注解方式等等(下边的HelloWord中实现了两种方式:实现接口的方式和接口的方式)
3.Handler:后端处理器;也就是我们定义的controller类
4.HanelerAdapter:负责调用具体的Controller,其实是他来执行调用controller
5.ViewResovler:视图解析器,解析结果,准备跳转到那个具体的物理视图
SpringMVC流程图:
二)SpringMVC容器
是Spring容器的子类,他可以获取Spring容器中的内容,Spring容器中不能获取SpringMVC中的内容,
他是在Dispatcher初始化的时候就完成创建。也可以通过下边代码来设置在tomcat启动的时候就创建
<load-on-startup>1</load-on-startup>
三)HelloWord实现:
1.web.xml
2.springmvc.xml
3.controller
4.pom.xml
web.xml文件(无论xml方式还是注解方式web.xml都一样)
<!--配置springmvc中的DispatcherServlet组件--> <servlet> <servlet-name>springmvc</servlet-name> <!--这个DidpatcherServlet相当于我们servlet中的写的那个类,去拦截处理请求的作用--> <!--创建他的时候他会创建一个自己的SpringMVC的一个容器ConfigurableApplicationContext--> <!--<servlet-name>springmvc</servlet-name>--> <!--中的name是springmvc。其实系统默认去找的配置文件名称也是这个+servlet.xml--> <!--spring-servlet.xml--> <!--但是他有会默认在src下去找--> <!--在这里我们修改他的默认路径和名称--> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!--拦截处理jsp之外的资源--> <url-pattern>/</url-pattern> </servlet-mapping>
(一)xml方式配置(不常用,但是更完整表达mvc组建的使用)这种方式一个controllerl类里边只能写一个请求
一)方式一:映射器和处理器为(BeanNameUrlHandlerMapping 和 SimpleControllerHandlerAdapter)
<!--将controller配置到springMVC容器中--> <bean class="com.xpl.controller.HelloController" id="/hello"/>--------------注意:hello前边的/ <!--配置handlerMapping--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!--配置处理器HandlerAdapter--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> <!--配置视图解析器viewResolver--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
public class HelloController implements Controller { public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse spn) throws Exception { System.out.println("hello springMVC控制器"); //也可以通过构造器来给视图命名 //ModelAndView hello = new ModelAndView(); ModelAndView hello = new ModelAndView("main"); hello.setViewName("main"); return hello; } }
二)方式二:映射器和处理器为(SimpleUrlHandlerMapping 和 SimpleControllerHandlerAdapter)
<!--将controller配置到springMVC容器中--> <bean class="com.xpl.controller.HelloController" id="helloController"/> <!--配置handlerMapping-->
方式一和方式二区别在于property中的参数不一样一个是mappings一个是urlMap
方式一:
<!--<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >--> <!--<property name="urlMap">--> <!--<map>--> <!--key是解析出来的控制器逻辑名 value-ref是上边配置的controller就是要调用的controller--> <!--<entry key="hello" value-ref="helloController"/>--> <!--</map>--> <!--</property>--> <!--</bean>-->
方式二:
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <!--key表示请求参数名 value表示上边配置进来的Bean--> <prop key="hello">helloController</prop> </props> </property> </bean> <!--配置处理器HandlerAdapter--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> <!--配置视图解析器viewResolver--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
public class HelloController implements Controller { public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse spn) throws Exception { System.out.println("hello springMVC控制器"); //也可以通过构造器来给视图命名 //ModelAndView hello = new ModelAndView(); ModelAndView hello = new ModelAndView("main"); hello.setViewName("main"); return hello; } }
(二)注解方式配置映射器和处理器为(RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter)
<!--包扫描--> <context:component-scan base-package="com.xpl" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/> <!--配置视图解析器viewResolver--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="viewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean>
@Controller public class HelloController { @RequestMapping("/hello") public ModelAndView Hello(HttpServletRequest Request, HttpServletResponse Response) throws Exception { System.out.println("hello springMVC控制器"); ModelAndView hello = new ModelAndView("main"); return hello; } }
注意:
使用xml方式实现的时候controller必须实现Controller类,并重写其中的方法HandlerRequest();
使用注解的方式无需实现任何类,但是要在类上添加@Controller注解,方法上添加@RequestMapping("/hello")
pom.xml文件
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.0.3.RELEASE</version> </dependency>
四)简化配置
将HandlerMapping 和 HandlerAdapter 两句合成一句
<!--注意:是mvc那一个--> <mvc:annotation-driven/>
五):静态资源访问
<!--location:静态资源路径--> <!--mapping:表示访问的url格式--> <!--访问 http://8080/err/err.html--> <mvc:resources mapping="/js/**" location="/WEB-INF/js/"/> <mvc:resources mapping="/css/**" location="/WEB-INF/css/"/> <mvc:resources mapping="/images/**" location="/WEB-INF/images/"/> <mvc:resources mapping="/err/**" location="/WEB-INF/err/"/>
六):乱码问题解决(web.xml中配置字符编码过滤器)
<filter> <filter-name>encodingFilter</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> <init-param> <param-name>forceRequestEncoding</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>