SpringMVC入门学习四--接受表单数据

浏览器提交数据是非常常见的,本节学习提交产品名称以及产品价格到SpringMVC,以及SpringMVC如何接收数据。
1.准备pojo

package pojo;

public class Product {
    private int id;
    private String name;
    private float price;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public float getPrice() {
        return price;
    }
    public void setPrice(float price) {
        this.price = price;
    }
    
}

2.准备addProduct.jsp
WebContent下新建以上文件
内容如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*" isELIgnored="false"%>
    
    <form action="addProduct">
        产品名称:<input type="text" name="name" value=""><br/>
        产品价格:<input type="text" name="price" value=""><br/>
        
        <input type="submit" value="增加商品">
    
    </form>

3.准备ProductController
在ProductController当中需要准备一个add()方法来映射/addProduct路径
为add()方法准备一个Product参数,用于接收注入这点很重要
最后指定跳转到showProduct页面。
代码如下:

package controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import pojo.Product;

@Controller
public class ProductController {
    @RequestMapping("/addProduct")
    public ModelAndView add(Product product) throws Exception {
        
        ModelAndView mav=new ModelAndView("showProduct");
        return mav;
        
    }
}

4.准备showProduct.jsp页面
WEB-INF/page目录下新建showProduct.jsp页面,使用 EL 表达式显示用户提交的商品名称合价格信息。
代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
    产品名称:${product.name}<br>
   产品价格:${product.price}

另外,web.xml和springmvc-serclet.xml配置同上次学习内容一致。
5.测试结果

addproduct.PNG

submit结果:

产品名称:二狗
产品价格:100.0

总结:相信很多同学会有疑惑,这个product究竟哪里来的,没有在任何地方创建啊,怎么就有了呢。这就是SpringMVC框架所带来的好处。不用自己再去创建对象。
具体对应的映射关系,参考别人的一段源码解释就比较清楚了:

来咱来研究下源码  
1 先是addObject
    public ModelAndView addObject(Object attributeValue) {
        this.getModelMap().addAttribute(attributeValue);
        return this;
    }

2 然后是addAttribute
    public ModelMap addAttribute(Object attributeValue) {
        Assert.notNull(attributeValue, "Model object must not be null");
        return attributeValue instanceof Collection && ((Collection)attributeValue).isEmpty() ? this : this.addAttribute(Conventions.getVariableName(attributeValue), attributeValue);
    }

3 getVariableName 这个方法是spring的
    public static String getVariableName(Object value) {
        Assert.notNull(value, "Value must not be null");
        boolean pluralize = false;
        Class valueClass;
        if (value.getClass().isArray()) {
            valueClass = value.getClass().getComponentType();
            pluralize = true;
        } else if (value instanceof Collection) {
            Collection collection = (Collection)value;
            if (collection.isEmpty()) {
                throw new IllegalArgumentException("Cannot generate variable name for an empty Collection");
            }

            Object valueToCheck = peekAhead(collection);
            valueClass = getClassForValue(valueToCheck);
            pluralize = true;
        } else {
            valueClass = getClassForValue(value);
        }

        String name = ClassUtils.getShortNameAsProperty(valueClass);
        return pluralize ? pluralize(name) : name;
    }

4 getShortNameAsProperty
    public static String getShortNameAsProperty(Class<?> clazz) {
        String shortName = getShortName(clazz);
        int dotIndex = shortName.lastIndexOf(46);
        shortName = dotIndex != -1 ? shortName.substring(dotIndex + 1) : shortName;
        return Introspector.decapitalize(shortName);
    }

可以看到你直接addObjec的时候,如果直接传Object的话,他的attribute名字就是
通过这个spring的方法来获取的Conventions.getVariableName(attributeValue)
获取Object这个变量的名字。
String name = ClassUtils.getShortNameAsProperty(valueClass);

    public static String getShortNameAsProperty(Class<?> clazz) {
        String shortName = getShortName(clazz);
        int dotIndex = shortName.lastIndexOf(46);
        shortName = dotIndex != -1 ? shortName.substring(dotIndex + 1) : shortName;
        return Introspector.decapitalize(shortName);
    }

    public static String decapitalize(String name) {
        if (name == null || name.length() == 0) {
            return name;
        }
        if (name.length() > 1 && Character.isUpperCase(name.charAt(1)) &&
                        Character.isUpperCase(name.charAt(0))){
            return name;
        }
        char chars[] = name.toCharArray();
        chars[0] = Character.toLowerCase(chars[0]);
        return new String(chars);
    }

就是这么将参数名字转换为attribute的名字的
时间有限我就大致看看源码 继续学习下去咯
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,786评论 18 399
  • 1.Spring web mvc介绍 Spring web mvc和Struts2都属于表现层的框架,它是Spri...
    七弦桐语阅读 11,591评论 2 38
  • 成都已经被赵雷唱遍了大街小巷,那寂寥的弦音和落寞的歌词很快便给这座城市蒙上了一层文艺的外衣。 然而,在我心里,成都...
    吴六一阅读 517评论 0 0
  • 人人那个都说哎嘿嘿,沂蒙山好。这首流传甚广的歌曲,使沂蒙山地区成为了所有人向往的天堂,而现实生活中,在这块贫瘠的土...
    孤傲水手阅读 424评论 0 0
  • 可以Debug Rx代码的操作 debug 打印机出所有订阅,事件,和清除对象。 RxSwift.Resource...
    你家旭哥阅读 169评论 0 0