第三节 SpringMVC

客户端传递数据到服务端时,在接触到的知识中,我们会采用

A.普通的传递方式:

        如果是说你传递的数据的名称跟控制层中的形参的名称不一致的情况下需要使用 注解: @RequestParam()如果存在在注解的话,那么一定要传递对应的名称,除非设置required="false"  如下情况      个人建议是保存名称一致

 @RequestMapping("/client01")
    public ModelAndView client01(@RequestParam(name="id",required=false)Integer userId){
      System.out.println(userId);
                  return null;
                   }
  @RequestMapping("/client01")
      public ModelAndView client01(Integer id){
                  System.out.println(id);//前台传递的是id
                    return null;
                  }

B.传递的数据为表单的数据

1)使用普通的表单进行提交,那么你需要注意的是 name="类中的数据",如果是说我的类中有关联的类型那么name="role.role_id",表单中含有name属性才是传递数据

2)使用Jquery中的表单序列化操作,该操作比较方便,但是如果是日后工作当中,会只用客户端传递JSON的数据形式的字符串,注意:JQuery中的serialize()表单中的序列化函数

   $(function(){                            
           $("input[type='button']").click(function(){
                 $.post("ajax",$("#myForm").serialize(),function(data){
                     });
                         });
                });

C.使用的是占位符

                   使用占位符操作,那么你一般情况下需要传递简单的数据,形式如下/sys/100/tomcat

                    控制层当中,一定为如下的格式 /sys/{id}/{name},并且对应的形参中一定要含有@PathVariable注解

@RequestMapping("/client01/{user_id}/{name}")                    
          public ModelAndView 占位符传值(@PathVariable String user_id,@PathVariable String name){
            System.out.println("++++"+user_id+"----"+name);
            return null;
                    }

        服务端传递数据到客户端:

            1.一共介绍了5种形式

            (1)使用原生的二阶段用request进行传递数据,需要你再方法(HttpServletRequest)形式

            (2)ModelAndView

            (3)方法名(Map<String,Object> map)注意这些形参对进行实例化操作

                     (4)方法名(ModelMap modelMap)注意你可以使用 Ctrl+T的快捷键进行查看继承的关系

            (5)方法名(Model model)

            (6)返回客户端的数据为JSON的格式

   2.单纯传递日期的数据:当在如下的操作中,在接受数据时只有在2016/4/9这种形式中客户端才能接受到,而当我们想接受这样的形式2016-04-09或者是这样的形式2016.04.09就没办法这样显示,所以我们需要解决这件事情。

    <h2>日期传递</h2>
         <form action="client01" method="get">
            <input type="text" name="mydate" placeholder="输入日期格式">
             <input type="submit" value="提交日期数据">
          </form>
                    
    @RequestMapping("/client01")
          public ModelAndView test01(@RequestParam(name="mydate") @DateTimeFormat(pattern="yyyy-MM-dd")Date date){
              System.out.println(date);
                return null;
             }

                            向上述这样的形式,我们只能单纯的解决固定的一种形式,不能将你输入的任意一种形式都完美的显示,暂且留下悬念。

                       3.单纯的传递金钱的显示,一般页面上显示的金钱都会以这种形式1,000,000,000,而我们以这种形式输入时,不添加任何转换的代码时,是不会被接受的。所以我们需要设置让它识别这种写法。需要注意的是这里我们传递的参数的数据类型只是为了演示,实际开发中金钱的参数类型不会使用这个。

    @RequestMapping("/client02")                
         public ModelAndView 金钱(@NumberFormat(pattern="#,###.#")Double money){
                System.out.println(money);
                return null;
              }

                        4.当你有客户数据传递的时候,那么我会进入含有标注@InitBinder的方法中

 package com.shxt.controller;
 
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.beans.PropertyChangeListener;
import java.beans.PropertyEditor;
import java.beans.PropertyEditorSupport;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Map;
 
import javax.servlet.http.HttpServletRequest;
 
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.NumberFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
 
import com.shxt.model.User;
 
