`
jinnianshilongnian
  • 浏览: 21433528 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2404899
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2997560
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5631379
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257540
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1593121
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248955
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5847416
Group-logo
跟我学Nginx+Lua开...
浏览量:698091
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:780408
社区版块
存档分类
最新评论

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

 
阅读更多

 

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

4.15MultiActionController

之前学过的控制器如AbstractCommandControllerSimpleFormController等一般对应一个功能处理方法(如新增),如果我要实现比如最简单的用户增删改查(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的功能处理方法的方法名。

核心方法:

 

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

 

//是否是异常处理方法
private boolean isExceptionHandlerMethod(Method method) {
    //异常处理方法必须是功能处理方法 且 参数长度为3、第三个参数类型是Throwable子类
	return (isHandlerMethod(method) &&
			method.getParameterTypes().length == 3 &&
			Throwable.class.isAssignableFrom(method.getParameterTypes()[2]));
}
private void registerHandlerMethods(Object delegate) {
    //缓存Map清空
	this.handlerMethodMap.clear();
	this.lastModifiedMethodMap.clear();
	this.exceptionHandlerMap.clear();

    //得到委托对象的所有public方法
	Method[] methods = delegate.getClass().getMethods();
	for (Method method : methods) {
        //验证是否是异常处理方法,如果是放入exceptionHandlerMap缓存map
		if (isExceptionHandlerMethod(method)) {
			registerExceptionHandlerMethod(method);
		}
        //验证是否是功能处理方法,如果是放入handlerMethodMap缓存map
		else if (isHandlerMethod(method)) {
			registerHandlerMethod(method);
			registerLastModifiedMethodIfExists(delegate, method);
		}
	}
}
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
		throws Exception {
	try {
        //1、使用methodNameResolver 方法名解析器根据请求解析到要执行的功能方法的方法名
		String methodName = this.methodNameResolver.getHandlerMethodName(request);
        //2、调用功能方法(通过反射调用,此处就粘贴代码了)
		return invokeNamedMethod(methodName, request, response);
	}
	catch (NoSuchRequestHandlingMethodException ex) {
		return handleNoSuchRequestHandlingMethod(ex, request, response);
	}
}

 

接下来,我们看一下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:根据请求的参数名解析功能方法名(功能方法名和参数名同名);

<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”进行匹配。

 

for (String suffix : SUBMIT_IMAGE_SUFFIXES)  {//SUBMIT_IMAGE_SUFFIXES {“.x”, “.y”}
    if (request.getParameter(name + suffix) != null) {// name是我们配置的methodParamNames
        return true;
    }
}

 

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

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

       <property name="logicalMappings">
           <props>
               <prop key="doList">list</prop>
           </props>
       </property>

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

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

 

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

<bean id="propertiesMethodNameResolver" 
class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
    <property name="mappings">
        <props>
              <prop key="/create">create</prop>
              <prop key="/update">update</prop>
              <prop key="/delete">delete</prop>
              <prop key="/list">list</prop>
              <!-- 默认的行为 -->
              <prop key="/**">list</prop>
        </props>
    </property>
</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

package cn.javass.chapter4.web.controller;
//省略import
public class UserController extends MultiActionController {
    //用户服务类
	private UserService userService;
	//逻辑视图名 通过依赖注入方式注入,可配置
	private String createView;
	private String updateView;
	private String deleteView;
	private String listView;
	private String redirectToListView;
	//省略setter/getter

	public String create(HttpServletRequest request, HttpServletResponse response, UserModel user) {
		if("GET".equals(request.getMethod())) {
			//如果是get请求 我们转向 新增页面
			return getCreateView();
		}
		userService.create(user);
		//直接重定向到列表页面
		return getRedirectToListView();
	}
	public ModelAndView update(HttpServletRequest request, HttpServletResponse response, UserModel user) {
		if("GET".equals(request.getMethod())) {
			//如果是get请求 我们转向更新页面
			ModelAndView mv = new ModelAndView();
			//查询要更新的数据
			mv.addObject("command", userService.get(user.getUsername()));
			mv.setViewName(getUpdateView());
			return mv;
		}
		userService.update(user);
		//直接重定向到列表页面
		return new ModelAndView(getRedirectToListView());
	}

	
	public ModelAndView delete(HttpServletRequest request, HttpServletResponse response, UserModel user) {
		if("GET".equals(request.getMethod())) {
			//如果是get请求 我们转向删除页面
			ModelAndView mv = new ModelAndView();
			//查询要删除的数据
			mv.addObject("command", userService.get(user.getUsername()));
			mv.setViewName(getDeleteView());
			return mv;
		}
		userService.delete(user);
		//直接重定向到列表页面
		return new ModelAndView(getRedirectToListView());
	}	
	
	public ModelAndView list(HttpServletRequest request, HttpServletResponse response) {
		ModelAndView mv = new ModelAndView();
		mv.addObject("userList", userService.list());
		mv.setViewName(getListView());
		return mv;
	}
	
	//如果使用委托方式,命令对象名称只能是command
	protected String getCommandName(Object command) {
		//命令对象的名字 默认command
		return "command";
	}
}

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

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

 

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

 

   <bean id="userService" class="cn.javass.chapter4.service.UserService"/>
   <bean name="/user/**" class="cn.javass.chapter4.web.controller.UserController">
       <property name="userService" ref="userService"/>
       <property name="createView" value="user/create"/>
       <property name="updateView" value="user/update"/>
       <property name="deleteView" value="user/delete"/>
       <property name="listView" value="user/list"/>
       <property name="redirectToListView" value="redirect:/user/list"/>
       <!-- 使用PropertiesMethodNameResolver来解析功能处理方法名 -->       
       <!--property name="methodNameResolver" ref="propertiesMethodNameResolver"/-->
   </bean>

 

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

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

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

 

3、视图页面

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

 

<a href="${pageContext.request.contextPath}/user/create">用户新增</a><br/>
<table border="1" width="50%">
   <tr>
      <th>用户名</th>
      <th>真实姓名</th>
      <th>操作</th>
   </tr> 
   <c:forEach items="${userList}" var="user">
   <tr>
      <td>${user.username }</td>
      <td>${user.realname }</td>
      <td>
          <a href="${pageContext.request.contextPath}/user/update?username=${user.username}">更新</a>
          |
          <a href="${pageContext.request.contextPath}/user/delete?username=${user.username}">删除</a>
      </td>
   </tr>
   </c:forEach>   
</table>

 

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

<form action="${pageContext.request.contextPath}/user/update" method="post">
用户名: <input type="text" name="username" value="${command.username}"/><br/>
真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>
<input type="submit" value="更新"/>
</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

 

<bean id="propertiesMethodNameResolver" 
class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
    <property name="mappings">
        <props>
              <prop key="/user/create">create</prop>
              <prop key="/user/update">update</prop>
              <prop key="/user/delete">delete</prop>
              <prop key="/user/list">list</prop>
              <prop key="/**">list</prop><!-- 默认的行为 -->
          </props>
    </property>
    <property name="alwaysUseFullPath" value="false"/><!-- 不使用全路径 -->
</bean>   
<bean name="/user/**" class="cn.javass.chapter4.web.controller.UserController">
       <!—省略其他配置,详见配置文件-->
       <!-- 使用PropertiesMethodNameResolver来解析功能处理方法名 -->       
       <property name="methodNameResolver" ref="propertiesMethodNameResolver"/>
</bean> 

 

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

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

4.15.7、委托方式实现

1、控制器UserDelegate

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

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

<!—委托对象-->
<bean id="userDelegate" class="cn.javass.chapter4.web.controller.UserDelegate">
   <property name="userService" ref="userService"/>
   <property name="createView" value="user2/create"/>
   <property name="updateView" value="user2/update"/>
   <property name="deleteView" value="user2/delete"/>
   <property name="listView" value="user2/list"/>
   <property name="redirectToListView" value="redirect:/user2/list"/>
</bean>
<!—控制器对象-->
<bean name="/user2/**" 
class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
<property name="delegate" ref="userDelegate"/>
    <property name="methodNameResolver" ref="parameterMethodNameResolver"/>
</bean>

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

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

<!—ParameterMethodNameResolver -->
<bean id="parameterMethodNameResolver" 
class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<!-- 1、根据请求参数名解析功能方法名 -->
    <property name="methodParamNames" value="create,update,delete"/>
    <!-- 2、根据请求参数名的值解析功能方法名 -->
    <property name="paramName" value="action"/>
<!-- 3、逻辑方法名到真实方法名的映射 -->
    <property name="logicalMappings">
       <props>
           <prop key="doList">list</prop>
       </props>
    </property>
    <!—4、默认执行的功能处理方法 -->
    <property name="defaultMethodName" value="list"/>
</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)

<a href="${pageContext.request.contextPath}/user2?action=create">用户新增</a><br/>
<table border="1" width="50%">
   <tr>
      <th>用户名</th>
      <th>真实姓名</th>
      <th>操作</th>
   </tr> 
   <c:forEach items="${userList}" var="user">
   <tr>
      <td>${user.username }</td>
      <td>${user.realname }</td>
      <td>
          <a href="${pageContext.request.contextPath}/user2?action=update&username=${user.username}">更新</a>
          |
          <a href="${pageContext.request.contextPath}/user2?action=delete&username=${user.username}">删除</a>
      </td>
   </tr>
   </c:forEach>   
</table> 

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

<form action="${pageContext.request.contextPath}/user2" method="post">
<input type="hidden" name="action" value="update"/>
用户名: <input type="text" name="username" value="${command.username}"/><br/>
真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>
<input type="submit" value="更新"/>
</form> 

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

 

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

<form action="${pageContext.request.contextPath}/user2" method="post">
用户名: <input type="text" name="username" value="${command.username}"/><br/>
真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>
<input type="submit" name="create" value="新增"/>
</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/

 

35
22
分享到:
评论
38 楼 chenyyll1025 2017-04-06  
一个form里面有多个sumbit如何实现?例如,按照你的例子举例:
<form action="${pageContext.request.contextPath}/user2" method="post">    
<input type="hidden" name="action" value="update"/>    
用户名: <input type="text" name="username" value="${command.username}"/><br/>    
真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>    
<input type="submit" value="操作1"/>    
<input type="submit" value="操作2"/>    
<input type="submit" value="操作3"/>    
</form>  


老师,可用参数名映射方式满足该需求,如下:
<form action="${pageContext.request.contextPath}/user2" method="post">    
<input type="hidden" name="action" value="update"/>    
用户名: <input type="text" name="username" value="${command.username}"/><br/>    
真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>    
<input type="submit" [i]name="method1"[/i] value="操作1"/>    
<input type="submit" [i]name="method2"[/i] value="操作2"/>    
<input type="submit" [i]name="method3"[/i] value="操作3"/>    
</form>
37 楼 woohuu 2015-11-20  
好文章,随然很多,看着有点杂,但是自己还是全部跑了一遍,很有用,感谢tao哥分享
36 楼 baileibailei 2015-08-05  
确实控制器讲太多了点。
不过很不错,每个例子我都自己跑了一遍
35 楼 redcoatjk 2015-03-04  
lwkjob 写道
jinnianshilongnian 写道
lwkjob 写道
<bean id="userService" class="cn.javass.chapter4.service.UserService"/>  
<bean name="/user/**" class="cn.javass.chapter4.web.controller.UserController">  
    <property name="userService" ref="userService"/>  
    <property name="createView" value="user/create"/>  
    <property name="updateView" value="user/update"/>  
    <property name="deleteView" value="user/delete"/>  
    <property name="listView" value="user/list"/>  
    <property name="redirectToListView" value="redirect:/user/list"/>  
    <!-- 使用PropertiesMethodNameResolver来解析功能处理方法名 -->      
[color=red]<!--启用-->   [/color]
    <property name="methodNameResolver" ref="propertiesMethodNameResolver"/>  
</bean>  


请问:怎么访问这个的demo啊?
http://localhost:8080/springmvc-chapter4/user/create 这样访问不到

代码和文章有点出入 请参考文章内容 对比小

噢 改好了谢谢!

我就说嘛. 还以为默认配置后面会自动加view...
34 楼 王巧巧 2015-03-02  
在14.5.4下面的3的配置文件中,有一个语句是这样的
<!--默认的行为>
<prop key="/**">list</prop>
这个默认的行为是指什么呢?我测试了下,用user/fsfsfs就会出错,但是用user/create/delete(/**可以匹配两层子目录)就会到delete页面,那到底什么时候才会执行这个默认的语句呢?
33 楼 王巧巧 2015-03-02  
这个页面多处有问题,右侧溢出。。。
32 楼 redcoatjk 2015-02-28  
越来越看不下去了.. 蛋疼.晕了
31 楼 dogga 2014-10-19  
chengang292214 写道
MultiActioncontroller 使用PropertiesMethodNameResolver的问题,http://localhost:9080/springmvc_0400_controller_before2.5/user/create 这样映射不到create方法上,没有匹配到,所有create update delete都是跑到list界面。

我没看过框架源代码,我觉得不管采用什么MethodNameResolver吧,这个只是请求到方法的映射, 但不管怎样,要定位方法,你首先要定位到方法所在的controller吧,MultiActionController 的name定义为/user/**, /user/create,定位到controller的create方法上没问题吧。

现在我想问问MultiActioncontroller使用PropertiesMethodNameResolver还需要加其他配置么?
从我上面说的先定位到controller,然后才定位到method的话
<property name="alwaysUseFullPath" value="false"/> 回复里提到的配置我不知道有什么意义。 我现在的情况是使用全路径,匹配不到controller的create方法

30 楼 chengang292214 2013-12-24  
MultiActioncontroller 使用PropertiesMethodNameResolver的问题,http://localhost:9080/springmvc_0400_controller_before2.5/user/create 这样映射不到create方法上,没有匹配到,所有create update delete都是跑到list界面。

我没看过框架源代码,我觉得不管采用什么MethodNameResolver吧,这个只是请求到方法的映射, 但不管怎样,要定位方法,你首先要定位到方法所在的controller吧,MultiActionController 的name定义为/user/**, /user/create,定位到controller的create方法上没问题吧。

现在我想问问MultiActioncontroller使用PropertiesMethodNameResolver还需要加其他配置么?
从我上面说的先定位到controller,然后才定位到method的话
<property name="alwaysUseFullPath" value="false"/> 回复里提到的配置我不知道有什么意义。 我现在的情况是使用全路径,匹配不到controller的create方法
29 楼 haole 2013-11-29  
jinnianshilongnian 写道
haole 写道
一个form里面有多个sumbit如何实现?例如,按照你的例子举例:
<form action="${pageContext.request.contextPath}/user2" method="post">  
<input type="hidden" name="action" value="update"/>  
用户名: <input type="text" name="username" value="${command.username}"/><br/>  
真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>  
<input type="submit" value="操作1"/>  
<input type="submit" value="操作2"/>  
<input type="submit" value="操作3"/>  
</form>


这种需求应该很常见,请问如何实现?

这种情况 就需要自己js控制了


我感觉这方面,还是struts1实现的比较好
28 楼 haole 2013-11-29  
jinnianshilongnian 写道
haole 写道
一个form里面有多个sumbit如何实现?例如,按照你的例子举例:
<form action="${pageContext.request.contextPath}/user2" method="post">  
<input type="hidden" name="action" value="update"/>  
用户名: <input type="text" name="username" value="${command.username}"/><br/>  
真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>  
<input type="submit" value="操作1"/>  
<input type="submit" value="操作2"/>  
<input type="submit" value="操作3"/>  
</form>


这种需求应该很常见,请问如何实现?

这种情况 就需要自己js控制了


谢谢
27 楼 jinnianshilongnian 2013-11-29  
haole 写道
一个form里面有多个sumbit如何实现?例如,按照你的例子举例:
<form action="${pageContext.request.contextPath}/user2" method="post">  
<input type="hidden" name="action" value="update"/>  
用户名: <input type="text" name="username" value="${command.username}"/><br/>  
真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>  
<input type="submit" value="操作1"/>  
<input type="submit" value="操作2"/>  
<input type="submit" value="操作3"/>  
</form>


这种需求应该很常见,请问如何实现?

这种情况 就需要自己js控制了
26 楼 haole 2013-11-29  
一个form里面有多个sumbit如何实现?例如,按照你的例子举例:
<form action="${pageContext.request.contextPath}/user2" method="post">  
<input type="hidden" name="action" value="update"/>  
用户名: <input type="text" name="username" value="${command.username}"/><br/>  
真实姓名:<input type="text" name="realname" value="${command.realname}"/><br/>  
<input type="submit" value="操作1"/>  
<input type="submit" value="操作2"/>  
<input type="submit" value="操作3"/>  
</form>


这种需求应该很常见,请问如何实现?
25 楼 jimmy_sir 2013-11-22  
我仔细的把第四章Controller的这些文章看了,我觉得这些几篇写的挺好的。
大家反映不怎么强烈,也许是因为都在用注释了,耐不住心看这些,然后觉得看的不明白吧。
tao哥辛苦了,赞一个
24 楼 jinnianshilongnian 2013-07-29  
chengang292214 写道
首先,肯定 你技术上很不错,能写这些东西算是摸清了很多底层。不过有些许建议.
(1)技术文章.
你可以先模仿一些别人写技术书的方式,其实外面很多技术书,讲解技术的时候做法基本很相似的. 至于你springmvc,前面那个写web上技术的一些发展,那里写的东西就说的比较有条理,很多web书籍,在讲这方面也差不多是这样讲的.至于后面介绍那些很多控制器的,感觉越看下去越摸不清头绪;
(2)我感觉很多技术文章,也不算是入门级别的吧,其实讲技术的东西,我觉得不一定非的拿很多源码来讲,毕竟我觉得对于一个不到3年工作经验的人来说,也许很多人没有研究过源码,也不一定能看懂.网上很多博客上面那些文章,也有写得不错的,也没拿源码来说说.
(3)你写东西的时候,有些话可以说简单点,呵呵,我看起来有时候觉得好绕,不知道其他网友有没有这感觉,mvc的东西其实基本上的东西就是那些方面,很容器和struts2进行对比。比如参数绑定 异常处理 类型转换 输入校检 国际化等等. 在看控制器的时候,请求映射到功能处理方法名字。。。,感觉简化点,简单点不更好吗? 将url请求映射到controller的方法级别上,这样说感觉不那么绕,呵呵.
最后,感觉开涛写这么不错的文章,我虽然都用的struts2,就跟着你的这文章看springmvc的,看到控制器这里就看的晕了,哈哈

第四章这些,遗留控制器这块 其实是败笔,完全可以忽略,目前开发基本没用的(当时为了考虑还有用的,其实应该有取舍,当时是什么都想写 ),缓存那块可以看看。估计反映都是出在第四章。

对于一些概念,你说的很对,以后写会注意的;非常感谢提建议;以后会注意,得有取舍。
23 楼 chengang292214 2013-07-29  
首先,肯定 你技术上很不错,能写这些东西算是摸清了很多底层。不过有些许建议.
(1)技术文章.
你可以先模仿一些别人写技术书的方式,其实外面很多技术书,讲解技术的时候做法基本很相似的. 至于你springmvc,前面那个写web上技术的一些发展,那里写的东西就说的比较有条理,很多web书籍,在讲这方面也差不多是这样讲的.至于后面介绍那些很多控制器的,感觉越看下去越摸不清头绪;
(2)我感觉很多技术文章,也不算是入门级别的吧,其实讲技术的东西,我觉得不一定非的拿很多源码来讲,毕竟我觉得对于一个不到3年工作经验的人来说,也许很多人没有研究过源码,也不一定能看懂.网上很多博客上面那些文章,也有写得不错的,也没拿源码来说说.
(3)你写东西的时候,有些话可以说简单点,呵呵,我看起来有时候觉得好绕,不知道其他网友有没有这感觉,mvc的东西其实基本上的东西就是那些方面,很容器和struts2进行对比。比如参数绑定 异常处理 类型转换 输入校检 国际化等等. 在看控制器的时候,请求映射到功能处理方法名字。。。,感觉简化点,简单点不更好吗? 将url请求映射到controller的方法级别上,这样说感觉不那么绕,呵呵.
最后,感觉开涛写这么不错的文章,我虽然都用的struts2,就跟着你的这文章看springmvc的,看到控制器这里就看的晕了,哈哈
22 楼 lwkjob 2013-05-07  
jinnianshilongnian 写道
lwkjob 写道
<bean id="userService" class="cn.javass.chapter4.service.UserService"/>  
<bean name="/user/**" class="cn.javass.chapter4.web.controller.UserController">  
    <property name="userService" ref="userService"/>  
    <property name="createView" value="user/create"/>  
    <property name="updateView" value="user/update"/>  
    <property name="deleteView" value="user/delete"/>  
    <property name="listView" value="user/list"/>  
    <property name="redirectToListView" value="redirect:/user/list"/>  
    <!-- 使用PropertiesMethodNameResolver来解析功能处理方法名 -->      
[color=red]<!--启用-->   [/color]
    <property name="methodNameResolver" ref="propertiesMethodNameResolver"/>  
</bean>  


请问:怎么访问这个的demo啊?
http://localhost:8080/springmvc-chapter4/user/create 这样访问不到

代码和文章有点出入 请参考文章内容 对比小

噢 改好了谢谢!
21 楼 jinnianshilongnian 2013-05-07  
lwkjob 写道
<bean id="userService" class="cn.javass.chapter4.service.UserService"/>  
<bean name="/user/**" class="cn.javass.chapter4.web.controller.UserController">  
    <property name="userService" ref="userService"/>  
    <property name="createView" value="user/create"/>  
    <property name="updateView" value="user/update"/>  
    <property name="deleteView" value="user/delete"/>  
    <property name="listView" value="user/list"/>  
    <property name="redirectToListView" value="redirect:/user/list"/>  
    <!-- 使用PropertiesMethodNameResolver来解析功能处理方法名 -->      
[color=red]<!--启用-->   [/color]
    <property name="methodNameResolver" ref="propertiesMethodNameResolver"/>  
</bean>  


请问:怎么访问这个的demo啊?
http://localhost:8080/springmvc-chapter4/user/create 这样访问不到

代码和文章有点出入 请参考文章内容 对比小
20 楼 lwkjob 2013-05-07  
<bean id="userService" class="cn.javass.chapter4.service.UserService"/>  
<bean name="/user/**" class="cn.javass.chapter4.web.controller.UserController">  
    <property name="userService" ref="userService"/>  
    <property name="createView" value="user/create"/>  
    <property name="updateView" value="user/update"/>  
    <property name="deleteView" value="user/delete"/>  
    <property name="listView" value="user/list"/>  
    <property name="redirectToListView" value="redirect:/user/list"/>  
    <!-- 使用PropertiesMethodNameResolver来解析功能处理方法名 -->      
[color=red]<!--启用-->   [/color]
    <property name="methodNameResolver" ref="propertiesMethodNameResolver"/>  
</bean>  


请问:怎么访问这个的demo啊?
http://localhost:8080/springmvc-chapter4/user/create 这样访问不到
19 楼 jinnianshilongnian 2013-02-01  
yumingtao 写道
jinnianshilongnian 写道
修正

在PropertiesMethodNameResolver 加上
<property name="alwaysUseFullPath" value="false"/><!-- 不使用全路径 -->

否则就是全路径匹配,即需要
/user/create
/user/update
……

非常感谢guochaojun指正


我在spring3.2.0中测试,加上<property name="alwaysUseFullPath" value="false"/>还是没有效果,必须用
/user/create
/user/update
....
求解

看了下源代码 此处语义是没有改的,建议先试试3.1 如果成功 再试试3.2

相关推荐

    源代码下载 第五章 处理器拦截器详解——跟着开涛学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