发表于: 2017-06-14 19:55:07

1 1068


今日完成

springMVC

实现MVC模式的应用包含模型、视图、和控制器3个模块。视图负责应用展示。模型封装了应用的数据和业务逻辑。控制器负责接收用户输入,改变模型,以及调整视图的显示。

每个Http请求都发送给控制器,请求中的URI标识出对应的action。action代表了应用可以执行的一个操作。

控制器会解析URI并调用相应的action,然后将模型对象放到视图可以访问的区域。最后控制器利用RequestDispatcher跳转到视图(JSP)页面。在JSP页面中,用表达式语言以及定制标签显示数据。

一个简单的MVC应用。用户填写产品表单并提交;示例应用保存产品并展示一个完成页面,显示已保存的产品信息。

一个Product类,作为product的领域对象。

一个ProductForm类,封装了HTML表单的输入项。

一个ControllerServlet类,本示例应用的控制器

一个SaveProductAction类

两个JSP页面(ProductForm.jsp和ProductDetail.jsp)作为view

一个CSS文件,定义两个JSP页面的显示风格

解耦控制器代码,将Servlet类业务逻辑代码提取到独立的被称为controller的类中

Controller Servlet变更为DispatcherServlet。检查每个URI,创建相应的controller,并调用其handleRequest方法。

在Web应用执行action时,很重要的一个步骤就是进行输入校验。现代的MVC框架通常同时支持编程式和申明式两种校验方法。在编程式中,需要通过编码进行用户输入校验,而在申明式中,则需要提供包含校验规则的XML文档或者属性文件。

新的目录结构

校验器ProductValidator和JSTL

JSTL的作用在ProductForm.jsp页面中展示输入校验的错误信息

校验器

public class ProductValidator {

public List<String> validate(ProductForm productForm) {
List<String> errors = new ArrayList<String>();
String name = productForm.getName();
if (name == null || name.trim().isEmpty()) {
errors.add("Product must have a name");
}
String price = productForm.getPrice();
if (price == null || price.trim().isEmpty()) {
errors.add("Product must have a price");
} else {
try {
Float.parseFloat(price);
} catch (NumberFormatException e) {
errors.add("Invalid price value");
}
}
return errors;
}

Spring MVC自带的DispatcherServlet org.springframework.web.servlet.DIspatcherServlet

在web.xml文件中应用servlet和servlet-mapping元素

<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

部署描述符(web.xml)文件和Spring MVC配置文件

<?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="app03a.controller.InputProductController"/>
<bean name="/product_save.action" class="app03a.controller.SaveProductController"/>

</beans>

声明了两个控制器类,并分别映射到/product_input.action和/product_save.action

注解法可以省去ProductForm对象


View Resolver

Spring MVC中的视图解析器负责解析视图,为所有视图路径添加前缀和后缀

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

基于注解的控制器

优点,一是一个控制器类可以处理多个动作;二是基于注解的控制器的请求映射不需要存储在配置文件中。

@Controller

为保证Spring能找到控制器需要完成两件事情。首先需要在Spring MVC配置文件中声明spring-context。

xmlns:context="http://www.springframework.org/schema/context"

然后需要应用<component-scan/>元素

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

@RequestMapping

控制器的内部为每一个动作开发相应的处理方法。映射一个请求和一种方法。

RequestMapping的value属性和method属性

RequestMapping注释类型也可以用来注释一个控制器类


收获

MVC 前端处理,JSP页面视图,SpringMVC基本组件

困难

明日计划

继续学习Spring MVC


返回列表 返回列表
评论

    分享到