@Controller//如果是你没有命名,那么id=类名的首字母小写
public class ClienDataController {
@RequestMapping("/client01")
public ModelAndView test01(@RequestParam(name="mydate") @DateTimeFormat(pattern="yyyy-MM-dd")Date date){//有接收客户端数据,进入@InitBinder注解的方法内部
System.out.println(date);
return null;
}
@RequestMapping("/client02")
public ModelAndView test02(@NumberFormat(pattern="#,###.##")Double money){//有接收客户端数据,进入@InitBinder注解的方法内部
System.out.println(money);
return null;
}
@RequestMapping("/client03")
public ModelAndView test03(){//没有接收客户端数据,不进入@InitBinder注解的方法内部
System.out.println("test03");
return null;
}
@RequestMapping("/client04")
public ModelAndView test04(User user){//有接收客户端数据,进入@InitBinder注解的方法内部
System.out.println("test04");
return null;
}
@RequestMapping("/client05")
public ModelAndView test05(HttpServletRequest request){//没有接收客户端数据,不进入@InitBinder注解的方法内部
System.out.println("test05");
return null;
}
@RequestMapping("/client06")
public ModelAndView test06(Map<String,Object> map){//没有接收客户端数据,不进入@InitBinder注解的方法内部
System.out.println("test06");
return null;
}
@RequestMapping("/client07")
public ModelAndView test07(String shxt) throws UnsupportedEncodingException{
//如果是GET请求解决中文乱码问题,有两种方式:请自己总结一下
/*System.out.println("test07---->>"+
new String(shxt.getBytes("ISO8859-1"),"UTF-8"));*/
System.out.println("test07---->>"+shxt);
return null;
}
  
@InitBinder
//当客户端传递数据的时候,并且我的控制器中的方法要接收之前,会进入该标注的方法内部进行处理
public void shxt(WebDataBinder binder){
System.out.println("请注意观察该输入语句,在上面情况下输出?");
//String.class为客户端传递的数据要转换成形参所对应的那个类
binder.registerCustomEditor(String.class, new PropertyEditorSupport(){
//内部类-->>什么是Java内部类,如何使用?
@Override
public void setAsText(String text) throws IllegalArgumentException {
System.out.println("客户端传递的数据为:"+text);
setValue(text+":齐天大圣");//重新赋值
}
});
}
 
}

        配置工具类,进行对日期的解决方案

    @InitBinder//当客户端传递数据的时候,并且我的控制器中的方法要接收之前,会进入该标注的方法内部进行处理        
        public void shxt(WebDataBinder binder){
                binder.registerCustomEditor(Date.class, new PropertyEditorSupport(){
                @Override
                public void setAsText(String text) throws IllegalArgumentException {
                setValue(DateUtils.parseDate(text));
                }
                });
        }
        
            /注意使用这种方式去实现,自己的工具类的方式?
             //可以回去自己去实现继承Map接口,实现一个HashMap,很好玩
             public class DateUtils extends org.apache.commons.lang.time.DateUtils {
            private static String[] parsePatterns = {
            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", 
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};

@ModelAttribute注解方式用法:当传递的修改数据中并没有包括数据库中的所有字段,如果只是简单的修改而且也没有进行数据的校验时,只能是将我们传递的数据进行修改了,其余的数值都将变成null,现在当我们采用@ModelAttribute注解方式,就将不需要修改的值直接传送回去,只是将要修改的值进行修改。

<h2>用户更新</h2>
<form action="user/update" method="post">
<input type="hidden" name="_method" value="put">
<input type="text" name="account" value="wukong">
<input type="text" name="user_id" value="1000">
<input type="submit" value="用户更新">
</form>

package com.shxt.controller;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
 
import com.shxt.model.User;
 
@Controller
public class UserController {
@RequestMapping(value="/user/update",method=RequestMethod.PUT)
public ModelAndView update(@ModelAttribute(value="user_data")User user){
System.out.println(user);
return null;
}
@RequestMapping("/shxt")
public ModelAndView test01(){
System.out.println("哈哈哈");
return null;
}
@ModelAttribute
public void init2(){
System.out.println("******");
}
 
@ModelAttribute
public void init1(Integer user_id,Map<String,Object> map){
//System.out.println("======"+user_id);
if(user_id!=null){
//查询数据库,模拟通过主键查询数据库操作
System.out.println("我进来了");
User user = new User();
user.setUser_id(1000);
user.setAccount("wukong");
user.setPassword("123456");
user.setUser_name("悟空");
map.put("user_data",user);
}
}
 
}






 





                




转载于:https://my.oschina.net/courage123/blog/655734

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值