赞
踩
服务器端分成三层架构
1.表现层:SpringMVC
2.业务层:Spring
3.持久层:Mybatis
表现层通常采用MVC这种设计模型来做架构。
M:Model(模型)JavaBean
V:View(视图)JSP
C:Controller(控制器)
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用 Spring 进行 WEB 开发时,可以选择使用 Spring的 Spring MVC 框架或集成其他 MVC 开发框架,如 Struts1(现在一般不用),Struts2 等。
SpringMVC 已经成为目前最主流的 MVC 框架之一,并且随着 Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。
它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful 编程风格的请求。
1.启动服务其,加载一些配置文件
DispatcherServlet对象创建。
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
spingmvc.xml被加载。
<!-- 开启注解扫描 -->
<context:component-scan base-package="org.example"/>
<!-- 视图解析器 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<!-- 文件所在目录 -->
<property name="prefix" value="/WEB-INF/pages/"/>
<!-- 文件后缀名 -->
<property name="suffix" value=".jsp"/>
</bean>
<!-- 开启SpringMVC注解的支持 -->
<mvc:annotation-driven/>
其中的注解扫描,将Controller类加载进IOC容器中变成对象;视图解析器也创建为对象,完成跳转页面的功能;注解支持开启,使springmvc注解生效。
2.发送请求,后台处理请求
超链接可直接发送请求。
<a href="/hello">入门程序</a>
DispatcherServlet控制作用,指挥中心。通过path找方法来执行,根据返回值,找到视图解析器对象,帮助跳转到对应的视图文件,接着就显示结果。
相当于MVC中的C,整个流程控制的中心,由它调用其它组件处理用户的请求。从而降低了组件之间的耦合性。
根据用户请求找到Handler即处理器,SpringMVC提供了不同的映射器实现不同的映射方式,例如:配置文件、实现接口方式,注解方式等。
对控制器进行执行。适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
负责将处理结果生成View视图,其首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
HandlerMapping:处理器映射器,HandlerAdapter:处理器适配器,ViewResovler:视图解析器称为SpringMVC的三大组件。
绑定机制:表单数据都是k=v格式的。SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的;要求提交表单的name和参数的名称相同。
支持的数据类型:基本数据类型;实体类型(JavaBean);集合数据类型(List、map集合等)
<form action="param/saveUser" method="post">
姓名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
金额:<input type="text" name="money"/><br/>
账户姓名:<input type="text" name="account.uname"/><br/>
账户年龄:<input type="text" name="account.age"/><br/>
<input type="submit" value="提交"/>
<!-- 类中存在集合 List, Map -->
账户姓名:<input type="text" name="list[0].uname"/><br/>
账户年龄:<input type="text" name="list[0].age"/><br/>
账户姓名:<input type="text" name="map['1'].uname"/><br/>
账户年龄:<input type="text" name="map['1'].age"/><br/>
</form>
解决post请求中文乱码问题:通过过滤器,每次请求时进行处理。
<!-- 配置解决中文乱码的过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
表单中提交的数据均为String字符串,大多数类型都可以通过SpringMVC自动转换成相应的类型。但部分复杂的类型需要通过自定义类型转换器来解决该问题。
1.定义一个类,实现Converter接口,该接口有两个泛型。
package org.example.utils; import org.springframework.core.convert.converter.Converter; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * 把字符串转换成日期 */ public class StringToDateConverter implements Converter<String, Date> { /** * * @param s 传入的字符串 * @return */ public Date convert(String s) { //判断 if(s == null){ throw new RuntimeException("请传数据"); } DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); //把字符串转换成日期 try { return df.parse(s); } catch (Exception e) { throw new RuntimeException("转换错误"); } } }
2.在spring配置文件中配置类型转换器。
<!-- 配置自定义类型转换器 -->
<bean id="conversionService2" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="org.example.utils.StringToDateConverter"></bean>
</set>
</property>
</bean>
3.在annotation-driven标签中引用配置的类型转换服务。
<mvc:annotation-driven conversion-service="conversionService2"/>
可以放在方法上,可以放在方法上也可以放在类上。具体的模块具体划分。
属性:
path和value:作用相同,用于指定请求的URL。
method:用于指定请求的方式。RequestMethod:GET、HEAD、POST…
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置一摸一样。
headers:用于指定限制请求消息头的条件。
@RequestMapping(path = "/testMapping", method = RequestMethod.GET, params = {"username"}, headers = {"Accept"})
把请求中指定名称的参数给控制器中的形参赋值。
属性:
name和value:作用相同。指定参数名。
required:默认为true。不传值会报错。
用于获取请求体的内容。直接使用得到是key=value&key=value…结构的数据。get请求方式不适用。
属性:
required:是否必须有请求体。默认为true。
用于绑定url中的占位符。请求url中/delete/{id},这个{id}就是url占位符。
属性:
value:用于指定url中占位符名称。
required:是否必须提供占位符。
用于获取请求消息头。
属性:value:提供消息头名称;required:是否必须有此消息头。
用于把指定cookie名称的值传入控制器方法参数。
属性:
value:指定cookie的名称。
required:是否必须有此cookie。
可以用于修饰方法和参数。在方法上,表示会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法;出现在参数上,获取指定的数据给参数赋值。
属性:
value:用于获取数据的key。可以是POJO属性名称,也可以是map结构的key。
应用场景:当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
用于多次执行控制器方法间的参数共享。作用在类上。
属性:
value:用于指定存入的属性名称。
type:用于指定存入的数据类型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。