javaweb框架之springmvc第二天

来源:互联网 发布:精美的php个人网站源码 编辑:程序博客网 时间:2024/06/06 13:19

1、springmvc数据模型

1.1.使用注解和常用类

1.1.1. 常用类

1.Model(最常用的方式)

//这种方式最常用@RequestMapping("/listUser1")public String listUser(Model model){    //向域中设置list对象,key是字符串list    model.addAttribute("list", list);    return "list";}

2.ModelMap

//实现类map接口的类@RequestMapping("/listUser2")public String listUser(ModelMap map){    //向域中设置list对象,key是字符串list    map.addAttribute("list", list);    return "list";}

3.ModelAndView

@RequestMapping("/listUser3")public ModelAndView listUser(){    ModelAndView mv = new ModelAndView();    mv.addObject("list", list);    mv.setViewName("list");    return mv;}

1.1.2. 注解

1.@ModelAttribute

能把变量设置到域中

//@ModelAttribute能够把对象设置到域中@RequestMapping("/saveUser")public String saveUser(@ModelAttribute("u") User user){    System.out.println(user);    return "result";}

2.@SessionAttribute

//将user信息在放到session//需要作用在类上@SessionAttributes("loginUser") @RequestMapping("/login") public String login(Model model){     model.addAttribute("loginUser", new User("张三",123));     return "result"; }

2、servletapi

要使用Sevlet的一些API,只要直接将其作为参数传入即可。你需要request,就传入request, 需要response,就传入response。springmvc支持传入的Sevlet原生api一共有以下这些:

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • Java.security.Principal
  • Locale
  • InputStream
  • OutputStream
  • Reader
  • Writer

代码示例:

@RequestMapping("/saveUser")public void saveUser(HttpServletRequest request, HttpServletResponse response) throws IOException{    String name = request.getParameter("name");    String age = request.getParameter("age");    System.out.println(name+" "+ age);    System.out.println("服务器路径:"+request.getContextPath());    response.sendRedirect("http://www.baidu.com");}

3、json数据处理

@RequestBody
处理请求是json格式的数据,能够将json格式的数据转为java对象,依赖HttpMessageConverter,需要在后台配置

@ResponseBody
能够将返回数据处理成json格式数据,依赖HttpMessageConverter,需要在后台配置

3.1 配置springmvc.xml,使springmvc能够解析json格式的数据

<mvc:annotation-driven>    <mvc:message-converters register-defaults="true">        <bean            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">            <property name="supportedMediaTypes">                <list>                    <value>application/json;charset=UTF-8</value>                    <value>text/json;charset=UTF-8</value>                    <value>text/html;charset=UTF-8</value>                </list>            </property>        </bean>        <!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->        <bean class="org.springframework.http.converter.StringHttpMessageConverter">            <constructor-arg value="UTF-8" />        </bean>    </mvc:message-converters></mvc:annotation-driven>

3.1 引入解析json的包

    <!--spring-json依赖 -->    <dependency>        <groupId>com.fasterxml.jackson.core</groupId>        <artifactId>jackson-databind</artifactId>        <version>2.4.2</version>    </dependency>    <dependency>        <groupId>com.fasterxml.jackson.dataformat</groupId>        <artifactId>jackson-dataformat-xml</artifactId>        <version>2.4.2</version>    </dependency>

3.2 使用@ResponseBody来处理返回数据

//该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。@ResponseBody@RequestMapping("/listProduct")public List<Product> listProduct(){    List<Product> list = new ArrayList<Product>();    list.add(new Product(1,"iPhone8",7000,2));    list.add(new Product(2,"mac book",12000,1));    list.add(new Product(3,"meta9",3500,2));    list.add(new Product(4,"s8",7000,1));    list.add(new Product(5,"oppo",1000,5));    return list;}

3.3 使用@RequestBody来处理请求数据

Controller代码:

@ResponseBody@RequestMapping("/saveProduct")public boolean saveProduct(@RequestBody Product product){    System.out.println(product);    return true;}

请求代码:

