我是靠谱客的博主 追寻康乃馨,最近开发中收集的这篇文章主要介绍SpringMVC中Controller接口的三种实现类的使用与说明,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

要说Controller接口的实现类使用与说明之前,先简要说明一下SpringMVC的工作原理。

①客户端发出一个请求,web服务器接受了这个请求后,就会与web.xml中配置的DispatcherServlet中的映射路径相匹配,如果有对应的匹配路径存在,那么这个请求将会交给DispatcherServlet处理(这个Dispatcher Servlet也是SpringMvc的核心);

②DispactherServlet接受请求后,根据URL寻找恰当的处理器映射来处理这个请求;

③处理器(Controller)处理完之后,就会返回一个ModelAndView对象给DispatcherServlet,这个ModelAndView对象封装了模型数据信息以及视图图逻辑名(视图逻辑名常指跳转的jsp页面);

④但是ModelAndView对象封装的只是视图逻辑名,而不是一个真正的视图对象,所以DispatcherServlet需要通过ViewResolver来进行对视图逻辑名的解析;

⑤解析得到视图对象后,DispatcherServlet将模型数据交给View对象进行渲染;

⑥最后将结果返回到客户端,这个结果可以是一个页面,也可以是一个Excel这类的视图形式。

  换句话说,DispatcherServlet是SpringMVC的核心,在web.xml里面配置DispatcherServlet:

<servlet>
      <servlet-name>spring</servlet-name><!-- 这里的取servlet名字为spring,意味着解析时,服务器会找到WEB-INF目录下的一个叫做spring-servlet.xml的文件 -->
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>spring</servlet-name>
      <url-pattern>*.do</url-pattern>
  </servlet-mapping>

        spring-servlet.xml的文件是用来配置处理器映射、控制器的定义、视图解析器等。
        SpringMVC的控制器基础是org.springframework.web.servlet.mvc.Controller接口,spring提供的Controller实现类有三个:AbstractCommandControllerSimpleFormControllerMultiActionController
下面是讲解这三个控制器类在使用上的区别:
一、AbstractCommandController(命令控制器):
        使用命令控制器时的spring-servlet.xml配置主要分了3个步骤:

①处理器映射配置,这里使用org.springframework.web.servlet.SimpleUrlHandlerMapping;
②定义控制器(这里是配置自定义控制器,因为自定义控制器已经继承了SpringMVC提供的控制器)
③配置视图解析器,这里使用org.springframework.web.servlet.view.InternalResourceViewResolver
        自定义一个控制器类继承AbstractCommandController后,下面的代码是在spring-servlet.xml的配置,

<!--配置处理器映射-->
  <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
       <property name="mappings">
           <props>
               <prop key="login.do">loginController</prop>  <!--key值表示url的值,如果两者匹配,则处理交给id为loginController的类处理-->
           </props>
       </property>
    </bean>
    <!--配置控制器-->
    <bean id="loginController" class="com.controller.LoginController">  <!--配置自定义控制器类,这里的id值对应上面的id值,换句话说,上面的处理操作交给这里对应的LoginController类-->
        <property name="commandClass" value="com.entity.Users"></property>  <!--配置注入类-->
    </bean>
  <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
public class LoginController extends AbstractCommandController {

    @Override
    protected ModelAndView handle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, BindException arg3)
            throws Exception {
        Users user = (Users) arg2;
    //指定视图逻辑名
        ModelAndView mav = new ModelAndView("success");
        mav.addObject("user", user);
        return mav;
    }

}

        当LoginController执行结束后,就会将ModelAndView对象返回给InternalResourceViewResolver解析,视图解析器类就会根据mav里面的指定视图逻辑名进行渲染,以这里为例子,就是找到success.jsp的文件,然后跳转。

二、SimpleFormController(表单控制器):
        自定义控制器类继承SimpleFormController后,在spring-servlet.xml里的配置主要有两个步骤:
①配置处理器映射
②配置控制器

<!--配置处理器映射-->
  <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="reg.do">regController</prop>
            </props>
        </property>
    </bean>
    <!--配置控制器-->
    <bean id="regController" class="com.controller.RegController">
        <property name="commandClass" value="com.entity.Users"></property>
        <property name="formView" value="register.jsp"></property>  <!--指定表单数据加载后,跳转的页面-->
        <property name="successView" value="show.jsp"></property>  <!--指定表单执行成功后跳转的页面-->
    </bean>
public class RegController extends SimpleFormController {
    protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, 
            Object command, BindException errors)throws Exception{
        Users user = (Users)command;
        
        ModelAndView mav = new ModelAndView("show.jsp");
        mav.addObject("user", user);
        return mav;
    }
    
    protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) 
            throws Exception{
        binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
    }
    
    protected Map referenceData(HttpServletRequest request) throws Exception{
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("hobbyList", new String[]{"Swimming", "Running"});
        return model;
    }
}

        从上面两段代码可以知道,当url的值为reg.do的时候,DispatcherServlet就会将处理请求交给id=regController的类(即RegController)处理,此时并不是执行onSubmit()方法,而是执行referenceData()方法,因为没有点击submit按钮。因为此方法
里面没有指定视图逻辑名,所以当referenceData()执行结束后,就会找到配置控制器<property name="formView" value="register.jsp"></property>这条语句,这里的value=register.jsp,即下一步会跳转到register.jsp页面,相应的数据也会加载到register.jsp页面上。当在register.jsp页面上点击submit按钮时,又会将请求交给RegController处理(因为form标签的action=reg.do),此时就会执行onSubmit()方法.
  对比AbstractCommandController和SimpleFormController的配置,就会发现,SimpleFormController少了配置视图解析器,而且自定义控制器类里指定视图逻辑名是用了“.jsp”后缀。其实这是成对出现的,配置视图解析器,就不需要后缀,因为后缀已经在视图解析器里有配置好,两种方法效果一样。

三、MultiSimpleController(多动作控制器):
        多动作控制器是为了减少大量的定义控制器类,可以实现多个动作在同一个类里面操作,实现功能集成。
        MultiSimpleController的配置相对简单一点:
①配置处理器映射
②配置自定义控制器
③配置自定义控制器的响应策略

<!--配置处理器映射-->
  <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="user.do">userController</prop>
            </props>
        </property>
    </bean>
  <!--配置自定义控制器-->
    <bean id="userController" class="com.controller.UserController">
        <property name="methodNameResolver" ref="methodNameResolver"></property>
    </bean>
  <!--配置自定义控制器响应策略-->
    <bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
        <property name="paramName" value="method"></property>
    </bean>

        上面同样的也没有配置视图解析器,所以自定义控制类的视图逻辑名要加上后缀(即使用路径+文件全名).

        在自定义控制器的配置里面,相对于AbstractCommandController和SimpeFormController来说,这里不需要配置封装类“commandClas”,因为使用了ParameterMethodNameReslover策略,作用是根据url请求匹配自定义控制器类里的方法名字,进而进行动作处理。

  当使用基于配置来实现SpringMVC的的动作响应时,就会发现AbstractCommandController和SimpleFormController被显示为已过期,因为SpringMVC框架是推荐使用注解的形式。

 

 

 

 

 

 

 

 

 

 

 

最后

以上就是追寻康乃馨为你收集整理的SpringMVC中Controller接口的三种实现类的使用与说明的全部内容,希望文章能够帮你解决SpringMVC中Controller接口的三种实现类的使用与说明所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部