`

第四章 Controller接口控制器详解(5)——跟着开涛学SpringMVC

阅读更多
  1. 4.15、MultiActionController

之前学过的控制器如AbstractCommandController、SimpleFormController等一般对应一个功能处理方法(如新增),如果我要实现比如最简单的用户增删改查(CRUD Create-Read-Update-Delete),那该怎么办呢?

 

4.15.1 解决方案

1、每一个功能对应一个控制器,如果是CRUD则需要四个控制器,但这样我们的控制器会暴增,肯定不可取;

2、使用Spring Web MVC提供的MultiActionController,用于支持在一个控制器里添加多个功能处理方法,即将多个请求的处理方法放置到一个控制器里,这种方式不错。

 

4.15.2 问题

1、  MultiActionController如何将不同的请求映射不同的请求的功能处理方法呢?

Spring Web MVC提供了MethodNameResolver(方法名解析器)用于解析当前请求到需要执行的功能处理方法的方法名。默认使用InternalPathMethodNameResolver实现类,另外还提供了ParameterMethodNameResolverPropertiesMethodNameResolver,当然我们也可以自己来实现,稍候我们仔细研究下它们是如何工作的。

 

2、那我们的功能处理方法应该怎么写呢?

public (ModelAndView | Map | String | void) actionName(HttpServletRequest request, HttpServletResponse response, [,HttpSession session] [,AnyObject]);

 

哦,原来如此,我们只需要按照如上格式写我们的功能处理方法即可;此处需要注意一下几点:

1、返回值:即模型和视图部分;

ModelAndView:模型和视图部分,之前已经见过了;

Map:只返回模型数据,逻辑视图名会根据RequestToViewNameTranslator实现类来计算,稍候讨论;

String:只返回逻辑视图名;

void:表示该功能方法直接写出response响应(如果其他返回值类型(如Map)返回null则和void进行相同的处理);

2actionName功能方法名字;由methodNameResolver根据请求信息解析功能方法名,通过反射调用;

3、形参列表:顺序固定,“[]”表示可选,我们来看看几个示例吧:

//表示到新增页面

public ModelAndView toAdd(HttpServletRequest request, HttpServletResponse response);

//表示新增表单提交,在最后可以带着命令对象

public ModelAndView add(HttpServletRequest request, HttpServletResponse response, UserModel user);

//列表,但只返回模型数据,视图名会通过RequestToViewNameTranslator实现来计算

public Map list(HttpServletRequest request, HttpServletResponse response);

//文件下载,返回值类型为void,表示该功能方法直接写响应

public void fileDownload(HttpServletRequest request, HttpServletResponse response)

//第三个参数可以是session

public ModelAndView sessionWith(HttpServletRequest request, HttpServletResponse response, HttpSession session);

//如果第三个参数是session,那么第四个可以是命令对象,顺序必须是如下顺序

public void sessionAndCommandWith(HttpServletRequest request, HttpServletResponse response, HttpSession session, UserModel user)

4、异常处理方法,MultiActionController提供了简单的异常处理,即在请求的功能处理过程中遇到异常会交给异常处理方法进行处理,式如下所示:

public ModelAndView anyMeaningfulName(HttpServletRequest request, HttpServletResponse response, ExceptionClass exception)

MultiActionController会使用最接近的异常类型来匹配对应的异常处理方法,示例如下所示:

 

//处理PayException

public ModelAndView processPayException(HttpServletRequest request, HttpServletResponse response, PayException ex)

//处理Exception

public ModelAndView processException(HttpServletRequest request, HttpServletResponse response,  Exception ex)

4.15.3 MultiActionController类实现

类定义:public class MultiActionController extends AbstractController implements LastModified ,继承了AbstractController,并实现了LastModified接口,默认返回-1;

 

核心属性:

delegate功能处理的委托对象,即我们要调用请求处理方法所在的对象,默认是this;

methodNameResolver功能处理方法名解析器,即根据请求信息来解析需要执行的delegate的功能处理方法的方法名。

核心方法:

 

Java代码  收藏代码
  1. //判断方法是否是功能处理方法  
  2. private boolean isHandlerMethod(Method method) {  
  3.     //得到方法返回值类型  
  4.     Class returnType = method.getReturnType();  
  5.     //返回值类型必须是ModelAndView、Map、String、void中的一种,否则不是功能处理方法  
  6.     if (ModelAndView.class.equals(returnType) || Map.class.equals(returnType) || String.class.equals(returnType) ||  
  7.             void.class.equals(returnType)) {  
  8.         Class[] parameterTypes = method.getParameterTypes();  
  9.         //功能处理方法参数个数必须>=2,且第一个是HttpServletRequest类型、第二个是HttpServletResponse  
  10.         //且不能Controller接口的handleRequest(HttpServletRequest request, HttpServletResponse response),这个方法是由系统调用  
  11.         return (parameterTypes.length >= 2 &&  
  12.                 HttpServletRequest.class.equals(parameterTypes[0]) &&  
  13.                 HttpServletResponse.class.equals(parameterTypes[1]) &&  
  14.                 !("handleRequest".equals(method.getName()) && parameterTypes.length == 2));  
  15.     }  
  16.     return false;  
  17. }  

 

Java代码  收藏代码
  1. //是否是异常处理方法  
  2. private boolean isExceptionHandlerMethod(Method method) {  
  3.     //异常处理方法必须是功能处理方法 且 参数长度为3、第三个参数类型是Throwable子类  
  4.     return (isHandlerMethod(method) &&  
  5.             method.getParameterTypes().length == 3 &&  
  6.             Throwable.class.isAssignableFrom(method.getParameterTypes()[2]));  
  7. }  
Java代码  收藏代码
  1. private void registerHandlerMethods(Object delegate) {  
  2.     //缓存Map清空  
  3.     this.handlerMethodMap.clear();  
  4.     this.lastModifiedMethodMap.clear();  
  5.     this.exceptionHandlerMap.clear();  
  6.   
  7.     //得到委托对象的所有public方法  
  8.     Method[] methods = delegate.getClass().getMethods();  
  9.     for (Method method : methods) {  
  10.         //验证是否是异常处理方法,如果是放入exceptionHandlerMap缓存map  
  11.         if (isExceptionHandlerMethod(method)) {  
  12.             registerExceptionHandlerMethod(method);  
  13.         }  
  14.         //验证是否是功能处理方法,如果是放入handlerMethodMap缓存map  
  15.         else if (isHandlerMethod(method)) {  
  16.             registerHandlerMethod(method);  
  17.             registerLastModifiedMethodIfExists(delegate, method);  
  18.         }  
  19.     }  
  20. }  
Java代码  收藏代码
  1. protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)  
  2.         throws Exception {  
  3.     try {  
  4.         //1、使用methodNameResolver 方法名解析器根据请求解析到要执行的功能方法的方法名  
  5.         String methodName = this.methodNameResolver.getHandlerMethodName(request);  
  6.         //2、调用功能方法(通过反射调用,此处就粘贴代码了)  
  7.         return invokeNamedMethod(methodName, request, response);  
  8.     }  
  9.     catch (NoSuchRequestHandlingMethodException ex) {  
  10.         return handleNoSuchRequestHandlingMethod(ex, request, response);  
  11.     }  
  12. }  

 

接下来,我们看一下MultiActionController如何使用MethodNameResolver来解析请求到功能处理方法的方法名。

4.15.4 MethodNameResolver

1、InternalPathMethodNameResolver:MultiActionController的默认实现,提供从请求URL路径解析功能方法的方法名,从请求的最后一个路径(/)开始,并忽略扩展名;如请求URL是“/user/list.html”,则解析的功能处理方法名为“list”,即调用list方法。该解析器还可以指定前缀和后缀,通过prefix和suffix属性,如指定prefix=”test_”,则功能方法名将变为test_list;

 

2、ParameterMethodNameResolver:提供从请求参数解析功能处理方法的方法名,并按照如下顺序进行解析:

(1、 methodParamNames:根据请求的参数名解析功能方法名(功能方法名和参数名同名);

Java代码  收藏代码
  1. <property name="methodParamNames" value="list,create,update"/>         

  如上配置时,如果请求中含有参数名list、create、update时,则功能处理方法名为list、create、update,这种方式的可以在当一个表单有多个提交按钮时使用,不同的提交按钮名字不一样即可。

  ParameterMethodNameResolver也考虑到图片提交按钮提交问题:

    <input type="image" name="list"> 和submit类似可以提交表单,单击该图片后会发送两个参数“list.x=x轴坐标”和“list.y=y轴坐标”(如提交后会变为list.x=7&list.y=5);因此我们配置的参数名(如list)在会加上“.x” 和 “.y”进行匹配。

 

Java代码  收藏代码
  1. for (String suffix : SUBMIT_IMAGE_SUFFIXES)  {//SUBMIT_IMAGE_SUFFIXES {“.x”, “.y”}  
  2.     if (request.getParameter(name + suffix) != null) {// name是我们配置的methodParamNames  
  3.         return true;  
  4.     }  
  5. }  

 

(2、paramName:根据请求参数名的值解析功能方法名,默认的参数名是action,即请求的参数中含有“action=query”,则功能处理方法名为query;

(3、logicalMappings:逻辑功能方法名到真实功能方法名映射,如下所示:

Java代码  收藏代码
  1. <property name="logicalMappings">  
  2.     <props>  
  3.         <prop key="doList">list</prop>  
  4.     </props>  
  5. </property>  

  即如果步骤1或2解析出逻辑功能方法名为doList(逻辑的),将会被重新映射为list功能方法名(真正执行的)。

(4、defaultMethodName:默认的方法名,当以上策略失败时默认调用的方法名。

 

3、PropertiesMethodNameResolver:提供自定义的从请求URL解析功能方法的方法名,使用一组用户自定义的模式到功能方法名的映射,映射使用Properties对象存放,具体配置示例如下:

Java代码  收藏代码
  1. <bean id="propertiesMethodNameResolver"   
  2. class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">  
  3.     <property name="mappings">  
  4.         <props>  
  5.               <prop key="/create">create</prop>  
  6.               <prop key="/update">update</prop>  
  7.               <prop key="/delete">delete</prop>  
  8.               <prop key="/list">list</prop>  
  9.               <!-- 默认的行为 -->  
  10.               <prop key="/**">list</prop>  
  11.         </props>  
  12.     </property>  
  13. </bean>   

对于/create请求将调用create方法,Spring内部使用PathMatcher进行匹配(默认实现是AntPathMatcher)。

4.15.5 RequestToViewNameTranslator

用于直接将请求转换为逻辑视图名。默认实现为DefaultRequestToViewNameTranslator。

 

1、DefaultRequestToViewNameTranslator:将请求URL转换为逻辑视图名,默认规则如下:

  http://localhost:9080/web上下文/list -------> 逻辑视图名为list

  http://localhost:9080/web上下文/list.html -------> 逻辑视图名为list(默认删除扩展名)

  http://localhost:9080/web上下文/user/list.html -------> 逻辑视图名为user/list

4.15.6 示例

(1、控制器UserController

Java代码  收藏代码
  1. package cn.javass.chapter4.web.controller;  
  2. //省略import  
  3. public class UserController extends MultiActionController {  
  4.     //用户服务类  
  5.     private UserService userService;  
  6.     //逻辑视图名 通过依赖注入方式注入,可配置  
  7.     private String createView;  
  8.     private String updateView;  
  9.     private String deleteView;  
  10.     private String listView;  
  11.     private String redirectToListView;  
  12.     //省略setter/getter  
  13.   
  14.     public String create(HttpServletRequest request, HttpServletResponse response, UserModel user) {  
  15.         if("GET".equals(request.getMethod())) {  
  16.             //如果是get请求 我们转向 新增页面  
  17.             return getCreateView();  
  18.         }  
  19.         userService.create(user);  
  20.         //直接重定向到列表页面  
  21.         return getRedirectToListView();  
  22.     }  
  23.     public ModelAndView update(HttpServletRequest request, HttpServletResponse response, UserModel user) {  
  24.         if("GET".equals(request.getMethod())) {  
  25.             //如果是get请求 我们转向更新页面  
  26.             ModelAndView mv = new ModelAndView();  
  27.             //查询要更新的数据  
  28.             mv.addObject("command", userService.get(user.getUsername()));  
  29.             mv.setViewName(getUpdateView());  
  30.             return mv;  
  31.         }  
  32.         userService.update(user);  
  33.         //直接重定向到列表页面  
  34.         return new ModelAndView(getRedirectToListView());  
  35.     }  
  36.   
  37.       
  38.     public ModelAndView delete(HttpServletRequest request, HttpServletResponse response, UserModel user) {  
  39.         if("GET".equals(request.getMethod())) {  
  40.             //如果是get请求 我们转向删除页面  
  41.             ModelAndView mv = new ModelAndView();  
  42.             //查询要删除的数据  
  43.             mv.addObject("command", userService.get(user.getUsername()));  
  44.             mv.setViewName(getDeleteView());  
  45.             return mv;  
  46.         }  
  47.         userService.delete(user);  
  48.         //直接重定向到列表页面  
  49.         return new ModelAndView(getRedirectToListView());  
  50.     }     
  51.       
  52.     public ModelAndView list(HttpServletRequest request, HttpServletResponse response) {  
  53.         ModelAndView mv = new ModelAndView();  
  54.         mv.addObject("userList", userService.list());  
  55.         mv.setViewName(getListView());  
  56.         return mv;  
  57.     }  
  58.       
  59.     //如果使用委托方式,命令对象名称只能是command  
  60.     protected String getCommandName(Object command) {  
  61.         //命令对象的名字 默认command  
  62.         return "command";  
  63.     }  
  64. }  

  增删改:如果是GET请求方法,则表示到展示页面,POST请求方法表示真正的功能操作;

  getCommandName:表示是命令对象名字,默认command,对于委托对象实现方式无法改变,因此我们就使用默认的吧。

 

(2、spring配置文件chapter4-servlet.xml

 

Java代码  收藏代码
  1. <bean id="userService" class="cn.javass.chapter4.service.UserService"/>  
  2. <bean name="/user/**" class="cn.javass.chapter4.web.controller.UserController">  
  3.     <property name="userService" ref="userService"/>  
  4.     <property name="createView" value="user/create"/>  
  5.     <property name="updateView" value="user/update"/>  
  6.     <property name="deleteView" value="user/delete"/>  
  7.     <property name="listView" value="user/list"/>  
  8.     <property name="redirectToListView" value="redirect:/user/list"/>  
  9.     <!-- 使用PropertiesMethodNameResolver来解析功能处理方法名 -->         
  10.     <!--property name="methodNameResolver" ref="propertiesMethodNameResolver"/-->  
  11. </bean>  

 

  userService:用户服务类,实现业务逻辑;

  依赖注入:对于逻辑视图页面通过依赖注入方式注入,redirectToListView表示增删改成功后重定向的页面,防止重复表单提交;

  默认使用InternalPathMethodNameResolver解析请求URL到功能方法名。

 

(3、视图页面

(3.1、list页面(WEB-INF/jsp/user/list.jsp)

 

Java代码  收藏代码
  1. <a href="${pageContext.request.contextPath}/user/create">用户新增</a><br/>  
  2. <table border="1" width="50%">  
  3.    <tr>  
  4.       <th>用户名</th>  
  5.       <th>真实姓名</th>  
  6.       <th>操作</th>  
  7.    </tr>   
  8.    <c:forEach items="${userList}" var="user">  
  9.    <tr>  
  10.       <td>${user.username }</td>  
  11.       <td>${user.realname }</td>  
  12.       <td>  
  13.           <a href="${pageContext.request.contextPath}/user/update?username=${user.username}">更新</a>  
  14.           |  
  15.           <a href="${pageContext.request.contextPath}/user/delete?username=${user.username}">删除</a>  
  16.       </td>  
  17.    </tr>  
  18.    </c:forEach>     
  19. </table>  

 

(3.2、update页面(WEB-INF/jsp/user/update.jsp)

Java代码  收藏代码
  1. <form action="${pageContext.request.contextPath}/user/update" method="post">  
  2. 用户名: <input type="text" name="username" value="${command.username}"/><br/>  
  3. 真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>  
  4. <input type="submit" value="更新"/>  
  5. </form>  

(4、测试:

默认的InternalPathMethodNameResolver将进行如下解析:

http://localhost:9080/springmvc-chapter4/user/list————>list方法名;

http://localhost:9080/springmvc-chapter4/user/create————>create方法名;

http://localhost:9080/springmvc-chapter4/user/update————>update功能处理方法名;

http://localhost:9080/springmvc-chapter4/user/delete————>delete功能处理方法名。

 

我们可以将默认的InternalPathMethodNameResolver改为PropertiesMethodNameResolver

 

Java代码  收藏代码
  1. <bean id="propertiesMethodNameResolver"   
  2. class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">  
  3.     <property name="mappings">  
  4.         <props>  
  5.               <prop key="/user/create">create</prop>  
  6.               <prop key="<span style="font-size: 1em; line-height: 1.5;">/user/</span><span style="font-size: 1em; line-height: 1.5;">update">update</prop></span>  
  7.               <prop key="<span style="font-size: 1em; line-height: 1.5;">/user/</span><span style="font-size: 1em; line-height: 1.5;">delete">delete</prop></span>  
  8.               <prop key="<span style="font-size: 1em; line-height: 1.5;">/user/</span><span style="font-size: 1em; line-height: 1.5;">list">list</prop></span>  
  9.               <prop key="/**">list</prop><!-- 默认的行为 -->  
  10.           </props>  
  11.     </property>  
  12.     <property name="alwaysUseFullPath" value="false"/><!-- 不使用全路径 -->  
  13. </bean>     
  14. <bean name="/user/**" class="cn.javass.chapter4.web.controller.UserController">  
  15.        <!—省略其他配置,详见配置文件-->  
  16.        <!-- 使用PropertiesMethodNameResolver来解析功能处理方法名 -->         
  17.        <property name="methodNameResolver" ref="propertiesMethodNameResolver"/>  
  18. </bean>   

 

 /**表示默认解析到list功能处理方法。

如上配置方式可以很好的工作,但必须继承MultiActionController,Spring Web MVC提供给我们无需继承MultiActionController实现方式,即使有委托对象方式,继续往下看吧。

4.15.7、委托方式实现

(1、控制器UserDelegate

   将UserController复制一份,改名为UserDelegate,并把继承MultiActionController去掉即可,其他无需改变。

(2、spring配置文件chapter4-servlet.xml 

Java代码  收藏代码
  1. <!—委托对象-->  
  2. <bean id="userDelegate" class="cn.javass.chapter4.web.controller.UserDelegate">  
  3.    <property name="userService" ref="userService"/>  
  4.    <property name="createView" value="user2/create"/>  
  5.    <property name="updateView" value="user2/update"/>  
  6.    <property name="deleteView" value="user2/delete"/>  
  7.    <property name="listView" value="user2/list"/>  
  8.    <property name="redirectToListView" value="redirect:/user2/list"/>  
  9. </bean>  
  10. <!—控制器对象-->  
  11. <bean name="/user2/**"   
  12. class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">  
  13. <property name="delegate" ref="userDelegate"/>  
  14.     <property name="methodNameResolver" ref="parameterMethodNameResolver"/>  
  15. </bean>  

 delegate控制器对象通过delegate属性指定委托对象,即实际调用delegate委托对象的功能方法。

 methodNameResolver此处我们使用ParameterMethodNameResolver解析器;

Java代码  收藏代码
  1. <!—ParameterMethodNameResolver -->  
  2. <bean id="parameterMethodNameResolver"   
  3. class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">  
  4. <!-- 1、根据请求参数名解析功能方法名 -->  
  5.     <property name="methodParamNames" value="create,update,delete"/>  
  6.     <!-- 2、根据请求参数名的值解析功能方法名 -->  
  7.     <property name="paramName" value="action"/>  
  8. <!-- 3、逻辑方法名到真实方法名的映射 -->  
  9.     <property name="logicalMappings">  
  10.        <props>  
  11.            <prop key="doList">list</prop>  
  12.        </props>  
  13.     </property>  
  14.     <!—4、默认执行的功能处理方法 -->  
  15.     <property name="defaultMethodName" value="list"/>  
  16. </bean>     

1、methodParamNamescreate,update,delete,当请求中有参数名为这三个的将被映射为功能方法名,如“<input type="submit" name="create" value="新增"/>”提交后解析得到的功能方法名为create;

2、paramName:当请求中有参数名为action,则将值映射为功能方法名,如“<input type="hidden"name="action" value="delete"/>”,提交后解析得到的功能方法名为delete;

3、logicalMappings:逻辑功能方法名到真实功能方法名的映射,如:

    http://localhost:9080/springmvc-chapter4/user2?action=doList

    首先请求参数“action=doList”,则第二步解析得到逻辑功能方法名为doList;

    本步骤会把doList再转换为真实的功能方法名list。

4、defaultMethodName:以上步骤如果没有解析到功能处理方法名,默认执行的方法名。

 

(3、视图页面

(3.1、list页面(WEB-INF/jsp/user2/list.jsp)

Java代码  收藏代码
  1. <a href="${pageContext.request.contextPath}/user2?action=create">用户新增</a><br/>  
  2. <table border="1" width="50%">  
  3.    <tr>  
  4.       <th>用户名</th>  
  5.       <th>真实姓名</th>  
  6.       <th>操作</th>  
  7.    </tr>   
  8.    <c:forEach items="${userList}" var="user">  
  9.    <tr>  
  10.       <td>${user.username }</td>  
  11.       <td>${user.realname }</td>  
  12.       <td>  
  13.           <a href="${pageContext.request.contextPath}/user2?action=update&username=${user.username}">更新</a>  
  14.           |  
  15.           <a href="${pageContext.request.contextPath}/user2?action=delete&username=${user.username}">删除</a>  
  16.       </td>  
  17.    </tr>  
  18.    </c:forEach>     
  19. </table>   

(3.2、update页面(WEB-INF/jsp/user2/update.jsp)

Java代码  收藏代码
  1. <form action="${pageContext.request.contextPath}/user2" method="post">  
  2. <input type="hidden" name="action" value="update"/>  
  3. 用户名: <input type="text" name="username" value="${command.username}"/><br/>  
  4. 真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>  
  5. <input type="submit" value="更新"/>  
  6. </form>   

  通过参数name="action" value="update"来指定要执行的功能方法名update。

 

(3.3、create页面(WEB-INF/jsp/user2/create.jsp)

Java代码  收藏代码
  1. <form action="${pageContext.request.contextPath}/user2" method="post">  
  2. 用户名: <input type="text" name="username" value="${command.username}"/><br/>  
  3. 真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>  
  4. <input type="submit" name="create" value="新增"/>  
  5. </form>   

  通过参数name="create"来指定要执行的功能方法名create。

(4、测试:

使用ParameterMethodNameResolver将进行如下解析:

http://localhost:9080/springmvc-chapter4/user2?create      ————>create功能处理方法名(参数名映射);

http://localhost:9080/springmvc-chapter4/user2?action=create————>create功能处理方法名(参数值映射);

 

http://localhost:9080/springmvc-chapter4/user2?update      ————>update功能处理方法名;

http://localhost:9080/springmvc-chapter4/user2?action=update————>update功能处理方法名;

 

http://localhost:9080/springmvc-chapter4/user2?delete      ————>delete功能处理方法名;

http://localhost:9080/springmvc-chapter4/user2?action=delete————>delete功能处理方法名;

 

http://localhost:9080/springmvc-chapter4/user2?doList      ————>通过logicalMappings解析为list功能处理方法。

http://localhost:9080/springmvc-chapter4/user2?action=doList————>通过logicalMappings解析为list功能处理方法。

 

http://localhost:9080/springmvc-chapter4/user2————>默认的功能处理方法名list(默认)。

 

 

原创内容,转载请注明iteye http://jinnianshilongnian.iteye.com/

原文地址:http://jinnianshilongnian.iteye.com/blog/1630585

原作者:开涛

如有侵权请通知我删除!!!

JAVA技术交流群 532101200

分享到:
评论

相关推荐

    源代码下载 第五章 处理器拦截器详解——跟着开涛学SpringMVC

    NULL 博文链接:https://jinnianshilongnian.iteye.com/blog/1679570

    跟着开涛学SpringMVC

    跟着开涛学SpringMVC,很好的MVC教程,简单易懂,PDF高清版本

    SpringMvc开涛.rar

    PDF,源代码 开涛学SpringMVC 第一章源...第四章 Controller接口控制器详解 源代码下载 第五章 处理器拦截器详解——跟着开涛学SpringMVC 第六章 注解式控制器详解 第七章 注解式控制器的数据验证、类型转换及格式化

    跟着开涛学SpringMVC.pdf

    跟开涛学springmvc pdf电子文档版 适合学习springmvc 非常好的教程

    跟我学SpringMVC 教程

    第四章 Controller接口控制器详解(4) 第四章 Controller接口控制器详解(5) 第四章 Controller接口控制器详解(6) 第五章 处理器拦截器详解 第六章 注解式控制器详解 注解式控制器运行流程及处理器定义 第...

    跟开涛学 SpringMVC

    跟开涛学 SpringMVC跟开涛学 SpringMVC跟开涛学 SpringMVC跟开涛学 SpringMVC

    跟我学SpringMVC

    第四章 Controller接口控制器详解(4) 第四章 Controller接口控制器详解(5) 第四章 Controller接口控制器详解(6) 第五章 处理器拦截器详解 第六章 注解式控制器详解 注解式控制器运行流程及处理器定义 第六章 ...

    SpringMVC教程

    第四章 Controller接口控制器详解 (4).pdf 第四章 Controller接口控制器详解 (5).pdf 第四章 Controller接口控制器详解 (6).pdf 第四章 Controller接口控制器详解(7 完).pdf 第五章 处理器拦截器详解.pdf 第...

    跟开涛学SpringMVC-高清版

    跟开涛学SpringMVC-高清版,找了好久的,分享给大家。

    Spring MVC学习(四)-------Controller接口控制器详解1

    Spring MVC学习(四)-------Controller接口控制器详解1

    跟开涛学SpringMVC(4.6)Controller接

    跟开涛学SpringMVC(4.6)Controller接口控制器详解(6)Java开发Java经验技巧共10页.pdf.zip

    跟开涛学SpringMVC源代码

    跟开涛学SpringMVC源代码汇总

    跟开涛学SpringMVC

    跟开涛学SpringMVC 高清 带书签 pdf 通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText和POI。Spring MVC 框架并不知道使用的视图,所以...

    跟开涛学SpringMVC(4.3)Controller接

    跟开涛学SpringMVC(4.3)Controller接口控制器详解(3)Java开发Java经验技巧共9页.pdf.zip

    跟开涛学springmvc

    开涛写的中文springmvc开发文档 , 初学者可以下载学习,或者当做字典用。

    跟开涛学SpringMVC(5)处理器拦截器详解Java开

    跟开涛学SpringMVC(5)处理器拦截器详解Java开发Java经验技巧共13页.pdf.zip

    跟开涛学习springmvc spring 3 pdf

    跟开涛学习springmvc spring 3 pdf ,非常好的资料。我将原文档的spring合并为一份,查看更方便一些。

    SpringMVC入门——跟开涛学SpringMVC

    SpringWebMVC是一种基于Java的实现了WebMVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行...应用控制器其实拆为处理器映射器(HandlerMapping)进行处理器管理和视图解析器(ViewResolv

Global site tag (gtag.js) - Google Analytics