Controller實現(xiàn)類
AbstractController:使用Template Method模式,包括了對緩存標(biāo)頭的處理、檢驗對請求方法(POST、GET)的支持,Session的取得與同步化等。
使用方式:繼承AbstractController類,覆蓋handleRequestInternal()方法。
MultiActionController與ParameterMethodNameResolver
在一個Controller類中定義多個方法,并根據(jù)使用者的請求來執(zhí)行當(dāng)中的某個方法,相當(dāng)于Struts的DispatcherAction。
使用MultiActionController需要配個一個MethodNameResolver實例,默認使用ParameterMethodNameResolver,他會根據(jù)所給的網(wǎng)址中,最后請求的文件名稱來判斷執(zhí)行Controller中的哪一個方法,示例:
multiMethodController.java
1
public class MultiMethodController extends MultiActionController
{
2
private String viewPage;
3
4
public ModelAndView add(HttpServletRequest request, HttpServletResponse response)
{
5
return new ModelAndView(viewPage, "method", "add");
6
}
7
8
public ModelAndView delete(HttpServletRequest request, HttpServletResponse response)
{
9
return new ModelAndView(viewPage, "method", "delete");
10
}
11
12
public ModelAndView update(HttpServletRequest request, HttpServletResponse response)
{
13
return new ModelAndView(viewPage, "method", "update");
14
}
15
16
public void setViewPage(String viewPage)
{
17
this.viewPage = viewPage;
18
}
19
}
applicationContext.xml
1
<bean id="urlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
2
<property name="mappings">
3
<props>
4
<prop key="/sayHello.do">sayHelloController</prop>
5
<prop key="/method.do">multiMethodController</prop>
6
<prop key="/login.do">loginController</prop>
7
<prop key="/wizard.do">wizardController</prop>
8
</props>
9
</property>
10
</bean>
11
12
<bean id="parameterMethodResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
13
<property name="paramName" value="action" />
14
<property name="defaultMethodName" value="add" />
15
</bean>
16
17
<bean id="multiMethodController" class="SpringMVC.MultiMethodController">
18
<property name="methodNameResolver" ref="parameterMethodResolver" />
19
<property name="viewPage" value="multiMethodTest" />
20
</bean>
PatameterizableViewController
可以直接在Bean文件中定義,設(shè)定它的viewName屬性,當(dāng)這個Controller執(zhí)行時,會根據(jù)viewName的設(shè)定直接導(dǎo)向指定的網(wǎng)頁,使用它的好處是可以用來避免直接對JSP頁面請求。
AbstractCommandController
繼承該類,并提供一個Command對象(如常見的User類),當(dāng)請求來時,AbstractCommandController會試著對比請求參數(shù)名稱與Command上的Setter方法名稱,設(shè)定請求參數(shù)值。
SimpleFormController
SimpleFormController繼承自AbstractFormController,對于簡單的表單可以直接繼承這個類,并重新定義onSubmit()或doSubmitAction()方法處理請求。以下是一個簡單的登錄頁面示例:
LoginController.java
1
public class LoginController extends SimpleFormController
{
2
3
public LoginController()
{
4
this.setCommandClass(LoginForm.class);
5
}
6
7
protected ModelAndView onSubmit(Object command) throws Exception
{
8
LoginForm form = (LoginForm)command;
9
if("codingliyi".endsWith(form.getUsername()) &&
10
"123456".endsWith(form.getPassword()))
{
11
return new ModelAndView(getSuccessView(), "username", form.getUsername());
12
}else return new ModelAndView(getFormView());
13
}
14
}
15
applicationContext.xml
1
<bean id="loginController" class="SpringMVC.LoginController">
2
<property name="successView" value="loginSuccess" />
3
<property name="formView" value="login" />
4
</bean>
login.jsp
1
<form name="loginForm" action="login.do" method="POST">
2
用戶名:<input type="text" name="username"/><br/>
3
密碼:<input type="text" name="password"/><br/>
4
<input type="submit" value="登錄" />
5
</form>
AbstractWizardFormController
AbstractWizardFormController用于設(shè)計多頁表單。
可以繼承該類,并重寫processFinish()方法。一個多頁表單的示例如下:
WizardController.java
1
public class WizardController extends AbstractWizardFormController
{
2
3
private String viewPage;
4
5
public WizardController()
{
6
this.setCommandClass(LoginForm.class);
7
}
8
@Override
9
protected ModelAndView processFinish(HttpServletRequest arg0,
10
HttpServletResponse arg1, Object command, BindException arg3)
11
throws Exception
{
12
LoginForm form = (LoginForm)command;
13
Map model = new HashMap();
14
model.put("username", form.getUsername());
15
model.put("password", form.getPassword());
16
return new ModelAndView(viewPage, model);
17
}
18
19
public void setViewPage(String viewPage)
{
20
this.viewPage = viewPage;
21
}
22
}
applicationContext.xml
1
<bean name="wizardController" class="SpringMVC.WizardController">
2
<property name="viewPage" value="wizardResult"/>
3
<property name="pages">
4
<list>
5
<value>question1</value>
6
<value>question2</value>
7
</list>
8
</property>
9
<property name=""></property>
10
</bean>
question2.jsp
1
<form action="wizard.do" method="POST">
2
你的密碼:<input type="text" name="password" /><br/>
3
<input type="submit" value="previous" name="_target0" />
4
<input type="submit" value="finish" name="_finish" />
5
</form>
也可以在問卷中涉及一個cancel按鈕,在按下該按鈕后,送出"_cancel"請求參數(shù),當(dāng)請求中帶有"_cancel"參數(shù)時,會執(zhí)行processCancel()方法。
ThrowawayController
ThrowawayController并不在Controller的繼承架構(gòu)中,而是一個獨立的接口定義。實現(xiàn)該接口的類不是以單例的方式產(chǎn)生并重復(fù)使用。ThrowawayController在每一次請求中都會產(chǎn)生新的對象,而且用了就丟,不會重復(fù)使用。
在設(shè)定Bean定義文件中,ThrowawayController必須將"singleton"屬性設(shè)為false。