Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
后端镜像
java镜像
Springside4
提交
c283ba11
S
Springside4
项目概览
后端镜像
/
java镜像
/
Springside4
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
Springside4
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c283ba11
编写于
7月 27, 2012
作者:
C
Calvin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
#59 再次泪流满面,终于有一个彻底满意的写法.
上级
dc0578ab
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
34 addition
and
71 deletion
+34
-71
examples/quickstart/src/main/java/org/springside/examples/quickstart/web/TaskController.java
...rg/springside/examples/quickstart/web/TaskController.java
+17
-6
examples/quickstart/src/main/webapp/WEB-INF/spring-mvc.xml
examples/quickstart/src/main/webapp/WEB-INF/spring-mvc.xml
+1
-6
examples/showcase/src/main/java/org/springside/examples/showcase/common/web/UserController.java
...ringside/examples/showcase/common/web/UserController.java
+15
-2
examples/showcase/src/main/webapp/WEB-INF/spring-mvc.xml
examples/showcase/src/main/webapp/WEB-INF/spring-mvc.xml
+1
-6
modules/core/src/main/java/org/springside/modules/web/springmvc/OptionalPathVariable.java
...pringside/modules/web/springmvc/OptionalPathVariable.java
+0
-21
modules/core/src/main/java/org/springside/modules/web/springmvc/OptionalPathVariableMethodArgumentResolver.java
...springmvc/OptionalPathVariableMethodArgumentResolver.java
+0
-30
未找到文件。
examples/quickstart/src/main/java/org/springside/examples/quickstart/web/TaskController.java
浏览文件 @
c283ba11
...
...
@@ -5,13 +5,15 @@ import java.util.List;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.ui.Model
;
import
org.springframework.web.bind.WebDataBinder
;
import
org.springframework.web.bind.annotation.InitBinder
;
import
org.springframework.web.bind.annotation.ModelAttribute
;
import
org.springframework.web.bind.annotation.PathVariable
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.servlet.mvc.support.RedirectAttributes
;
import
org.springside.examples.quickstart.entity.Task
;
import
org.springside.examples.quickstart.service.TaskManager
;
import
org.springside.modules.web.springmvc.OptionalPathVariable
;
/**
* Task管理的Controller, 使用Restful风格的Urls:
...
...
@@ -53,7 +55,8 @@ public class TaskController {
}
@RequestMapping
(
value
=
"update/{id}"
)
public
String
updateForm
(
Model
model
)
{
public
String
updateForm
(
@PathVariable
(
"id"
)
Long
id
,
Model
model
)
{
model
.
addAttribute
(
"task"
,
taskManager
.
getTask
(
id
));
return
"taskForm"
;
}
...
...
@@ -72,14 +75,22 @@ public class TaskController {
}
/**
* 使用@ModelAttribute, 实现Struts2 Preparable二次绑定的效果,先根据
url中
的id从数据库查出Task对象,再把Form提交的内容绑定到该对象上。
*
本方法仅用于updateForm()/update(),其他方法的url不存在id,因此使用了@OptionalPathVariable。
* 使用@ModelAttribute, 实现Struts2 Preparable二次绑定的效果,先根据
form
的id从数据库查出Task对象,再把Form提交的内容绑定到该对象上。
*
因为仅update()方法的form中有id属性,因此本方法在该方法中执行.
*/
@ModelAttribute
(
"task"
)
p
ublic
Task
getTask
(
@OptionalPathVariable
(
"id"
)
Long
id
)
{
p
rivate
Task
getTask
(
@RequestParam
(
value
=
"id"
,
required
=
false
)
Long
id
)
{
if
(
id
!=
null
)
{
return
taskManager
.
getTask
(
Long
.
valueOf
(
id
)
);
return
taskManager
.
getTask
(
id
);
}
return
null
;
}
/**
* 不要绑定对象中的id属性.
*/
@InitBinder
protected
void
initBinder
(
WebDataBinder
binder
)
{
binder
.
setDisallowedFields
(
"id"
);
}
}
examples/quickstart/src/main/webapp/WEB-INF/spring-mvc.xml
浏览文件 @
c283ba11
...
...
@@ -12,12 +12,7 @@
<context:include-filter
type=
"annotation"
expression=
"org.springframework.stereotype.Controller"
/>
</context:component-scan>
<!-- 在spring mvc 标准annotation基础上,增加了@OptionalPathVariable -->
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean
class=
" org.springside.modules.web.springmvc.OptionalPathVariableMethodArgumentResolver"
/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
...
...
examples/showcase/src/main/java/org/springside/examples/showcase/common/web/UserController.java
浏览文件 @
c283ba11
...
...
@@ -8,12 +8,14 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Controller
;
import
org.springframework.ui.Model
;
import
org.springframework.validation.BindingResult
;
import
org.springframework.web.bind.WebDataBinder
;
import
org.springframework.web.bind.annotation.InitBinder
;
import
org.springframework.web.bind.annotation.ModelAttribute
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.servlet.mvc.support.RedirectAttributes
;
import
org.springside.examples.showcase.common.entity.User
;
import
org.springside.examples.showcase.common.service.AccountManager
;
import
org.springside.modules.web.springmvc.OptionalPathVariable
;
import
com.google.common.collect.Lists
;
...
...
@@ -50,12 +52,23 @@ public class UserController {
return
"redirect:/common/user/"
;
}
/**
* 使用@ModelAttribute, 实现Struts2 Preparable二次绑定的效果,先根据form的id从数据库查出User对象,再把Form提交的内容绑定到该对象上。
* 因为仅update()方法的form中有id属性,因此本方法在该方法中执行.
*/
@ModelAttribute
(
"user"
)
p
ublic
User
getAccount
(
@OptionalPathVariable
(
"id"
)
Long
id
)
{
p
rivate
User
getUser
(
@RequestParam
(
value
=
"id"
,
required
=
false
)
Long
id
)
{
if
(
id
!=
null
)
{
return
accountManager
.
getUser
(
id
);
}
return
null
;
}
/**
* 不要绑定对象中的id属性.
*/
@InitBinder
protected
void
initBinder
(
WebDataBinder
binder
)
{
binder
.
setDisallowedFields
(
"id"
);
}
}
examples/showcase/src/main/webapp/WEB-INF/spring-mvc.xml
浏览文件 @
c283ba11
...
...
@@ -12,12 +12,7 @@
<context:include-filter
type=
"annotation"
expression=
"org.springframework.stereotype.Controller"
/>
</context:component-scan>
<!-- 在spring mvc 标准annotation基础上,增加了@OptionalPathVariable -->
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean
class=
" org.springside.modules.web.springmvc.OptionalPathVariableMethodArgumentResolver"
/>
</mvc:argument-resolvers>
</mvc:annotation-driven>
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
...
...
modules/core/src/main/java/org/springside/modules/web/springmvc/OptionalPathVariable.java
已删除
100644 → 0
浏览文件 @
dc0578ab
package
org.springside.modules.web.springmvc
;
import
java.lang.annotation.Documented
;
import
java.lang.annotation.ElementType
;
import
java.lang.annotation.Retention
;
import
java.lang.annotation.RetentionPolicy
;
import
java.lang.annotation.Target
;
/**
* 用于标注不一定存在的PathVarible. 主要用于无@RequestMapping定义, 只有方法级@ModelAttribute标注的函数的参数。
*
* @author calvin
*/
@Target
(
ElementType
.
PARAMETER
)
@Retention
(
RetentionPolicy
.
RUNTIME
)
@Documented
public
@interface
OptionalPathVariable
{
/** The URI template variable to bind to. */
String
value
()
default
""
;
}
modules/core/src/main/java/org/springside/modules/web/springmvc/OptionalPathVariableMethodArgumentResolver.java
已删除
100644 → 0
浏览文件 @
dc0578ab
package
org.springside.modules.web.springmvc
;
import
org.springframework.core.MethodParameter
;
import
org.springframework.web.bind.annotation.ValueConstants
;
import
org.springframework.web.servlet.mvc.method.annotation.PathVariableMethodArgumentResolver
;
/**
* 用于标注不一定存在的PathVarible. 主要用于无@RequestMapping定义, 只有方法级@ModelAttribute标注的函数的参数。
*
* @author calvin
*/
public
class
OptionalPathVariableMethodArgumentResolver
extends
PathVariableMethodArgumentResolver
{
@Override
public
boolean
supportsParameter
(
MethodParameter
parameter
)
{
return
parameter
.
hasParameterAnnotation
(
OptionalPathVariable
.
class
);
}
@Override
protected
NamedValueInfo
createNamedValueInfo
(
MethodParameter
parameter
)
{
OptionalPathVariable
annotation
=
parameter
.
getParameterAnnotation
(
OptionalPathVariable
.
class
);
return
new
PathVariableNamedValueInfo
(
annotation
);
}
private
static
class
PathVariableNamedValueInfo
extends
NamedValueInfo
{
private
PathVariableNamedValueInfo
(
OptionalPathVariable
annotation
)
{
//设定required为false
super
(
annotation
.
value
(),
false
,
ValueConstants
.
DEFAULT_NONE
);
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录