初识SpringMVC

工程结构:


Spring MVC是一个包含了Dispatcher servlet的MVC框架。它调用控制器方法并转发到视图。这是使用Spring MVC的一个好处:不需要编写Dispatcher servlet。

要使用这个servlet,需要把它配置在部署描述符(web.xml文件),应用servlet和servlet-mapping。DispatchcerServlet类在spring-webmvc-x.y.z.jar文件中。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
		xmlns="http://java.sun.com/xml/ns/javaee"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
	    <init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/config/springmvc-config.xml</param-value>
		</init-param>
        <load-on-startup>1</load-on-startup>    
	</servlet>

    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
</web-app>
注:Dispatcher servlet将使用Spring MVC诸多默认组件。此外,初始化时,它会寻找一个在应用程序的WEB-INF目录下的配置文件,该配置文件的命名规则是:

servletName-servlet.xml,其中servletName是在部署描述符中的Dispachter servlet的名称。所以本例中如果要去掉<init-param>标签,则可把springmvc-config.xml移至WEB-INF目录下。对于init-param,它拥有一个值为contextConfigLocation的param-name元素,其param-value元素则包含配置文件的路径。

servlet元素内的on-startup元素是可选的。如果它存在,则它将在应用程序启动时装载servlet并调用它的init方法。若它不存在,则在该servlet的第一个请求时加载。

开发一个控制器可实现org.springframework.web.servlet.mvc.Controller接口,这个接口公开了一个handleRequest方法,下面是该方法的签名:

ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response),其实现类可以访问对应请求的HttpServletRequest和HttpServletResponse,还必须返回一个包含视图路径或视图路径和模的ModelAndView对象。

注:Controller接口的实现类只能处理一个单一动作(Action),而一个基于注解的控制器可以同时支持多个请求处理,并且无须实现任何接口。

springmvc-config.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean name="/product_input.action" class="app03b.controller.InputProductController"/>
    <bean name="/product_save.action" class="app03b.controller.SaveProductController"/>
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

Spring MVC中的视图解析器负责解析视图。可以通过在配置文件中定义一个ViewResolver来配置。如上视图解析器配置有前缀和后缀两个属性。这样一来,view路径将缩短。例如,仅需提供"myPage",而不必再设置视图路径为/WEB-INF/jsp/myPage.jsp,视图解析器将会自动增加前缀和后缀。

InputProductController.java

package app03b.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class InputProductController implements Controller {
	
	private static final Log logger = LogFactory.getLog(InputProductController.class);
	
	@Override
	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		logger.info("InputProductController called");
		return new ModelAndView("ProductForm");
	}

}

其中,“ProductForm”由于视图解析器的存在,自动加了前后缀,它相当于“/WEB-INF/jsp/ProduceForm.jsp”。

Spring自带的DispatcherServlet会通过springmvc-config.xml配置文件去实例化controller,而controller以<bean>的形式声明。

jsp页面提交表单-->product_input.action-->springmvc-config.xml匹配<bean>标签中name="/product_input.action",从而交给InputProductController类进行处理。

由于controller以<bean>的形式在配置文件中声明,故一个实现了Controller接口的控制器只能处理一个动作。

SaveProductController.java

package app03b.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import app03b.domain.Product;
import app03b.form.ProductForm;

public class SaveProductController implements Controller {
	
	private static final Log logger = LogFactory.getLog(SaveProductController.class);
	
	@Override
	public ModelAndView handleRequest(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		logger.info("SaveProductController called");
        ProductForm productForm = new ProductForm();
        // populate action properties
        productForm.setName(
                request.getParameter("name"));
        productForm.setDescription(
                request.getParameter("description"));
        productForm.setPrice(request.getParameter("price"));

        // create model
        Product product = new Product();
        product.setName(productForm.getName());
        product.setDescription(productForm.getDescription());
        try {
        	product.setPrice(Float.parseFloat(
        			productForm.getPrice()));
        } catch (NumberFormatException e) {
        }

        // insert code to save Product

        return new ModelAndView("ProductDetails", "product", product);
	}

}

ProductDetails.jsp页面通过模型属性名“product"来访问由SaveProductController传入的Product对象。

测试:浏览器输入http://localhost:8080/SpringMVCTest/product_input.action,效果及缺少的其他源码,见博客“初始MVC”。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itzyjr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值