SpringMVC入門學習(一) ssm框架 spring SpringMVC是一個Java WEB框架,現在我們知道Spring了,那麼,何為MVC呢? MVC是一種設計模式,其分為3個方面 model 模型:dao層和service層 view 視圖:例如jsp和Html controller ...
SpringMVC入門學習(一)
ssm框架 springSpringMVC是一個Java WEB框架,現在我們知道Spring了,那麼,何為MVC呢?
MVC是一種設計模式,其分為3個方面
- model 模型:dao層和service層
- view 視圖:例如jsp和Html
- controller 控制器
SpringMVC原理
SpringMVC工作的原理圖如下【圖來自於網路,侵刪】:
過程如下:
-
http請求:客戶端提交請求到DispatcherServlet。
-
尋找處理器:DispatcherServlet是一個Spring提供的前端控制器,所有請求都是他來發放的。但是它需要HandlerMapping定位到具體的Controller。
-
調用處理器:在DispatcherServlet通過HandlerMapping找到控制器後,它就將http請求提交到Controller。
-
調用模型處理業務:Controller執行相關的邏輯代碼。
-
ModelAndView:在Controller執行完相關的處理後,返回ModelAndView。
-
處理視圖映射:ViewResolver是視圖解析器,將一個邏輯上面的視圖名稱機械為一個真正的視圖同時取出model。(ps:例如:將user解析為:/WEB-INF/jsp/user.jsp【下麵的例子】)
-
將模型數據傳給View顯示:將model數據放入view中。
環境搭建配置
-
首先使用maven包快速構建web-app
項目結構圖:
-
maven jar包導入:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.1.1.RELEASE</version> </dependency>
-
然後將web.xml文件進行更改,使用3.1的版本:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> </web-app>
-
配置web.xml文件
首先,先配置前段控制器
<!-- 配置 Spring MVC DispatchcerServlet 前端控制器 這裡寫的這個名字是有講究的,如果我們不去修改spring配置文件預設的位置,那麼SpringMVC他會去WEB-INF下麵找一個叫springmvc-servlet.xml的文件 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--<init-param>--> <!--可以重新聲明配置文件的名字--> <!--<param-name>namespace</param-name>--> <!--將名字變成mvc--> <!--<param-value>mvc</param-value>--> <!--</init-param>--> <init-param> <!--上下文配置的位置的制定--> <param-name>contextConfigLocation</param-name> <!--此時是在類路徑下麵spring文件夾去尋找,也就是resources/spring--> <param-value>classpath:spring/springmvc.xml</param-value> </init-param> </servlet>
然後進行映射配置:
在web.xml文件中,進行映射配置
<!--servlet的映射配置--> <servlet-mapping> <!-- 將所有的請求都交給springmvc處理,即處理方式在springmvc.xm文 件中 --> <servlet-name>springmvc</servlet-name> <!--這裡統一寫/--> <url-pattern>/</url-pattern> </servlet-mapping>
關於
url-pattern
的寫法問題- / 處理所有的請求,但是他不會像/*一樣,將這個girl.jsp當成一個新的請求,而是直接將渲染結果給瀏覽器
- /* (永遠不要這樣寫):請求/helloController過去的時候,他的視圖名稱是girl,girl.jsp頁面,(出去的時候)它將其當成了一個叫做girl.jsp的請求,去嘗試請求對應的controller
- *.do 例如:/helloController.do
關於前段控制器的解釋:
springMVC設置的理念是希望我們開發者遠離原生的servletAPI【太繁瑣了】,希望將操作儘量簡化。它將很多東西責任進行了拆分。不希望我們將技術點綁定死,可以做到任意切換。其本身還是基於servlet設計的,分發的servlet。
-
配置springmvc.xml文件
springmvc.xml文件的初始配置:<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> </beans>
首先先配置視圖解析器和控制器:
<!--配置一個視圖解析器 常用內部資源視圖解析器 這裡面的意思是:加入此時viewName為hello,那麼它會到WEB-INF/jsp/hello.jsp中去尋找 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--1. 首碼--> <property name="prefix" value="/jsp/"/> <!--2. 尾碼--> <property name="suffix" value=".jsp"/> </bean> <!-- 註解掃描 --> <context:component-scan base-package="com.weno.controller"/>
書寫第一份代碼
Controller的寫法有兩種:
-
介面式
的寫法:是一個傳統式的寫法,類implement一個介面,然後實現介面方法,在modle中填充元素,返回ModelAndView。public class HelloController implements org.springframework.web.servlet.mvc.Controller { @Override public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { ModelAndView mav = new ModelAndView(); mav.addObject("hello","世界"); // 尋找web-inf目錄下的jsp/hello.jsp文件 mav.setViewName("hello"); return mav; } }
當然這種方法還要在springmvc中配置bean。
<!-- 此時name相當於URI --> <bean class="com.weno.controller.HelloController" name="/hello"/>
-
註解式
寫法:註解式寫法要配置註冊掃描【前面已經配置】。將前面的換一種寫法:
@org.springframework.stereotype.Controller public class HelloController { //URI @RequestMapping("hello") public String hello(Model model){ model.addAttribute("hello","世界"); // 尋找web-inf目錄下的jsp/hello.jsp文件 return "hello"; } }
jsp文件
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 你好:${requestScope.hello} </body> </html>
結果:
簡單的註意點
- @RequestMapping可以同時寫在類的上面【模塊】和方法的上面【業務】
這時候就可以使用@org.springframework.stereotype.Controller @RequestMapping("product") public class HelloController { @RequestMapping("add") public String add(Model model){ return ""; } @RequestMapping("del") public String del(Model model){ return ""; } }
/product/add
完成add方法執行,/product/del
完成del方法執行,這樣更好的有利於模塊化的執行。