1 前言
在史上最簡單的 Spring MVC 教程(二)中,咱們講解了常見的處理器映射(handlerMapping)逝嚎,并給出了應(yīng)用示例挤牛。在本篇博客中,咱們講解常見的控制器(Controller)疲陕,在這里有一點需要大家知曉,那就是:在我們創(chuàng)建Controller钉赁,并繼承父類的時候蹄殃,父類上會被畫上一條橫線,這表示該類已經(jīng)過時啦你踩!這是因為在 Spring 框架在升級到 Spring 3.0 后诅岩,推薦大家使用注解的方式進(jìn)行開發(fā),因此用繼承的方式就過時啦带膜!
2 Controller
2.1 CommandController
在使用命令控制器 CommandController 的時候吩谦,我們需要在類的構(gòu)造方法中進(jìn)行傳參,指定 command 對應(yīng)的實體膝藕。 由于要指定實體式廷,我們就需要創(chuàng)建一個實體類,在此以 Person 為例芭挽;其次懒棉,我們需要在“springmvc-servlet.xml”中聲明一個命令控制器;最后览绿,在訪問鏈接的地址有多個單詞的時候策严,都需要小寫,也可以去掉其中的 Controller 單詞饿敲。修改后的項目結(jié)構(gòu)圖如下所示:
第一步:創(chuàng)建實體類(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 對象
public DemoCommandController() {
// 頁面封裝數(shù)據(jù)到 command 對象妻导,對應(yīng)的實體為 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
在使用簡單表單控制器 SimpleFormController 的時候倔韭,我們也需要在類的構(gòu)造方法中進(jìn)行傳參,指定 command 對應(yīng)的實體瓢对。 接下來寿酌,同 CommandController 的配置類似,需要在“springmvc-servlet.xml”中聲明一個簡單表單控制器硕蛹。由于這是表單控制器醇疼,所以我們需要新建一個 JSP 頁面用于提交表單硕并。在這里,有一點需要注意:當(dāng)鏈接以 get 方式提交時秧荆,轉(zhuǎn)向 formView 視圖倔毙;當(dāng)鏈接以 post 方式提交時,轉(zhuǎn)向 successView 視圖乙濒。修改后的項目結(jié)構(gòu)圖如下所示:
第一步:創(chuàng)建簡單表單控制器(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 頁面(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>編號:</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" />
<!-- 聲明 簡單表單控制器 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 的時候么库,我們也需要在類的構(gòu)造方法中設(shè)置關(guān)聯(lián)的實體,并且可以在構(gòu)造方法中實現(xiàn)頁面參數(shù)的回顯功能甘有。 接下來廊散,在類中覆寫 processFinish 方法,實現(xiàn)點擊“完成”操作后需要跳轉(zhuǎn)的頁面梧疲;覆寫 processCancel 方法,實現(xiàn)點擊“取消”操作后跳轉(zhuǎn)的頁面运准。由于在使用向?qū)Э刂破鲿r幌氮,涉及多個頁面,因此我們需要新建多個 JSP 頁面胁澳,并在“springmvc-servlet.xml”中聲明一個向?qū)Э刂破鞲没ィ⑴渲庙撁娴牧鬓D(zhuǎn)順序。修改后的項目結(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 對象
public DemoWizardController() {
// 頁面封裝數(shù)據(jù)到 command 對象韭畸,對應(yīng)的實體為 Person
this.setCommandClass(Person.class);
// 幫助頁面實現(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");
}
// 取消填寫宇智,返回第一個頁面
@Override
protected ModelAndView processCancel(HttpServletRequest request,
HttpServletResponse response, Object command, BindException e) throws Exception {
return new ModelAndView("wizard/PersonInfo");
}
}
第二步:新建 JSP 頁面(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>編號:</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" />
<!-- 聲明 簡單表單控制器 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" >
<!-- 配置這個向?qū)Э刂破饔心男╉撁妫约斑@些頁面的流轉(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>
在完成以上操作及配置后机蔗,啟動 tomcat 服務(wù)器,在 Chrome 瀏覽器中訪問 http://localhost:8080/springmvc/demowizard.action甘萧,然后在顯示的頁面中萝嘁,依次輸入編號、姓名和年齡扬卷,點擊“完成”牙言,將會返回如下頁面:
查看原文: 史上最簡單的 Spring MVC 教程(三)