Java知識總結---MVC模式解析之SpringMVC(三)

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

       

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章