史上最簡(jiǎn)單的 Spring MVC 教程(三)

1 前言


在史上最簡(jiǎn)單的 Spring MVC 教程(二)中,咱們講解了常見(jiàn)的處理器映射(handlerMapping),并給出了應(yīng)用示例。在本篇博客中,咱們講解常見(jiàn)的控制器(Controller),在這里有一點(diǎn)需要大家知曉,那就是:在我們創(chuàng)建Controller,并繼承父類的時(shí)候,父類上會(huì)被畫(huà)上一條橫線,這表示該類已經(jīng)過(guò)時(shí)啦!這是因?yàn)樵?Spring 框架在升級(jí)到 Spring 3.0 后,推薦大家使用注解的方式進(jìn)行開(kāi)發(fā),因此用繼承的方式就過(guò)時(shí)啦!

2 Controller


2.1 CommandController

在使用命令控制器 CommandController 的時(shí)候,我們需要在類的構(gòu)造方法中進(jìn)行傳參,指定 command 對(duì)應(yīng)的實(shí)體。 由于要指定實(shí)體,我們就需要?jiǎng)?chuàng)建一個(gè)實(shí)體類,在此以 Person 為例;其次,我們需要在“springmvc-servlet.xml”中聲明一個(gè)命令控制器;最后,在訪問(wèn)鏈接的地址有多個(gè)單詞的時(shí)候,都需要小寫(xiě),也可以去掉其中的 Controller 單詞。修改后的項(xiàng)目結(jié)構(gòu)圖如下所示:

項(xiàng)目結(jié)構(gòu)圖

第一步:創(chuàng)建實(shí)體類(Person)

package spring.mvc.domain;

/** * Created by 維C果糖 on 2017/1/25\. */

public class Person {
    private Integer id;
    private String name;
    private Integer age;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

第二步:創(chuàng)建命令控制器(DemoCommandController)

package spring.mvc.controller;

import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractCommandController;
import spring.mvc.domain.Person;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/** * Created by 維C果糖 on 2017/1/25\. */
public class DemoCommandController extends AbstractCommandController {

    // 在構(gòu)造函數(shù)中初始化 command 對(duì)象
    public DemoCommandController() {
        // 頁(yè)面封裝數(shù)據(jù)到 command 對(duì)象,對(duì)應(yīng)的實(shí)體為 Person
        this.setCommandClass(Person.class);
    }

    @Override
    protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response,
                                  Object command, BindException e) throws Exception {
        Person p = (Person) command;
        System.out.println(p);
        return null;
    }
}

第三步:修改“springmvc-servlet.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:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!-- 聲明 handlerMapping -->
    <!-- 聲明 BeanNameUrlHandlerMapping 處理器映射,其為默認(rèn)的處理器映射 -->
    <bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
        <property name="order" value="1"/>
    </bean>

    <!-- 聲明 SimpleUrlHandlerMapping 處理器映射 -->
    <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/a.aciton">homeController</prop>
                <prop key="/b.aciton">homeController</prop>
                <prop key="/hello.aciton">homeController</prop>
            </props>
        </property>
        <property name="order" value="0"/>
    </bean>

    <!-- 聲明 ControllerClassNameHandlerMapping 處理器映射 -->
    <bean id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

    <!-- 聲明 Controller -->
    <bean id="homeController" name="/hello.action" class="spring.mvc.controller.CeshiController" />
    <!-- 聲明 命令控制器 CommandController -->
    <bean class="spring.mvc.controller.DemoCommandController" />

    <!-- 內(nèi)部資源視圖解析器,前綴 + 邏輯名 + 后綴 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

2.2 SimpleFormController


在使用簡(jiǎn)單表單控制器 SimpleFormController 的時(shí)候,我們也需要在類的構(gòu)造方法中進(jìn)行傳參,指定 command 對(duì)應(yīng)的實(shí)體。 接下來(lái),同 CommandController 的配置類似,需要在“springmvc-servlet.xml”中聲明一個(gè)簡(jiǎn)單表單控制器。由于這是表單控制器,所以我們需要新建一個(gè) JSP 頁(yè)面用于提交表單。在這里,有一點(diǎn)需要注意:當(dāng)鏈接以 get 方式提交時(shí),轉(zhuǎn)向 formView 視圖;當(dāng)鏈接以 post 方式提交時(shí),轉(zhuǎn)向 successView 視圖。修改后的項(xiàng)目結(jié)構(gòu)圖如下所示:

項(xiàng)目結(jié)構(gòu)圖

第一步:創(chuàng)建簡(jiǎn)單表單控制器(PersonFormController)

package spring.mvc.controller;

import org.springframework.web.servlet.mvc.SimpleFormController;
import spring.mvc.domain.Person;

/** * Created by 維C果糖 on 2017/1/25\. */
public class PersonFormController extends SimpleFormController {

    public PersonFormController() {
        // 設(shè)置 command
        this.setCommandClass(Person.class);
    }

