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>

 

 

  

  

 

posted @ 2018-10-12 17:39  凤凰山小旋风  阅读(159)  评论(0编辑  收藏  举报