SpringMVC--初级

什么是SpringMVC

springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。springmvc是一个基于mcv的web框架。

mvc在b/s中的应用

mvc是一个设计模式,

springmvc框架原理(掌握)

  1. 前端控制器
  2. 处理器映射器
  3. 处理器适配器
  4. 视图解析器
  5. SpringMVC和mybatis整合
  6. 自定义参数绑定

springmvc执行步骤

  1. 发起请求到前端控制器(DispatcherServlet)
  2. 前端控制器请求处理器映射器HandlerMapping查找Handler

    可根据xml配置、注解进行查找

  3. 处理器映射器HandlerMapping向前端控制器返回Handler
  4. 前端控制器调用处理器适配器去执行Handler
  5. 处理器适配器执行Handler
  6. Handler执行完成给处理器适配器返回ModelAndView
  7. 处理器适配器给前端返回ModelAndView

    ModelAndView是springmvc框架的一个底层对象,包括Model和View

  8. 前端控制器请求视图解析器去进行视图解析

    根据逻辑视图名解析成真正的视图(jsp)

  9. 视图解析器向前端控制器返回View
  10. 前端控制器进行视图渲染

    视图渲染将模型数据(在ModelAndView对象中)填充到request域

  11. 前端控制器向用户响应结果

组件的作用

  1. 前端控制器DispatcherServlet

    作用:接受请求,响应结果。相当于转发器

  2. 处理器映射器HandlerMapping

    作用:根据请求的URL查找Handler

  3. 处理器适配器HandlerAdapter

    作用:按照规定规则(HandlerAdapter要求的规则)去执行Handler
    注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler

  4. 视图解析器View resolver

    作用:进行视图解析,根据逻辑视图名解析成真正的视图

  5. 视图View

    View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf......)

第一个程序

  1. 导入jar包,spring-webmvc.jar

  2. 在web.xml中配置springmvc的前端控制器

    <!-- 配置springmvc前端控制器 -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    
    
        <!-- contextConfigLocation配置springmvc加载的配置文件(处理器映射器、适配器等)
             如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet。xml(这里是springmvc-servlet.xml)
         -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
    </servlet>
    
    
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- 
             第一种:*.action,访问以.action结尾的请求,由DispatcherServlet进行解析
             第二种:/,所有的访问地址都有DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析,使用这种方式可以实现REDTful风格的url
             第三种:/*,这种配置不对,这种配置最终要转发到一个jsp页面时,仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到Handler,会报错
         -->
         <url-pattern>*.action</url-pattern>
    </servlet-mapping>
    
  3. 配置springmvc.xml(首先引入Spring约束)

  4. 配置处理器适配器。这个适配器的support方法可以处理实现Controller接口的类

    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
    
  5. 创建处理器实现Controller接口

    public class ItemController implements Controller{
    
    
    
    
        public ModelAndView handleRequest(HttpServletRequest request,
                HttpServletResponse response) throws Exception {
            Item item1=new Item();
            item1.setName("乒乓球");
            item1.setPrice("5");
            item1.setDetail("好球");
    
    
            Item item2=new Item();
            item2.setName("蓝球");
            item2.setPrice("100");
            item2.setDetail("球");
            List<Item> listitem=new ArrayList<Item>();
            listitem.add(item1);
            listitem.add(item2);
    
    
            ModelAndView modelAndView=new ModelAndView();
            //相当于setAttribute
            modelAndView.addObject("listitem",listitem);
            //指定视图
            modelAndView.setViewName("/WEB-INF/jsp/items/item/itemList.jsp");
    
    
            return modelAndView;
        }
    
    
    }
    
  6. 创建视图(这里是在/WEB-INF/jsp/items/item路径下创建itemList.jsp)

  7. 在springmvc.xml配置处理器、处理器映射器、视图解析器

    <!-- 配置Handler -->
    <bean name="/queryItems.action" class="cn.zcw.ssm.controller.ItemController"></bean>
    
    
    <!-- 配置处理器映射器 
         将bean的name作为Url进行查找,需要在配置Handler时指定bean的name(url)
    -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
    
    <!-- 视图解析器 
         jsp解析,默认使用jstl标签,所以classpath下得有jstl的包
    -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean> 
    
  8. 测试

非注解处理器映射器

  1. org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping

    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
    
  2. org.springframework.web.servlet.handler.SimpleUrlHandlerMapping

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="hello.action">itemController1</prop>
            </props>
        </property>
    </bean>
    

    key表示URL,值为handel的idspringmvc会自己选择正确的处理器映射器,所以可以同时配置以上两种处理器映射器

非注解的处理器适配器

  1. org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
  2. org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter

    对应的handler类

    public class ItemController2 implements HttpRequestHandler{
    
    
        @Override
        public void handleRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            Item item1=new Item();
            item1.setName("乒乓球");
            item1.setPrice("5");
            item1.setDetail("好球");
    
    
            Item item2=new Item();
            item2.setName("蓝球");
            item2.setPrice("100");
            item2.setDetail("球");
            List<Item> listitem=new ArrayList<Item>();
            listitem.add(item1);
            listitem.add(item2);
    
    
            request.setAttribute("listitem", listitem);
    
    
            request.getRequestDispatcher("/WEB-INF/jsp/items/item/itemList.jsp").forward(request, response);
    
    
        }
    
    
    }
    

    这个适配器可以指定传给jsp页面的数据格式,例如json

注解方式的适配器和映射器

第一种方式:

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

第二种方式(推荐):

    <!-- 使用mvc:annotation-driven代替上边注解映射器和注解适配器
         mvc:annotation-driven默认加载很多的参数绑定方法
         比如json转换解析器就默认加载,如果使用mvc:annotation-driven就不用配置上面两个注解映射器、注解适配器
         实际开发中也是使用mvc:annotation-driven
     -->
    <mvc:annotation-driven></mvc:annotation-driven>

Handler使用注解方式

@Controller
public class ItemController3{


    @RequestMapping("/itemlist.action")
    public ModelAndView itemList(){
        Item item1=new Item();
        item1.setName("乒乓球");
        item1.setPrice("5");
        item1.setDetail("好球");


        Item item2=new Item();
        item2.setName("棒球");
        item2.setPrice("100");
        item2.setDetail("球");
        List<Item> listitem=new ArrayList<Item>();
        listitem.add(item1);
        listitem.add(item2);


        ModelAndView modelAndView=new ModelAndView();
        //相当于setAttribute
        modelAndView.addObject("listitem",listitem);
        //指定视图
        modelAndView.setViewName("/WEB-INF/jsp/items/item/itemList.jsp");


        return modelAndView;


    }
}

在springmvc.xml开启组件扫描

<!-- 可以扫描controller、service。。。。 -->
<context:component-scan base-package="cn.zcw.ssm.controller"></context:component-scan>

视图解析器的参数配置

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!-- 配置jsp路径前缀 -->
    <property name="prefix" value="/WEB-INF/jsp/"></property>
    <!-- 配置JSP路径后缀 -->
    <property name="suffix" value=".jsp"></property>
</bean>

在控制其中做出jsp路径相应修改

//modelAndView.setViewName("/WEB-INF/jsp/items/item/itemList.jsp");
modelAndView.setViewName("items/item/itemList");

ssm框架整合步骤

  1. 整合dao层

    mybatis和Spring整合,通过Spring管理mapper接口使用mapper的扫描器自动扫描mapper接口在Spring中进行注册

  2. 整合service层

    通过Spring管理service接口使用配置方式将service接口配置在Spring配置文件中实现事务控制

  3. 整合springmvc

    由于springmvc是Spring的模块,不需要整合

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章