发表于: 2017-06-15 18:49:54

1 1112


今日完成

编写请求处理方法,每个请求处理方法可以有多个不同类型的参数,以及一个多种类型的返回结果。

特别重要的是org.springframework.ui.Model类型。这不是一个Servlet API类型,而是一个包含Map的Spring MVC类型。每次调用请求处理方法时,Spring MVC都创建Model对象并将其Map注入到各种对象。

请求处理方法返回对象类型

ModelAndView

Model

Map包含模型的属性

View

代表逻辑视图名的String

void

提供Servlet的访问,以响应HTTP头部和内容HttpEntity或ResponseEntity对象

Callable

DeferredResult

其他任意类型,Spring将其视作输出给View的对象模型


配置文件,第一个为web.xml注册Spring MVC的Dispatcher Servlet。第二个为springmvc-config.xml,即Spring MVC配置文件。

部署描述符中的<servlet-mapping/>元素,Spring MVC的dispatcher-servlet的URL模式设置为“/”,所有请求都被映射到dispatcher servlet。为了正确处理静态资源,需要在Spring MVC配置文件中添加一些<resource/>元素。

springmvc-config.xml

<context:component-scan base-package="app04a.controller"/>
<mvc:annotation-driven/>
<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/*.html" location="/"/>

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>

<component-scan/>元素指示Spring MVC扫描目标包中的类。<annotation-driven/>元素注册用于支持注解控制器请求处理方法的bean对象。<resources/>元素指示Spring MVC哪些静态资源需要单独处理。


应用@Autowired和@Service进行依赖注入

@Autowired
private ProductService productService;

控制类增加@Autowired注解会使ProductService的一个实例被注入到ProductCOntroller实例中。

实现类ProductServiceImpl能被spring扫到增加标注@Service

@Service
public class ProductServiceImpl implements ProductService {

Spring MVC配置文件<compnent-sacn/>元素:一个用于扫描控制类,另一个用于扫描服务类。

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


servlet/JSP

转发和重定向的去吧,转发比重定向块,因为重定向经过客户段,而转发没有。但是,有时采用重定向更好,若需要重定向到一个外部网站,则无法使用转发。另一个使用重定向的场景是避免在用户重新加载页面时再次调用同样的动作。

return "redirect:/product_view/" + savedProduct.getId();

使用重定向而不是转发来防止用户重新加载页面时,saveProduct被二次调用。

重定向无法轻松传值给目标页面,而采用转发则可以简单的将属性添加到Model,使得目标视图可以轻松访问。由于重定向经过客户段,所以modle中的一切在重定向时丢失。Spring3.1通过Flash属性提供了一种重定向传值的方法。


使用Flash属性,在Spring MVC配置文件中有<annotation-driven/>元素。然后方法上添加新的参数类型org.springframework.web.servlet.mvc.support.RedirectAttributes.

public String saveProduct(ProductForm productForm, RedirectAttributes redirectAttributes) 


redirectAttributes.addFlashAttribute("message", "The product was successfully added.");

请求参数和路径变量都可以发送值给股武器。请求参数采用key=value形式,并用&分隔。

使用路径变量

@RequestMapping(value = "/product_view/{id}")
public String viewProduct(@PathVariable Long id, Model model) {
Product product = productService.get(id);
model.addAttribute("product", product);
return "ProductView";

为了使用路径变量,首先需要在RequestMapping注解的值中添加一个变量,该变量必须放在花括号之间。然后在方法签名中添加一个同名变量,并加上@PathVariable注解。

可以在请求映射中使用多个路径变量。

@RequestMapping(value = “product_view/{userid}/{orderId}”)


@ModelAttribute

用来注释方法参数或方法,带@ModelAttribute注解的方法会将其输入或创建的参数对象添加到Model对象中。

第二个用途是标注一个非请求的处理方法。被注释的方法会在每次调用改控制器类的请求处理方法时被调用。

SpringMVC会在调用请求方法之前调用带@ModelAttribute注解的方法。注解的方法可以返回一个对象或者一个void类型。如果返回一个对象,则返回对象会自动添加到Model中。

@ModelAttribute

public Product addProduct(@RequestParam String productID){

return productService.get(productId);

}

若方法返回void,则还必须添加一个Model类型的参数,并自行将实例添加到Model中

@ModelAttribute

public void populateModel(@RequestParam String id,Model model) er);

model.addAttribute(new Account(id));

}


今天还在看java语言基础的书,所以Spring MVC这边学的比较少

遇到困难

收获

基于注解控制器的SpringMVC应用,注解类、方法或方法参数的注释类型


明日计划

数据绑定和表单标签库

转换器和格式化

验证器 表达式语言


返回列表 返回列表
评论

    分享到