一、Spring MVC注解类型
优点:
1.一个控制器可以处理多个动作。(而一个实现了Controller类的控制器只能处理一个动作)。
2.请求映射不要存储在配置文件中,使用RequestMapping注解就可以对一个方法进行请求处理。
- Controller注解类型
用于指定Spring类的实例是一个控制器。Spring使用扫描机制来找到应用程序中所有的基于注解的控制器。为了让Spring 可以找到控制器,我们要:
在Spring MVC配置文件中声明spring context.先在xmlns中加入context。再
<context:component-scan base-package="basepackage"/>
basepackage是控制器类的基本包。
- RequestMapping注解类型
在控制器内部为每一个动作做相应的处理方法。RequestMapping映射URI与方法。
RequestMapping的属性有value(默认),method .
value :URI映射到方法,如果只有value属性时,可以不写value,直接写URI .
method: method={RequestMethod.POST ,RequestMehtod.GET},method=RequestMethod.GET。
RequestMapping还可以用来注释一个控制器类。
二、编写请求处理的方法
每个请求处理的方法可以有不同类型的参数,和一个多种类型的返回结果。如我们要在方法中访问HttpSession参数,则可以添加HttpSession作为参数,Spring将会正确的
传递给方法。
请求处理方法中可以传递进去的参数
太多,略。在每次调用处理方法的时候,Spring MVC会创建一个Model对象 ,并将其Map注入到各种对象。
请求处理方法中可以返回的参数类型
ModelAndView.
Model
Map包含的属性
View
代表视图名的String
void
....
其他任意类型,Spring将其视作输出给View的对象模型。
三、例子
工程目录
- web.xml文件(部署描述符)
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app 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"
version="3.0"
>
<!-- 注意文件名一定是servletName-servlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 当springmvc的配置文件不是默认情况时,要设置contextConfigLocation -->
<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>
<!-- map all request to this DispatcherServlet -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc-config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans
xsi:schemaLocation=" http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans">
<!-- 扫描controller -->
<context:component-scan base-package="app04a.controller"></context:component-scan>
<!-- 注册用于支持基于注解的控制器的请求处理方法的bean 对象 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 那些静态资源要单独处理 ,而不通过dispatcher servlet-->
<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
<mvc:resources location="/" mapping="/*.html"/>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
- Controller类
可以有多个请求处理方法。
@Controller
public class ProductController {
private static final Log logger = LogFactory.getLog(ProductController.class) ;
@RequestMapping(value="/product_input")
public String inputProduct(){
logger.info("inputProduct called");
return "ProductForm" ;
}
@RequestMapping(value="/product_save")
public String saveProduct(ProductForm productForm, Model model){
logger.info("saveProduct called");
//no need to create and instantiate a ProductForm
//这里对比原来的ProductDetailsController
//这里不是很明白,数据怎么传递到productForm中的
//create product
Product product = new Product();
product.setName(productForm.getName());
product.setDescription(productForm.getDescription());
try {
product.setPrice(Float.parseFloat(productForm.getPrice()));
} catch (Exception e) {
e.printStackTrace();
}
//add product
model.addAttribute("product" , product);
return "ProductDetails";
}
}
注意,无论是否会使用,Spring MVC都会在每一个请求处理方法被调用时创建一个Model对象 ,用于增加要显示在视图中的属性。