Spring MVC是Spring框架中用于Web应用快速开发的一个模块。
Spring MVC基于Spring框架、Servlet和JSP.
HTTP请求包含3部分内容:方法-URL-协议/版本、请求头信息、请求正文。
URL定义了一个互联网资源,通常解析为服务器根目录的相对路径。因此,通常用“/”符号打头。
HTTP响应也包含3部分:1、协议-状态码-描述
2、响应头信息
3、响应正文
状态代码200表示Web服务器能正确响应所请求的资源。
访问未授权的资源将返回401
使用被禁止的请求方法将返回405
一个Servlet是一个Java程序,一个Servlet应用包含了一个或多个Servlet,一个JSP页面会被翻译并编译成一个Servlet.
一个Servlet应用运行在一个Servlet容器中,它无法独立运行。
Servlet容器将来自用户的请求传递给Servlet应用,并将Servlet应用的响应返回给用户。
由于大部分Servlet应用都会包含一些JSP界面,故称Java Web应用为“Servlet/JSP”应用会更恰当些。
一个Servlet/JSP容器是一个能处理Servlet以及静态资源的Web服务端。
HTTP服务器处理静态资源,而Servlet/JSP容器用来产生动态内容。
Apache Tomcat和Jetty作为最流行的Servlet/JSP容器。
Spring框架是一个开源的企业应用开发框架,其包含20多个不同的模块,主要有Core和Bean,以及SpringMVC模块。Spring MVC是Spring的一个子框架。
依赖注入接管对象的创建工作,并将该对象的引用注入需要该对象的组件。
如果需要更强的Spring配置能力,可以在 schema location属性中添加相应的schema。
ApplicationCOntext的实现类支持读取多份配置文件。
Spring会先创建B的实例,再创建实例A,然后把B注入到实例A中。
注:Spring管理的对象称为beans。
Spring为我们提供了一种可以管理Java对象依赖关系的方法。
Spring 1.0版本,支持setter和构造器方式的依赖注入。
2.0版本开始,通过Autowired注解,Spring支持基于field方式的依赖注入。
Spring支持XML和注解两种配置方式配置如何注入依赖。
创建一个ApplicationContext对象,代表一个Spring控制反转容器。
ApplicationContext接口有多个实现,包括ClasspathXmlApplicationContext和FileSystemXmlApplicationContext。
ClasspathXmlApplicationContext:尝试在类加载路径中加载配置文件。
FileSystemXmlApplicationContext:从文件系统中加载。
可以通过调用ApplicationContext的getBean方法获得对象。
控制器利用RequestDispatcher跳转到视图(JSP页面)。在JSP也面中,用表达式语言以及定制标签显示数据。
Dispatcher servlet必须能够做如下事情:
(1)根据URI调用相应的action。
(2)实例化正确的控制器类。
(3)根据请求参数值来构造表单bean。
(4)调用控制器对象的相应方法。
(5)转向到一个视图(JSP页面)。
SpringMVC是一个包含了Dispatcher servlet的MVC框架。它调用控制器方法并转发到视图。
Product product = context.getBean("product",Product.class);
getBean方法会查询id为product且类型为Product的bean对象。
使用基于注解的控制器的优点:
一个控制器类可以处理多个动作(而一个实现了Controller接口的控制器只能处理一个动作)。
基于注解的控制器的请求映射不需要存储在配置文件中。使用RequestMapping注释类型,可以对一个方法进行请求处理。
为了保证Spring能够找到你的控制器,需要完成两件事情:
1、在Spring MVC的配置文件中声明spring-context,如下所示:
<beans
xmlns:context="http://www.springframework.org/schema/context"
>
2、需要应用<component-scan/>元素:
<context:component-scan base-package="basePackage"/>
@RequestMapping注释类型的作用是映射一个请求和一种方法。
<annotation-driven/>元素做的事情包括注册用于支持基于注解的控制器的请求处理方法的bean对象。
<resources/>元素则指示Spring MVC哪些静态资源需要单独处理(不通过dispatcher servlet)。
为了能被作为依赖注入,类必须要注明为@Service。Service注释类型指示类是一个服务。
转化比重定向块,因为重定向经过客户端,而转发没有。
请求参数和路径变量都可以用于发送值给服务器。请求参数采用key=value形式,并用“&”分隔。在传统的servlet编程中,
可以使用HttpServletRequest的getParameter方法来获取一个请求参数值:
String productId = httpServletRequest.getParameter("productId");
使用RequestParam注释类型来注释方法参数。下面的方法包含了一个获取请求参数productId值的参数。
public void sendProduct(@RequestParam int productId)
使用路径变量
@RequestMapping(value = "/product_view/{id}")
public String viewProduct(@PathVariable Long id, Model model)
可以用@ModelAttribute来注释方法参数或方法。带@ModelAttribute注解的方法会将其输入的或创建的参数对象添加到Model对象中。
表单标签库:必须在JSP页面的开头处声明这个taglib指令。
<%@taglib prefix="form"
uri="http://www.springframework.org/tags/form" %>
表单标签库中的标签
Spring的Converter是可以将一种类型转化成另一种类型的一个对象。
当URL模式设置为“/”时,意味着所有请求(包括那些用于静态资源)都被映射到dispacher servlet。为了正确处理静态资源,需要在Spring MVC配置文件中添加一些<resources/>元素。
表单标签库中包含了可以用在JSP页面中渲染HTML元素的标签。为了使用这些标签,必须在JSP页面的开头处声明这个taglib指令。
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
表单标签库中的标签
表单标签的属性
input标签的属性
password标签的属性
hidden标签的属性
textarea标签属性
checkbox标签
radiobutton标签
Spring的Converter是可以将一种类型转换成另一种类型的一个对象。
Formatter的源类型必须是一个String,而Converter则适用于任意的源类型。Formatter更适合Web层,而Converter则可以用在任意层中。为了转换SpriingMVC应用程序表单中的用户输入,
始终应该选择Formatter,而不是Converter。