zoukankan      html  css  js  c++  java
  • Spring mvc 基础

    一.springmvc 框架

    步骤:

    第一步:发起请求到前端控制器(DispatcherServlet)

    第二步:前端控制器请求HandlerMapping查找 Handler 

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

    第三步:处理器映射器HandlerMapping向前端控制器返回Handler

    第四步:前端控制器调用处理器适配器去执行Handler

    第五步:处理器适配器去执行Handler

    第六步:Handler执行完成给适配器返回ModelAndView

    第七步:处理器适配器向前端控制器返回ModelAndView

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

    第八步:前端控制器请求视图解析器去进行视图解析

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

    第九步:视图解析器向前端控制器返回View

    第十步:前端控制器进行视图渲染

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

    第十一步:前端控制器向用户响应结果

    组件:

    1、前端控制器DispatcherServlet(不需要程序员开发)

    作用接收请求,响应结果,相当于转发器,中央处理器。

    有了DispatcherServlet减少了其它组件之间的耦合度。

    2、处理器映射器HandlerMapping(不需要程序员开发)

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

    3、处理器适配器HandlerAdapter

    作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler

    4、处理器Handler(需要程序员开发)

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

    5、视图解析器View resolver(不需要程序员开发)

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

    6、视图View(需要程序员开发jsp)

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

    二.实现

      2.1在web.xml中配置前端控制器

        

        <!-- springmvc前端控制器 -->
        <servlet>
            <servlet-name>springmvc</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等等) 如果不配置contextConfigLocation,默认加载的
          是/WEB-INF/servlet名称-serlvet.xml(springmvc-servlet.xml) --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping>

      2.2配置处理器适配器

          在springmvc.xml

    <mvc:annotation-driven></mvc:annotation-driven>

      2.3视图解析器配置

          在springmvc.xml

        <!-- 视图解析器
        解析jsp解析,默认使用jstl标签,classpath下的得有jstl的包
         -->
        <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!-- 配置jsp路径的前缀 -->
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <!-- 配置jsp路径的后缀 -->
            <property name="suffix" value=".jsp"/>
        </bean>

      2.4开发controller

          新建controller

    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.servlet.ModelAndView;
    
    
    
    
    @Controller
    //为了对url进行分类管理 ,可以在这里定义根路径,最终访问url是根路径+子路径
    //比如:商品列表:/items/queryItems.action
    @RequestMapping("/items")
    public class ItemsController {
    
        @Autowired
        private ItemsService itemsService;
    
        // 商品查询
        @RequestMapping("/queryItems")
        public ModelAndView queryItems(HttpServletRequest request) throws Exception {
            //测试forward后request是否可以共享
            
            System.out.println(request.getParameter("id"));
    
            // 调用service查找 数据库,查询商品列表
            List<ItemsCustom> itemsList = itemsService.findItemsList(null);
            
            // 返回ModelAndView
            ModelAndView modelAndView = new ModelAndView();
            // 相当 于request的setAttribut,在jsp页面中通过itemsList取数据
            modelAndView.addObject("itemsList", itemsList);
    
            // 指定视图
            // 下边的路径,如果在视图解析器中配置jsp路径的前缀和jsp路径的后缀,修改为
            // modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
            // 上边的路径配置可以不在程序中指定jsp路径的前缀和jsp路径的后缀
            modelAndView.setViewName("items/itemsList");
    
            return modelAndView;
    
        }
    
        
        
        @RequestMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})
        //@RequestParam里边指定request传入参数名称和形参进行绑定。
        //通过required属性指定参数是否必须要传入
        //通过defaultValue可以设置默认值,如果id参数没有传入,将默认值和形参绑定。
        public String editItems(Model model,@RequestParam(value="id",required=true) Integer items_id)throws Exception {
            
            //调用service根据商品id查询商品信息
            ItemsCustom itemsCustom = itemsService.findItemsById(items_id);
            
            //通过形参中的model将model数据传到页面
            //相当于modelAndView.addObject方法
            model.addAttribute("itemsCustom", itemsCustom);
            
            return "items/editItems";
        }
        
        //商品信息修改提交
        @RequestMapping("/editItemsSubmit")
        public String editItemsSubmit(HttpServletRequest request,Integer id,ItemsCustom itemsCustom)throws Exception {
            
            //调用service更新商品信息,页面需要将商品信息传到此方法
            itemsService.updateItems(id, itemsCustom);
            
            //重定向到商品查询列表
    //        return "redirect:queryItems.action";
            //页面转发
            //return "forward:queryItems.action";
            return "success";
        }
    
    
    }

      2.5配置controller

          在springmvc.xml

        <!-- 可以扫描controller、service、...
        这里让扫描controller,指定controller的包
         -->
        <context:component-scan base-package="hstc.edu.controller"></context:component-scan>

    三.整合springmvc和mybatis

      3.1 整合dao

         mybatis自身配置文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        
        <!-- 全局setting配置,根据需要添加 -->
        
        <!-- 配置别名 -->
        <typeAliases>
            <!-- 批量扫描别名 -->
            <package name="hstc.edu.po"/>
        </typeAliases>
    
        <!-- 配置mapper
        由于使用spring和mybatis的整合包进行mapper扫描,这里不需要配置了。
        必须遵循:mapper.xml和mapper.java文件同名且在一个目录 
         -->
    
        <!-- <mappers>
        
        </mappers> -->
    </configuration>

        applicationContext-dao.xml
          配置:数据源、SqlSessionFactory、mapper扫描器

    <!-- 加载db.properties文件中的内容,db.properties文件中key命名要有一定的特殊规则 -->
        <context:property-placeholder location="classpath:db.properties" />
        <!-- 配置数据源 ,dbcp -->
    
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
            destroy-method="close">
            <property name="driverClassName" value="${jdbc.driver}" />
            <property name="url" value="${jdbc.url}" />
            <property name="username" value="${jdbc.username}" />
            <property name="password" value="${jdbc.password}" />
            <property name="maxActive" value="30" />
            <property name="maxIdle" value="5" />
        </bean>
        <!-- sqlSessionFactory -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!-- 数据库连接池 -->
            <property name="dataSource" ref="dataSource" />
            <!-- 加载mybatis的全局配置文件 -->
            <property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml" />
        </bean>
        <!-- mapper扫描器 -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开 -->
            <property name="basePackage" value="cn.itcast.ssm.mapper"></property>
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
        </bean>

      3.2整合service

        在applicationContext-service.xml

    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
            http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context-3.2.xsd 
            http://www.springframework.org/schema/aop 
            http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
            http://www.springframework.org/schema/tx 
            http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
    <!-- 商品管理的service -->
    <bean id="itemsService" class="hstc.edu.service.impl.ItemsServiceImpl"/>
    </beans>

      3.3事务控制(applicationContext-transaction.xml)

     

    <!-- 事务管理器 
        对mybatis操作数据库事务控制,spring使用jdbc的事务控制类
    -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 数据源
        dataSource在applicationContext-dao.xml中配置了
         -->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!-- 通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 传播行为 -->
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    <!-- aop -->
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* hstc.edu.service.impl.*.*(..))"/>
    </aop:config>

      3.4加载spring容器

        web.xml      

        <!-- 加载spring容器 -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/classes/spring/applicationContext-*.xml</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>

    四.参数绑定

     4.1pojo绑定 

        页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo。

    <table width="100%" border=1>
    <tr>
        <td>商品名称</td>
        <td><input type="text" name="name" value="${itemsCustom.name }"/></td>
    </tr>
    <tr>
        <td>商品价格</td>
        <td><input type="text" name="price" value="${itemsCustom.price }"/></td>
    </tr>
    <tr>
        <td>商品生产日期</td>
        <td><input type="text" name="createtime" value="<fmt:formatDate value="${itemsCustom.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/>"/></td>
    </tr>
    <%-- <tr>
        <td>商品图片</td>
        <td>
            <c:if test="${item.pic !=null}">
                <img src="/pic/${item.pic}" width=100 height=100/>
                <br/>
            </c:if>
            <input type="file"  name="pictureFile"/> 
        </td>
    </tr> --%>
    <tr>
        <td>商品简介</td>
        <td>
        <textarea rows="3" cols="30" name="detail">${itemsCustom.detail }</textarea>
        </td>
    </tr>
    <tr>
    <td colspan="2" align="center"><input type="submit" value="提交"/>
    </td>
    </tr>
    </table>

      

    public class Items {
        private Integer id;
    
        private String name;
    
        private Float price;
    
        private String pic;
    
        private Date createtime;
    
        private String detail;

      4.2自定义参数绑定

        1.自己写converter

        2.配置方式springmvc.xml

            <!-- 自定义参数绑定 -->
        <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
            <!-- 转换器 -->
            <property name="converters">
                <list>
                    <!-- 日期类型转换 -->
                    <bean class="cn.itcast.ssm.controller.converter.CustomDateConverter"/>
                </list>
            </property>
            
        
        </bean>        
    代码都是乱鸠写的
  • 相关阅读:
    修改silverlight DataGrid当前选中行及选中列的背景色
    转 Introduction to SharePoint Feature Stapling – Part 2
    File.ReadAllText方法,File.WriteAllText方法修改文件内容
    用xlst将xml转换html
    简单在线编辑器<转>
    随机数生成
    asp.net 2.0 的代码隐藏
    Microsoft .NET Pet Shop 3.x: .NET Pet Shop 的设计模式与体系结构
    并发术语解释
    如何在Render方法中修改替换HtmlTextWriter中的内容
  • 原文地址:https://www.cnblogs.com/diaoniwa/p/5968973.html
Copyright © 2011-2022 走看看