Java自学之SpringMVC:接收表单数据

学习目的:使用SpringMVC接收表单数据。

Part 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;
	}
	
}

Part 2

在WebContent下,新建一个添加商品的addProduct.jsp。

<%@ 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>

Part 3

准备ProductController控制器。

注:addProduct.jsp提交的name和price会自动注入到参数 product里。

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) {
		ModelAndView amv = new ModelAndView("showProduct");
		return amv;
	}
}

Part 4

在/WEB-INF/page新建showProduct.jsp,用来显示添加的商品信息。

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" isELIgnored="false"%>

产品名称: ${product.name}<br>
产品价格: ${product.price}

Part 5

配置springmvc-servlet.xml。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context        
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">

	<context:component-scan base-package="controller" />

	<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
   		<property name="prefix" value="/WEB-INF/page/" />
  		<property name="suffix" value=".jsp" />
	</bean>
<!-- 	<bean id="simpleUrlHandlerMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/index">indexController</prop>
				<prop key="/hello">helloController</prop>
			</props>
		</property>
	</bean>
	<bean id="indexController" class="controller.IndexController"></bean>
	<bean id="helloController" class="controller.HelloController"></bean> -->
</beans>

Part 6

部署项目,运行Tomcat,在浏览器访问localhost:8080/springMV

v2-c12d667c78c7bd439450ed7bc65f2acc_b.jpg

输入信息之后点击增加商品

v2-426be31d89cb7c5190fed0c3d61c5837_b.jpg

成功显示新增的信息,SpringMVC成功接收到表单数据,学习目的完成。

Part 7

流程理解

输入完表单请求的数据后,提交。来到DispatcherServlet中,处理器映射器根据提交的路径,找到了相匹配的处理器Controller(已注解了路径)。接下来到了我认为的难点:在Controller的方法中,通过参数绑定,表单中的数据直接注入到了形参(Product product)中,前提是表单中的属性和Bean:Product中的属性是相匹配的,这样Spring才能找到。(此处各种类型参数绑定的链接详解:

[Spring MVC] - SpringMVC的各种参数绑定方式

SpringMVC中的参数绑定总结_spring mvc,数据_hugh 的博客-CSDN博客

)然后进入方法,在方法中创建了一个ModelAndView,并且通过这个构造方法制定了返回的View,与Springmvc-servlet中的配置配合后,showProject+.jsp就变成了最后返回视图的路径。

疑问解答:

Q:地址访问不是会根据web.xml中的配置 所有的访问都会经过DispatcherServlet,然后到配置文件springmvc-servlet.xml 里查找,然后现在因为设置成了注解方式,所以直接查找所有控制器,找到路径所对应的方法,执行相关代码嘛。那直接访问jsp文件的时候不是经过以上步骤么???

A:地址访问都是从web.xml开始的,<url-pattern>/</url-pattern>这个叫默认匹配,优先级最低,这里只配置了默认匹配,所以首先所有请求都是由DispatcherServlet转发的,DispatcherServlet会根据handler mapping去找相应请求的处理器,这个handler mapping就是映射关系,这些映射关系或者从配置文件里读取,或者配置文件里有<context:component-scan base-package="xxx" />会从注解中获取,这些都是在初始化的时候完成的,初始化后这些映射关系统一变成handler mapping,至于访问jsp文件,jsp文件路径在映射关系中找不到,这时spring会调用tomcat的defaultServletDispatcher,这个转发器就是web容器加载静态资源的转发器,就是直接根据路径找文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值