浏览器提交数据是非常常见的,本节学习提交产品名称以及产品价格到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的名字的
时间有限我就大致看看源码 继续学习下去咯