$(function(){    $("#btn").click(function(){        //将form的数据序列化成数组        var params = $("form").serializeArray();        var _json = {};        for (var item in params) {            //循环数据,将数据封装成json格式            _json[params[item].name] = params[item].value;        }        $.ajax({            type:"post",            url:"${pageContext.request.contextPath}/saveProduct",            data:JSON.stringify(_json),            dataType:'json',            headers:{            Accept:"application/json",            "Content-Type":"application/json"            },                        success:function (data) {                if(data){                    alert("添加成功!");                }            },            error:function () {                alert("请求失败");            }        });    });});

4、restful风格接口

rest风格的接口,是目前最流行的轻量级接口,交互的内容是基于json格式。

在Rest 基础设计中,资源使用以下动词进行操作,也意味着,你作为Rest 服务开发者或者客户,应该遵循这些的标准。:

• 创建资源 : 使用 HTTP POST
• 获取资源 : 使用 HTTP GET
• 更新资源 : 使用 HTTP PUT
• 删除资源 : 使用 HTTP DELETE

我们提供的rest服务,应满足一下场景:

• GET 方式请求/user/ 返回用户列表
• GET 方式请求/user/1返回id为1的用户
• POST 方式请求/user/ 通过user对象的JSON 参数创建新的user对象
• PUT 方式请求/user/1 更新id为1的发送json格式的用户对象
• DELETE 方式请求/user/1删除 ID为1的user对象
• DELETE 方式请求/user/删除所有user

4.1.Cotroller实现

@RestController//等于@Controller+@ResponseBodypublic class UserController {    Map<Integer, User> map = new HashMap<Integer, User>();    public UserController(){        //初始化用户,因为SpringMVC Controller是单例模式,因此可以在系统启动时初始化数据        map.put(1, new User("张三丰",100,"太极"));        map.put(2, new User("东方不败",20,"葵花宝典"));        map.put(3, new User("风清扬",50,"独孤九剑"));        map.put(4, new User("扫地僧",60,"易筋经"));    }    @RequestMapping(value="/user", method=RequestMethod.GET)    public List<User> listUser(){        List<User> list = new ArrayList<User>();        Set<Map.Entry<Integer, User>> set = map.entrySet();        for (Map.Entry<Integer, User> entry : set) {            list.add(entry.getValue());        }        return list;    }    @RequestMapping(value="/user/{id}", method=RequestMethod.GET)    public User listUser(@PathVariable("id") int id){        return map.get(id);    }    @RequestMapping(value="/user/{id}",method=RequestMethod.DELETE)    public List<User> deleteUser(@PathVariable("id") int id){        //根据ID删除用户        map.remove(id);        return listUser();    }    @RequestMapping(value="/user", method=RequestMethod.POST)    public List<User> addUser(@RequestBody User user){        //临时用一下,存在安全隐患        int id = map.size()+1;        map.put(id, user);        return listUser();    }    @RequestMapping(value="/user/{id}", method=RequestMethod.PUT)    public List<User> updateUser(@PathVariable("id") int id, @RequestBody User user){        //更新用户        map.put(id, user);        return listUser();    }}

4.2.rest测试:

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title><script type="text/javascript" src="js/jquery-1.8.3.js"></script><script type="text/javascript">$(function(){    $("#btn1").click(function(){        $.ajax({            type:"get",            url:"user",            data:{},            success:function (data) {                for(var i=0;i<data.length;i++){                    alert(data[i].name+" "+data[i].age+" "+data[i].hobby);                }            },            error:function () {                alert("请求失败");            }        });    });    $("#btn2").click(function(){        $.ajax({            type:"get",            url:"user/1",            data:{},            success:function (data) {                alert(data.name+" "+data.age+" "+data.hobby);            },            error:function () {                alert("请求失败");            }        });    });    $("#btn3").click(function(){        var data = {"name":"乔峰","age":"30","hobby":"降龙十八掌"};        $.ajax({            type:"post",            url:"user",            //注意,json串对象转换为json字符串            data:JSON.stringify(data),            dataType:"json",            headers:{                Accept:"application/json",                "Content-Type":"application/json"            },            success:function (data) {                for(var i=0;i<data.length;i++){                    alert(data[i].name+" "+data[i].age+" "+data[i].hobby);                }            },            error:function () {                alert("请求失败");            }        });    });     $("#btn4").click(function(){        var data = {"name":"虚竹","age":"28","hobby":"北冥神功"};        $.ajax({            type:"put",            url:"user/4",            //注意,json串对象转换为json字符串            data:JSON.stringify(data),            dataType:"json",            headers:{                Accept:"application/json",                "Content-Type":"application/json"            },            success:function (data) {                for(var i=0;i<data.length;i++){                    alert(data[i].name+" "+data[i].age+" "+data[i].hobby);                }            },            error:function () {                alert("请求失败");            }        });    });     $("#btn5").click(function(){        $.ajax({            type:"delete",            url:"user/1",            data:{},            success:function (data) {                for(var i=0;i<data.length;i++){                    alert(data[i].name+" "+data[i].age+" "+data[i].hobby);                }            },            error:function () {                alert("请求失败");            }        });    });});</script></head><body><input type="button" value="查询所有用户" id="btn1"><input type="button" value="查询单个用户" id="btn2"><input type="button" value="新增用户" id="btn3"><input type="button" value="修改用户" id="btn4"><input type="button" value="删除用户" id="btn5"></body></html>

4.3.常用的测试工具:

• firefox浏览器的httprequest插件
• chrome浏览器的postman
• soapui
• postman

原创粉丝点击