发表于: 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
评论