SpringMVC

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的名字來生成的。


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"
       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ù)都叫hover,可以把他們放在list里面

還可以前端傳“對象.屬性”的參數(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)亂碼問題:


解決亂碼
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容