Spring MVC Controller

来源:互联网 发布:淘宝雪纺长纱巾 编辑:程序博客网 时间:2024/04/27 20:27

原文例子:http://www.mkyong.com/tutorials/spring-mvc-tutorials/
MultiActionController :
MultiActionController用于组合成一个单一控制器的相关Action,方法必须遵循以下格式:
public (ModelAndView | Map | String | void) actionName(
HttpServletRequest, HttpServletResponse [,HttpSession] [,CommandObject]);
一个MultiActionController 的例子:
package com.mkyong.common.controller;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
 
public class CustomerController extends MultiActionController{
 
public ModelAndView add(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerPage", "msg","add() method");
 
}
 
public ModelAndView delete(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerPage", "msg","delete() method");
 
}
 
public ModelAndView update(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerPage", "msg","update() method");
 
}
 
public ModelAndView list(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerPage", "msg","list() method");
 
}
 
}
配置文件:
<beans ...>
 
 <bean 
  class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
 
  <bean class="com.mkyong.common.controller.CustomerController" />
 
</beans>
匹配URL路径
CustomerController –> /customer/*
/customer/add.htm –> add()
/customer/delete.htm –> delete()
/customer/update.htm –> update()
/customer/list.htm –> list()
配置 InternalPathMethodNameResolver:
InternalPathMethodNameResolver是继承MultiActionController默认按照方法名进行URL映射的实现。但是,你仍然可以为方法名称添加前缀或后缀的:
<beans ...>
 <bean 
  class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
 
  <bean class="com.mkyong.common.controller.CustomerController">
     <property name="methodNameResolver">
<bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
  <property name="prefix" value="test" />
  <property name="suffix" value="Customer" />
</bean>
     </property>
   </bean>
</beans>
匹配的URL:
CustomerController –> /customer/*
/customer/add.htm –> testaddCustomer()
/customer/delete.htm –> testdeleteCustomer()
/customer/update.htm –> testupdateCustomer()
/customer/list.htm –> testlistCustomer()
使用注解是配置更加容易,例子:
package com.mkyong.common.controller;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
 
@Controller
public class CustomerController{
 
@RequestMapping("/customer/add.htm")
public ModelAndView add(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerAddView");
 
}
 
@RequestMapping("/customer/delete.htm")
public ModelAndView delete(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerDeleteView");
 
}
 
@RequestMapping("/customer/update.htm")
public ModelAndView update(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerUpdateView");
 
}
 
@RequestMapping("/customer/list.htm")
public ModelAndView list(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerListView");
 
}
}
匹配路径:
/customer/add.htm –> add() method
/customer/delete.htm –> delete() method
/customer/update.htm –> update() method
/customer/list.htm –> list() method
PropertiesMethodNameResolver:
PropertiesMethodNameResolver,灵活的MultiActionController方法名解析器,明确定义URL和方法名之间的映射。见下面的例子:
package com.mkyong.common.controller;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
 
public class CustomerController extends MultiActionController{
 
public ModelAndView add(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerPage", "msg","add() method");
 
}
 
public ModelAndView delete(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerPage", "msg","delete() method");
 
}
 
public ModelAndView update(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerPage", "msg","update() method");
 
}
 
public ModelAndView list(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerPage", "msg","list() method");
 
}
 
}
使用PropertiesMethodNameResolver,你可以很容易的将任何URL名称与方法名称进行匹配:
配置文件:
<beans ...>
 
 <bean 
  class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
 
 <bean class="com.mkyong.common.controller.CustomerController">
   <property name="methodNameResolver">
    <bean class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
      <property name="mappings">
<props>
  <prop key="/customer/a.htm">add</prop>
  <prop key="/customer/b.htm">update</prop>
  <prop key="/customer/c.htm">delete</prop>
  <prop key="/customer/d.htm">list</prop>
  <prop key="/customer/whatever.htm">add</prop>
</props>
       </property>
     </bean>
    </property>
  </bean>
 
</beans>
匹配路径:
/customer/a.htm –> add() method
/customer/b.htm –> update() method
/customer/c.htm –> delete() method
/customer/d.htm –> list() method
/customer/whatever.htm –> add() method
ParameterMethodNameResolver
ParameterMethodNameResolver,一个MultiActionController方法名解析器通过请求参数名的URL映射到方法名,参数的名称是通过“PARAMNAME”属性定义。见下面的例子:
package com.mkyong.common.controller;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
 
public class CustomerController extends MultiActionController{
 
public ModelAndView add(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerPage", "msg","add() method");
 
}
 
public ModelAndView delete(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerPage", "msg","delete() method");
 
}
 
public ModelAndView update(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerPage", "msg","update() method");
 
}
 
public ModelAndView list(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
return new ModelAndView("CustomerPage", "msg","list() method");
 
}
 
}
对ParameterMethodNameResolver进行配置,定义“PARAMNAME”属性的参数名称:
<beans ...>
 
 <bean 
  class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
 
  <bean class="com.mkyong.common.controller.CustomerController">
     <property name="methodNameResolver">
<bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
  <property name="paramName" value="action"/>
</bean>
     </property>
   </bean>
 
</beans>
匹配路径:
/customer/*.htm?action=add –> add() method
/customer/whatever.htm?action=add –> add() method
/customer/*.htm?action=update –> update() method
/customer/*.htm?action=delete –> delete() method
/customer/*.htm?action=list –> list() method
ParameterizableViewController 
在一般情况下,返回一个视图或在Spring MVC应用程序的页面,你需要创建一个类,它扩展了AbstractController的,并返回一个ModelAndView()对象
public class WelcomeController extends AbstractController{
 
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request,
HttpServletResponse response) throws Exception {
 
ModelAndView model = new ModelAndView("WelcomePage");
return model;
 
}
 
}
在bean的配置文件中,声明ControllerClassNameHandlerMapping,自动检测映射
<bean 
 class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
 
<bean class="com.mkyong.common.controller.WelcomeController" />
但是只为了跳转的话这样做太麻烦了,使用ParameterizableViewController之后就不需要在代码中再声明任何页面了。
ParameterizableViewController是一个AbstractController的子类,并根据viewName属性返回一个ModelAndView,一个纯净的redirect类,一点不多,一点不少
ParameterizableViewController的源代码:


protected ModelAndView handleRequestInternal(
    HttpServletRequest request, HttpServletResponse response)
throws Exception {
 
return new ModelAndView(getViewName());
}


ParameterizableViewController不需要Controller,只需要声明ParameterizableViewController 并通过“viewName”属性指定页面
<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-2.5.xsd">
 
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/welcome.htm">welcomeController</prop>
            </props>
        </property>
    </bean>
 
   <bean name="welcomeController" 
            class="org.springframework.web.servlet.mvc.ParameterizableViewController">
   <property name="viewName" value="WelcomePage" />
   </bean>
 
   <bean id="viewResolver"
   class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
            <property name="prefix">
              <value>/WEB-INF/pages/</value>
            </property>
            <property name="suffix">
              <value>.jsp</value>
            </property>
    </bean>
 
</beans>
匹配的路径:
/wellcome.htm –> /WEB-INF/pages/WelcomPage.jsp“.
注意:必须指定明确的映射关系。
例如:
<beans ...>
//...
<bean 
class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />
 
<bean name="welcomeController" 
    class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="WelcomePage" />
</bean>
//...
</beans>
是不行的 因为ControllerClassNameHandlerMapping不会对Controller中的内置映射关系进行映射







原创粉丝点击