SpringMVC的简单应用

1:Spring和SpringMVC

   从严格意义上来讲,spring并不是一个框架,而是一个容器。开发程序的模块组件,都可以通过spring来组装拼合,表现在IOC(空置反转)和AOP面向切面编程

    IOC存在另一种说法就是DI即依赖注入,将对象交给spring管理,由于不需要手动创建、协调、销毁对象,从而极大的降低了代码的耦合程度

    AOP:由于AOP不好描述,所以举个例子

/*    我们以系统中常用到的事务管控举例子。在系统操作数据库的过程中,不可避免地要考虑到事务相关的内容。如果在每一个方法中都新建一个事务管理器,那么无疑是对代码严重的耦合和侵入。
为了简化我们的开发过程(实际上spring所做的一切实现都是为了简化开发过程),需要把事务相关的代码抽成出来做为一个独立的模块。通过AOP,确认每一个操作数据库方法为一个连接点,这些连
接点组成了一个切面。当程序运行到其中某个一个切点时,我们将事务管理模块顺势织入对象中,通过通知功能,完成整个事务管控的实现。这样一来,所有的操作数据库的方法中不需要再单独关心事务
管理的内容,只需要关注自身的业务代码的实现即可。所有的事务管控相关的内容都通过AOP的方式进行了实现。简化了代码的内容,将目标对象复杂的内容进行解耦,分离业务逻辑与横切关注点
*/

  SpringMVC : SpringMVC其实是spring 位于web层的一个框架,两者的关系其实是子父层的关系。是实现了WEB MVC 设计模式的请求驱动类型的轻量级的框架,,将web层进行职责解耦

      请求驱动即是使用请求——响应模型

2:spring mvc 的流程图

                           

    具体执行步骤:

      1:用户将请求发送给前段控制器(Dispatcher  Servlet),前端控制器根据请求信息,将请求转发给具体页面控制器,即图中的1、2部分

      2:页面处理器接收到请求后,将收集和绑定信息到一个对象,这个对象在spring mvc中成为命令对象,将一个命令对象交给业务对象进行处理,返回一个ModleAndView(模型视图和逻辑视图名)

  即图中的3、4部分

      3:前段控制器收回控制权,根据返回的逻辑视图名,选择相应的页面进行解析,并把相应的数据模型传入进行视图渲染,即图中的5、6部分

      4:前段控制器再吃收回控制权,将相应的页面传输给用户,图中的7部分

  

 

  相应的JAVA代码和配置文件:

    项目保存在  D:\海同\springMVC\FirsetSpringMVC  目录下  

    主要用到的JAR包   spring-web.jar  和spring-webmvc.jar 

   

    web.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <!-- 配置调度serlvet  -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!--    加载spring配置文件  -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!--    设置加载文件优先级-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!--    配置调度servlet的配置路径,这里表示多有的请求全部要经过该Servlet -->
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

  spring的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
    <!--    扫描注解    -->
    <context:component-scan base-package="com.yuwenhui.springMVC.handler"></context:component-scan>
    <!--    配置视图解析器,将handler返回值,解析成实际的物理视图  -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--    配置路径    -->
        <property name="prefix" value="/WEB-INF/views/"></property>
        <!--    后置路径-->
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

  Controller代码:

package com.yuwenhui.springMVC.handler;

import com.yuwenhui.springMVC.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import java.util.Map;

/**
 * Created by Administrator on 2017/9/15 0015.
 */
//声明为控制层
@Controller
public class First {
    private static String SUCCESS = "success";

    /**
     *  ModelAttribute 将会在在所有的RequestMapping之前调用
     *  将user保存到model里面
     * @param map
     * @param model
     */
    @ModelAttribute("user")
    public User getUser(Map<String,Object> map, Model model){
        User user = new User("YuWenHui","123456");
        System.out.println("数据库对象:"+user);
        map.put("user",user);
//        将数据或者对象保存到request域中,利用modle
        model.addAttribute("username",user.getName());
        return user;
    }

//    RequestMapping 当用户访问的servlet为 RequestMapping中的值时将调用该方法
    @RequestMapping("/testModelAttribute")
    public String testModelAttribute(User u){
        System.out.println("修改:"+u);
        return SUCCESS;
    }

//     请求重定向 redirect 后不能加空格
    @RequestMapping(value = "redirect")
    public String testRedirect(){
        System.out.println("重定向");
        return "redirect:index.jsp";
    }
//    请求转发
    @RequestMapping(value = "forward")
    public String testForward(){
        System.out.println("转发");
        return "forward:first";
    }


//    页面请求写的servlet方法,将对应 RequestMapping中的值
    @RequestMapping(value = "/first",method = RequestMethod.GET)
    public String sayHolloWord(){
        System.out.println("Hollo Word");
        return "success";
    }

    @RequestMapping(value = "update",method = RequestMethod.POST)
    public String update(User user){
        System.out.println(user);
        return "success";
    }

//    这里不能进行方法的重载,否则springMVC将不知道将请求发送到哪一个方法中
    @RequestMapping(value = "find",method = RequestMethod.GET)
    public String getAgeAndID(@RequestParam(value = "id",required = false,defaultValue = "0") int id,
                              @RequestParam(value = "age",required = false,defaultValue = "0") int age){
        System.out.println("ID:" + id);
        System.out.println("AGE:" + age);
        return SUCCESS;
    }

}

 

posted @ 2017-09-16 20:01  西瓜的小弟西西瓜  阅读(264)  评论(0编辑  收藏  举报