JavaEE——springMVC

1.springMVC是spring框架的一个模块,springMVC和spring无需通过中间层进行整合
springMVC是一个基于MVC的web框架
2.MVC是一个设计模式
mvc模式原理
3.springMVC框架原理
springMVC框架原理
组件
 1)前端控制器(DispatcherServlet):接收请求,响应结果,相当于转发器,中央处理器。减少了其他组件之间的耦合度
 2)处理器映射器(HandlerMapping):
   作用:根据请求的url查找Handler
 3)处理器适配器(HandlerAdapter):
   作用:按照特定规则(HandlerAdapter要求的规则)执行Handler。
 4)处理器Handle
 5)视图解析器(ViewResolver):进行视图解析,根据逻辑视图解析成真正的视图(View)
 6)视图View:是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf..)
 

4.入门程序
(1)配置前端控制器————web.xml

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器、适配器等等)
      若不配置,默认加载WEB-INF/servlet名称-servlet(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进行解析,
            使用此种方式和实现RESTful风格的url
    第三种:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时,仍然会由DispatcherServlet解析jsp地址,
            不能根据jsp页面找到handler,会报错
    -->
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

(2)配置处理器映射器、适配器——springmvc.xml
  A.添加约束
  B.配置处理器适配器

<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 ">

<!-- 配置Handler -->
<bean id="itemsController" name="/queryItems.action" class="com.iot.ssm.controller.ItemsController"/>

<!-- 处理器映射器1
    将bean的name作为url进行查找,需要在配置Handler时指定beanname(就是url)
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 处理器映射器2.简单url映射-->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <!-- 对 itemsController进行url映射-->
            <prop key="/queryItems1.action">itemsController</prop>
            <prop key="/queryItems2.action">itemsController</prop>
        </props>
    </property>
</bean>

<!-- 处理器适配器 :所有处理器适配器都实现了HandlerAdapter接口-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>

<!-- 视图解析器
    解析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>

</beans>

注意:注解的处理器映射器和适配器,(使用注解的映射器和注解的适配器必须配对使用)

<!-- 注解的映射器 -->
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>

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

而以上配置可以用注解驱动来代替

<!-- 启用注解驱动 -->
    <mvc:annotation-driven></mvc:annotation-driven>

(3)开发注解Handle
  使用@Controller来标识它是一个控制器
  使用@RequestMapping(“/queryItems”)实现 对queryItems方法和url进行映射,一个方法对应一个url,一般建议将url和方法写成一样
   这样在配置处理器适配器的时候,可以使用组件扫描

<!-- 对于注解的Handler 可以单个配置
    实际开发中加你使用组件扫描
    -->
    <!--  <bean  class="com.iot.ssm.controller.ItemsController3"/> -->
    <!-- 可以扫描controller、service、...
    这里让扫描controller,指定controller的包
     -->
    <context:component-scan base-package="com.iot.ssm.controller"></context:component-scan>

因此在spring-mvc.xml中的配置就可以简写成:

<!-- 启用注解驱动 -->
    <mvc:annotation-driven></mvc:annotation-driven>
<!-- 开始组件扫描 -->
    <context:component-scan base-package="com.iot.ssm.controller">
<!-- 视图解析器
    解析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>

5.@RequestMapping:定义Controller方法对应的url,进行处理器的映射使用。
窄化请求映射:对该Controller也添加一个@RequestMapping(“/”)注解,作为一个根目录

对标记@Controller类中标识有@RequestMapping的方法进行映射。在@RequestMapping里边定义映射的url。使用注解的映射器不用在xml中配置url和Handler的映射关系。

6.Controller的返回值类型
  1)返回ModelAndView
    需要方法结束时,定义ModelAndView,将model和view分别进行设置
  2)返回String
    如果Controller方法返回string,表示返回逻辑视图名
    真正视图(jsp路径)=前缀+逻辑视图名+后缀