    // 提交后,交給業(yè)務(wù)處理
    protected void doSubmitAction(Object command) throws Exception {
        Person p = (Person) command;
        System.out.println(p);
    }
}

第二步:新建 JSP 頁(yè)面(PersonForm)

<%-- Created by IntelliJ IDEA. User: 維C果糖 Date: 2017/1/25 Time: 14:03 To change this template use File | Settings | File Templates. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>人員列表</title>
</head>
<body>

    <form action="${pageContext.request.contextPath}/personform.action" method="post">

        <table>
            <tr>
                <td>編號(hào):</td>
                <td><input tyep="text" name="id"></td>
            </tr>
            <tr>
                <td>姓名:</td>
                <td><input tyep="text" name="name"></td>
            </tr>
            <tr>
                <td>年齡:</td>
                <td><input tyep="text" name="age"></td>
            </tr>
            <tr>
                <td colspan="2"><input type="button" name="btnOK" value="submit"></td>
            </tr>
        </table>
    </form>

</body>
</html>

第三步:修改“springmvc-servlet.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:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!-- 聲明 handlerMapping -->
    <!-- 聲明 BeanNameUrlHandlerMapping 處理器映射,其為默認(rèn)的處理器映射 -->
    <bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
        <property name="order" value="1"/>
    </bean>

    <!-- 聲明 SimpleUrlHandlerMapping 處理器映射 -->
    <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/a.aciton">homeController</prop>
                <prop key="/b.aciton">homeController</prop>
                <prop key="/hello.aciton">homeController</prop>
            </props>
        </property>
        <property name="order" value="0"/>
    </bean>

    <!-- 聲明 ControllerClassNameHandlerMapping 處理器映射 -->
    <bean id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

    <!-- 聲明 Controller -->
    <bean id="homeController" name="/hello.action" class="spring.mvc.controller.CeshiController" />
    <!-- 聲明 命令控制器 CommandController -->
    <bean class="spring.mvc.controller.DemoCommandController" />
    <!-- 聲明 簡(jiǎn)單表單控制器 SimpleFormController -->
    <bean class="spring.mvc.controller.PersonFormController" >
        <property name="formView" value="PersonForm"/>  <!-- 轉(zhuǎn)向 form 視圖-->
        <property name="successView" value="index"/>    <!-- 轉(zhuǎn)向 成功 視圖-->
    </bean>

    <!-- 內(nèi)部資源視圖解析器,前綴 + 邏輯名 + 后綴 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

2.3 WizardController


在使用向?qū)Э刂破鱓izarController 的時(shí)候,我們也需要在類的構(gòu)造方法中設(shè)置關(guān)聯(lián)的實(shí)體,并且可以在構(gòu)造方法中實(shí)現(xiàn)頁(yè)面參數(shù)的回顯功能。 接下來(lái),在類中覆寫(xiě) processFinish 方法,實(shí)現(xiàn)點(diǎn)擊“完成”操作后需要跳轉(zhuǎn)的頁(yè)面;覆寫(xiě) processCancel 方法,實(shí)現(xiàn)點(diǎn)擊“取消”操作后跳轉(zhuǎn)的頁(yè)面。由于在使用向?qū)Э刂破鲿r(shí),涉及多個(gè)頁(yè)面,因此我們需要新建多個(gè) JSP 頁(yè)面,并在“springmvc-servlet.xml”中聲明一個(gè)向?qū)Э刂破鳎⑴渲庙?yè)面的流轉(zhuǎn)順序。修改后的項(xiàng)目結(jié)構(gòu)圖如下所示:

項(xiàng)目結(jié)構(gòu)圖

第一步:創(chuàng)建向?qū)Э刂破鳎―emoWizardController)

package spring.mvc.controller;

import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractWizardFormController;
import spring.mvc.domain.Person;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/** * Created by 維C果糖 on 2017/1/26\. */
public class DemoWizardController extends AbstractWizardFormController{

    // 在構(gòu)造函數(shù)中初始化 command 對(duì)象
    public DemoWizardController() {
        // 頁(yè)面封裝數(shù)據(jù)到 command 對(duì)象,對(duì)應(yīng)的實(shí)體為 Person
        this.setCommandClass(Person.class);
        // 幫助頁(yè)面實(shí)現(xiàn)回顯功能
        this.setCommandName("p");
    }

    // 最終完成后提交
    @Override
    protected ModelAndView processFinish(HttpServletRequest request,
                                         HttpServletResponse response, Object command, BindException e) throws Exception {
        Person p = (Person) command;
        System.out.println(p);
        return new ModelAndView("index");
    }

    // 取消填寫(xiě),返回第一個(gè)頁(yè)面
    @Override
    protected ModelAndView processCancel(HttpServletRequest request,
                                         HttpServletResponse response, Object command, BindException e) throws Exception {
        return new ModelAndView("wizard/PersonInfo");
    }
}

第二步:新建 JSP 頁(yè)面(PersonInfo、PersonEdu、PersonWork)

