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; } }