四:springmvc RESTRUL CRUD

来源:互联网 发布:上海培训java 编辑:程序博客网 时间:2024/06/09 04:08
需求:通过点击 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
       publicvoidgetUser(@RequestParam(value="id",required=false) Integerid,
                     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 给的. 
       
   
     
















 
     








0 0
原创粉丝点击