@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 {
public String editItems(Model model)throws Exception {

    //调用service根据商品id查询商品信息
    ItemsCustom itemsCustom = itemsService.findItemsById(1);

    //通过形参中的model将model数据传到页面
    //相当于modelAndView.addObject方法
    model.addAttribute("itemsCustom", itemsCustom);

    return "items/editItems";
}

   2.2)返回redirect重定向
    redirect重定向特点:浏览器地址栏中的url会变化。修改提交的request数据无法传到重定向的地址。因为重定向后重新进行request(request无法共享)

//重定向到商品查询列表
//return "redirect:queryItems.action";

   2.3)forward页面转发:通过forward进行页面转发,浏览器地址栏url不变,request可以共享。

//页面转发
return "forward:queryItems.action";

  3)返回void:在controller方法形参上可以定义request和response,使用request或response指定响应结果

7.参数绑定
  1)spring参数绑定过程:
  从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上。
  springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变更接收!!!!
  2)默认支持的类型
    HttpServletRequest:通过request对象获取请求信息
    HttpServletResponse:通过response处理响应信息
    HttpSession:通过session对象得到session中存放的对象
    Model/ModelMap:model是一个接口,modelMap是一个接口实现。作用:将model数据填充到request域。
  3)简单类型
    通过@RequestParam对简单类型的参数进行绑定。如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。通过required属性指定参数是否必须要传入,如果设置为true,没有传入参数则报错。

@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 {}

  4)pojo绑定
    页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo。
    注意:这里只是要求name和形参的属性名一致,而不是要求和形参的名称一致,这点不要混淆了,框架会进入形参内部自动匹配pojo类的属性名。(我没看源码,但应该是用反射实现的)
    页面参数:
     商品名称:
    注意:itemsCustom和包装pojo中的属性名一致即可。
    controller方法形参:
     public ModelAndView queryItems(HttpServletRequest request, ItemsQueryVo itemsQueryVo) throws Exception
    包装类ItemsQueryVo中部分属性:

public class ItemsQueryVo {
    //商品信息
    private Items items;
    //为了系统 可扩展性,对原始生成的po进行扩展
    private ItemsCustom itemsCustom;

    可见,ItemsQueryVo中属性itemsCustom和页面参数中一致
  5)自定义参数绑定实现日期类型绑定
    对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。
    将请求日期数据串传成日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。本文示例中,自定义参数绑定将日期串转成java.util.Date类型。
    需要向处理器适配器中注入自定义的参数绑定组件。
    自定义日期类型绑定:

public class CustomDateConverter implements Converter<String,Date>{
    public Date convert(String s) {
        //实现 将日期串转成日期类型(格式是yyyy-MM-dd HH:mm:ss)

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        try {
            //转成直接返回
            return simpleDateFormat.parse(s);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //如果参数绑定失败返回null
        return null;

    }
}

    配置方式:

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!-- 自定义参数绑定 -->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <!-- 转换器 -->
        <property name="converters">
            <list>
                <!-- 日期类型转换 -->
                <bean class="com.iot.learnssm.firstssm.controller.converter.CustomDateConverter"/>
           </list>
        </property>
    </bean>

8.SSM整合基础
spring整合mybatis
 1.整合dao层
   mybatis和spring整合,通过spring管理mapper接口。
   使用mapper的扫描器自动扫描mapper接口在spring中进行注册。
 2.整合service层
   通过spring管理service接口。
   使用配置方式将service接口配置在spring配置文件中。
   实现事务控制。
 3.整合springmvc
   由于springmvc是spring的模块,不需要整合。

具体流程:
  1.applicationContext-dao.xml
    1)配置数据源(连接池),以及db.properties

<util:properties id="config" location="classpath:db.properties"></util:properties>
<!-- 配置数据库连接参数及连接池 -->
    <bean id="ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="#{config.driver}" />
        <property name="url" value="#{config.url}" />
        <property name="username" value="#{config.username}" />
        <property name="password" value="#{config.password}" />
    </bean> 

    2)配置sqlSessionFactory

