需求:通过点击 index.jsp 页面的 show 按钮,在list.jsp页面显示所有 entity.(对应请求为 GET)
可以在 list.jsp 页面点击 ADD 到 input.jsp 页面进行添加 entity 操作.
可以在 list.jsp 页面对每个 entity 进行 DELETE 操作.
可以在 list.jsp 通过点击修改按钮 进入 input.jsp 页面. 此时的input.jsp 页面需要回显,并完成修改操作
一. 显示所有 User(entity).
编写 entity User , 属性为 Integer id , String userName , String password. 并给出对应 set ,get 方法
编写 UserDao , 方法包括: getAll(), get(), save() , delete(). 用 @Repository 修饰类.
save() 方法说明: 此方法应该包含 Update 功能, 当传入的 User 有 id 的时候为save 否则为 Update.
由于没有数据库,采用静态块在项目启动的时候创建一个 Map 充当数据库.
静态代码块 such as:
<code>
private staict Integer id = 0;
pirvate staict Map<Integer,User> map;
staict{
map.put(id,new User(id++,"AA","aa"));
etc.
}
</code>
注入 handler 私有成员 UserDao 并用 @Autowired 标识.
编写 handler 的
show 方法. method 为
GET such as: @RequestMapping(value="/show",method=RequestMethod.GET)
通过 UserDao 方法获取全部 User 放去 map.返回 list.
二.添加一个 User
利用 a 标签到一个 handler 方法
uri 为user method 为 GET
new 一个 user 放入 map (four chapter hava explain)
返回 input
为 handler 添加一个方法
input , method 为 POST 相应 uri 为 /user
调用 UserDao.save() 方法.
返回 redirect:/show. (调用 show 方法).
注:后有补充。修改也应用 input 页面
三.删除一个 User
前提:
form 表单 method 属性没有 值为 DELETE 和 PUT 请求。
所以从浏览器发送过来的请求只有 POST 和 GET 两种请求。
spirngmvc 可以配置一个 filter 来将 POST 请求转为 DELETE 请求或者是 PUT 请求。
在 web.xml 中加入 org.springframework.web.filter.HiddenHttpMethodFilter
<filter>
<filter-name> hiddenHttpMethodFilter</filter-name >
<filter-class> org.springframework.web.filter.HiddenHttpMethodFilter</filter-class >
</filter>
<filter-mapping>
<filter-name> hiddenHttpMethodFilter</filter-name >
<url-pattern> /*</ url-pattern>
</filter-mapping>
然后我们只需要在form表单增加一个 hidden 类型的 input ,mame 值为 _method value 的可选值一般为 : DELETE PUT;
即可通过 HiddenHttpMethodFilter 拦截器将 method 方法改为 DELETE or PUT ,(注意:此时的 request 并不是原生的 request 了. 可以通过在方法的参数中传入 requst 用getClass.getName(),方法得知.这是一个被包装过的 request)
还需处理的一件事:
DELETE 操作一般为一对 a 标签来完成, a 标签并不具备 method 属性. So,可以采用 JQ . 利用 JQ 来触发一个 from 的提交.
such as:
<a class="delete" href="user/${user.id}">Delete</a>
<form action="" method="POST">
<input type="hidden" name="_method" value="DELETE"/>
</form>
<script type="text/javascript">
$(function(){
$(".delete").click(function(){
var href = $(this).attr("href");
$("form").attr("action", href).submit();
return false;
});
})
</script>
正文:
编写 handler 的 Dle 方法,
method 为 DELETE uri 为 /user/{id}.
获取 id 的注解在 三.handler 方法常用注解与map
调用 userDao.delete(),方法,
返回 redirect:/show
发现错误:
错误: JQ 不好用.
错误原因: jq 静态资源文件被 springmvc 给拦截了. 因为没有给出处理方法.
解决办法: springmvc 为我们提供了默认的 servlet 来处理静态资源文件(参加 一:springmvc配置)
<
mvc:default-servlet-handler
/>
配置完成后在 jsp 页面查看源代码,点击 jq 的连接的确可以看到 jq 的代码.
然而发现所有请求都不好使了.解决办法是在 springmvc.xml 中在添加一个配置
<
mvc:annotation-driven
></
mvc:annotation-driven
>
四:更改一个 User
在页面中写一对 a 标签用来转到 input.jsp 页面.因为需要修改我们需要回显.
所以必须经过 handler 来获取 User 的信息.
<a href="user/${user.id}">Edit</a>
handler 中编写一个 input 方法来处理这个请求
uri 为/user/{id} mechod 为 GET
根据 id 用 userDao 获取 user 放入 map 返回 input
二的补充:关于input.jsp
根据传进来的 user 的 id 来判断这是需要修改的还是新加的,可以使用 springmvc 提供的 form 标签 其中 path 与 普通标签的 name 大致相同.
这也就是为什么添加操作转向 input 页面需要 new 一个新的 user 的原因. 因为 input 页面需要 user 的 id 来判断是修改操作还是添加操作.
有些时候我们希望某些字段要隐藏(比如 user 的密码不能被修改.当然也不能说放入 hidden 里面,查看源代码还是可以看到密码,不安全,所以页面上是不可以有這个值的)不给页面实现,如果這样那么传回来的 user 会少某些字段,這样我们做更新操作的时候,会把這个字段更新为空,这是一个错误的结果,处理办法是 springmvc 给我们提供了一个注解.@ModeAttribute.
被 @ModeAttribute 注解的方法会在请求方法(被@RequestMapping注释的方法)之前调用,当這个被 @RequestMapping 注解的方法参数中有被 @ModeAttribute 注解方法中放入map的对象(value 必须为类名首字母小写)时.springmvc 会把在 @ModeAttribute 放入 map 的对象传入被 @RequestMapping 注解的方法参数中. @ModeAttribute 常根据 @
RequestParam 注解获取 id
如果 id 不为 null,则调用 userDao.get(id) 获取 user 并根据命名规则放入 map 中.
such as:
ModeAttribute 使用样例
@ModelAttribute
public
void
getUser(
@RequestParam
(value=
"id"
,required=
false
) Integer
id
,
Map<String,Object>
map
){
if
(
id
!=
null
){
map
.put(
"user"
,
userDao
.getById(
id
));
}
}
对于springmvc 的 map 里面的值是怎么个运行流程,可以打断点去看下,目前没时间解析.
编写 handler 的 Edit 方法 uri 为 /user method 为 PUT 参数为 User user 這个 user 是 ModeAttribute 给的.