在上一篇文章中,我們使用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一些更深入的的東西,就需要大家自己去研究了。