<!-- 配置SqlSessionFactoryBean -->
    <bean id="ssfb" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入连接池 -->
        <property name="dataSource" ref="ds"></property>
        <!-- 映射文件的位置 -->
        <property name="mapperLocations" value="classpath:cn/javaex/blog/dao/*.xml"></property>
    </bean>

    3)配置mapper扫描器

 <!-- mapper扫描器 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开 -->
        <property name="basePackage" value="com.iot.learnssm.firstssm.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
       <!-- <property name="sqlSessionFactory" ref="sqlSessionFactory" />
       会导致数据源配置不管用,数据库连接不上。
       且spring 4弃用
       -->
    </bean>

  2.实体类:生成po类,最好对每个类添加一个扩展类poCustom,利于系统的扩展
  3.整合mapper(持久层):创建mapper.xml和mapper.java,先根据sql语句创建mapper.xml,其中resultType最好使用包装类,根据mapper.xml创建mapper.java,最好使用po类的扩展类作为参数,根据xml中的输入类型和输出类型定义方法。
  4.整合service(业务层):
    创建service接口,根据mapper.java中的方法定义一个方法。
    创建servicelmp类,以mapperlmpl类的对象作为参数(因为mapper已经在配置文件中配置过,已经存在该对象,因此不需要new) ,实现接口中的方法,返回mapperlmp对象.方法()
    配置service,声明(非注解)方式创建applicationContext-service.xml

  <bean id="service首字母小写" class="ServiceImpl类的路径"/>

    配置事务控制,创建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(* service包路径.*.*(..))"/>
    </aop:config>

  5.整合springMVC(整合Controller层)
    创建springmvc.xml

    <!-- 开始组件扫描 -->
    <context:component-scan base-package="controller包路径"></context:component-scan>
    <!-- 启用注解驱动 -->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- 视图解析器
    解析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>

    配置前端控制器——web.xml

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

    编写Controller,添加注解@Controller
    添加service的对象作为属性值,并添加@Autowired注解,如下:

//使用@Controller来标识它是一个控制器
@Controller
//为了对url进行分类管理 ,可以在这里定义根路径,最终访问url是根路径+子路径
//比如:商品列表:/items/queryItems.action
public class ItemsController {

    @Autowired
    private ItemsService itemsService;

    //商品查询列表
    @RequestMapping("/queryItems")
    //实现 对queryItems方法和url进行映射,一个方法对应一个url
    //一般建议将url和方法写成一样
    public ModelAndView queryItems() throws Exception{
        //调用service查找数据库,查询商品列表
        List<ItemsCustom> itemsList = itemsService.findItemsList(null);

        //返回ModelAndView
        ModelAndView modelAndView = new ModelAndView();
        //相当于request的setAttribute方法,在jsp页面中通过itemsList取数据
        modelAndView.addObject("itemsList",itemsList);

        //指定视图
        //下边的路径,如果在视图解析器中配置jsp的路径前缀和后缀,修改为items/itemsList
        //modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
        //下边的路径配置就可以不在程序中指定jsp路径的前缀和后缀
        modelAndView.setViewName("items/itemsList");

        return modelAndView;
    }
}

    编写jsp
    
  6.加载spring容器——web.xml
  加载spring容器:添加spring容器监听器,加载spring容器,使用通配符加载spring/下的配置文件
    applicationContext-dao.xml
    applicationContext-service.xml
    applicationContext-transaction.xml

 <!-- 加载spring容器 :使用通配符来加载,-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/classes/spring/applicationContext-*.xml</param-value>
        <!--  <param-value>classpath:spring/applicationContext-*.xml</param-value>-->
      </context-param>
    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

猜你喜欢

转载自blog.csdn.net/u012990327/article/details/80233915