1.基本組件
1.1 介紹
傳統(tǒng)的servlet做的事情是:
匹配url路徑,然后瀏覽器里面輸入相應(yīng)的路徑,進(jìn)入到servlet里面,在servlet里面做相應(yīng)的處理,在請求轉(zhuǎn)發(fā),重定向等等。
SpringMVC做的事情也是這些,它只是對傳統(tǒng)的servlet的優(yōu)化,使用SpringMVC可以更加方便,當(dāng)然它不只我說的這么簡單。
SpringMVC的流程:
有一個前端控制器,所有的瀏覽器輸入的路徑訪問都會到它這里。然后呢它獲取到不同的路徑,然后判斷這些路徑對應(yīng)哪個方法去處理(這里的方法就相當(dāng)于傳統(tǒng)的servlet類),然后呢調(diào)用相應(yīng)的方法,最后呢,方法處理完了,跳轉(zhuǎn)到具體的物理視圖中去。
1.2組件
- DispatcherServlet:前端控制器,接受所有的路徑請求(可以通過配置,讓訪問jsp的請求不處理,這樣瀏覽器可以直接獲取到j(luò)sp頁面)。
- HandlerMapping:解析請求的路徑,去判斷要執(zhí)行哪個方法。
- HandlerAdapter:去調(diào)用具體的那個方法。
-
ViewResovler:視圖解析器,解析結(jié)果,準(zhǔn)備跳轉(zhuǎn)到具體的物理視圖。
圖解
2.純配置文件搭建SpringMVC運(yùn)行環(huán)境(看看)
2.1首先需要在web.xml文件中配置(idea會自己配置好)
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--自啟動,不配的話,訪問的時候才加載-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
因為前端控制器需要處理所有的url訪問,所以這個DispatcherServlet需要配置一下。
2.2然后配置SpringMVC的配置文件
默認(rèn)情況下在WEB-INF文件下會自動生成dispatcher-servlet.xml,這個就是SpringMVC的配置文件,這個文件的名字是根據(jù)web.xml中配置的DispatcherServlet的名字來生成的。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="xxxx" class="controller.xxxController"></bean>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="urlMap">
<map>
<entry key="xxx" value-ref="xxxx"/>
</map>
</property>
</bean>
</beans>
配置好以后,訪問http://localhost:8080/xxx就會,進(jìn)入到xxxController。
下面是xxxController的代碼
public class xxxController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
System.out.println("xxx");
ModelAndView modelAndView = new ModelAndView("a.jsp");
return modelAndView;
}
}
進(jìn)來了xxxController以后先打印xxx,然后轉(zhuǎn)發(fā)到a.jsp頁面
2.3修改SpingMVC 的默認(rèn)配置文件的名稱和位置
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--修改SpringMVC的配置文件路徑-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--自啟動,不配的話,訪問的時候才加載-->
<load-on-startup>1</load-on-startup>
</servlet>
這樣在src下面建一個springmvc.xml即可,這個就是SpringMVC的配置文件了。
3.SpringMVC 容器和Spring容器是父子關(guān)系
意思就是說在Spring中的對象,在SpringMVC中是可以直接@Resource獲取到對象的
4注解搭建SpringMVC 的環(huán)境
4.1web.xml還是一樣的配置,同上
4.2配置SpringMVC的配置文件
<?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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--掃描注解-->
<context:component-scan base-package="com.test.controller"/>
<!--注解驅(qū)動-->
<!--配置了這個就有了HandlerMapping和HandlerAdapter-->
<mvc:annotation-driven/>
<!--靜態(tài)資源自動放行,js/**表示js文件夾下的所有的文件和子文件夾里面文件-->
<mvc:resources mapping="/js/**" location="/js/**"/>
</beans>
4.3Controller代碼
@Controller
public class XXXController {
@RequestMapping("xxx")
public String xxx(){
System.out.println("執(zhí)行demo方法");
return "a.jsp";
}
}
這樣子,瀏覽器訪問http://localhost:8080/xxx,就可以進(jìn)入到xxx()方法了。
5傳參
比如前端會傳進(jìn)來2個值,name和age
@RequestMapping("xxx")
public String xxx(String name, int age){
System.out.println("執(zhí)行demo方法"+name+"--"+age);
return "a.jsp";
}
或者用一個pojo類接收,springmvc還會把name和age自動注入到pojo類里。同時還可以選擇把name和age再接收到變量里面
@RequestMapping("xxx")
public String xxx(String name, int age, User user){
System.out.println("執(zhí)行demo方法"+name+"--"+age+"--"+user);
return "a.jsp";
}
如果前端傳進(jìn)來的變量的名稱和接收方法的變量名稱不一致,可以使用@RequestParam

如果需要傳入的參數(shù)有默認(rèn)值或者必傳,也可以如下:

如果前端傳進(jìn)來的幾個參數(shù)重名,可以如下:

還可以前端傳“對象.屬性”的參數(shù),比如xx.yy
其實就是把接收的對象里面有一個XX類的對象xx,給xx的yy屬性賦值。
比如有個User,User里面引用了xx對象,用User接收參數(shù),這個參數(shù)會直接賦值給xx的yy屬性。
6.轉(zhuǎn)發(fā)方式
轉(zhuǎn)發(fā)方式有請求轉(zhuǎn)發(fā)和重定向兩種,默認(rèn)的是請求轉(zhuǎn)發(fā)。
@RequestMapping("xxx")
public String demo( int age,String name){
return "redirect:/a.jsp";//請求轉(zhuǎn)發(fā),默認(rèn)
return "forward:/a.jsp";//重定向
}
7.自定義視圖解析器(不寫的話,SpringMVC有默認(rèn)的)
之前的return是這樣的:
return "/a.jsp";
在SpringMVC的配置文件上加上視圖解析器:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
之后的return就可以這樣了:
return "a";
會自動前面加上/,后面加上.jsp
當(dāng)指定了轉(zhuǎn)發(fā)方式的時候(redirect:/a.jsp,forward:/a.jsp),這個自定義視圖解析器就不起作用了,走默認(rèn)的視圖解析器。很好理解,因為再拼接前綴后綴就不對了。
8.@ResponseBody
在方法上面直接加@RequestMapping,無論返回什么,都是被認(rèn)為要跳轉(zhuǎn)的
給加上@ResponseBody,就不會跳轉(zhuǎn),而是把返回值轉(zhuǎn)換為json串以輸出流響應(yīng)給客戶端。(需要導(dǎo)包)
ps:這里可能會出現(xiàn)亂碼問題:

