SpringMVC使用

Spring實現(xiàn)步驟

  • 新建web maven工廠
  • 加入依賴
    spring-mvc依賴,間接把spring的依賴都加入到項目
    jsp,servlet依賴
  • 重點:在web.xml注冊springmvc框架的核心對象DispatcherServlet
    1.DispatherServlet:中央調(diào)度器是一個servlet,父類是HttpServlet
    2.DispatherServlet:也叫前端控制器
    3.DispatherServlet:負責(zé)接受請求,調(diào)用其他控制器對象,并把請求返回給用戶。
    4.創(chuàng)建一個發(fā)起請求的頁面 index.jsp
    5.創(chuàng)建控制器類
    - 1. 在類上面加入@Controller注解,創(chuàng)建對象,并放入到springmvc容器中。
    - 2. 在類中的方法上面加入@RequestMapping注解
    6.創(chuàng)建一個作為結(jié)果的jsp,顯示請求的處理結(jié)果。
    7.創(chuàng)建springmvc的配置文件(spring的配置文件一模一樣)
    - 1.聲明組件掃描器,指定@Controller注解所在的包名。
    - 2.聲明視圖解析器,幫組處理視圖的。

springmvc 配置

  • web.xml
<?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_4_0.xsd"
         version="4.0">
    <!--    注冊springMVC的核心對象DispatherServlet-->
<!--    需要在tomcat服務(wù)器啟動后創(chuàng)DispatherServlet實例-->
<!--    為什么要創(chuàng)建DispatherServlet對象的實例呢
       通過DispatherServlet在他創(chuàng)建過程中,會同時創(chuàng)建springmvc容器對象
       讀取springmvc的配置文件,吧這個配置文件中的對象都創(chuàng)建好,當(dāng)用戶發(fā)起請求
       就可直接使用對象了
       servlet的初始化會執(zhí)行init()方法.DispatherServlet在init()中
       創(chuàng)建容器 讀取配置文件
       WebApplicationContext ctx = new ClassPathXmlApplicationContext("SpringMVC.xml");
       // 把容器對象放入ServletContext中
       getServletContext().setAttribute(key, ctx);


      報錯: /WEB-INF/springmvc-servlet.xml
               /WEB-INF/myWeb-servlet.xml
               原因是: springmvc在創(chuàng)建容器對象時
               默認讀取的是/WEB-INF/<servlet-name>-servlet.xml
    -->
    <servlet>
        <servlet-name>myWeb</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <!--        自定義springmvc配置文件的位置-->
        <init-param>
            <!--            springmvc的配置文件的位置的屬性-->
            <param-name>contextConfigLocation</param-name>
            <!--            指定自定義文件的位置-->
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
<!--        在tomcat啟動后,創(chuàng)建servlet對象
            load-on-startup: 表示tomcat啟動后創(chuàng)建對象的順序
            它的值士整數(shù),數(shù)值越小,tomcat創(chuàng)建對象的時間越早。
            大于等于0的整數(shù)
-->
        <load-on-startup>1</load-on-startup>

    </servlet>
    <servlet-mapping>
        <servlet-name>myWeb</servlet-name>
<!--        使用框架的時候,url-pattern可以使用兩種方式-->
<!--        1. 使用擴展名, 使用*.xx , xxx是自定義的擴展名。-->
<!--        常用*.do 等等
            2. 使用斜杠 */
-->
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
</web-app>

  • resrouce/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:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--    聲明組件掃描器-->
    <context:component-scan base-package="com.study.controller"/>
    <!--    聲明 springmvc框架中的視圖解析器, 幫助開發(fā)人員設(shè)置視圖文件的路徑、-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--        前綴: 視圖文件的路徑-->
        <property name="prefix" value="/WEB-INF/view/"/>
        <!--        后綴:視圖文件的擴展名-->
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

  • Controller類
/**
 *  表示一個控制器對象
 *  位置在類上面
 *  和spring中講的@Service, @Component一樣
 */

@Controller
public class MyController {
    /**
     *  處理用戶提交的請求,springmvc是用方法來處理的
     *  方法是自定義的,可以有多種返回值,多種參數(shù), 方法名自定義
     */
    /**
     * @RequestMapping 請求映射
     *              作用: 把一個請求和一個方法綁定在一起
     *              屬性: 1. value是一個String, 表示url地址的(some.do)
     *                      value 的值必須是唯一的, 不能重復(fù). 在使用時, 推薦地時以"/"
     *              說明: 使用RequestMapping修飾的方法叫做處理器方法,或者說控制器方法。
     *              類似于servlet的doGet, doPost.
     *              返回值: ModelAndView
     *              Model:要顯示給用戶的數(shù)據(jù)
     *              View : 返回jsp等.
     */
    @RequestMapping(value = "/some.do")
    public ModelAndView dosome(){   // doGet()
        ModelAndView mv = new ModelAndView();
//        添加數(shù)據(jù) , 框架最后吧數(shù)據(jù)放入request作用域
//        request.setAttribute("fun","執(zhí)行完成");
        mv.addObject("msg", "歡迎使用springmvc");
        mv.addObject("fun", "執(zhí)行dosmome方法");
        // 指定視圖
        // 框架對視圖執(zhí)行的是forward.
        mv.setViewName("/show.jsp");
        return mv;
    }
}

  • spring.xml 配置文件 掃描包 創(chuàng)建對象
<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <context:component-scan base-package="com.lz.controller"/>
</beans>
  • view層 show.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h3>show.jsp</h3>
    <p>msg數(shù)據(jù):${requestScope.msg}</p>
    <p>fun數(shù)據(jù):${requestScope.fun}</p>
</body>
</html>

springmvc的處理流程:

  • 用戶發(fā)起請求 -> tomcat -> tomcat讀取web.xml更具映射規(guī)則*.do給中央調(diào)度器DispatherServlet(根據(jù)springmvc.xml配置文件 知道some.do - > dosome()方法)- >DispatherServlet吧some.do裝法給MyController.dosome() - > 方法返回ModelAndView


  • 如何訪問WEB-INF/view目錄下的jsp或者其他頁面
    即保證了用戶直接訪問,又解決的無法轉(zhuǎn)發(fā)的問題。

   mv.setViewName("/WEB-INF/view/show.jsp");
  • 視圖解析器:


<!--    聲明 springmvc框架中的視圖解析器, 幫助開發(fā)人員設(shè)置視圖文件的路徑、-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--        前綴: 視圖文件的路徑-->
        <property name="prefix" value="/WEB-INF/view/"/>
<!--        后綴:視圖文件的擴展名-->
        <property name="suffix" value=".jsp"/>
    </bean>

@Controller
public class MyController {
    /**
     *  處理用戶提交的請求,springmvc是用方法來處理的
     *  方法是自定義的,可以有多種返回值,多種參數(shù), 方法名自定義
     */
    /**
     * @RequestMapping 請求映射
     *              作用: 把一個請求和一個方法綁定在一起
     *              屬性: 1. value是一個String, 表示url地址的(some.do)
     *                      value 的值必須是唯一的, 不能重復(fù). 在使用時, 推薦地時以"/"
     *              說明: 使用RequestMapping修飾的方法叫做處理器方法,或者說控制器方法。
     *              類似于servlet的doGet, doPost.
     *              返回值: ModelAndView
     *              Model:要顯示給用戶的數(shù)據(jù)
     *              View : 返回jsp等.
     */
    @RequestMapping(value = "/some.do")
    public ModelAndView dosome(){   // doGet()
        ModelAndView mv = new ModelAndView();
//        添加數(shù)據(jù) , 框架最后吧數(shù)據(jù)放入request作用域
//        request.setAttribute("fun","執(zhí)行完成");
        mv.addObject("msg", "歡迎使用springmvc");
        mv.addObject("fun", "執(zhí)行dosmome方法");
        // 指定視圖
        // 框架對視圖執(zhí)行的是forward.
//        mv.setViewName("/WEB-INF/view/show.jsp");
//        配置了視圖解析器后用邏輯名稱指定視圖
//        框架自動把前綴和邏輯名稱和視圖進行字符串拼接

        mv.setViewName("show");
        return mv;
    }
}

  • controller
    @RequestMapping(value = {"/some.do","/second.do"})

@RequestMapping("")可以定義在類上把公共的部分放在類上。形成層級例如 /first/metod.do

RequestMapping() Method屬性

  • 控制請求方式
  //使用的是枚舉形式
   @RequestMapping(value = "/some.do", method = RequestMethod.POST)

如果沒有設(shè)置則什么形式的訪問都行

接受前臺數(shù)據(jù)

 // 接受前端參數(shù)
    @RequestMapping(value = "/first.do")
    public ModelAndView doFirst(HttpServletRequest req,
                                HttpServletResponse resp,
                                HttpSession session){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg", req.getParameter("name"));
        mv.setViewName("other");
        return mv;
    }

逐個接受form表單

  <form action="properties.do" method="post">
        姓名: <input type="text" name="name">
        年齡: <input type="text" name="age">
        <input type="submit" value="提交參數(shù)">
    </form>

 // 逐個接受    需要方法參數(shù)與請求名字一一對應(yīng) 并且一樣
    @RequestMapping(value = "properties.do")
    /**
     *  框架會提供類型轉(zhuǎn)型功能,能把String 轉(zhuǎn)換為 int float double類型
     */
    public ModelAndView proper(String name, int age){
        ModelAndView mv = new ModelAndView();
        mv.addObject("myAge", age);
        mv.addObject("myName", name);
        mv.setViewName("properties");
        return mv;
    }
}
int 換成 Integer更好 容錯 也可以全部寫String
  • post方式請求 解決亂碼
    get請求沒有亂碼 post請求會有中文亂碼
1.  在每個方法前面加Request.getCharacterEncoding("utf-8");
2. 使用過濾器解決
  • web.xml 過濾器解決亂碼問題
<!--    注冊過濾器, 解決亂碼問題-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--        設(shè)置使用的項目字符編碼-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
<!--        強制請求對象使用上面的編碼格式-->
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
<!--        強制應(yīng)答對象使用上面編碼格式-->
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
<!--        強制所有請求先通過過濾器-->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

@RequestMapping

  • 請求參數(shù)和處理器方法的形參名不一樣時用

解決請求中參數(shù)名形參名不一樣的問題
屬性 :
1.value 請求中參數(shù)名稱
2.required 是一個boolean,默認是true
true標(biāo)識請求中必須包含此參數(shù)
false參數(shù)可以有也可以沒有(必須有時,不傳參數(shù)會報400錯誤)
位置:在處理器方法

    @RequestMapping(value = "haha.do")
    public ModelAndView hahaPara(@RequestParam(value = "name", required = false) String name, @RequestParam(value = "age",required = false) Integer age){
        ModelAndView view = new ModelAndView();
        view.addObject("msg" , name);
        view.addObject("fun", age);
        view.setViewName("show");
        return view;
    }
  • 接受對象

處理器方法形參是java對象,這個對象的屬性名和請求名一樣的。
框架會創(chuàng)建形參java對象,給屬性賦值。請求中的參數(shù)是name,框架會調(diào)用setName()
使用同名原則所以參數(shù)中可以有多個對象
并且沒法使用RequestParam。
···
@RequestMapping(value = "object.do")
public ModelAndView objectTest(Student student){
ModelAndView mv = new ModelAndView();

    mv.addObject("msg", student.getName());
    mv.addObject("fun", student.getAge());
    mv.setViewName("show");
    return mv;
}

····

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

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