SpringMVC第一个项目
1.springmvc是基于表现层(WEB层)的
Java WEB常用的经典三层框架
表示层(web)—>业务层-(service)—>持久层(dao)
2.springmvc是一个典型的MVC式框架,mvc的核心思想是模型—视图—控制器
3.springmvc的第一个项目测试
1)首先启动服务器,加载一些配置文件
springmvc的核心控制器DispatcherServlet对象被创建
初始化参数contextConfigLocation的值为spring-mvc.xml的路径,这样就加载了配置文件,控制器类(注解扫描)被创建了。
2. 前端发送任意请求到后台dispatcherservlet指挥中心会去寻找控制器类中的方法的请求映射–基于注解@RequestMapping(“/hello”),并执行相应的方法,返回值是String类型,值应填写返回的结果页面的名称,后缀省略,根据xml中视图解析器的配置实现重定向。
3.配置文件中配置两处,第一开启扫描注解类及其子集;第二配置视图解析器InternalResourceViewResolver。配置两个属性,解析地址目录或文件夹prefix(/WEB-INF/…/)和后缀suffix(.jsp),响应结果默认从此目录下寻找并默认使用转发到该页面。
springmvc三大组件:
1.视图解析器InternalResourceViewResolver:用于响应用户时返回的视图控制。
2.处理器映射器HandlerMapping:映射请求url找到对应的方法体返回一个执行链,
3.处理器适配器HandlerAdapter:处理所有请求的url让他们可以适配controller类,从而执行目标方法。
整个流程:
图源:
注意:开启了mvc注解驱动,默认开启了处理器映射器和适配器。
处理映射器的注解 : @RequestMapping
1.用在类上多用户模块划分,一级路径,例如 @RequestMapping("/user")
2.属性
vlaue:用于请求路径的URL,作用和path相同。
method:用户指定请求方式,使用枚举 RequestMethod.GET
params:指定请求参数,可以指定值,以key=value的形式。
headers:指定请求头参数。
用户模块注解:
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value="/hello",params={"username=zhangsan","type=1"},method={RequestMethod.GET})
public String helloWorld(Model model){
model.addAttribute("message", "userspringmvc你好");
return "helloworld";
}
注意:return后面的字符串是经过视图解析器后转发的路径;
如果用重定向写法为:return “redirect:/add”;后面跟的是另一个方法或模块的请求映射URL。
请求参数的绑定:
1.mvc框架只需要在映射方法体中提供和前端请求属性相同名称的参数,则会自动绑定请求参数的值,获取到后台。(反射技术实现的绑定)
2.表单传多个参数时,可以自动封装到实体对象javabean实体。
当实体类中有引用对象时,语法为表单属性name=“引用对象.属性”,即可完成多个对象的封装;
3.引用集合对象,假设有如下集合属性List list, Map<String,User> map;
语法为: name=“lsit[0].uname” ; name=“lsit[0].age”
name=“map[‘one’].uname” ; name=“map[‘one’].age”
添加了list中的第0条数据和map中键为one的一个对象
解决中文提交乱码
传统的过滤器可以做到这一点,但是spring提供了自己的过滤器。只需要配置即可使用。
web.xml的配置如下
<!--配置spring过滤器,解决中文乱码问题 -->
<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>
参数类型转换
默认情况下,springmvc会根据数据类型自动强制转换,替我们封装。有时转换出错,不能转换的情况,或是我们想要自定义转换形式时,就需要开启配置自定义类型转换器。
例如:配置字符串到指定时间格式的date形式的数据的转换器。
注意:数据转换类必须实现spring的核心core包的接口Converter<S(源类型),T(目标类型)>
<!--配置自定义类型转换器 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<!--控制器名称,把自定义的转换器类路径作为属性值注入 -->
<property name="converters">
<set>
<bean class="com.borened.utils.StringTodateConverter"></bean>
</set>
</property>
</bean>
<!--开启mvc注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
常用注解
@RequestMapping(前面讲过。)
@RequestParam(用于方法体的参数内)
属性 value:等同于name,表示后面的参数对应此处的名称
required:默认是true,必须要的。
public String save(@RequestParam(name="username")String uname){
.....
}
@RequestBody(获取请求体的内容)
得到是key=value&key=value的格式数据
public String save(@RequestBody String body){
.....
}
前端post请求体中的参数会全部封装到字符串body中。不适合get方式的请求,get提交数据不在请求体内。
@PathVaribale(用于绑定URL中的占位符)
例如:请求url为 /add/{id} -----------------restful风格的url,提高了缓存和响应速度。
{id} 就是URL占位符
前端请求url中必须用/参数的形式拼接。后台默认取到该参数作为id的值。mapping中的{id}和后面的value必须相同,形参可以不同。
@RequestMapping("/path/{id}")
public String testpath(Model model,@PathVariable(value="id") String ssid){
model.addAttribute("mes", "测试成功");
System.out.println(id);
return "helloworld";
@RequestHeader(用于获取请求头的信息)
@CookieValue(用于把指定名称的cookie的值传入控制器方法参数)
把客户端存储的cookie属性的key值,获取到后台。例如JSESSIONID就是一个cookie技术存的。
(@CookieValue(value=“JSESSIONID”) String cookie)
@ModelAttribute(用于修饰方法和参数)
出现在方法上,表示当前方法会在控制器的方法执行之前执行。
出现在参数上,获取指定的数据然后给参数赋值。
用法场景:当实体类的某一个属性时不能被修改,想使用数据库的默认值时,表单提交时为了避免提交null值覆盖原有的值,使用此注解可以在目标方法执行之前,把不能修改的属性先从数据库查询赋值给对象,再选择传递给控制器方法还是参数。
@SessionAttribute(用于多次执行控制器方法间的参数共享)
为了解决和Servlet的高耦合,spring提供了Model接口,底层帮我们把数据封装进了request域中,添加属性:model.addAttribute(key,value);
取值:modelmap.get(key);modelmap时model接口的实现类
如果要把属性存在session域中则需要在类名前添加注解
用法:@SessionAttribute(value={“msg”}) 大括号内存的是字符串数组;
如果要销毁session.
用法:在方法中添加SessionStatus对象,调用setComplete()方法;