springmvc01
三层架构
表现层
即web层。它负责接收客户端请求,向客户端响应结果,通常客户端使用 http协议请求web 层, web 需要接收 http 请求,完成 http 响应 。
业务层
service 层。它负责业务逻辑处理 。
持久层
dao 层。负责数据持久化,包括数据层即数据库和数据访问层 。
springmvc组件
DisptcherServlet 前端控制器
dispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求, dispatcherServlet 的存在降低了组件之间的耦合性
HandlerMapping:处理器映射器
HandlerMapping 负责根据用户请求找到 Handler 即处理器, SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等
Handler:处理器
具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。
HandlAdapter:处理器适配器
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用
View Resolver:视图解析器
View Resolver 负责将处理结果生成 View 视图, View Resolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
View:视图
View 视图类型的支持,包括: jstlView、 freemarkerView、 pdfView等。常用的视图就是 jsp
处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件 ,其中在sprtingmvc.xml 使用 <mvc:annotation-driven> 自 动 加 载 RequestMappingHandlerMapping ( 处 理 映 射 器 ) 和
RequestMappingHandlerAdapter (处 理 适 配 器 )
参数绑定
支持的数据类型
基本类型参数:
包括基本类型和 String 类型
POJO 类型参数:
包括实体类,以及关联的实体类
数组和集合类型参数:
包括 List 结构和 Map 结构的集合(包括数组)
基本类型和String类型作为参数
要求参数名称必须和控制器中方法的形参名称保持一致
1 account/findAccount?accountId=10&accountName=zhangsan 2 3 4 String findAccount(Integer accountId,String accountName)
POJO作为参数
要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型
1 <form action="param/saveUser" method="post"> 2 用户姓名 <input type="text" name="uname"/></br> 3 用户年龄 <input type="text" name="age"/></br> 4 用户生日 <input type="text" name="date"/></br> 5 <input type="submit" value="提交"> 6 </form> 7 8 9 10 public class User implements Serializable{ 11 12 private String uname; 13 private String age; 14 private Date date; 15 16 17 18 @RequestMapping("/saveUser") 19 public String saveUser(User user){ 20 // 21 return null; 22 23 }
(2) pojo中包含集合类属性
第一种:
要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
给 List 集合中的元素赋值, 使用下标。
给 Map 集合中的元素赋值, 使用键值对。
第二种:
接收的请求参数是 json 格式数据。需要借助一个注解实现
1 public class Account implements Serializable { 2 3 private String username; 4 private String password; 5 private Double money; 6 7 /** 8 * 请求参数绑定集合类型 9 * @return 10 */ 11 private List<User> list; 12 private Map<String,User> map; 13 14 // 15 } 16 17 public class User implements Serializable{ 18 19 private String uname; 20 private String age; 21 private Date date; 22 // 23 } 24 25 26 27 <form action="param/saveAccount" method="post"> 28 姓名 <input type="text" name="username"><br/> 29 密码 <input type="text" name="password"><br/> 30 金额 <input type="text" name="money"><br/> 31 //把uname封装成user对象,把对象存到map集合的key,key为one的位置上 32 用户姓名 <input type="text" name="map['one'].uname"><br> 33 用户年龄 <input type="text" name="map['one'].age"><br> 34 35 //把uname封装成user对象,把user对象存到list集合的0位置上 36 用户姓名2 <input type="text" name="list[0].uname"><br> 37 用户年龄2 <input type="text" name="list[0].age"><br> 38 39 <input type="submit" value="提交"/><br/> 40 </form> 41 42 @RequestMapping("/saveAccount") 43 public String saveAccount(Account account){ 44 // 45 46 47 return null; 48 49 }
自定义类型转换器
日期类型转换器
1.实现Converter<S,T>接口
1 public class ToDateConverter implements Converter<String,Date>{ 2 @Override 3 public Date convert(String source) { 4 if (source == null) { 5 throw new RuntimeException("传入了空数据"); 6 } 7 DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); 8 try { 9 return df.parse(source); 10 } catch (Exception e) { 11 throw new RuntimeException("数据类型错误"); 12 } 13 14 } 15 }
2.修改spring配置文件配置类型转换器
1 <!--配置自定义类型转换器--> 2 <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean"> 3 <property name="converters"> 4 <set> 5 <bean class="com.xxx.util.ToDateConverter"></bean> 6 </set> 7 </property> 8 </bean>
3.在 annotation-driven 标签中引用配置的类型转换服务
1 <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>
常用注解
RequestMapping
用于建立请求 URL 和处理请求方法之间的对应关系,url进行模块化管理
1 @Target({ElementType.METHOD, ElementType.TYPE}) 2 @Retention(RetentionPolicy.RUNTIME) 3 @Documented 4 @Mapping 5 public @interface RequestMapping { 6 }
value:用于指定请求的 URL。 它和 path 属性的作用是一样的
method:用于指定请求的方式
params:用于指定限制请求参数的条件。 它支持简单的表达式。 要求请求参数的 key 和 value 必须和配置 一致
headers:用于指定限制请求消息头的条件
Requestparam
把请求中指定名称的参数给控制器中的形参赋值 (参数名称和控制器中方法的形参名称不一致的情况 )
value: 请求参数中的名称。
required:请求参数中是否必须提供此参数。 默认值: true
1 user/Param?name=test" 2 3 public String Param(@RequestParam("name")String username){ 4 5 return null; 6 }
RequestBody
用于获取请求体内容。 直接使用得到是 key=value&key=value...结构的数据。get 请求方式不适用。
required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值
为 false, get 请求得到是 null。
可以将请求体中的JSON字符串绑定到相应的bean上
1 <form action="springmvc/useRequestBody" method="post"> 2 用户名称: <input type="text" name="username" ><br/> 3 用户密码: <input type="password" name="password" ><br/> 4 用户年龄: <input type="text" name="age" ><br/> 5 <input type="submit" value="保存"> 6 </form> 7 8 <a href="user/useRequestBody?body=test">requestBody 注解</a> 9 10 @RequestMapping("/useRequestBody") 11 public String useRequestBody(@RequestBody(required=false) String body){ 12 System.out.println(body); 13 return null; 14 } 15 16 17 //username=aaa&password=111&ge=111
PathVaribale
用于绑定 url 中的占位符
value: 用于指定 url 中占位符名称。
required:是否必须提供占位符。
1 <a href="user/usePathVariable/100">pathVariable 注解</a> 2 3 @RequestMapping("/usePathVariable/{id}") 4 public String usePathVariable(@PathVariable("id") Integer id){ 5 System.out.println(id); 6 return null; 7 }
ModelAttribute
出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。
出现在参数上,获取指定的数据给参数赋值 (当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据
属性:
value:用于获取数据的 key。 key 可以是 POJO 的属性名称,也可以是 map 结构的 key。
1 <form action="user/updateUser" method="post"> 2 用户名称: <input type="text" name="username" ><br/> 3 用户年龄: <input type="text" name="age" ><br/> 4 <input type="submit" value="保存"> 5 </form> 6 7 @RequestMapping("/updateUser") 8 public String testModelAttribute(@ModelAttribute("abc")User user) { 9 10 return null; 11 } 12 13 private User findUserByName(String username) { 14 User user = new User(); 15 user.setUsername(username); 16 user.setAge(19); 17 user.setPassword("123456"); 18 return user; 19 20 } 21 22 //username值默认没有修改
ResponseBody
该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据
如: json,xml 等,通过 Response 响应给客户端
返回值类型
字符串
void
ModelAndView
字符串
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址
指定逻辑视图名,经过视图解析器解析成jsp物理路径
void
在controller 方法形参上可以定义 request 和 response,使用 request 或 response 指定响应结果
使用request转向页面
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
通过 response 页面重定向
response.sendRedirect("testRetrunString")
通过 response 指定响应结果, 例如响应 json 数据:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json 串");
ModelAndView
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值
1 public void setViewName(@Nullable String viewName) { 2 this.view = viewName; 3 } 4 //1.用于设置逻辑视图名称,视图解析器会根据名称前往指定的视图
6 public ModelAndView addObject(String attributeName, Object attributeValue) { 7 getModelMap().addAttribute(attributeName, attributeValue); 8 return this; 9 }
//2.添加模型到对象中,页面上可直接用el表达式获取
转发&&重定向
forward转发
路径必须写成实际视图 url,不能写逻辑视图。
1 return "forward:/WEB-INF/pages/success.jsp" 2 3 相当于“request.getRequestDispatcher("url").forward(request,response)” 。使用请求 4 转发,既可以转发到 jsp,也可以转发到其他的控制器方法
redirect重定向
contrller 方法提供了一个 String 类型返回值之后, 它需要在返回值里使用:redirect:
1 return "redirect:testReturnModelAndView"; 2 3 4 相当于“response.sendRedirect(url)” 如果是重定向到 jsp 页面,则 jsp 页面不 5 能写在 WEB-INF 目录中,否则无法找到