zoukankan      html  css  js  c++  java
  • springMVC ——Controller配置方式

    一.手动配置方式(开发中主要用注解方式,可以直接看标题二:注解方式)

    1.web.xml中DispatcherServlet控制器的的配置

      SpringMVC也是一种基于请求驱动的WEB框架,并且使用了前端控制器的设计模式。前端控制器就是DispatcherServlet控制器,只要满足web.xml文件中的【url-pattern】的规则,这个请求就会交给这个前端控制器(DispatcherServlet),然而前端控制器在收到请求后自己不进行任何处理,根据相应的【URL的映射规则】委托给其他的页面控制器进行处理请求。前端控制器只作为一个统一的访问点,进行全局的流程控制。

    contextConfigLocation的值指定springmvc的配置文件位置

    Servlet拦截匹配规则可以自已定义,拦截哪种URL合适? 
    当映射为@RequestMapping("/user/add")时,为例

    1、拦截*.do、*.htm, 例如:/user/add.do

      这是最传统的方式,最简单也最实用。不会导致静态文件(jpg,js,css)被拦截。

    2、拦截/,例如:/user/add

      可以实现现在很流行的REST风格。很多互联网类型的应用很喜欢这种风格的URL。

      弊端:会导致静态文件(jpg,js,css)被拦截后不能正常显示。想实现REST风格,事情就是麻烦一些。后面有解决办法还算简单。

    3、拦截/*,这是一个错误的方式,请求可以走到Action中,但转到jsp时再次被拦截,不能访问到jsp。

    <!--解决中文乱码问题的过滤器-->
    <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>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <!-- springMVC前端控制器 -->
    <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
    <!-- contextConfigLocation配置springmvc加载的配置文件;如果不配置默认加载的是/WEB-INF/servlet名称-servlet.xml -->
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring/springmvc.xml</param-value>
    </init-param>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <!-- 第一种:*.action 以.action结尾的由DispatcherServlet解析 -->
      <!-- <url-pattern>*.action</url-pattern> -->
      <!-- 第二种:/    所有的访问地址都由DispatcherServlet解析,对于静态文件的解析需要配置不让DispatcherServlet解析;使用此种方式可以实现RESTful风格的url-->
      <url-pattern>/</url-pattern>
    </servlet-mapping>

    手动指定spring配置文件(springmvc的配置文件可以不用指定了,上面的contextConfigLacation已经指定好springmvc的配置文件)的位置,需要使用ServletContext的初始化参数

    <!-- 手动指定spring配置文件的位置,需要使用ServletContext的初始化参数 -->
       <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/application-dao.xml,classpath:spring/application-service.xml,classpath:spring/application-transaction.xml</param-value>
       </context-param>

      配置spring提供的监听器,用于监听servletContext对象的创建,同时为我们创建spring容器放在servletContext中

      <listener>
          <!-- 配置spring提供的监听器,用于监听servletContext对象的创建,同时为我们创建spring容器放在servletContext中,需导spring-web-4.3.8.RELEASE.jar
                  默认情况下:这个配置只能加载位置是在WEB-INF目录中的spring配置文件,同时文件名必须是applicationContext.xml(所以spring配置文件在其它位置时需要手动指定配置文件位置)
           -->
          <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>

    2.在springmvc.xml中配置1.处理器映射器  2.处理器适配器  3.视图解析器(注意默认使用了jstl,所以必须导入jstl包

    如下视图解析器配置了前缀和后缀两个属性,因此控制器类的视图路径仅需提供文件名,视图解析器将会自动添加前缀和后缀。
             例如:1.视图解析器中设置了这两个属性时
                 <property name="prefix" value="/WEB-INF/jsp/"></property><property name="suffix" value=".jsp"></property>

                  2.Controller类中返回的ModelAndView设置了放回视图名:modelAndView.setViewName("items");
                  3.则访问controller成功后访问的url为...../WEB-INF/jsp/items.jsp

           <!--  配置处理器映射器    在配置Controller时需要指定bean的name;bean的name作为url进行查找 -->
            <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
            
           <!--  配置处理器适配器 ;所有的处理器适配器都实现了HandlerAdapter接口 -->
            <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
            
            
            <!-- 视图解析器 ;解析jsp,默认使用jstl标签,所以必须导jstl包 -->
            <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <!-- 设置view的前缀 -->
                <property name="prefix" value="/WEB-INF/jsp/"></property>
                <!-- 设置view的后缀 -->
                <property name="suffix" value=".jsp"></property>
                
                <!-- 指定前后缀后modelAndView.setViewName("");自动在前后加上前后缀 -->
            </bean>

    3.编写controller的java代码

      手动配置controller时对应的java类需实现Controller接口并重写实现方法

    public class ItemController implements Controller{
    
        @Override
        public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
            String name = "普通name";
            //返回ModelAndView
            ModelAndView modelAndView = new ModelAndView();
            //相当于request的setAttribute();
            modelAndView.addObject("name",name);
            
            //指定视图
            modelAndView.setViewName("items");
            return modelAndView;
        }
    
    }

    4.在springmvc.xml中配置controller

       <!-- 配置Controlle -->
         <bean name="/queryItems.action" class="cn.controller.ItemController"></bean>

    二.注解方式

    1.web.xml配置与以上手动配置controller的web.xml一样

    2.springmvc.xml中配置注解映射器和注解适配器

        方式一:

            <!-- (注解)映射器 -->
            <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
            <!-- (注解)适配器 -->
            <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

        方式二(开发用这种):

        <!-- 使用<mvc:annotation-driven>可以代替上边注解映射器和注解适配器 ,它默认加载很多参数绑定方法
                   比如json转换解析器(springmvc默认使用jackson,导入依赖即可)就默认加载了,实际开发用这个-->
          <mvc:annotation-driven></mvc:annotation-driven>    

    3.编写通过注解实现的controller的java代码

    //使用@Controller说明此类是一个控制器
    @Controller
    //为了对url进行分类管理,可以在这里定义根路径,比如此例子访问url为/item/queryItems
    @RequestMapping("/item")
    public class AnnotationController {
        
        @Autowired
        private ItemService itemService;
        
        /**
         * 查询item
         * @param itemQueryVo
         * @return
         */
        //@RequestMapping实现方法和url的映射,一个方法对应一个url,一般值设置和方法名一样
        @RequestMapping("/queryItems")
        public ModelAndView queryItems(ItemQueryVo itemQueryVo) {
            ModelAndView modelAndView = new ModelAndView();
            List<ItemCustom> itemsList = itemService.findItemsList(itemQueryVo);
            //相当于request的setAttribute();
            modelAndView.addObject("itemsList",itemsList);
            //指定视图
            modelAndView.setViewName("item/itemsList");
            return modelAndView;
        }

    4.springmvc.xml中配置注解的controller

            <!-- 扫描单个 -->
            <!-- <bean class="cn.controller.AnnotationController"></bean> -->
    <!-- 扫描包下的 --> <context:component-scan base-package="cn.controller"></context:component-scan>
  • 相关阅读:
    守护进程-锁-队列(生产者消费者模型)
    正则表达式不包含某个字符串写法
    正则表达式匹配不包含某些字符串的技巧
    08.参数估计_点估计
    07.编程理解中心极限定理
    05.编程理解小数和大数定律
    03.描述性统计代码
    02.描述统计 (descriptive statistics)
    oracle之三手工不完全恢复
    oracle之三手工完全恢复
  • 原文地址:https://www.cnblogs.com/lyh233/p/12047942.html
Copyright © 2011-2022 走看看