最近 項目中剛接觸了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;
}