在上一篇文章中,我们使用SpringMVC、Mybatis、Spring快速的搭建了一个简单的项目。今天呢,跟大家简单的聊一聊MVC模式。很多人特别是Java开发者,都在说MVC,都挺别人说MVC,那么MVC到底是什么,这个又跟SSH、SSM有什么关系呢?
MVC其实是一种设计的架构模式,Model+View+Controller。这个跟我们现在Web开发有很大的关系。Web开发我们需要前台页面展示给用户,我们需要处理业务逻辑,需要跟数据库打交道。如果把这些操作都放到一起,那么不仅没有良好的展现形式,开发人员也不好维护,所以就有了分层。把这些操作都分开,各自负责各自的功能,这样就很清晰了,这就是MVC产生的背景。
首先来说说V,就是View,也就是视图层,最终展现给用户看的东西,大部分都是jsp,或者其他的页面展现技术。M,就是Model,模型层,主要负责对也逻辑进行处理,例如,用户登录,用户注册等。C,就是Controller,控制层,主要负责前台和后台交互的中间层,包括获取前台传入的参数,向前台发送数据,跳转页面等。
那么我们再来看看现在流行的框架都实现了哪些部分,对于Controller层,现在主要有SpringMVC 、Struts等。而Hibernate、MyBatis呢,它们主要是对数据库操作的封装,是Model层的一部分,那Spring呢,它其实贯穿了MVC之中,它主要是一个容器,来帮助我们管理我们的对象。
以上是对MVC模式的解析。下边呢就结合项目,来看看springMVC的使用。
SpringMVC的核心就是Controller,新建一个类,加上@Controller注解,它就成了一个SpringMVC控制器,除此之外,我们还需要的spring-servlet.xml中配置一个:
<context:component-scan base-package="com.demo.controller" />
这句话,就是扫描包用的,我们配置了@Controller注解,也得告诉spring去哪找吧。这样在spring启动的时候,就会在这个路径下找@Controller注解,把这个类当成是一个控制器。
在配置文件中,这两个配置也是必不可少的。
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/page/" /> <property name="suffix" value=".jsp" /> </bean>
第一个配置时说明了我们要使用注解的方式,否则@Controller他是不认识的。
第二个配置则配置了我们使用的视图解析器。viewClass指明了你是哪种视图,pdf,jsp还是其他,prefix指定了页面的前缀,一般都配置页面的路径,suffiex则是页面的后缀,一般都是页面的类型。
我们来看看UserController这个类:
@Controller @RequestMapping("/user/") public class UserController { @Autowired private UserService userService; @RequestMapping("addUser.do") public String addUser() { return "addUser"; } @RequestMapping("saveUser.do") public ModelAndView saveUser(UserModel userModel) { ModelAndView mv = new ModelAndView(); boolean b = userService.insertUser(userModel); if(b) { mv.setViewName("addUserSuccess"); } else { mv.setViewName("addUserFail"); } return mv; } }
@Controller这个注解表明了这个类是个控制器。
@RequestMapping这个是用来指明一个请求的映射关系,把UserController这个类映射到/user/这个路径下,如果这个注解是在方法上,那就把路径映射到方法上,类加方法就唯一的表示了一个特定的url,如/user/addUser.do就表明了我要访问UserController类的addUser方法,并且这个路径必须的全局唯一的。一般情况下,在开发过程中,类的RequestMapping就表示了某一个模块,而方法的RequestMapping就是使用方法名。这样就保证了类模块名+方法名的唯一。
@AutoWired注解表示了这个属性是spring容器自动注入,我们不需要自己去创建对象,这就是spring的IOC。
接下来就说说controller中的方法怎么写,在上边的代码中,有两个方法,一个方法的返回值是String,一个方法的返回值是ModelAndView。这两种都是springmvc支持的写法。
先说说返回String的,返回的就是我们要跳转的页面,这个页面必须是spring-servlet.xml中配置的prefix和suffix中。
返回ModelAndView的,先要创建这个对象,而需要跳转的页面通过setViewName进行设置。
那么,如何将数据返回到页面呢?这也有两种方法。第一种使用ModelMap对象,调用ModelMap的addAttribute方法。
@RequestMapping("getUserById") public String getUserById(String id,ModelMap modelMap) { if(StringUtils.isNotBlank(id)) { int userId = Integer.parseInt(id); UserModel userModel = userService.getUser(userId); modelMap.addAttribute("userModel", userModel); } return "showUser"; }
第二种使用ModelAndView对象,调用addObject方法。
@RequestMapping("getUserById1") public ModelAndView getUserById1(String id) { ModelAndView mv = new ModelAndView(); if(StringUtils.isNotBlank(id)) { int userId = Integer.parseInt(id); UserModel userModel = userService.getUser(userId); mv.addObject("userModel", userModel); } mv.setViewName("showUser"); return mv; }
在工作中可能还有一种情况,如果需要使用request或者response怎么办呢,这个就更简单了,直接在方法中写这两个参数就可以了。
@RequestMapping("addUser.do") public String addUser(HttpServletRequest request,HttpServletResponse response) { return "addUser"; }
除此之外,还有一些注解的使用都是很常见的,比如@ModelAttribute,@InitBinder,@PathVarivable等等。
当然,以上的介绍都是一些非常基本的东西,至于SpringMVC一些更深入的的东西,就需要大家自己去研究了。
版权声明:本文为博主原创文章,未经博主允许不得转载。