<%-- Created by IntelliJ IDEA. User: 維C果糖 Date: 2017/1/26 Time: 00:15 To change this template use File | Settings | File Templates. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>人員信息 PersonInfo</title>
</head>
<body>

    <form action="${pageContext.request.contextPath}/demowizard.action" method="post">

        <table>
            <tr>
                <td>編號(hào):</td>
                <td><input tyep="text" name="id" value="${p.id}"></td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="submit" name="_target1" value="下一步"/>
                    <input type="submit" name="_cancel" value="取消"/>
                </td>
            </tr>
        </table>
    </form>

</body>
</html>
<%-- Created by IntelliJ IDEA. User: 維C果糖 Date: 2017/1/26 Time: 00:18 To change this template use File | Settings | File Templates. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>教育信息 PersonEdu</title>
</head>
<body>

<form action="${pageContext.request.contextPath}/demowizard.action" method="post">

    <table>
        <tr>
            <td>姓名:</td>
            <td><input tyep="text" name="id" value="${p.name}"></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" name="_target0" value="上一步"/>
                <input type="submit" name="_cancel" value="取消"/>
                <input type="submit" name="_target2" value="下一步"/>
            </td>
        </tr>
    </table>
</form>

</body>
</html>
<%-- Created by IntelliJ IDEA. User: 維C果糖 Date: 2017/1/26 Time: 00:20 To change this template use File | Settings | File Templates. --%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>工作信息 PersonWork</title>
</head>
<body>

<form action="${pageContext.request.contextPath}/demowizard.action" method="post">

    <table>
        <tr>
            <td>年齡:</td>
            <td><input tyep="text" name="id" value="${p.age}"></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" name="_target1" value="上一步"/>
                <input type="submit" name="_cancel" value="取消"/>
                <input type="submit" name="_finish" value="完成"/>
            </td>
        </tr>
    </table>
</form>

</body>
</html>

第三步:修改“springmvc-servlet.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:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <!-- 聲明 handlerMapping -->
    <!-- 聲明 BeanNameUrlHandlerMapping 處理器映射,其為默認(rèn)的處理器映射 -->
    <bean id="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
        <property name="order" value="1"/>
    </bean>

    <!-- 聲明 SimpleUrlHandlerMapping 處理器映射 -->
    <bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/a.aciton">homeController</prop>
                <prop key="/b.aciton">homeController</prop>
                <prop key="/hello.aciton">homeController</prop>
            </props>
        </property>
        <property name="order" value="0"/>
    </bean>

    <!-- 聲明 ControllerClassNameHandlerMapping 處理器映射 -->
    <bean id="controllerClassNameHandlerMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

    <!-- 聲明 Controller -->
    <bean id="homeController" name="/hello.action" class="spring.mvc.controller.CeshiController" />

    <!-- 聲明 命令控制器 CommandController -->
    <bean class="spring.mvc.controller.DemoCommandController" />

    <!-- 聲明 簡(jiǎn)單表單控制器 SimpleFormController -->
    <bean class="spring.mvc.controller.PersonFormController" >
        <property name="formView" value="PersonForm"/>  <!-- 轉(zhuǎn)向 form 視圖-->
        <property name="successView" value="index"/>    <!-- 轉(zhuǎn)向 成功 視圖-->
    </bean>

    <!-- 聲明 向?qū)Э刂破?WizardController -->
    <bean class="spring.mvc.controller.DemoWizardController" >
        <!-- 配置這個(gè)向?qū)Э刂破饔心男╉?yè)面,以及這些頁(yè)面的流轉(zhuǎn)順序 -->
        <property name="pages">
            <list>
                <value>wizard/PersonInfo</value>
                <value>wizard/PersonEdu</value>
                <value>wizard/PersonWork</value>
            </list>
        </property>
    </bean>

    <!-- 內(nèi)部資源視圖解析器,前綴 + 邏輯名 + 后綴 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

在完成以上操作及配置后,啟動(dòng) tomcat 服務(wù)器,在 Chrome 瀏覽器中訪問(wèn) http://localhost:8080/springmvc/demowizard.action,然后在顯示的頁(yè)面中,依次輸入編號(hào)、姓名和年齡,點(diǎn)擊“完成”,將會(huì)返回如下頁(yè)面:

操作結(jié)果頁(yè)面

查看原文: 史上最簡(jiǎn)單的 Spring MVC 教程(三)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,765評(píng)論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,835評(píng)論 0 11
  • 1.Spring web mvc介紹 Spring web mvc和Struts2都屬于表現(xiàn)層的框架,它是Spri...
    七弦桐語(yǔ)閱讀 11,556評(píng)論 2 38
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,923評(píng)論 18 139
  • 盡管奢華的城市已經(jīng)很難引起我的興趣,盡管已經(jīng)通過(guò)影視、照片和文字對(duì)它有了充分的了解,但真正走進(jìn)賭城拉斯維加斯,感覺(jué)...
    田園讀書(shū)人閱讀 1,609評(píng)論 20 40