JavaEE——springMVC

1.springMVC是spring框架的一个模块,springMVC和spring无需通过中间层进行整合
springMVC是一个基于MVC的web框架
2.MVC是一个设计模式
JavaEE——springMVC_第1张图片
3.springMVC框架原理
JavaEE——springMVC_第2张图片
组件
 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>springmvcservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    
    <init-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:springmvc.xmlparam-value>
    init-param>
servlet>

<servlet-mapping>
    <servlet-name>springmvcservlet-name>
    
    <url-pattern>*.actionurl-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 ">


<bean id="itemsController" name="/queryItems.action" class="com.iot.ssm.controller.ItemsController"/>


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

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


<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>


   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        
        <property name="prefix" value="/WEB-INF/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和方法写成一样
   这样在配置处理器适配器的时候,可以使用组件扫描


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

   <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        
        <property name="prefix" value="/WEB-INF/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整合基础
JavaEE——springMVC_第3张图片
 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


    <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扫描器

 
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        
        <property name="basePackage" value="com.iot.learnssm.firstssm.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
       
    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

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

    配置事务控制,创建applicationContext-transaction.xml


    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        
        <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: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>
    
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        
        <property name="prefix" value="/WEB-INF/jsp/"/>
        
        <property name="suffix" value=".jsp"/>
    bean>

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


<servlet>
        <servlet-name>SpringMVCservlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        servlet-class>
         
        <init-param>
            <param-name>contextConfigLocationparam-name>
            <param-value>classpath:spring-*.xmlparam-value>
        init-param>
    servlet>
    <servlet-mapping>
        <servlet-name>SpringMVCservlet-name>
        <url-pattern>*.actionurl-pattern>
    servlet-mapping>
    <servlet-mapping>
        <servlet-name>SpringMVCservlet-name>
        <url-pattern>*.jsonurl-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 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

 
    <context-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>WEB-INF/classes/spring/applicationContext-*.xmlparam-value>
        
      context-param>
    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
    listener>

你可能感兴趣的:(Java开发--学习阶段,springMVC)