Spring MVC原理及實例基礎掃盲篇

最近 項目中剛接觸了SpringMVC,就把這幾天看的跟實踐的東西寫出來吧。

一、首先,先來了解一下SpringMVC到底是個什麼樣的框架?

Spring Web MVC是一種基於Java的實現了Web MVC設計模式的請求驅動類型的輕量級Web框架,即使用了MVC架構模式的思想,將web層進行職責解耦,基於請求驅動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發。

二、SpringMVC的工作原理:

1. 客戶端請求提交到DispatcherServlet
2.
DispatcherServlet控制器查詢一個或多個HandlerMapping,找到處理請求的Controller
3. DispatcherServlet
將請求提交到Controller
4. Controller
調用業務邏輯處理後,返回ModelAndView
5. DispatcherServlet
查詢一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖
6.
視圖負責將結果顯示到客戶

三、瞭解了springmvc的工作原理之後,我們自己動手來搭建一下吧:

1. 在創建好的maven工程上加入springmvc所依賴的jar包:

<span style="white-space:pre">		</span><dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>3.2.8.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>3.2.8.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>3.2.8.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>3.2.8.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jms</artifactId>
			<version>3.2.8.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>3.2.8.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>3.2.8.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>3.2.8.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>3.2.8.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>3.2.8.RELEASE</version>
		</dependency>

2. 配置web.xml,配置前段控制器DispatcherServlet

<span style="white-space:pre">	</span><servlet>
		<servlet-name>dispatcher</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

  3. 在web-inf 下創建springmvc配置文件,[servletname]-servlet.xml

  如上面的配置,文件名必須爲dispatcher -servlet.xml


<!-- 默認的註解映射的支持 --> 
	<mvc:annotation-driven/>
	  <!-- 自動掃描的包名 --> 
	<context:component-scan base-package="com.acxiom"/>
	  <!-- 對靜態資源文件的訪問 -->
	<mvc:resources location="/resources/" mapping="/resources/**" />
	
	<!-- spring MVC爲@Controllers分發請求 -->
	<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />
	
	<!-- 視圖解釋類 --> 
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value=""></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
	
	<!-- 從請求和響應讀取/編寫字符串 -->
	<bean id="stringHttpMessage" class="org.springframework.http.converter.StringHttpMessageConverter">
		<property name="supportedMediaTypes">
			<list>
				<value>text/plain;charset=UTF-8</value>
			</list>
		</property>
	</bean>

4.  配置HandlerMapping  根據benaname找到對應Conntroller( 可以省略)

                <bean                   class="org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping"></bean>

5. 創建JSP頁面,需要發出請求的頁面

6. 創建自己的Controller繼承AbstractController重寫handleRequestInternal

        在這裏,我們着重來學習下頁面參數的傳遞與接收。

Controller中傳遞請求參數:

1)第一種 通過request對象 或者 session對象

	@RequestMapping(value="/add1.do")
	public String add(HttpServletRequest request){
	
		String userNumber = request.getParameter("userNumber");
		String passWord = request.getParameter("passWord");
		
		System.out.println("userNumber:"+userNumber+" passWord:"+passWord);
		
		return "user_add1";
	}

2)第二種  參數字段跟頁面字段一致

<span style="white-space:pre">	</span>@RequestMapping(value="/add2.do")
	public String add(String userNumber,Integer passWord){

		System.out.println("<span style="font-family: Arial, Helvetica, sans-serif;">userNumber</span>:"+userNumber+" passWord:"+passWord);
		
		return "user_add2";
	}
這種方式如果頁面字段跟參數字段不一致的話,可以通過@RequestParam 設置別名,如頁面字段爲number,實際使用參數爲userNumber,見下面代碼:

<span style="white-space:pre">	</span>@RequestMapping(value="/add2.do")
	public String add(@RequestParam(value="number")String userNumber,Integer passWord){

		System.out.println("userNumber:"+userNumber+" passWord:"+passWord);
		
		return "user_add2";
	}

3)第三種  通過對象方式,要求表單字段要跟pojo類字段一致,如果頁面有複選框,pojo類中定義數組。

	@RequestMapping(value="/add3.do")
	public String add3(UserInfo user){

		System.out.println(user);
		
		return "user_add3";
	}
跟strut2的區別在於  如果是strut2在頁面要使用類似於user.userId,但是spring不需要,加了反而會取不到值。

返回數據到頁面:

1)第一種 通過request對象setAttribute ,也可以使用session對象

	@RequestMapping(value="/add1.do")
	public String add(HttpServletRequest request){
	
		String userNumber = request.getParameter("userNumber");
		String passWord = request.getParameter("passWord");
		
		System.out.println("userNumber:"+userNumber+" passWord:"+passWord);
		
		String str = "userNumber:"+userNumber+" passWord:"+passWord;
		
		request.setAttribute("user", str);
		
		return "user_add1";
	}

2)第二種 ModelAndView

	@RequestMapping(value="/add2.do")
	public ModelAndView add2(){
		
		ModelAndView mav = new ModelAndView("user_add2");
		mav.addObject("userId", 1001);
		mav.addObject("userName", "張三");
		
		return mav;
	}

3)第三種 通過Model對象

	@RequestMapping(value="/add3.do")
	public String add3(Model model){
		
		model.addAttribute("personId", 9527);
		model.addAttribute("personName", "唐伯虎");
		
		return "user_add3";
	}

4)第四種 通過map

	@RequestMapping(value="/add4.do")
	public String add4(Integer personId,String userName,Map map){
		
		System.out.println(personId);
		System.out.println(userName);
		map.put("personId", 9527);
		map.put("personName", "唐伯虎");
		
		return "user_add4";
	}
FAQ: 如果要返回一個json對象怎麼實現呢?

首先在springmvc-servlet.xml中配置:

	<!-- 用於將對象轉化爲JSON -->
	<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean>
	
	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
				<ref bean="stringHttpMessage"/>
				<ref bean="jsonConverter"/>
			</list>
		</property>
	</bean>

然後在controller中注入ResponseBody講返回對象作爲json返回到頁面

	@RequestMapping("/ajaxUser2.do")
	public @ResponseBody UserInfo ajaxUser(Integer userId){
		
		System.out.println("編號:"+userId);
		UserInfo user = new UserInfo();
		user.setUserId(userId);
		user.setUserName("張三");
		user.setUserAge(18);
		return user;
	}













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