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 视图类型的支持,包括: jstlViewfreemarkerViewpdfView等。常用的视图就是 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 请求方式会报错。如果取值
falseget 请求得到是 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:用于获取数据的 keykey 可以是 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 目录中,否则无法找到

 

原文地址:https://www.cnblogs.com/quyangyang/p/11847688.html